#include #include #include #include #include #include #include #include #define WIFI_DRIVER_FW_PATH "sta" #define WIFI_DRIVER_MODULE_NAME "rwnx_fdrv" #define WIFI_DRIVER_MODULE_PATH "/vendor/modules/rwnx_fdrv.ko" #define MAX_DRV_CMD_SIZE 1536 #define TXRX_PARA SIOCDEVPRIVATE+1 static const char IFACE_DIR[] = ""; static const char DRIVER_MODULE_NAME[] = "rwnx_fdrv"; static const char DRIVER_MODULE_TAG[] = WIFI_DRIVER_MODULE_NAME " "; static const char DRIVER_MODULE_PATH[] = WIFI_DRIVER_MODULE_PATH; static const char DRIVER_MODULE_ARG[] = ""; static const char FIRMWARE_LOADER[] = ""; static const char DRIVER_PROP_NAME[] = "wlan.driver.status"; #ifndef TEMP_FAILURE_RETRY #define TEMP_FAILURE_RETRY(expression) \ (__extension__ \ ({ long int __result; \ do __result = (long int) (expression); \ while (__result == -1L && errno == EINTR); \ __result; })) #endif typedef struct android_wifi_priv_cmd { char *buf; int used_len; int total_len; } android_wifi_priv_cmd; int wifi_send_cmd_to_net_interface(const char* if_name, int argC, char *argV[]) { int sock; struct ifreq ifr; int ret = 0; int i = 0; char buf[MAX_DRV_CMD_SIZE]; struct android_wifi_priv_cmd priv_cmd; char is_param_err = 0; int buf_len = 0; sock = socket(PF_INET, SOCK_DGRAM, 0); if (sock < 0) { printf("bad sock!\n"); return -1; } memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, if_name); if (ioctl(sock, SIOCGIFFLAGS, &ifr) != 0) { printf("%s Could not read interface %s flags: %s",__func__, if_name, strerror(errno)); return -1; } if (!(ifr.ifr_flags & IFF_UP)) { printf("%s is not up!\n",if_name); return -1; } // printf("ifr.ifr_name = %s\n", ifr.ifr_name); memset(&priv_cmd, 0, sizeof(priv_cmd)); memset(buf, 0, sizeof(buf)); for(i=2; i> 16) & 0x0000ffff); } else if (strcasecmp(argV[2], "GET_VENDOR_INFO") == 0) { printf("done: get_vendor_info = 0x%x\n", *(unsigned char *)&priv_cmd.buf[0]); } else if (strcasecmp(argV[2], "RDWR_PWRMM") == 0) { printf("done: txpwr manual mode = %x\n", *(unsigned int *)&priv_cmd.buf[0]); } else if (strcasecmp(argV[2], "RDWR_PWRIDX") == 0) { char *buff = &priv_cmd.buf[0]; printf("done:\n" "txpwr index 2.4g:\n" " [0]=%d(ofdmlowrate)\n" " [1]=%d(ofdmhighrate)\n" " [2]=%d(ofdm1024qam)\n" " [3]=%d(dsss)\n", buff[0], buff[1], buff[2], buff[3]); printf("txpwr index 5g:\n" " [0]=%d(ofdmlowrate)\n" " [1]=%d(ofdmhighrate)\n" " [2]=%d(ofdm1024qam)\n", buff[4], buff[5], buff[6]); } else if (strcasecmp(argV[2], "RDWR_PWROFST") == 0) { char *buff = &priv_cmd.buf[0]; printf("done:\n" "txpwr offset 2.4g:\n" " [0]=%d(ch1~4)\n" " [1]=%d(ch5~9)\n" " [2]=%d(ch10~13)\n", buff[0], buff[1], buff[2]); printf("txpwr offset 5g:\n" " [0]=%d(ch36~64)\n" " [1]=%d(ch100~120)\n" " [2]=%d(ch122~140)\n" " [3]=%d(ch142~165)\n", buff[3], buff[4], buff[5], buff[6]); } else if (strcasecmp(argV[2], "RDWR_DRVIBIT") == 0) { char *buff = &priv_cmd.buf[0]; int idx = 0; printf("done: 2.4g txgain tbl pa drv_ibit:\n"); for (idx = 0; idx < 16; idx++) { printf(" %x", buff[idx]); if (!((idx + 1) & 0x03)) { printf(" [%x~%x]\n", idx - 3, idx); } } } else if (strcasecmp(argV[2], "RDWR_EFUSE_PWROFST") == 0) { char *buff = &priv_cmd.buf[0]; printf("done:\n" "efuse txpwr offset 2.4g:\n" " [0]=%d(ch1~4)\n" " [1]=%d(ch5~9)\n" " [2]=%d(ch10~13)\n", buff[0], buff[1], buff[2]); printf("efuse txpwr offset 5g:\n" " [0]=%d(ch36~64)\n" " [1]=%d(ch100~120)\n" " [2]=%d(ch122~140)\n" " [3]=%d(ch142~165)\n", buff[3], buff[4], buff[5], buff[6]); } else if (strcasecmp(argV[2], "RDWR_EFUSE_DRVIBIT") == 0) { printf("done: efsue 2.4g txgain tbl pa drv_ibit: %x\n", priv_cmd.buf[0]); } else { printf("done\n"); } return ret; } int main(int argC, char *argV[]) { char* ins = "insmod"; char* rm = "rmmod"; char* ko = "rwnx_fdrv.ko"; // printf("enter!!!AIC argC=%d argV[0]=%s argV[1]=%s argV[2]=%s\n", argC, argV[0], argV[1],argV[2]); if(argC >= 3) wifi_send_cmd_to_net_interface(argV[1], argC, argV); else printf("Bad parameter! %d\n",argC); return 0; }