From d96de9c21af96969292d5a2955c2ec8499565a97 Mon Sep 17 00:00:00 2001 From: Yuguo Zou Date: Thu, 23 Mar 2017 18:57:41 +0800 Subject: [PATCH] update to lwip_stack issue --- .../TARGET_AMEBA/RTWInterface.cpp | 31 ++++++++++++------ .../device/TOOLCHAIN_IAR/rtl8195a.icf | 4 +-- .../TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp | 32 +++++++++++++++++-- .../sdk/common/api/platform/platform_stdlib.h | 7 ++++ .../sdk/common/api/wifi/wifi_conf.c | 23 +++++++++++-- .../wlan/realtek/src/osdep/lwip_intf.c | 4 ++- .../TARGET_AMEBA/sdk/os/rtx/rtx_service.c | 2 +- 7 files changed, 84 insertions(+), 19 deletions(-) diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/RTWInterface.cpp b/targets/TARGET_Realtek/TARGET_AMEBA/RTWInterface.cpp index a35cb6d757..95893fc8c0 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/RTWInterface.cpp +++ b/targets/TARGET_Realtek/TARGET_AMEBA/RTWInterface.cpp @@ -27,6 +27,10 @@ #include "osdep_service.h" +struct netif *xnetif[2]; +static struct netif lwap_netif; +extern struct netif *netif_default; + RTWInterface::RTWInterface() : _dhcp(true), _ip_address(), _netmask(), _gateway() { @@ -38,9 +42,9 @@ RTWInterface::RTWInterface() } static void *scan_sema; - +static const signed int maxApNum = 4; static signed int ApNum; -static WiFiAccessPoint *SCANED_AP[15]; /*maximum store 15 APs*/ +static WiFiAccessPoint *SCANED_AP[maxApNum]; /*maximum store 15 APs*/ nsapi_error_t RTWInterface::set_network(const char *ip_address, const char *netmask, const char *gateway) { @@ -67,13 +71,13 @@ nsapi_error_t RTWInterface::init() if (!emac) { return NSAPI_ERROR_DEVICE_ERROR; } - + emac->ops.power_up(emac); //printf("Initializing lwip ...\r\n"); ret = mbed_lwip_init(emac); if (ret != 0) { return ret; } - + xnetif[0] = netif_default; return NSAPI_ERROR_OK; } @@ -134,7 +138,7 @@ static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_sca if (malloced_scan_result->scan_complete != RTW_TRUE) { rtw_scan_result_t* record = &malloced_scan_result->ap_details; record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */ - if(ApNum>15) + if(ApNum>maxApNum) return RTW_SUCCESS; nsapi_wifi_ap_t ap; @@ -167,20 +171,24 @@ nsapi_error_t RTWInterface::scan(WiFiAccessPoint *res, unsigned count) // blocked if(count == 0){ ApNum = 0; - + rtw_init_sema(&scan_sema, 0); if(wifi_scan_networks(scan_result_handler, NULL) != RTW_SUCCESS){ printf("wifi scan failed\n\r"); - return NSAPI_ERROR_DEVICE_ERROR; + //return NSAPI_ERROR_DEVICE_ERROR; + goto error; } if(rtw_down_timeout_sema( &scan_sema, 15000 ) == RTW_FALSE) { printf("wifi scan timeout\r\n"); - return NSAPI_ERROR_DEVICE_ERROR; + //return NSAPI_ERROR_DEVICE_ERROR; + goto error; } + rtw_free_sema(&scan_sema); return ApNum; - }else if(count > 0 && res != NULL){ - count = count < 15 ? count : 15; + + }else if(count > 0 && res != NULL){ + count = count < maxApNum ? count : maxApNum; for(int i = 0; i < count; i++){ memcpy(&res[i], SCANED_AP[i], sizeof(WiFiAccessPoint)); delete[] SCANED_AP[i]; @@ -188,6 +196,9 @@ nsapi_error_t RTWInterface::scan(WiFiAccessPoint *res, unsigned count) return (signed int)count; } return NSAPI_ERROR_OK; +error: + rtw_free_sema(&scan_sema); + return NSAPI_ERROR_DEVICE_ERROR; } nsapi_error_t RTWInterface::set_channel(uint8_t channel) diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_IAR/rtl8195a.icf b/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_IAR/rtl8195a.icf index 284a5f8822..598910f6a3 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_IAR/rtl8195a.icf +++ b/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_IAR/rtl8195a.icf @@ -25,8 +25,8 @@ define symbol __ICFEDIT_region_SDRAM_RAM_start__ = 0x30000000; define symbol __ICFEDIT_region_SDRAM_RAM_end__ = 0x301FFFFF; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; // 8K -define symbol __ICFEDIT_size_heap__ = 0x8000; // 60K +define symbol __ICFEDIT_size_cstack__ = 0x1000; +define symbol __ICFEDIT_size_heap__ = 0x10000; /**** End of ICF editor section. ###ICF###*/ diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp b/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp index 10aec19aeb..f4cb9f522c 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp +++ b/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp @@ -36,10 +36,12 @@ static emac_link_state_change_fn link_state_cb; static void *link_input_data; static void *link_state_data; +#if 0 struct netif *xnetif[2]; extern struct netif lwip_netif; static struct netif lwap_netif; extern uint8_t *netif_get_hwaddr(int idx); +#endif static uint32_t wlan_get_mtu_size(emac_interface_t *emac) { @@ -59,6 +61,7 @@ static uint8_t wlan_get_hwaddr_size(emac_interface_t *emac) static void wlan_get_hwaddr(emac_interface_t *emac, uint8_t *addr) { +#if 0 uint8_t *hwaddr; hwaddr = netif_get_hwaddr(0); @@ -67,6 +70,16 @@ static void wlan_get_hwaddr(emac_interface_t *emac, uint8_t *addr) } memcpy(addr, hwaddr, ETHARP_HWADDR_LEN); +#else + char mac[20]; + if(RTW_SUCCESS == wifi_get_mac_address(mac)) + { + if (sscanf(mac, "%x:%x:%x:%x:%x:%x", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]) != 6) + printf("Get HW address failed\r\n"); + }else{ + printf("Get HW address failed\r\n"); + } +#endif } static void wlan_set_hwaddr(emac_interface_t *emac, uint8_t *addr) @@ -196,9 +209,21 @@ void mbed_default_mac_address(char *mac) { void mbed_mac_address(char *mac) { +#if 0 //wlan_get_hwaddr((emac_interface_t *)NULL, (uint8_t *)mac); mbed_default_mac_address(mac); +#else + char hwaddr[20]; + + if(RTW_SUCCESS == wifi_get_mac_address(hwaddr)) + { + if (sscanf(hwaddr, "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]) != 6) + printf("Get HW address failed\r\n"); + }else{ + printf("Get HW address failed\r\n"); + } +#endif } void wlan_emac_link_down(uint8_t i) @@ -207,7 +232,7 @@ void wlan_emac_link_down(uint8_t i) return; } - xnetif[i]->flags &= ~NETIF_FLAG_LINK_UP; + //xnetif[i]->flags &= ~NETIF_FLAG_LINK_UP; if (link_state_cb) { link_state_cb(link_state_data, false); } @@ -219,7 +244,7 @@ void wlan_emac_link_up(uint8_t i) return; } - xnetif[i]->flags |= NETIF_FLAG_LINK_UP; + //xnetif[i]->flags |= NETIF_FLAG_LINK_UP; if (link_state_cb) { link_state_cb(link_state_data, true); } @@ -231,9 +256,10 @@ void wlan_emac_init_mem(void) emac_interface_t *wlan_emac_init_interface() { +#if 0 xnetif[0] = &lwip_netif; xnetif[1] = &lwap_netif; - +#endif if (_emac == NULL) { _emac = new emac_interface_t(); _emac->hw = NULL; diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/platform/platform_stdlib.h b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/platform/platform_stdlib.h index 364ccabc05..5bf5c6d1e8 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/platform/platform_stdlib.h +++ b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/platform/platform_stdlib.h @@ -43,6 +43,13 @@ #include #include "diag.h" + #define strsep(str, delim) _strsep(str, delim) +#elif defined (__CC_ARM) + #include + #include + #include + #include + #include "diag.h" #define strsep(str, delim) _strsep(str, delim) #else #include diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/wifi/wifi_conf.c b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/wifi/wifi_conf.c index 9d145356f4..6913a4162c 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/wifi/wifi_conf.c +++ b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/api/wifi/wifi_conf.c @@ -60,9 +60,12 @@ extern int inic_stop(void); /****************************************************** * Variables Declarations ******************************************************/ +#if DEVICE_EMAC +extern struct netif *xnetif[]; +#else extern struct netif xnetif[NET_IF_NUM]; - +#endif /****************************************************** * Variables Definitions ******************************************************/ @@ -969,11 +972,14 @@ int wifi_on(rtw_mode_t mode) } #if CONFIG_LWIP_LAYER + #if DEVICE_EMAC + #else netif_set_up(&xnetif[0]); if(mode == RTW_MODE_STA_AP) { netif_set_up(&xnetif[1]); } #endif + #endif #if CONFIG_INIC_EN inic_start(); @@ -999,9 +1005,14 @@ int wifi_off(void) #else LwIP_DHCP(0, DHCP_STOP); #endif +#if DEVICE_EMAC + netif_set_down(xnetif[0]); + netif_set_down(xnetif[1]); +#else netif_set_down(&xnetif[0]); netif_set_down(&xnetif[1]); #endif +#endif #if defined(CONFIG_ENABLE_WPS_AP) && CONFIG_ENABLE_WPS_AP if((wifi_mode == RTW_MODE_AP) || (wifi_mode == RTW_MODE_STA_AP)) wpas_wps_deinit(); @@ -1670,7 +1681,11 @@ int wifi_restart_ap( ip_addr_t ipaddr; ip_addr_t netmask; ip_addr_t gw; +#if DEVICE_EMAC + struct netif * pnetif = xnetif[0]; +#else struct netif * pnetif = &xnetif[0]; +#endif #ifdef CONFIG_CONCURRENT_MODE rtw_wifi_setting_t setting; int sta_linked = 0; @@ -1736,9 +1751,13 @@ int wifi_restart_ap( #if (INCLUDE_uxTaskGetStackHighWaterMark == 1) printf("\r\nWebServer Thread: High Water Mark is %ld\n", uxTaskGetStackHighWaterMark(NULL)); #endif +#if DEVICE_EMAC + // start dhcp server + dhcps_init(xnetif[idx]); +#else // start dhcp server dhcps_init(&xnetif[idx]); - +#endif return 0; } diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/drivers/wlan/realtek/src/osdep/lwip_intf.c b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/drivers/wlan/realtek/src/osdep/lwip_intf.c index 249b0076ee..d850d48e50 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/drivers/wlan/realtek/src/osdep/lwip_intf.c +++ b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/common/drivers/wlan/realtek/src/osdep/lwip_intf.c @@ -55,7 +55,8 @@ void rltk_wlan_set_netif_info(int idx_wlan, void * dev, unsigned char * dev_addr { #if (CONFIG_LWIP_LAYER == 1) #if DEVICE_EMAC - rtw_memcpy(xnetif[idx_wlan]->hwaddr, dev_addr, 6); + //rtw_memcpy(xnetif[idx_wlan]->hwaddr, dev_addr, 6); + //set netif hwaddr later #else rtw_memcpy(xnetif[idx_wlan].hwaddr, dev_addr, 6); xnetif[idx_wlan].state = dev; @@ -158,6 +159,7 @@ int netif_is_valid_IP(int idx, unsigned char *ip_dest) #if CONFIG_LWIP_LAYER == 1 #if DEVICE_EMAC struct netif *pnetif = xnetif[idx]; + return 1; #else struct netif *pnetif = &xnetif[idx]; #endif diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/os/rtx/rtx_service.c b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/os/rtx/rtx_service.c index 49466628b8..e23ddab694 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/sdk/os/rtx/rtx_service.c +++ b/targets/TARGET_Realtek/TARGET_AMEBA/sdk/os/rtx/rtx_service.c @@ -100,7 +100,7 @@ u8* _rtx_malloc(u32 sz) { _func_enter_; void *p = NULL; - p = malloc(sz); + p = (void *)malloc(sz); if(p != NULL){ #if USE_HEAP_INFO osFreeBytesRemaining-=sz;