[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/connectivity/wifitesttool/wifi_hw_test_tool/main.c b/src/connectivity/wifitesttool/wifi_hw_test_tool/main.c
new file mode 100644
index 0000000..443afdc
--- /dev/null
+++ b/src/connectivity/wifitesttool/wifi_hw_test_tool/main.c
@@ -0,0 +1,953 @@
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <sys/stat.h>
+#include "libwifitest.h"
+#include "lib.h"
+#ifdef ANDROID
+#include <cutils/properties.h>
+#include <sys/system_properties.h>
+#endif
+#include <errno.h>
+
+#define PACKAGE "WifiHwTestTool"
+
+char proc_name[256];
+
+typedef enum {
+ WLAN_MODE_OFF,
+ NORMAL_MODE_ON,
+ TEST_MODE_ON
+}WlanStatus;
+
+typedef enum {
+ OPER_NONE,
+ TEST_TX,
+ TEST_RX,
+ READ_EFUSE,
+ WRITE_EFUSE,
+ READ_MCR,
+ WRITE_MCR,
+ TEST_STOP,
+ QUERY_RESULT
+}Oper_Mode;
+
+typedef enum _ENUM_RX_MATCH_RULE_T {
+ RX_MATCH_RULE_DISABLE,
+ RX_MATCH_RULE_RA, /* RA only */
+ RX_MATCH_RULE_TA, /* TA only */
+ RX_MATCH_RULE_RA_TA, /* Both RA and TA */
+ RX_MATCH_RULE_NUM
+} ENUM_RX_MATCH_RULE_T, *P_ENUM_RX_MATCH_RULE_T;
+
+typedef enum _ENUM_FUNCTION_MODE {
+ MODE_DISABLE = 0,
+ MODE_ENABLE
+} ENUM_FUNCTION_MODE_T, *P__ENUM_FUNCTION_MODE_T;
+
+char *bg_rate[] = {
+"RATE_AUTO",
+"RATE_1MBPS",
+"RATE_2MBPS",
+"RATE_5_5MBPS",
+"RATE_6MBPS",
+"RATE_9MBPS",
+"RATE_11MBPS",
+"RATE_12MBPS",
+"RATE_18MBPS",
+"RATE_24MBPS",
+"RATE_36MBPS",
+"RATE_48MBPS",
+"RATE_54MBPS",
+};
+char *preamble[] = {
+"LONG",
+"SHORT",
+};
+char *bandwidth[] = {
+"BW20",
+"BW40",
+"BW20U",
+"BW20L",
+"BW80",
+"BW160"
+};
+
+char *bandwidthV2[] = {
+"BW20",
+"BW40",
+"BW80",
+"BW160"
+};
+
+static void wifi_sensitivity(int, int);
+static void wifi_tx();
+static WlanStatus wifiStatus();
+void wifiTestStop();
+void wifiGetResult();
+
+void signal_handler(int sig)
+{
+ int retval = 0;
+
+ retval = WIFI_TEST_CloseDUT();
+ printf("\n(%d) aborted .., sig=%d\n", retval,sig);
+
+ signal(SIGINT, SIG_DFL);
+ exit(0);
+}
+
+// "E:e:M:g:G:I:B:R:N:T:m:s:p:b:t:hVw:v:l:f :c:rn:"
+
+
+void print_help(int exval)
+{
+ printf("Usage: %s [options]\n", proc_name);
+ printf("\n");
+
+ printf("<Test mode control>\n");
+ printf(" %s -O Enable Wi-Fi test mode\n", proc_name);
+ printf(" %s -C Disable Wi-Fi test mode\n", proc_name);
+ printf("\n");
+
+ printf("<MCR read/write>\n");
+ printf(" %s [-M addr] Read value from CR address\n", proc_name);
+ printf(" %s [-w addr] [-v value] Write value to CR address\n", proc_name);
+ printf("\n");
+
+ printf("<EFUSE read/write>\n");
+ printf(" %s [-E offset] Read value from EFUSE at offset\n", proc_name);
+ printf(" %s [-e offset] [-v value] Write value to EFUSE at offset\n", proc_name);
+ printf("\n");
+
+ printf("<Tx test>\n");
+ printf("A/B/G Mode:\n");
+ printf(" %s [-t 0] [-R legacy rate] [-s preamble] [options]\n", proc_name);
+
+ printf("N Mode:\n");
+ printf(" %s [-t 1] [-N MCS rate] [-g greenfield] [-G SGI] [options]\n", proc_name);
+
+ printf("AC Mode:\n");
+ printf(" %s [-t 2] [-N MCS rate] [-G SGI] [options]\n", proc_name);
+ printf("\n");
+
+ printf("<Rx test>\n");
+ printf(" %s [-r] [-n time] [options]\n", proc_name);
+ printf("\n");
+
+ printf("Common for Tx/Rx:\n");
+ printf(" -c # Central channel number\n");
+ printf(" -b [0~3] RF bandwidth <0:20/1:40/2:80/3:160>Mhz <default 20Mhz>\n");
+ printf(" -P [0~7] Primary channel setting in unit of 20Mhz <default 0>\n");
+ printf(" -B [0~3] Bandwidth <0:20/1:40/2:20U/3:20L>Mhz (Legacy commaand, *deprecated)\n");
+ printf(" -j [0~2] J mode setting <0:disable/1:5Mhz/2:10Mhz>\n");
+ printf(" -d [0/1] Set Rx default antenna <0:main/1:AUX>\n");
+
+ printf(" -S # Test mode <0:non-blocking/others:blocking mode timeout in seconds>\n");
+ printf(" -T Test terminate command for non-blocking test\n");
+ printf(" -a # Blocking mode test result query interval in seconds\n");
+ printf(" -o # Max Tx/Rx packet count in blocking mode test\n");
+
+ printf(" -q Query test result\n");
+
+ printf(" -D Enable debug mode(dump AT command sequence)\n");
+
+ printf(" -f RX Filter type <0:default,Disalbe,1:filter RA>\n");
+ printf(" -A Set RA address on enabling RX Filter. ex:-A 123456789ABC is set mac 12:34:56:78:9A:BC to RA address\n");
+ printf("\n");
+
+ printf("Rx specific:\n");
+ printf(" -n # Test time in seconds.\n");
+ printf("\n");
+
+ printf("Tx specific:\n");
+
+ printf(" -n # TX Packet number, 0 is meaning that TX Packet number = unlimited\n");
+
+ printf(" -t [0/1/2] Tx mode <0:11abg/1:11n/2:11ac>\n");
+ printf(" -x [0~3] Tx bandwidth <0:20/1:40/2:80/3:160>Mhz <default follow RF BW>\n");
+ printf(" -p # Tx gain in dBm\n");
+
+
+
+ printf(" -n # Frame count\n");
+ printf(" -l # Frame length in bytes\n");
+
+ printf(" -R [1~12] Legacy rate code\n");
+ printf(" <1M/2M/5.5M/6M/9M/11M/12M/18M/24M/36M/48M/54M>\n");
+ printf(" -s [0/1] <0:short/1:long> preamble\n");
+
+ printf(" -N [0~15/32] MCS rate index\n");
+ printf(" -g [0/1] <0:mixed mode/1:greenfield> \n");
+ printf(" -G [0/1] <0:normal/1:short> guard interval\n");
+ printf(" -L Enable LDPC <default BCC>\n");
+
+ printf(" -m [0/3] <0:disable/3:enable> continuous waveform mode\n");
+ printf("\n");
+
+ exit(exval);
+}
+
+static int channel = 1;
+static int times = 10;
+//static int numBurst = 0;
+static int txMode = 0;
+static unsigned char macAddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+#define Default_TxGain -1.0
+static float txGain = Default_TxGain;
+static int payloadLength = 1024;
+static int g_rate = 6;
+static ENUM_WIFI_TEST_MCS_RATE gMCSrate = WIFI_TEST_MCS_RATE_0;
+static int g_bandwidth = WIFI_TEST_BW_20MHZ;
+static ENUM_WIFI_TEST_PREAMBLE_TYPE gMode = WIFI_TEST_PREAMBLE_TYPE_MIXED_MODE;
+static ENUM_WIFI_TEST_GI_TYPE giType = WIFI_TEST_GI_TYPE_NORMAL_GI;
+extern char WIFI_IF_NAME[256];
+static WIFI_PreambleType_t pType = WIFI_TEST_PREAMBLE_SHORT;
+static unsigned int mcr_addr = 0;
+static unsigned int mcr_value = 0;
+static unsigned int efuse_addr = 0;
+static int cw_mode = -1;
+static int sleep_time = 10;
+static bool sleepModeSet = false;
+
+static int priSetting = 0;
+static bool isNewBwSet = false;
+static ENUM_WIFI_CHANNEL_BANDWIDTH rfBw = WIFI_TEST_CH_BW_20MHZ;
+static bool isTxBwSet = false;
+static ENUM_WIFI_CHANNEL_BANDWIDTH txBw = WIFI_TEST_CH_BW_20MHZ;
+static int coding = 0; /* BCC */
+static int rxDefaultAnt = 0;
+static int jModeSetting = 0;
+static int printInterval = 1;
+static uint32_t maxPktCount = 0;
+static int user_expect = 0;
+
+static ENUM_RX_MATCH_RULE_T eRxOkMatchRule = RX_MATCH_RULE_DISABLE;
+static bool bRxFilterMacAddrLegalFg = false;
+static unsigned char aucRxFilterMacAddr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+
+#define WIFI_TEST_BW_MAX 5
+
+extern bool fgDebugMode;
+
+int main(int argc, char *argv[])
+{
+ int opt = 0;
+ int result = 0;
+ Oper_Mode operation = OPER_NONE;
+ WlanStatus wlan_status = 0;
+ int band_width[] = {WIFI_TEST_BW_20MHZ, WIFI_TEST_BW_40MHZ,
+ WIFI_TEST_BW_U20MHZ, WIFI_TEST_BW_D20MHZ, WIFI_TEST_BW_80MHZ,
+ WIFI_TEST_BW_160MHZ};
+
+ strncpy(proc_name, argv[0], 255);
+ proc_name[255] = '\0';
+
+ if (argc == 1){
+ fprintf(stderr, "Needs arguments....\n\n");
+ print_help(1);
+ }
+ // set up the Ctrl + C handler
+ signal(SIGINT, signal_handler);
+ while ((opt = getopt(argc, argv, "A:f:E:e:M:g:G:I:B:R:N:Tm:S:s:p:b:t:hVw:v:k:l:f:c:rOCn:DP:x:Ld:j:qa:o")) != -1) {
+ switch(opt) {
+ case 'e':
+ if (operation == OPER_NONE){
+ operation = WRITE_EFUSE;
+ xtoi(optarg, &efuse_addr);
+ }
+ break;
+ case 'E':
+ if (operation == OPER_NONE){
+ operation = READ_EFUSE;
+ xtoi(optarg, &efuse_addr);
+ }
+ break;
+ case 'w':
+ if (operation == OPER_NONE){
+ operation = WRITE_MCR;
+ xtoi(optarg, &mcr_addr);
+ }
+ break;
+ case 'M':
+ if (operation == OPER_NONE){
+ operation = READ_MCR;
+ xtoi(optarg, &mcr_addr);
+ }
+ break;
+ case 'r':
+ if (operation == OPER_NONE)
+ operation = TEST_RX;
+ break;
+ case 't':
+ if (operation == OPER_NONE)
+ operation = TEST_TX;
+ txMode = atoi(optarg);
+ break;
+
+ case 'q':
+ if (operation == OPER_NONE)
+ operation = QUERY_RESULT;
+ break;
+
+ case 'g':
+ gMode = !atoi(optarg) ? WIFI_TEST_PREAMBLE_TYPE_MIXED_MODE:WIFI_TEST_PREAMBLE_TYPE_GREENFIELD;
+ break;
+ case 'G':
+ giType = !atoi(optarg) ? WIFI_TEST_GI_TYPE_NORMAL_GI:WIFI_TEST_GI_TYPE_SHORT_GI;
+ break;
+ case 'I':
+ strncpy(WIFI_IF_NAME, optarg, strlen(WIFI_IF_NAME) - 1);
+ WIFI_IF_NAME[sizeof(WIFI_IF_NAME) - 1] = '\0';
+ break;
+ case 'B':
+ {
+ int index = atoi(optarg);
+ if (index > WIFI_TEST_BW_MAX){
+ printf("not support this band");
+ return -1;
+ }
+ g_bandwidth = band_width[index];
+ break;
+ }
+ case 'N':
+ gMCSrate = atoi(optarg);
+ break;
+ case 'R':
+ g_rate = atoi(optarg);
+ break;
+ case 'p':
+ txGain = strtod(optarg, NULL);
+ break;
+ case 'l':
+ payloadLength = atoi(optarg);
+ break;
+
+ case 'b':
+ rfBw = atoi(optarg);
+ isNewBwSet = true;
+ break;
+
+ case 'j':
+ jModeSetting = atoi(optarg);
+ break;
+
+ case 'P':
+ priSetting = atoi(optarg);
+ break;
+
+ case 'x':
+ txBw = atoi(optarg);
+ isTxBwSet = true;
+ break;
+
+ case 'L':
+ coding = 1;
+ break;
+
+ case 'd':
+ rxDefaultAnt = atoi(optarg);
+ break;
+
+ case 'a':
+ printInterval = atoi(optarg);
+ break;
+
+ case 'o':
+ maxPktCount = atoi(optarg);
+ break;
+
+ case 'h':
+ case ':':
+ print_help(0);
+ break;
+ case 'n':
+ times = atoi(optarg);
+ break;
+ case 'c':
+ channel = atoi(optarg);
+ break;
+ case 'V':
+ break;
+ case 'v':
+ xtoi(optarg, &mcr_value);
+ break;
+ case 's':
+ pType = !atoi(optarg) ? WIFI_TEST_PREAMBLE_SHORT:WIFI_TEST_PREAMBLE_LONG;
+ break;
+ case 'm':
+ cw_mode = atoi(optarg);
+ break;
+ case '?':
+ fprintf(stderr, "%s: Error - No such option: `%c`\r", proc_name, optopt);
+ print_help(1);
+ break;
+ case 'S':
+ sleep_time = atoi(optarg);
+ sleepModeSet = true;
+ break;
+ case 'O':
+ user_expect = 1;
+ break;
+ case 'C':
+ user_expect |= 2;
+ break;
+ case 'T':
+ operation = TEST_STOP;
+ break;
+ case 'D':
+ fgDebugMode = true;
+ break;
+ case 'f':
+ eRxOkMatchRule = atoi(optarg);
+ break;
+ case 'A':
+ result = xtoAddrptr(optarg, aucRxFilterMacAddr);
+ if (!result)
+ {
+ printf("Address format doesn't support\n");
+ return -1;
+ }
+ else
+ {
+ bRxFilterMacAddrLegalFg = true;
+ }
+ break;
+ case 'k':
+ result = xtoAddrptr(optarg, macAddr);
+ if (!result)
+ {
+ printf("Address format doesn't support\n");
+ return -1;
+ }
+ break;
+ }
+ }
+
+ /* Decide RF/Tx bandwidth */
+ if(isNewBwSet) {
+ if(!isTxBwSet) {
+ txBw = rfBw;
+ }
+ else if(txBw > rfBw){
+ txBw = rfBw;
+ }
+ }
+ else if(isTxBwSet) {
+ isNewBwSet = true;
+ rfBw = txBw;
+ }
+
+ /* BW coding check */
+ if((txBw >= WIFI_TEST_CH_BW_NUM) || (rfBw >= WIFI_TEST_CH_BW_NUM)) {
+ printf("Invalid bandwidth setting RF[%u] Tx[%u]", rfBw, txBw);
+ return -1;
+ }
+
+ wlan_status = wifiStatus();
+ switch (wlan_status){
+ case WLAN_MODE_OFF:
+ if ((user_expect & 0x1) == 1){
+ bool ret = false;
+ if ((user_expect & 0x2)==0x2 && operation == OPER_NONE){
+ return 0;
+ }
+ ret = WIFI_TEST_OpenDUT();
+ printf("[%s] Enable Wi-Fi test mode %s\n",
+ WIFI_IF_NAME, ret==true ? "success":"fail");
+ if (ret == true){
+ wlan_status = TEST_MODE_ON;
+ break;
+ }
+ }
+ printf("[%s] Not in test mode, use -O to enable.\n",
+ WIFI_IF_NAME);
+ return 0;
+
+ case TEST_MODE_ON:
+ if ((user_expect & 0x1) == 1)
+ printf("[%s] Already in test mode\n", WIFI_IF_NAME);
+ break;
+
+ case NORMAL_MODE_ON:
+ printf("Please turn off normal mode wlan first!\n");
+ return 0;
+ }
+
+ WIFI_TEST_init();
+
+ /* J mode setting */
+ if(jModeSetting) {
+ bool retval = false;
+ retval = WIFI_TEST_SetJMode(jModeSetting);
+ printf("(%s) Set J mode to %d\n", retval ? "success":"fail",
+ jModeSetting);
+ if (retval == 0) return -1;
+ }
+
+ switch (operation){
+ case WRITE_EFUSE:
+ {
+ bool retval = WIFI_TEST_EFUSE_Write(efuse_addr, mcr_value);
+ printf("(%s) Wirte EFUSE addr 0x%x value 0x%x\n", retval ? "success":"fail", efuse_addr, mcr_value);
+ break;
+ }
+ case READ_EFUSE:
+ {
+ unsigned int val = 0;
+ bool retval = WIFI_TEST_EFUSE_Read(efuse_addr, &val);
+ printf("(%s) EFUSE addr 0x%x value 0x%x\n", retval ? "success":"fail", efuse_addr, val);
+ break;
+ }
+ case WRITE_MCR:
+ {
+ bool retval = WIFI_TEST_MCR_Write(mcr_addr, mcr_value);
+ printf("(%s) MCR addr 0x%x is set to value 0x%x\n", retval ? "success":"fail", mcr_addr, mcr_value);
+ break;
+ }
+ case READ_MCR:
+ {
+ unsigned int val = 0;
+ bool retval = WIFI_TEST_MCR_Read(mcr_addr, &val);
+ printf("(%s) MCR addr 0x%x value 0x%x\n", retval ? "success":"fail", mcr_addr, val);
+ break;
+ }
+ case TEST_RX:
+ {
+ int testDuration;
+
+ if(sleepModeSet) {
+ testDuration = sleep_time;
+ }
+ else {
+ testDuration = times;
+ }
+
+ wifi_sensitivity(testDuration, channel);
+ break;
+ }
+ case TEST_TX:
+ wifi_tx();
+ break;
+ case TEST_STOP:
+ wifiTestStop();
+ break;
+
+ case QUERY_RESULT:
+ wifiGetResult();
+ break;
+
+ default:
+ case OPER_NONE:
+ //printf("not give any operation\n");
+ break;
+ }
+ WIFI_TEST_deinit();
+
+ if ((user_expect & 0x2) == 0x2 && wlan_status == TEST_MODE_ON){
+ int ret = WIFI_TEST_CloseDUT();
+ printf("[%s] Disable Wi-Fi test mode %s\n", WIFI_IF_NAME,
+ ret==true ? "success":"fail");
+ }
+ return 0;
+}
+
+void wifi_sensitivity(int times, int channel)
+{
+ int i, nextInterval;
+ int rxOk, rxErr;
+ int rxRssisFinal;
+ bool retval;
+ bool finalResult = false;
+ bool ret[3];
+
+ retval = WIFI_TEST_Channel(channel);
+ printf("(%s) Set central channel number to %d\n", retval ? "success":"fail",
+ channel);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetRxDefaultAnt(rxDefaultAnt);
+ printf("(%s) Set Rx default antenna to %s\n", retval ? "success":"fail",
+ rxDefaultAnt?"AUX":"main");
+ if (retval == 0) return;
+
+ if(isNewBwSet) {
+ retval = WIFI_TEST_SetBandwidthV2(rfBw);
+ printf("(%s) Set RF bandwidth to %s\n", retval ? "success":"fail",
+ bandwidthV2[rfBw]);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetPriChannelSetting(priSetting);
+ printf("(%s) Set primary channel index to %u\n",
+ retval ? "success":"fail", priSetting);
+ if (retval == 0) return;
+ }
+ else {
+ retval = WIFI_TEST_SetBandwidth(g_bandwidth);
+ printf("(%s) Set bandwidth to %s\n", retval ? "success":"fail",
+ bandwidth[g_bandwidth]);
+ if (retval == 0) return;
+ }
+ if (eRxOkMatchRule == RX_MATCH_RULE_DISABLE) {
+ retval = WIFI_TEST_SetRX(false, NULL, NULL);
+ printf("(%s) Disable RX filter\n", retval ? "success":"fail");
+ } else if (eRxOkMatchRule == RX_MATCH_RULE_RA) {
+ if (bRxFilterMacAddrLegalFg) {
+ retval = WIFI_TEST_SetRX(true, NULL, (char *)aucRxFilterMacAddr);
+ printf("(%s) Enable RX filter, Set RA Address to %02x:%02x:%02x:%02x:%02x:%02x\n", retval ? "success":"fail",
+ aucRxFilterMacAddr[0],
+ aucRxFilterMacAddr[1],
+ aucRxFilterMacAddr[2],
+ aucRxFilterMacAddr[3],
+ aucRxFilterMacAddr[4],
+ aucRxFilterMacAddr[5]
+ );
+ if (retval == 0) return;
+ } else {
+ printf("Enalbe RX filter, need to set RA address\n");
+ return;
+ }
+ } else if (eRxOkMatchRule == RX_MATCH_RULE_TA) {
+ if (bRxFilterMacAddrLegalFg) {
+ retval = WIFI_TEST_SetRX(true, (char *)aucRxFilterMacAddr, NULL);
+ printf("(%s) Enable TA filter, Set TA Address to %02x:%02x:%02x:%02x:%02x:%02x\n", retval ? "success":"fail",
+ aucRxFilterMacAddr[0],
+ aucRxFilterMacAddr[1],
+ aucRxFilterMacAddr[2],
+ aucRxFilterMacAddr[3],
+ aucRxFilterMacAddr[4],
+ aucRxFilterMacAddr[5]
+ );
+ if (retval == 0) return;
+ } else {
+ printf("Enalbe TA filter, need to set TA address\n");
+ return;
+ }
+ }
+
+ retval = WIFI_TEST_RxStart();
+ printf("(%s) RX test started\n", retval ? "success":"fail");
+ if (retval == 0) return;
+
+ nextInterval = printInterval;
+
+ for(i = 0; (i < times) || !finalResult; i += nextInterval) {
+
+ if(i >= times) {
+ finalResult = true;
+ }
+
+ ret[0] = WIFI_TEST_FRGood(&rxOk);
+ ret[1] = WIFI_TEST_FRError(&rxErr);
+ ret[2] = WIFI_TEST_RSSI(&rxRssisFinal);
+ if ((rxOk + rxErr) == 0){
+ fprintf(stdout, "[%3d] (%d)RX OK: %4d / (%d)RX ERR: %4d\n",
+ i, ret[0], rxOk, ret[1], rxErr);
+ }
+ else{
+ fprintf(stdout, "[%3d] (%d)RX OK: %4d / (%d)RX ERR: %4d / PER: %2d .. /"
+ " (%d)RSSI: %i\r\n", i, ret[0], rxOk, ret[1], rxErr,
+ (100 * rxErr)/(rxOk + rxErr), ret[2], (signed char)rxRssisFinal);
+ }
+ fflush(stdout);
+
+ if((times - i) < printInterval) {
+ nextInterval = times - i;
+ }
+
+ if((rxOk + rxErr >= (int)maxPktCount) && maxPktCount) {
+ printf("Rx packet count[%u] >= max count[%u], break!\n",
+ rxOk + rxErr, maxPktCount);
+ break;
+ }
+
+ sleep(nextInterval);
+ }
+
+ if (times == 0) {
+ printf("Rx test is running! use -T to stop Rx test...\n");
+ }
+ else {
+ retval = WIFI_TEST_RxStop();
+ }
+}
+
+void wifi_tx(void)
+{
+ bool retval;
+ bool finalResult = false;
+
+ WIFI_TEST_TxDestAddress(macAddr);
+
+ retval = WIFI_TEST_Channel(channel);
+ printf("(%s) Set central channel number to %d\n", retval ? "success":"fail",
+ channel);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetRxDefaultAnt(rxDefaultAnt);
+ printf("(%s) Set Rx default antenna to %s\n", retval ? "success":"fail",
+ rxDefaultAnt?"AUX":"main");
+ if (retval == 0) return;
+
+ if(isNewBwSet) {
+ retval = WIFI_TEST_SetBandwidthV2(rfBw);
+ printf("(%s) Set RF bandwidth to %s\n", retval ? "success":"fail",
+ bandwidthV2[rfBw]);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetTxBandwidth(txBw);
+ printf("(%s) Set Tx bandwidth to %s\n", retval ? "success":"fail",
+ bandwidthV2[txBw]);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetPriChannelSetting(priSetting);
+ printf("(%s) Set primary channel index to %u\n",
+ retval ? "success":"fail", priSetting);
+ if (retval == 0) return;
+ }
+ else {
+ retval = WIFI_TEST_SetBandwidth(g_bandwidth);
+ printf("(%s) Set bandwidth to %s\n", retval ? "success":"fail",
+ bandwidth[g_bandwidth]);
+ if (retval == 0) return;
+ }
+
+ // if txGain = Default_TxGain, then use NVRAM tx pwr setting
+ if(txGain != Default_TxGain){
+ retval = WIFI_TEST_TxGain(txGain);
+ printf("(%s) Set Tx power gain to %.2f dBm\n", retval ? "success":"fail",
+ txGain);
+ if (retval == 0) return;
+ }
+ else{
+ printf("(success) Set Tx power gain by NVRAM Setting\n");
+ }
+
+ retval = WIFI_TEST_TxPayloadLength(payloadLength);
+ printf("(%s) Set Tx payload to %d bytes..\n", retval ? "success":"fail", payloadLength);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_DPD_MODE(MODE_DISABLE);
+ printf("(%s) Disable DPD\n", retval ? "success":"fail");
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_TEMP_COMPEN_MODE(MODE_DISABLE);
+ printf("(%s) Disable TEMP_COMP\n", retval ? "success":"fail");
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_TX_POWER_MODE(MODE_DISABLE);
+ printf("(%s) TX power mode 0\n", retval ? "success":"fail");
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_TxBurstFrames(times);
+ printf("(%s) Set frame count to %d \n", retval ? "success":"fail", times);
+ if (retval == 0) return;
+
+ switch(txMode) {
+ case 0: /* A/B/G mode */
+ retval = WIFI_TEST_SetPreamble(pType);
+ printf("(%s) Set %s preamble\n", retval ? "success":"fail", preamble[pType]);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_TxDataRate(g_rate);
+ printf("(%s) Set Tx mode to 11a/b/g, tx rate %s\n", retval ? "success":"fail", bg_rate[g_rate]);
+ if (retval == 0) return;
+ break;
+
+ case 1: /* N mode */
+ retval = WIFI_TEST_TxDataRate11n(gMCSrate, gMode, giType);
+ printf("(%s) Set Tx mode to 11n, MCS%u, %s, %s GI, %s\n", retval ? "success":"fail",
+ gMCSrate, gMode?"greenfield":"mixed-mode", giType?"Short":"Normal",
+ coding?"LDPC":"BCC");
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetTxCodingMode(coding);
+ if (retval == 0) return;
+
+ break;
+
+ case 2: /* AC mode */
+ retval = WIFI_TEST_TxDataRate11ac(gMCSrate, giType);
+ printf("(%s) Set Tx mode to 11ac MCS%u, %s GI, %s\n", retval ? "success":"fail",
+ gMCSrate, giType?"Short":"Normal", coding?"LDPC":"BCC");
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_SetTxCodingMode(coding);
+ if (retval == 0) return;
+
+ break;
+
+ default:
+ printf("Unsupported Tx mode[%u]!\n", txMode);
+ return;
+ }
+
+ //for CW mode
+ if(-1 != cw_mode){
+ retval = WIFI_TEST_CW_MODE(cw_mode);
+ printf("(%s) cw mode set to %d\n", retval ? "success":"fail", cw_mode);
+ if (retval == 0) return;
+
+ retval = WIFI_TEST_CW_MODE_START();
+ printf("(%s) cw mode start.\n", retval ? "success":"fail");
+ if (retval == 0) return;
+ }else{
+ printf("no cw mode configuration.\n");
+ retval = WIFI_TEST_TxStart();
+ printf("(%s) TX test started..\n", retval ? "success":"fail");
+ if (retval == 0) return;
+ }
+
+ if (sleep_time == 0) {
+ printf("Tx test is running! use -T to stop Tx test...\n");
+ return;
+ }
+ else {
+ int i, nextInterval;
+ uint32_t u4TxOk, u4Tx;
+
+ nextInterval = printInterval;
+
+ printf("Tx test is running! wait for %us...\n", sleep_time);
+
+ for(i = 0; (i < sleep_time) || !finalResult; i += nextInterval) {
+ if(i >= sleep_time) {
+ finalResult = true;
+ }
+
+ retval = WIFI_TEST_TxCount(&u4Tx);
+ retval = WIFI_TEST_TxGoodCount(&u4TxOk);
+
+ if(retval == 0) {
+ printf("(%s) Cannot get test result!\n", retval ?"success":"fail");
+ }
+ else {
+ printf("[%u] Tx total/good count: %u/%u\n", i, u4Tx, u4TxOk);
+ }
+
+ if(i >= sleep_time) {
+ break;
+ }
+
+ if((u4Tx >= maxPktCount) && maxPktCount) {
+ printf("Tx packet count[%u] >= max count[%u], break!\n",
+ u4Tx, maxPktCount);
+ break;
+ }
+
+ if((sleep_time - i) < printInterval) {
+ nextInterval = (sleep_time - i);
+ }
+
+ sleep(nextInterval);
+ }
+
+ printf("Stop Tx test!\n");
+ }
+
+ retval = WIFI_TEST_TxStop();
+}
+
+void wifiGetResult(void) {
+ uint32_t u4RxOk, u4RxFailed, u4Rssi;
+ uint32_t u4TxOk, u4Tx;
+ bool retval;
+
+ do {
+
+ retval = WIFI_TEST_FRGood((int*)&u4RxOk);
+ if (retval == 0) break;
+
+ retval = WIFI_TEST_FRError((int*)&u4RxFailed);
+ if (retval == 0) break;
+
+ retval = WIFI_TEST_RSSI((int*)&u4Rssi);
+ if (retval == 0) break;
+
+ retval = WIFI_TEST_TxCount(&u4Tx);
+ if (retval == 0) break;
+
+ retval = WIFI_TEST_TxGoodCount(&u4TxOk);
+ if (retval == 0) break;
+
+ } while(false);
+
+ if(retval == 0) {
+ printf("(%s) Cannot get test result!\n", retval ?"success":"fail");
+ }
+ else {
+ printf("Tx total/good count: %u/%u\n", u4Tx, u4TxOk);
+ printf("Rx good/err count: %u/%u PER: %u RSSI:%i\n", u4RxOk, u4RxFailed,
+ (100 * u4RxFailed)/(u4RxOk + u4RxFailed), (signed char)u4Rssi);
+ }
+}
+
+void wifiTestStop(void){
+ bool retval = WIFI_TEST_TxStop();
+ printf("(%s) stop Tx\n", retval ? "success":"fail");
+
+ retval = WIFI_TEST_RxStop();
+ printf("(%s) stop Rx\n", retval ? "success":"fail");
+}
+
+/* if wlan.driver.status is ok, then wlan normal mode is on
+ if /sys/class/net/wlan0 is not exist, then wlan is off
+ otherwise, we think the wlan may be turned on by us */
+static WlanStatus wifiStatus(void){
+#ifdef ANDROID
+ char driver_status[PROP_VALUE_MAX];
+ bool normal_mode_on = false;
+ char netdevPath[256];
+
+ struct stat buf;
+ property_get("wlan.driver.status", driver_status, "unloaded");
+ if (strncmp(driver_status, "ok", 2) == 0){
+ normal_mode_on = true;
+ }
+
+ snprintf(netdevPath, 255, "/sys/class/net/%s", WIFI_IF_NAME);
+
+ if (stat(netdevPath, &buf) < 0 && errno==ENOENT)
+ return WLAN_MODE_OFF;
+ return normal_mode_on ? NORMAL_MODE_ON:TEST_MODE_ON;
+#else
+ bool normal_mode_on = false;
+ char netdevPath[256];
+ struct stat buf;
+
+ snprintf(netdevPath, 255, "/sys/class/net/%s", WIFI_IF_NAME);
+
+ if (stat(netdevPath, &buf) < 0 && errno==ENOENT)
+ return WLAN_MODE_OFF;
+
+ return TEST_MODE_ON;
+#endif
+}