blob: 0aecd40d095e5ec42a40c4d88f52f009c6a47cee [file] [log] [blame]
/**
*
* @file amt_wifi_test.c
* @brief
* This file is part of FTM.
* AMT´úÀíÓ¦Óòã
*
* @details
* @author Tools Team.
* @email
* @copyright Copyright (C) 2013 Sanechips Technology Co., Ltd.
* @warning
* @date 2019/02/02
* @version 1.1
* @pre
* @post
*
* @par
* Change History :
* ---------------------------------------------------------------------------
* date version author description
* ---------------------------------------------------------------------------
* 2015/04/28 1.0 lu.xieji Create file
* 2019/02/02 1.1 jiang.fenglin ÐÞ¸Ä×¢ÊÍ·½Ê½Îªdoxygen
* ---------------------------------------------------------------------------
*
*
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "amt.h"
#define MAX_CMD_BUFFER_LENGTH 256
#define MAX_RECV_BUFFER_LENGTH 2048
//static char g_CmdBuffer[MAX_CMD_BUFFER_LENGTH];
//static char g_RecvBuffer[MAX_RECV_BUFFER_LENGTH];
/**
* @brief AMT²âÊÔWIFI³õʼ»¯
* @return ³É¹¦·µ»Ø0, ʧ°Ü·µ»Ø-1
* @note
* @see
*/
int Amt_Wifi_Init(void)
{
return 0;
}
int wifi_ioctl_handle(int cmd)
{
int fd = -1;
int ret = 0;
fd = open("/dev/wifi_device", O_RDWR);
if (fd < 0)
return -1;
ret = ioctl(fd, cmd);
if (ret < 0)
printf("ioctl wifi_device err:%d\n", ret);
close(fd);
return ret;
}
/**
* @brief AMT´¦ÀíWIFIÏûÏ¢º¯Êý
* @param[in] msg_id FID
* @param[in] msg_buf ½ÓÊÕÊý¾Ýbuffer
* @param[in] msg_len ½ÓÊÕÊý¾Ýbuffer³¤¶È
* @return ³É¹¦·µ»Ø0, ʧ°Ü·µ»Ø-1
* @note
* @see
*/
int Amt_Wifi_ProcessMsg(unsigned int msg_id, unsigned char* msg_buf, unsigned int msg_len)
{
char*pCmdBuffer = malloc(MAX_CMD_BUFFER_LENGTH);
if (pCmdBuffer == NULL)
{
AmtPrintf(AMT_ERROR "%s: malloc pCmdBuffer failure.\n", __FUNCTION__);
return -1;
}
char*pRecvBuffer = malloc(MAX_RECV_BUFFER_LENGTH);
if (pRecvBuffer == NULL)
{
AmtPrintf(AMT_ERROR "%s: malloc pRecvBuffer failure.\n", __FUNCTION__);
free(pCmdBuffer);
return -1;
}
memcpy(pCmdBuffer, msg_buf, msg_len);
pCmdBuffer[msg_len] = '\0';
memset(pRecvBuffer, 0, MAX_RECV_BUFFER_LENGTH);
AmtPrintf(AMT_INFO "%s: cmd=%s.\n", __FUNCTION__, pCmdBuffer);
// sv6158 load firmware
if ((strcmp(pCmdBuffer, "insmod ./lib/modules/3.4.110-rt140/kernel/drivers/net/wireless/ssv6x5x/ssv6x5x.ko stacfgpath=/etc/firmware/ssv6x5x-wifi.cfg") == 0)||
(strcmp(pCmdBuffer, "insmod ./lib/modules/3.4.110-rt140/kernel/drivers/net/wireless/ssv6x5x/prealloc/ssv6xxx_prealloc_skb.ko") == 0)||
(strcmp(pCmdBuffer, "insmod ./lib/modules/3.4.110-rt140/kernel/drivers/net/wireless/ssv6x5x/ssv6x5x_host/ssv6x5x.ko stacfgpath=/etc/firmware/ssv6x5x-wifi.cfg") == 0))
{
static int load_flag = 0;
AmtPrintf(AMT_INFO "%s: recv insmod cmd=%s.\n", __FUNCTION__, pCmdBuffer);
if(load_flag == 0)
{
int ret = wifi_ioctl_handle(1);
load_flag = 1;
if(ret < 0)
{
AmtPrintf(AMT_ERROR "%s: load sv6158 firmware fail! ret=%d.\n", __FUNCTION__, ret);
free(pCmdBuffer);
free(pRecvBuffer);
return -1;
}
else
{
if (Amt_CreateResponse(msg_id, &ret, sizeof(ret)) == -1)
{
AmtPrintf(AMT_ERROR "%s: Send data failure.\n", __FUNCTION__);
}
else
{
AmtPrintf(AMT_INFO "%s: Send data success.\n", __FUNCTION__);
}
free(pCmdBuffer);
free(pRecvBuffer);
return 0;
}
}
else
{
free(pCmdBuffer);
free(pRecvBuffer);
return 0;
}
}
int read_len = Amt_ExecuteCmd(pCmdBuffer, pRecvBuffer, MAX_RECV_BUFFER_LENGTH);
if (read_len > 0)
{
// Ç¿ÖÆÔö¼Ó½áÊø·û
pRecvBuffer[MAX_RECV_BUFFER_LENGTH - 1] = '\0';
// Broadcom
if (strcmp(pCmdBuffer, "wl counters") == 0)
{
char pRxStr[] = "pktengrxdmcast";
char *ptr = strstr(pRecvBuffer, pRxStr);
if (ptr != NULL)
{
int packetsNum = 0;
sscanf(ptr, "%*[^ ]%d", &packetsNum);
memcpy(pRecvBuffer, &packetsNum, sizeof(packetsNum));
read_len = sizeof(packetsNum);
}
else
{
AmtPrintf(AMT_ERROR "%s: Can not find \"%s\".\n", __FUNCTION__, pRxStr);
free(pCmdBuffer);
free(pRecvBuffer);
return -1;
}
}
if (Amt_CreateResponse(msg_id, (unsigned char*)pRecvBuffer, read_len) == -1)
{
AmtPrintf(AMT_ERROR "%s: Send data failure.\n", __FUNCTION__);
}
else
{
AmtPrintf(AMT_INFO "%s: Send data success.\n", __FUNCTION__);
}
}
else
{
AmtPrintf(AMT_INFO "%s: no return.\n", __FUNCTION__);
}
free(pCmdBuffer);
free(pRecvBuffer);
return 0;
}