The calibrator and other useful utilities for TI wireless solution,
based on wl12xx driver.

Calibration is a process in which specific radio configuration parameters are
generated and saved into the NVS file, later to be used by the wl12xx driver
upon initialization.
These configuration parameters are specific to the chip on the specific design
and therefore are sent back to the driver to store in non-volatile memory for
later use. Upon initialization, the wl12xx driver will load an NVS file where
it expects to read those parameters and send them to the chip.

The NVS file contains 2 main parts - one stores the calibration parameters and
the other one stores initialization information required for the wl12xx driver.

--- Build procedure

Kernel configuration.
Make sure your kernel is configured to support nl80211 testmode commands
(NL80211_TESTMODE=y). Also enable following configurations:
CRC7=m
FW_LOADER=m

In userspace there is dependent on libnl v2.x package. It can be downloaded
from http://www.infradead.org/~tgr/libnl/files/libnl-2.0.tar.gz

Set follow environment variables:
export NFSROOT=<path to roofs of a target where installed libnl library>
export CROSS_COMPILE=arm-none-linux-gnueabi-
make
make install

Make sure that calibrator utility and go.sh script placed in the same dir.

--- How to calibrate

Native Linux calibration procedure.

    ./go.sh -c <path to INI file> [<path to firmware directory>]

Android calibration procedure.

    Based on adb utility which comes native with Android SDK

    adb shell "echo Going to stop GUI"
    adb shell "stop"

    adb shell "echo Create reference NVS"
    adb shell "calibrator set ref_nvs /data/TQS_D_1.7.ini"

    adb shell "echo Copy reference NVS file"
    adb shell "cat ./new-nvs.bin > /system/etc/firmware/ti-connectivity/wl1271-nvs.bin"

    adb shell "echo Insert wl12xx SDIO module"
    adb shell "insmod /system/lib/modules/wl12xx_sdio.ko"

    adb shell "echo Calibrate device"
    adb shell "calibrator wlan0 plt power_mode on"
    adb shell "calibrator wlan0 plt tune_channel 0 7"
    adb shell "calibrator wlan0 plt tx_bip 1 1 1 1 1 1 1 1"
    adb shell "calibrator wlan0 plt power_mode off"

    adb shell "echo Set MAC address in NVS file"
    adb shell "calibrator set nvs_mac ./new-nvs.bin 08:00:28:90:64:31"

    adb shell "echo Remove wl12xx modules"
    adb shell "rmmod wl12xx_sdio wl12xx"
    adb shell "rmmod wl12xx"

    adb shell "echo Copy calibrated NVS file"
    adb shell "cat ./new-nvs.bin > /system/etc/firmware/ti-connectivity/wl1271-nvs.bin"
    adb shell "insmod /system/lib/modules/wl12xx.ko"

    adb shell "echo Going to start GUI"
    adb shell "start"

--- How to calibrate with AutoFEM

The wl12xx driver has ability to use it's NVS file with radio parameters for 2
different frontend modules. The driver requires firmware at boot time which
FEM parameters it needs and provides radio parameters according to answer.

There is also scenario when driver decides which radio parameters to give
to firmware. In such case, 2 parameters should be set. The autofem should be
0 and fem_manuf should be 0 or 1, depends on FEM manufacturer.

In order to prepare NVS file with radio parameters for 2 FEMs, do follows

    ./go.sh -c2 <path to INI file> [<path to INI file>]

There is option to use the feature manualy. In such case, there is need to set
AutoFEM flag to 0 and explicitly set fem_manuf flag.

    ./calibrator set autofem <0-manual|1-auto> [<nvs file>]
    ./calibrator set fem_manuf <0|1> [<nvs file>]

--- How to choose INI file

It is very important to select INI file according to the firmware (see below).
Those files organized in 3 directories:
station - currently supported station firmware (wl1271-fw.bin)
access_point - currently supported access point (wl1271-fw-ap.bin)

For Beagle board and Panda board use ini_files/station/127x/TQS_S_2.6.ini
For Blaze board with ES2.1 or ES2.1 use ini_files/station/128x/TQS_D_1.7.ini


--- How to change MAC address in calibrated NVS

./calibrator set nvs_mac <nvs file> [<mac addr xx:xx:xx:xx:xx:xx>]

If the MAC address missing, the random valid value will be added.


--- How to dump NVS file

calibrator get dump_nvs [<nvs filename>]


--- Firmware files

The firmware files can be reached from git repository
git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git
under directory ti-connectivity.
There are 2 firmware files there:
wl1271-fw.bin    - station firmware
wl1271-fw-ap.bin    - access point firmware


--- Detailed instructions for calibrator procedures

The following detailed instructions are collection of commands done by
default calibration procedure.

    TxBip procedure (calibration)

It is important to set MAC address to an interface before the procedure.
For example, `ifconfig wlan0 hw ether xx:xx:xx:xx:xx:xx'
There are 2 ways to do it - short where all parameters has default values and
full where you have to set all parameters manually.

Short way:
calibrator plt calibrate

Full way:
calibrator wlan0 plt power_mode on
calibrator wlan0 plt tx_bip <0|1> <0|1> <0|1> <0|1> <0|1> <0|1> <0|1> <0|1>
calibrator wlan0 plt power_mode off

Result of this procedure is new NVS file created locally ./new-nvs.bin
In order to use it, copy the file to /lib/firmware/wl1271-nvs.bin and reload.

    TxCont procedure

calibrator wlan0 plt power_mode on
calibrator wlan0 plt tune_channel <band> <channel>
calibrator wlan0 plt tx_cont <delay> <rate> <size> <amount> <power> <seed> <pkt mode> <DC on/off> <gi> <preamble> <type> <scramble> <clpc> <seq nbr mode> <dest mac>
calibrator wlan0 plt tx_stop
calibrator wlan0 plt power_mode off

Description: This test sends packets of data directly to air. It receives
several parameters as described bellow, to enable diversity of
operational modes.
It is mostly used to see Energy and radio impact on Air.
Content of Packet can be Random, or Zero, One, Zero, one...

Packets send are configurable with following parameters:
  Delay between packets in microseconds
  Rate
    1 Mbps -   0x00000001       MCS_0 - 0x00002000
    2 Mbps -   0x00000002       MCS_1 - 0x00004000
    5.5 Mbps - 0x00000004       MCS_2 - 0x00008000
    6 Mbps -   0x00000008       MCS_3 - 0x00010000
    9 Mbps -   0x00000010       MCS_4 - 0x00020000
    11 Mbps -  0x00000020       MCS_5 - 0x00040000
    12 Mbps -  0x00000040       MCS_6 - 0x00080000
    18 Mbps -  0x00000080       MCS_7 - 0x00100000
    24 Mbps -  0x00000200
    36 Mbps -  0x00000400
    48 Mbps -  0x00000800
    54 Mbps -  0x00001000
  Size of data field in MPDU (in bytes, 0 - 2284)
  Amount - number of packets in case of using series mode
  Power - output power in dBm*1000
  Seed - value for the scrambler
  Packet mode - 0-single, 1-multipile, 3-continuous, 4-FCC
  DC on/off - activate DCF
  gi - guard interval on/off for 11n rates
  Preamble
    1 Mbps - long preamble mode=0
    2, 5.5, 11 Mbps - long preamble mode=0, short preamble mode=1
    6, 9, 12, 18, 24, 36, 48, 54 Mbps - ofdm preamble mode=4
    from MCS_0 to MCS_7 - n mixed mode preamble mode=6, greenfield preamble mode=7
  Type is 0-data packet, 1-ack, 2-probe req, 3-random data, 4-user data
  Scrambler - on/off
  CLPC
    range 0-100 is disable calibration
  Sequence number mode (incremented or fixed)
  Destination Mac address

    RxStat procedure

There are 2 ways to do it - short where all parameters has default values and
full where you have to set all parameters manually.

Short way:
calibrator plt rx_statistics

In the short way each time the statistics will be reseted.

Full way:
calibrator wlan0 plt power_mode on
calibrator wlan0 plt start_rx_statcs
calibrator wlan0 plt get_rx_statcs
calibrator wlan0 plt stop_rx_statcs
calibrator wlan0 plt power_mode off

While willing to reset the statistic run:
calibrator wlan0 plt reset_rx_statcs

    Update NVS file procedure

This is procedure changes ini part of NVS file. It helps when there is need
to change ini part of NVS which already calibrated.

calibrator set upd_nvs <ini file> [<nvs file>]

If NVS filename parameter not provided the current NVS file will be used from
destination directory (usually /lib/firmware).


--- Miscellaneous procedures

    Read MAC address from NVS file

calibrator get nvs_mac <nvs filename>


    Push local NVS to the system:

calibrator phy <phyname> set push_nvs <nvs filename>


    Set NVS to use auto FEM detection

calibrator set autofem 1


    Set FEM manufacturer

calibrator set fem_manuf 0|1


    Tone transmission testing
Get in PLT mode
calibrator wlan0 plt power_mode on

Run TxTone transmission
calibrator set plt_tx_tone <power> <tone type>
Power
Tone type
 1 - Single tone
 2 - Carrier FeedThrough

Stop transmission
calibrator wlan0 plt tx_stop

Get out from PLT mode
calibrator wlan0 plt power_mode off

-------------------------------------------------------------------------------

The project can be accessed from git repository:
    git clone git://github.com/gxk/ti-utils.git

Please send all patches to Gery Kahn <geryk@ti.com>
and CC linux-wireless@vger.kernel.org for community review.