forked from xuos/xiuos
				
			
		
			
				
	
	
		
			427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
* Copyright (c) 2020 AIIT XUOS Lab
 | 
						|
* XiUOS is licensed under Mulan PSL v2.
 | 
						|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
						|
* You may obtain a copy of Mulan PSL v2 at:
 | 
						|
*        http://license.coscl.org.cn/MulanPSL2
 | 
						|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
						|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
						|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
						|
* See the Mulan PSL v2 for more details.
 | 
						|
*/
 | 
						|
 | 
						|
/**
 | 
						|
 * @file adapter_wifi.c
 | 
						|
 * @brief Implement the connection wifi adapter function
 | 
						|
 * @version 1.1
 | 
						|
 * @author AIIT XUOS Lab
 | 
						|
 * @date 2021.07.25
 | 
						|
 */
 | 
						|
 | 
						|
#include <adapter.h>
 | 
						|
#include "adapter_wifi.h"
 | 
						|
 | 
						|
#ifdef ADAPTER_HFA21_WIFI
 | 
						|
extern AdapterProductInfoType Hfa21WifiAttach(struct Adapter *adapter);
 | 
						|
#endif
 | 
						|
#ifdef ADAPTER_ESP07S_WIFI
 | 
						|
extern AdapterProductInfoType Esp07sWifiAttach(struct Adapter *adapter);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef ADAPTER_ESP8285_WIFI
 | 
						|
extern AdapterProductInfoType Esp8285WifiAttach(struct Adapter *adapter);
 | 
						|
#endif
 | 
						|
 | 
						|
static int AdapterWifiRegister(struct Adapter *adapter)
 | 
						|
{
 | 
						|
    int ret = 0;
 | 
						|
 | 
						|
    strncpy(adapter->name, ADAPTER_WIFI_NAME, NAME_NUM_MAX);
 | 
						|
 | 
						|
    adapter->net_protocol = IP_PROTOCOL;
 | 
						|
    adapter->adapter_status = UNREGISTERED;
 | 
						|
 | 
						|
    ret = AdapterDeviceRegister(adapter);
 | 
						|
    if (ret < 0) {
 | 
						|
        printf("AdapterWifi register error\n");
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
int AdapterWifiInit(void)
 | 
						|
{
 | 
						|
    int ret = 0;
 | 
						|
 | 
						|
    struct Adapter *adapter = PrivMalloc(sizeof(struct Adapter));
 | 
						|
    if (!adapter) {
 | 
						|
        printf("AdapterWifiInit malloc error\n");
 | 
						|
        PrivFree(adapter);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    memset(adapter, 0, sizeof(struct Adapter));
 | 
						|
 | 
						|
    ret = AdapterWifiRegister(adapter);
 | 
						|
    if (ret < 0) {
 | 
						|
        printf("AdapterWifiInit register wifi adapter error\n");
 | 
						|
        PrivFree(adapter);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef ADAPTER_HFA21_WIFI
 | 
						|
    AdapterProductInfoType product_info = Hfa21WifiAttach(adapter);
 | 
						|
    if (!product_info) {
 | 
						|
        printf("AdapterWifiInit hfa21 attach error\n");
 | 
						|
        PrivFree(adapter);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    adapter->product_info_flag = 1;
 | 
						|
    adapter->info = product_info;
 | 
						|
    adapter->done = product_info->model_done;
 | 
						|
 | 
						|
#endif
 | 
						|
#ifdef ADAPTER_ESP07S_WIFI
 | 
						|
    AdapterProductInfoType product_info = Esp07sWifiAttach(adapter);
 | 
						|
    if (!product_info) {
 | 
						|
        printf("AdapterWifiInit ESP07S attach error\n");
 | 
						|
        PrivFree(adapter);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    adapter->product_info_flag = 1;
 | 
						|
    adapter->info = product_info;
 | 
						|
    adapter->done = product_info->model_done;
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef ADAPTER_ESP8285_WIFI
 | 
						|
    AdapterProductInfoType product_info = Esp8285WifiAttach(adapter);
 | 
						|
    if (!product_info) {
 | 
						|
        printf("AdapterWifiInit ESP8285 attach error\n");
 | 
						|
        PrivFree(adapter);
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    adapter->product_info_flag = 1;
 | 
						|
    adapter->info = product_info;
 | 
						|
    adapter->done = product_info->model_done;
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/******************wifi TEST*********************/
 | 
						|
int AdapterWifiTest(void)
 | 
						|
{
 | 
						|
//    char cmd[64];
 | 
						|
//    int baud_rate = BAUD_RATE_57600;
 | 
						|
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
 | 
						|
#if 0
 | 
						|
#ifdef ADAPTER_HFA21_DRIVER_EXT_PORT
 | 
						|
    static BusType ch438_pin;
 | 
						|
    ch438_pin = PinBusInitGet();
 | 
						|
    struct PinParam pin_cfg;
 | 
						|
    int ret = 0;
 | 
						|
 | 
						|
    struct BusConfigureInfo configure_info;
 | 
						|
    configure_info.configure_cmd = OPE_CFG;
 | 
						|
    configure_info.private_data = (void *)&pin_cfg;
 | 
						|
 | 
						|
    pin_cfg.cmd = GPIO_CONFIG_MODE;
 | 
						|
    pin_cfg.pin = 22;
 | 
						|
    pin_cfg.mode = GPIO_CFG_OUTPUT;
 | 
						|
 | 
						|
    ret = BusDrvConfigure(ch438_pin->owner_driver, &configure_info);
 | 
						|
 | 
						|
    struct PinStat pin_stat;
 | 
						|
    struct BusBlockWriteParam write_param;
 | 
						|
    struct BusBlockReadParam read_param;
 | 
						|
    write_param.buffer = (void *)&pin_stat;
 | 
						|
 | 
						|
    pin_stat.val = GPIO_HIGH;
 | 
						|
 | 
						|
    pin_stat.pin = 22;
 | 
						|
    BusDevWriteData(ch438_pin->owner_haldev, &write_param);
 | 
						|
 | 
						|
    int pin_fd;
 | 
						|
    pin_fd = PrivOpen("/dev/pin_dev", O_RDWR);
 | 
						|
 | 
						|
    struct PinParam pin_param;
 | 
						|
    pin_param.cmd = GPIO_CONFIG_MODE;
 | 
						|
    pin_param.mode = GPIO_CFG_OUTPUT;
 | 
						|
    pin_param.pin = 22;
 | 
						|
 | 
						|
    struct PrivIoctlCfg ioctl_cfg;
 | 
						|
    ioctl_cfg.ioctl_driver_type = PIN_TYPE;
 | 
						|
    ioctl_cfg.args = &pin_param;
 | 
						|
    PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg);
 | 
						|
 | 
						|
    struct PinStat pin_stat;
 | 
						|
    pin_stat.pin = 52;
 | 
						|
    pin_stat.val = GPIO_HIGH;
 | 
						|
    PrivWrite(pin_fd, &pin_stat, 1);
 | 
						|
 | 
						|
    PrivClose(pin_fd);
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
    AdapterDeviceOpen(adapter);
 | 
						|
    // AdapterDeviceControl(adapter, OPE_INT, &baud_rate);
 | 
						|
 | 
						|
    AdapterDeviceSetUp(adapter);
 | 
						|
    AdapterDeviceSetAddr(adapter, "192.168.64.253", "192.168.66.1", "255.255.252.0");
 | 
						|
    AdapterDevicePing(adapter, "36.152.44.95");
 | 
						|
    AdapterDeviceNetstat(adapter);
 | 
						|
 | 
						|
    const char *ip = "192.168.64.60";
 | 
						|
    const char *port = "12345";
 | 
						|
    enum NetRoleType net_role = CLIENT;
 | 
						|
    enum IpType ip_type = IPV4;
 | 
						|
    AdapterDeviceConnect(adapter, net_role, ip, port, ip_type);
 | 
						|
 | 
						|
    const char *wifi_msg = "Wifi Test";
 | 
						|
    int len = strlen(wifi_msg);
 | 
						|
    for(int i = 0; i < 10; ++i) {
 | 
						|
        AdapterDeviceSend(adapter, wifi_msg, len);
 | 
						|
        PrivTaskDelay(4000);
 | 
						|
    }
 | 
						|
 | 
						|
    char wifi_recv_msg[128];
 | 
						|
    for(int j = 0; j < 10; ++j){
 | 
						|
        AdapterDeviceRecv(adapter, wifi_recv_msg, 128);
 | 
						|
        PrivTaskDelay(1000);
 | 
						|
    }
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(AdapterWifiTest, a WiFi test sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiOpen(void)
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    return AdapterDeviceOpen(adapter);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiOpen, a WiFi open sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiClose(void)
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    return AdapterDeviceClose(adapter);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiClose, a WiFi close sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiSetup(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    static struct WifiParam param;
 | 
						|
    memset(¶m,0,sizeof(struct WifiParam));
 | 
						|
    strncpy((char *)param.wifi_ssid, argv[1], strlen(argv[1]));
 | 
						|
    strncpy((char *)param.wifi_pwd, argv[2], strlen(argv[2]));
 | 
						|
 | 
						|
    adapter->adapter_param = ¶m;
 | 
						|
 | 
						|
    return AdapterDeviceSetUp(adapter);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiSetup, a WiFi setup sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiAddrSet(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    char *ip = argv[1];
 | 
						|
    char *gateway = argv[2];
 | 
						|
    char *netmask = argv[3];
 | 
						|
 | 
						|
    AdapterDeviceSetAddr(adapter, ip, gateway, netmask);
 | 
						|
    AdapterDevicePing(adapter, "36.152.44.95");///< ping www.baidu.com
 | 
						|
    return AdapterDeviceNetstat(adapter);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiAddrSet, a WiFi addr set sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiPing(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    printf("ping %s\n",argv[1]);
 | 
						|
    return AdapterDevicePing(adapter, argv[1]);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiPing, a WiFi ping sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiConnect(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    char *ip = argv[1];
 | 
						|
    char *port = argv[2];
 | 
						|
    enum NetRoleType net_role = CLIENT;
 | 
						|
    enum IpType ip_type = IPV4;
 | 
						|
 | 
						|
    if(0 == strncmp("tcp",argv[3],strlen("tcp"))) {
 | 
						|
        adapter->socket.protocal = SOCKET_PROTOCOL_TCP;
 | 
						|
    }
 | 
						|
 | 
						|
    if(0 == strncmp("udp",argv[3],strlen("udp"))) {
 | 
						|
        adapter->socket.protocal = SOCKET_PROTOCOL_UDP;
 | 
						|
    }
 | 
						|
 | 
						|
    return AdapterDeviceConnect(adapter, net_role, ip, port, ip_type);
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiConnect, a WiFi connect sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiSend(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
 | 
						|
    const char *wifi_msg = argv[1];
 | 
						|
    int len = strlen(wifi_msg);
 | 
						|
    for(int i = 0;i < 10; ++i) {
 | 
						|
        AdapterDeviceSend(adapter, wifi_msg, len);
 | 
						|
        PrivTaskDelay(1000);
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiSend, a WiFi send sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
int WifiRecv(int argc, char *argv[])
 | 
						|
{
 | 
						|
    struct Adapter* adapter =  AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
 | 
						|
    char wifi_recv_msg[128];
 | 
						|
    while (1) {
 | 
						|
        AdapterDeviceRecv(adapter, wifi_recv_msg, 128);
 | 
						|
        PrivTaskDelay(1000);
 | 
						|
        printf("wifi recv [%s]\n",wifi_recv_msg);
 | 
						|
    }
 | 
						|
}
 | 
						|
PRIV_SHELL_CMD_FUNCTION(WifiRecv, a WiFi receive sample, PRIV_SHELL_CMD_MAIN_ATTR);
 | 
						|
 | 
						|
#ifdef ADD_NUTTX_FETURES
 | 
						|
 | 
						|
enum
 | 
						|
{
 | 
						|
    APT_WIFI_PARAM_IP,
 | 
						|
    APT_WIFI_PARAM_PORT,
 | 
						|
    APT_WIFI_PARAM_SSID,
 | 
						|
    APT_WIFI_PARAM_PWD,
 | 
						|
    APT_WIFI_PARAM_GW,
 | 
						|
    APT_WIFI_PARAM_SERVER,
 | 
						|
    APT_WIFI_PARAM_MASK,
 | 
						|
    APT_WIFI_PARAM_PING,
 | 
						|
    APT_WIFI_PARAM_NUM
 | 
						|
};
 | 
						|
 | 
						|
#define APT_WIFI_PARAM_LEN 128
 | 
						|
 | 
						|
char wifi_param[APT_WIFI_PARAM_NUM][APT_WIFI_PARAM_LEN] = {0};
 | 
						|
 | 
						|
#define CHECK_RET(__func) \
 | 
						|
ret = __func; \
 | 
						|
if(ret != 0){ \
 | 
						|
    printf("%s %d failed\n", __func__, __LINE__); \
 | 
						|
    AdapterDeviceClose(adapter); \
 | 
						|
    free(adapter->adapter_param); \
 | 
						|
    return ret; \
 | 
						|
};
 | 
						|
 | 
						|
void AdapterWifiGetParam(int argc, char *argv[])
 | 
						|
{
 | 
						|
    int i, j;
 | 
						|
    char *param_str[] = {"ip", "port", "ssid", "pwd", "gw", "server", "mask", "ping"};
 | 
						|
    char *default_str[] =
 | 
						|
    {
 | 
						|
        "192.168.137.34",
 | 
						|
        "12345",
 | 
						|
        "test",
 | 
						|
        "tttttttt",
 | 
						|
        "192.168.137.71",
 | 
						|
        "192.168.137.1",
 | 
						|
        "255.255.255.0",
 | 
						|
        "220.181.38.251"
 | 
						|
    };
 | 
						|
 | 
						|
    for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
 | 
						|
    {
 | 
						|
        memset(wifi_param[i], 0, APT_WIFI_PARAM_LEN);
 | 
						|
        strcpy(wifi_param[i], default_str[i]);
 | 
						|
    }
 | 
						|
 | 
						|
    for(i = 0; i < argc; i ++)
 | 
						|
    {
 | 
						|
        for(j = 0; j < APT_WIFI_PARAM_NUM; j ++)
 | 
						|
        {
 | 
						|
            if(strncmp(argv[i], param_str[j], strlen(param_str[j])) == 0)
 | 
						|
            {
 | 
						|
                printf("wifi %d: %s\n", j, argv[i] + strlen(param_str[j]) + 1);
 | 
						|
                strcpy(wifi_param[j], argv[i] + strlen(param_str[j]) + 1);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    printf("--- wifi parameter ---\n");
 | 
						|
    for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
 | 
						|
    {
 | 
						|
        printf("%7.7s = %s\n", param_str[i], wifi_param[i]);
 | 
						|
    }
 | 
						|
    printf("----------------------\n");
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int AdapterWifiTestWithParam(int argc, char *argv[])
 | 
						|
{
 | 
						|
    int i, ret;
 | 
						|
 | 
						|
    struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
 | 
						|
    AdapterWifiGetParam(argc, argv);
 | 
						|
 | 
						|
    enum NetRoleType net_role = CLIENT;
 | 
						|
    enum IpType ip_type = IPV4;
 | 
						|
 | 
						|
    adapter->adapter_param = malloc(sizeof(struct WifiParam));
 | 
						|
    memset(adapter->adapter_param, 0, sizeof(struct WifiParam));
 | 
						|
    struct WifiParam *apt_param = (struct WifiParam *)adapter->adapter_param;
 | 
						|
    strcpy(apt_param->wifi_ssid, wifi_param[APT_WIFI_PARAM_SSID]);
 | 
						|
    strcpy(apt_param->wifi_pwd, wifi_param[APT_WIFI_PARAM_PWD]);
 | 
						|
 | 
						|
	printf("apt %p ssid %p %s\n", apt_param, apt_param->wifi_ssid);
 | 
						|
 | 
						|
    CHECK_RET(AdapterDeviceOpen(adapter));
 | 
						|
    CHECK_RET(AdapterDeviceSetUp(adapter));
 | 
						|
 | 
						|
    CHECK_RET(AdapterDeviceSetAddr(adapter, wifi_param[APT_WIFI_PARAM_IP], wifi_param[APT_WIFI_PARAM_GW],
 | 
						|
        wifi_param[APT_WIFI_PARAM_MASK]));
 | 
						|
 | 
						|
    CHECK_RET(AdapterDeviceNetstat(adapter));
 | 
						|
 | 
						|
    adapter->socket.protocal = SOCKET_PROTOCOL_TCP;
 | 
						|
    CHECK_RET(AdapterDeviceConnect(adapter, net_role, wifi_param[APT_WIFI_PARAM_SERVER],
 | 
						|
        wifi_param[APT_WIFI_PARAM_PORT], ip_type));
 | 
						|
 | 
						|
    const char *wifi_msg = "Wifi Test";
 | 
						|
    for(i = 0; i < 10; i++)
 | 
						|
    {
 | 
						|
        AdapterDeviceSend(adapter, wifi_msg, strlen(wifi_msg));
 | 
						|
        PrivTaskDelay(4000);
 | 
						|
    }
 | 
						|
 | 
						|
    char wifi_recv_msg[APT_WIFI_PARAM_LEN];
 | 
						|
    memset(wifi_recv_msg, 0, APT_WIFI_PARAM_LEN);
 | 
						|
    for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
 | 
						|
    {
 | 
						|
        AdapterDeviceRecv(adapter, wifi_recv_msg, 128);
 | 
						|
        PrivTaskDelay(1000);
 | 
						|
    }
 | 
						|
 | 
						|
//    printf("ping %s\n", wifi_param[APT_WIFI_PARAM_PING]);
 | 
						|
//
 | 
						|
//    CHECK_RET(AdapterDevicePing(adapter, wifi_param[APT_WIFI_PARAM_PING]));
 | 
						|
//    AdapterDeviceDisconnect(adapter, NULL);
 | 
						|
    ret = AdapterDeviceClose(adapter);
 | 
						|
	free(adapter->adapter_param);
 | 
						|
    return ret;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 |