SmartAudio/package/utils/rftest/realtek/rtwpriv.cpp

325 lines
9.9 KiB
C++
Executable File

/******************************************************************************
*
* Copyright(c) 2007 - 2018 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*****************************************************************************/
#include "rtwpriv.h"
#include "rtw_api.h"
int main(int argc, char *argv[]) {
PRT_PMAC_TX_INFO pPMacTxInfo;
RT_PMAC_TX_INFO MyPMacTxInfo;
u8 UnicastDID[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
u16 CurrentAntenna;
u8 PktPattern = 0x00;
char *ifname, *incmd;
int inRate = 11, inBW = 0 ,inCH = 1 ,txmode = 1, psd_len = 256, pktlen = 1500, pktcount = 0, pktPeriod = 100;
//const char* rtw_pmact_version[] = {"v2.0"};
int skfd, err = 0;
char input[BUF_SIZE];
char input_arg[BUF_SIZE];
char copy_input[BUF_SIZE];
char setmpchar[]={"mp_hxtx "};
char setmp_rate[32] = {"mp_rate"};
char setmp_ch[32] = {"mp_channel"};
char setmp_bw[32] = {"mp_bandwidth 40M="};
char setmp_ant[32] = {"mp_ant_tx "};
char cmdbuf[64];
UCHAR tmpU1B, Idx;
int i = 0;
pPMacTxInfo = &MyPMacTxInfo;
pPMacTxInfo->bEnPMacTx = TRUE;
//Chack input parameter , wlan0 CH BW TxMode rateID
if (argc < 6) {
if (argc > 2) {
if (strncmp(argv[2], "stop", 4) == 0) {
DBG("#####Stop HW TX mode!!!#####\n");
pPMacTxInfo->bEnPMacTx = FALSE;
} else if (strncmp(argv[2], "ver", 3) == 0) {
printf("rtwpriv version:%s\n",RTWPRIVE_VERSION);
return err;
} else if ((strncmp(argv[2], "?", 1) == 0) || (strncmp(argv[2], "help", 4) == 0)) {
printf("rtwpriv version:%s\n",RTWPRIVE_VERSION);
rtw_help();
return err;
} else if (strncmp(argv[2], "mp_psd_analysis", 15) == 0) {
ifname = argv[1];
incmd = argv[2];
if(argv[3]!=NULL)
psd_len = atoi(argv[3]);
psd_analysis(ifname, incmd, psd_len);
return err;
} else {
if (argc < 3) {
printf("rtwpriv version:%s\n",RTWPRIVE_VERSION);
printf("ioctl no enough parameters!\n");
return -EINVAL;
}
ifname = argv[1];
sprintf(input, "%s", argv[2]);
for (i=3; i<argc; i++) {
sprintf(input_arg, "%s %s", input, argv[i]);
strcpy(input, input_arg);
}
//DBG("ifname = %s\n", ifname);
//DBG("input = %s\n", input);
/* decision for use old iwreq to send*/
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, input, strlen(input)+1);
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", argv[2], strerror(errno));
} else {
if (strlen(input) != 0)
printf("%-8.16s %s:%s\n", ifname, argv[2], input);
}
return err;
}
} else {
if (argc > 1) {
if ((strncmp(argv[1], "-v", 2) == 0) || (strncmp(argv[1], "v", 1) == 0))
printf("rtwpriv version:%s\n",RTWPRIVE_VERSION);
else{
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error\n");
fprintf(stderr, "%s: %s\n", argv[2], strerror(errno));
return -EINVAL;
}
} else
rtw_help();
return err;
}
} else {
if (argc > 2)
inCH = atoi(argv[2]);
if (inCH > 177 || inCH < 0) {
//rtw_help();
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error, channel \n");
return -EINVAL;
}
if (argc > 3)
inBW = atoi(argv[3]);
if (inBW > 3 || inBW <0) {
rtw_help();
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error, bandwidth\n");
return -EINVAL;
}
if (argc > 4)
CurrentAntenna = rtw_ant_strpars(argv[4]);
if (argc > 5)
inRate = rtw_mpRateParseFunc(argv[5]); //parsing string for get Rate ID index.
if (argc > 6)
txmode = atoi(argv[6]);
else {
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error\n");
return -EINVAL;
}
if (txmode >= 4 || txmode <= 0) {
rtw_help();
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error\n");
return -EINVAL;
}
if (argc > 7) {
pktPeriod = atoi(argv[7]);
printf("config packet Period =%d\n", pktPeriod);
}
if (argc > 8) {
pktlen = atoi(argv[8]);
printf("config packet length =%d\n", pktlen);
if (pktlen <= 100) {
fprintf(stderr, "Interface doesn't accept private ioctl... pktlen <= 100 parameter Error\n");
return -EINVAL;
}
}
if (argc > 9) {
pktcount = atoi(argv[9]);
printf("config packet count =%d\n", pktcount);
}
if (argc > 10) {
int i = atoi(argv[10]);
if(i <= 255) {
PktPattern = strtol(argv[10], NULL, 16);
} else {
rtw_help();
fprintf(stderr, "Interface doesn't accept private ioctl...parameter Error\n");
return -EINVAL;
}
}
}
ifname = argv[1]; // Wlan interface
// Parsing Config File for get setting.
if (Read_Parsing_file(&MyPMacTxInfo, &CurrentAntenna, UnicastDID) != 1) {
u16 umac[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
DBG("No rtw_Config.txt File, Use Default Setting for PMACT \n");
pPMacTxInfo->TX_SC = 0;
pPMacTxInfo->bSTBC = FALSE;
pPMacTxInfo->bLDPC = FALSE;
pPMacTxInfo->bSPreamble = FALSE;
pPMacTxInfo->bSGI = FALSE;
// Packet NDP
pPMacTxInfo->NDP_sound = FALSE;
// Packet Period
pPMacTxInfo->PacketPeriod = pktPeriod;
// Packet Pattern
if (PktPattern != 0x00)
pPMacTxInfo->PacketPattern = PktPattern;
else
pPMacTxInfo->PacketPattern = randomByte();
DBG("PacketPattern = %x\n", pPMacTxInfo->PacketPattern);
// Packet Count
pPMacTxInfo->PacketCount = pktcount;
// Packet Length
pPMacTxInfo->PacketLength = pktlen;
// Mac Address
memcpy(pPMacTxInfo->MacAddress, umac, 6);
}
for (i = 0; i < argc; i++) {
DBG("argv[%d] = %s\n", i, argv[i]);
}
if (pPMacTxInfo->bEnPMacTx != FALSE) {
pPMacTxInfo->TX_RATE = HwRateToMPTRate(inRate);;
if (inBW > 3 || inBW < 0)
pPMacTxInfo->BandWidth = 0;
else
pPMacTxInfo->BandWidth = inBW;
if (inCH > 168 || inCH < 0)
inCH = 36;
if (txmode == 1)
pPMacTxInfo->Mode = PACKETS_TX;
else if (txmode == 2)
pPMacTxInfo->Mode = CONTINUOUS_TX;
else if (txmode == 3)
pPMacTxInfo->Mode = OFDM_Single_Tone_TX;
else
pPMacTxInfo->Mode = PACKETS_TX;
/* Ioctrl Set Rate */
sprintf( cmdbuf, "%s %d", setmp_rate ,inRate);
DBG("cmdbuf= %s\n", cmdbuf);
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, cmdbuf, strlen(cmdbuf)+1); //ioctrl for set mp_rate
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", ifname, strerror(errno));
return -1;
}
/* Ioctrl Set Antenna */
sprintf( cmdbuf, "%s%s", setmp_ant, argv[4]);
DBG("cmdbuf= %s\n", cmdbuf);
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, cmdbuf, strlen(cmdbuf)+1); //ioctrl for set mp_ant_tx
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", ifname, strerror(errno));
return -1;
}
/* Ioctrl Set Bandwidth */
memset(cmdbuf, 0, sizeof(cmdbuf));
sprintf( cmdbuf, "%s%d", setmp_bw ,inBW);
DBG("cmdbuf= %s %d\n", cmdbuf, strlen(cmdbuf));
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, cmdbuf, strlen(cmdbuf)+1); //ioctrl for set mp_bandwidth
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", ifname, strerror(errno));
return -1;
}
/* Ioctrl Set CHannel */
memset(cmdbuf, 0, sizeof(cmdbuf));
sprintf( cmdbuf, "%s %d", setmp_ch ,inCH);
DBG("cmdbuf= %s %d\n", cmdbuf, strlen(cmdbuf));
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, cmdbuf, strlen(cmdbuf)+1); //ioctrl for set mp_channel
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", ifname, strerror(errno));
return -1;
}
memcpy(pPMacTxInfo->MacAddress, UnicastDID, 6);
pPMacTxInfo->Ntx = 0;
for(Idx = 16; Idx < 20; Idx++)
{
tmpU1B = (CurrentAntenna >> Idx) & 1;
if(tmpU1B)
pPMacTxInfo->Ntx++;
}
DBG("pPMacTxInfo->Ntx =%d\n",pPMacTxInfo->Ntx);
memcpy(input, &MyPMacTxInfo, sizeof(RT_PMAC_TX_INFO));
//dump_buf(input, sizeof(RT_PMAC_TX_INFO));
PMAC_Notify(pPMacTxInfo);
DBG("SGI %d bSPreamble %d bSTBC %d bLDPC %d NDP_sound %d\n", pPMacTxInfo->bSGI, pPMacTxInfo->bSPreamble, pPMacTxInfo->bSTBC, pPMacTxInfo->bLDPC, pPMacTxInfo->NDP_sound);
DBG("TXSC %d BandWidth %d PacketPeriod %d PacketCount %u PacketLength %u PacketPattern %d\n", pPMacTxInfo->TX_SC, pPMacTxInfo->BandWidth, pPMacTxInfo->PacketPeriod, pPMacTxInfo->PacketCount,pPMacTxInfo->PacketLength, pPMacTxInfo->PacketPattern);
#ifdef RTWDEBUG
PRINT_DATA((char *)"LSIG ", pPMacTxInfo->LSIG, 3);
PRINT_DATA((char *)"HT_SIG", pPMacTxInfo->HT_SIG, 6);
PRINT_DATA((char *)"VHT_SIG_A", pPMacTxInfo->VHT_SIG_A, 6);
PRINT_DATA((char *)"VHT_SIG_B", pPMacTxInfo->VHT_SIG_B, 4);
DBG("VHT_SIG_B_CRC %x\n", pPMacTxInfo->VHT_SIG_B_CRC);
PRINT_DATA((char *)"VHT_Delimiter", pPMacTxInfo->VHT_Delimiter, 4);
//PRINT_DATA("Src Address", Adapter->mac_addr, 6);
PRINT_DATA((char *)"Dest Address", pPMacTxInfo->MacAddress, 6);
#endif
}
memcpy(copy_input, setmpchar, strlen(setmpchar));
memcpy(copy_input + strlen(setmpchar), (void *)&MyPMacTxInfo, sizeof(RT_PMAC_TX_INFO));
/* check the driver for new feature support */
skfd = iw_sockets_open();
err = wlan_ioctl_mp(skfd, ifname, copy_input, sizeof(RT_PMAC_TX_INFO) + 9);
iw_sockets_close(skfd);
if (err < 0) {
fprintf(stderr, "Interface doesn't accept private ioctl...\n");
fprintf(stderr, "%s: %s\n", argv[2], strerror(errno));
} else {
if (strlen(copy_input) != 0)
printf("%-8.16s %s:%s\n", ifname, argv[2], copy_input);
}
return err;
}