Fix on Wifi

pull/4438/head
Yuguo Zou 2017-04-03 18:31:43 +08:00 committed by Martin Kojtal
parent 1141c7a08b
commit 08489e4f18
7 changed files with 293 additions and 394 deletions

View File

@ -27,24 +27,86 @@
#include "osdep_service.h"
struct netif *xnetif[2];
static struct netif lwap_netif;
extern struct netif *netif_default;
typedef struct _wifi_scan_hdl {
int scan_num;
WiFiAccessPoint *ap_details;
} wifi_scan_hdl;
#define MAX_SCAN_TIMEOUT (15000)
static void *scan_sema = NULL;
static signed int ApNum = 0;
static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
{
if (malloced_scan_result->scan_complete != RTW_TRUE) {
wifi_scan_hdl *scan_handler = (wifi_scan_hdl *)malloced_scan_result->user_data;
if(scan_handler->ap_details && scan_handler->scan_num > ApNum){
nsapi_wifi_ap_t ap;
rtw_scan_result_t* record = &malloced_scan_result->ap_details;
record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */
memset((void*)&ap, 0x00, sizeof(nsapi_wifi_ap_t));
memcpy(ap.ssid, record->SSID.val, record->SSID.len);
memcpy(ap.bssid, record->BSSID.octet, 6);
switch (record->security){
case RTW_SECURITY_OPEN:
ap.security = NSAPI_SECURITY_NONE;
break;
case RTW_SECURITY_WEP_PSK:
case RTW_SECURITY_WEP_SHARED:
ap.security = NSAPI_SECURITY_WEP;
break;
case RTW_SECURITY_WPA_TKIP_PSK:
case RTW_SECURITY_WPA_AES_PSK:
ap.security = NSAPI_SECURITY_WPA;
break;
case RTW_SECURITY_WPA2_AES_PSK:
case RTW_SECURITY_WPA2_TKIP_PSK:
case RTW_SECURITY_WPA2_MIXED_PSK:
ap.security = NSAPI_SECURITY_WPA2;
break;
case RTW_SECURITY_WPA_WPA2_MIXED:
ap.security = NSAPI_SECURITY_WPA_WPA2;
break;
default:
ap.security = NSAPI_SECURITY_UNKNOWN;
break;
}
ap.rssi = record->signal_strength;
ap.channel = record->channel;
WiFiAccessPoint *accesspoint = new WiFiAccessPoint(ap);
memcpy(&scan_handler->ap_details[ApNum], accesspoint, sizeof(WiFiAccessPoint));
delete[] accesspoint;
}
ApNum++;
} else{
// scan done
rtw_up_sema(&scan_sema);
}
return RTW_SUCCESS;
}
RTWInterface::RTWInterface()
: _dhcp(true), _ip_address(), _netmask(), _gateway()
{
nsapi_error_t ret;
ret = init();
if (ret != NSAPI_ERROR_OK){
printf("Error init RTWInterface!(%d)\r\n", ret);
}
emac_interface_t *emac;
int ret;
emac = wlan_emac_init_interface();
if (!emac) {
printf("Error init RTWInterface!\r\n");
}
emac->ops.power_up(emac);
ret = mbed_lwip_init(emac);
if (ret != 0) {
printf("Error init RTWInterface!(%d)\r\n", ret);
}
}
static void *scan_sema;
static const signed int maxApNum = 4;
static signed int ApNum;
static WiFiAccessPoint *SCANED_AP[maxApNum]; /*maximum store 15 APs*/
RTWInterface::~RTWInterface()
{
wlan_emac_link_change(false);
mbed_lwip_bringdown();
}
nsapi_error_t RTWInterface::set_network(const char *ip_address, const char *netmask, const char *gateway)
{
@ -61,31 +123,6 @@ nsapi_error_t RTWInterface::set_dhcp(bool dhcp)
return NSAPI_ERROR_OK;
}
nsapi_error_t RTWInterface::init()
{
emac_interface_t *emac;
int ret;
//printf("\r\nInitializing emac ...\r\n");
emac = wlan_emac_init_interface();
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;
}
nsapi_error_t RTWInterface::deinit()
{
return mbed_lwip_bringdown();
}
/*
* we may call connect multiple times
*/
@ -109,16 +146,27 @@ nsapi_error_t RTWInterface::connect()
}
switch (_security) {
case NSAPI_SECURITY_WPA2:
sec = RTW_SECURITY_WPA2_MIXED_PSK;
break;
case NSAPI_SECURITY_NONE:
default:
sec = RTW_SECURITY_OPEN;
break;
case NSAPI_SECURITY_WPA:
case NSAPI_SECURITY_WPA2:
case NSAPI_SECURITY_WPA_WPA2:
sec = RTW_SECURITY_WPA_WPA2_MIXED;
break;
case NSAPI_SECURITY_WEP:
sec = RTW_SECURITY_WEP_PSK;
break;
case NSAPI_SECURITY_NONE:
sec = RTW_SECURITY_OPEN;
break;
default:
return NSAPI_ERROR_PARAMETER;
}
printf("Connecting to: %s ... \r\n", _ssid);
if(_channel > 0 && _channel < 14){
uint8_t pscan_config = PSCAN_ENABLE;
wifi_set_pscan_chan(&_channel, &pscan_config, 1);
}
//printf("Connecting to: %s ... \r\n", _ssid);
ret = wifi_connect(_ssid, sec, _pass, strlen(_ssid), strlen(_pass), 0, (void *)NULL);
if (ret != RTW_SUCCESS) {
printf("failed: %d\r\n", ret);
@ -126,117 +174,74 @@ nsapi_error_t RTWInterface::connect()
}
//printf("connected\r\n");
wlan_emac_link_up(0);
wlan_emac_link_change(true);
return mbed_lwip_bringup(_dhcp,
_ip_address[0] ? _ip_address : 0,
_netmask[0] ? _netmask : 0,
_gateway[0] ? _gateway : 0);
}
static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
{
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>maxApNum)
return RTW_SUCCESS;
nsapi_wifi_ap_t ap;
memset((void*)&ap, 0x00, sizeof(nsapi_wifi_ap_t));
memcpy(ap.ssid, record->SSID.val, record->SSID.len);
memcpy(ap.bssid, record->BSSID.octet, 6);
ap.security = (record->security == RTW_SECURITY_OPEN)?NSAPI_SECURITY_NONE :
(record->security == RTW_SECURITY_WEP_PSK)?NSAPI_SECURITY_WEP:
(record->security == RTW_SECURITY_WPA_TKIP_PSK || record->security == RTW_SECURITY_WPA_AES_PSK)? NSAPI_SECURITY_WPA:
(record->security == RTW_SECURITY_WPA2_AES_PSK || \
record->security == RTW_SECURITY_WPA2_TKIP_PSK || \
record->security == RTW_SECURITY_WPA2_MIXED_PSK)?NSAPI_SECURITY_WPA2:
(record->security == RTW_SECURITY_WPA_WPA2_MIXED)?NSAPI_SECURITY_WPA_WPA2:NSAPI_SECURITY_UNKNOWN;
ap.rssi = record->signal_strength;
ap.channel = record->channel;
SCANED_AP[ApNum++] = new WiFiAccessPoint(ap);
} else{
// scan done
rtw_up_sema(&scan_sema);
}
return RTW_SUCCESS;
}
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;
goto error;
}
if(rtw_down_timeout_sema( &scan_sema, 15000 ) == RTW_FALSE) {
printf("wifi scan timeout\r\n");
//return NSAPI_ERROR_DEVICE_ERROR;
goto error;
}
rtw_free_sema(&scan_sema);
return ApNum;
}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];
}
return (signed int)count;
}
return NSAPI_ERROR_OK;
error:
rtw_free_sema(&scan_sema);
return NSAPI_ERROR_DEVICE_ERROR;
static wifi_scan_hdl scan_handler;
ApNum = 0;
if(!scan_sema)
rtw_init_sema(&scan_sema, 0);
scan_handler.scan_num = count;
scan_handler.ap_details = res;
if(wifi_scan_networks(scan_result_handler, (void *)&scan_handler) != RTW_SUCCESS){
printf("wifi scan failed\n\r");
return NSAPI_ERROR_DEVICE_ERROR;
}
if(rtw_down_timeout_sema( &scan_sema, MAX_SCAN_TIMEOUT ) == RTW_FALSE) {
printf("wifi scan timeout\r\n");
return NSAPI_ERROR_DEVICE_ERROR;
}
if(count <= 0 || count > ApNum)
count = ApNum;
return count;
}
nsapi_error_t RTWInterface::set_channel(uint8_t channel)
{
if(wifi_set_channel(channel) == 0)
return NSAPI_ERROR_OK;
return NSAPI_ERROR_DEVICE_ERROR;
_channel = channel;
return NSAPI_ERROR_OK;
}
int8_t RTWInterface::get_rssi()
{
return NSAPI_ERROR_UNSUPPORTED;
int rssi = 0;
if(wifi_get_rssi(&rssi) == 0)
return (int8_t)rssi;
return NSAPI_ERROR_OK;
}
nsapi_error_t RTWInterface::connect(const char *ssid, const char *pass,
nsapi_security_t security, uint8_t channel)
{
set_credentials(ssid, pass, security);
set_channel(channel);
return connect();
}
nsapi_error_t RTWInterface::disconnect()
{
char essid[33];
char essid[33];
wlan_emac_link_change(false);
if(wifi_is_connected_to_ap() != RTW_SUCCESS)
return NSAPI_ERROR_NO_CONNECTION;
printf("Deassociating AP ...\r\n");
if(wifi_disconnect()<0){
return NSAPI_ERROR_DEVICE_ERROR;
}
while(1){
if(wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
printf("WIFI disconnected\n\r");
break;
}
}
return NSAPI_ERROR_NO_CONNECTION;
//printf("Deassociating AP ...\r\n");
if(wifi_disconnect()<0){
return NSAPI_ERROR_DEVICE_ERROR;
}
while(1){
if(wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
//printf("WIFI disconnected\n\r");
break;
}
}
return NSAPI_ERROR_OK;
}

View File

@ -35,9 +35,7 @@ public:
/** RTWWlanInterface lifetime
*/
RTWInterface();
virtual nsapi_error_t init();
virtual nsapi_error_t deinit();
~RTWInterface();
/** Set a static IP address
*
@ -108,7 +106,7 @@ public:
* @return Number of entries in @a, or if @a count was 0 number of available networks, negative on error
* see @a nsapi_error
*/
virtual nsapi_error_t scan(WiFiAccessPoint *res, unsigned count);
virtual nsapi_size_or_error_t scan(WiFiAccessPoint *res, unsigned count);
virtual nsapi_error_t set_channel(uint8_t channel);
virtual int8_t get_rssi();
@ -156,6 +154,7 @@ protected:
char _ssid[256];
char _pass[256];
nsapi_security_t _security;
uint8_t _channel;
char _ip_address[IPADDR_STRLEN_MAX];
char _netmask[NSAPI_IPv4_SIZE];
char _gateway[NSAPI_IPv4_SIZE];

View File

@ -2,9 +2,9 @@
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
//define symbol __ICFEDIT_intvec_start__ = 0x00000000;
//include "main.icf";
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
@ -13,51 +13,50 @@ define symbol __ICFEDIT_region_TCM_start__ = 0x1FFF0000;
define symbol __ICFEDIT_region_TCM_end__ = 0x1FFFFFFF;
define symbol __ICFEDIT_region_ROM_USED_RAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_ROM_USED_RAM_end__ = 0x10005FFF;
define symbol __ICFEDIT_region_BD_RAM_start__ = 0x10006000;
define symbol __ICFEDIT_region_BD_RAM_end__ = 0x1006FFFF;
//define symbol __ICFEDIT_region_RECY_RAM_start__ = 0x10002090;
//define symbol __ICFEDIT_region_RECY_RAM_end__ = 0x100037FF;
if( !isdefinedsymbol( __ICFEDIT_region_BD_RAM_start__ ) ) {
define symbol __ICFEDIT_region_BD_RAM_start__ = 0x10006000;
}
if( !isdefinedsymbol( __ICFEDIT_region_BD_RAM_end__ ) ) {
define symbol __ICFEDIT_region_BD_RAM_end__ = 0x1006FFFF;
}
define symbol __ICFEDIT_region_SDRAM_RAM_start__ = 0x30000000;
define symbol __ICFEDIT_region_SDRAM_RAM_end__ = 0x301FFFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x1000;
define symbol __ICFEDIT_size_heap__ = 0x10000;
/*define symbol __ICFEDIT_size_cstack__ = 0x400;*/
define symbol __ICFEDIT_size_heap__ = 0x19000;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region TCM_region = mem:[from __ICFEDIT_region_TCM_start__ to __ICFEDIT_region_TCM_end__];
define region ROM_USED_RAM_region = mem:[from __ICFEDIT_region_ROM_USED_RAM_start__ to __ICFEDIT_region_ROM_USED_RAM_end__];
//define region RECY_RAM_region = mem:[from __ICFEDIT_region_RECY_RAM_start__ to __ICFEDIT_region_RECY_RAM_end__];
define region BD_RAM_region = mem:[from __ICFEDIT_region_BD_RAM_start__ to __ICFEDIT_region_BD_RAM_end__];
define region SDRAM_RAM_region = mem:[from __ICFEDIT_region_SDRAM_RAM_start__ to __ICFEDIT_region_SDRAM_RAM_end__];
define region BD_RAM_region = mem:[from __ICFEDIT_region_BD_RAM_start__ to __ICFEDIT_region_BD_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
/*define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };*/
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
//initialize by copy { readwrite };
//initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application
//do not initialize { section * };
//place at address mem:__ICFEDIT_intvec_start__ { readonly section .vectors_table };
do not initialize { section .noinit };
/*place in RAM_region { readwrite, block CSTACK, block HEAP };*/
//place in TCM_region { readwrite };
/****************************************
* ROM Section config *
****************************************/
//keep { section .rom };
//place at start of ROM_region { readonly, section .rom };
place at start of ROM_region {section .rom };
keep { section .rom };
place at start of ROM_region { section .rom };
/****************************************
* BD RAM Section config *
@ -71,61 +70,49 @@ define block .user_vector_table with fixed order{section .ram_user_define_irq_ta
keep { section .ram_user_define_data_table* };
define block .user_data_table with fixed order{section .ram_user_define_data_table*};
define block .rom.bss with fixed order{ section .hal.ram.bss* object hal_misc.o,
section .hal.ram.bss* object hal_pinmux.o,
section .hal.ram.bss* object diag.o,
section .hal.ram.bss* object rtl8195a_ssi_rom.o,
section .hal.ram.bss* object rtl8195a_gpio.o,
section .hal.ram.bss*,
section .timer2_7_vector_table.data*,
section .infra.ram.bss*,
section .mon.ram.bss*,
section .wlan_ram_map* object rom_wlan_ram_map.o,
section .wlan_ram_map*,
section .libc.ram.bss*,
define block .rom.bss with fixed order{ section .hal.ram.bss* object hal_misc.o,
section .hal.ram.bss* object hal_pinmux.o,
section .hal.ram.bss* object diag.o,
section .hal.ram.bss* object rtl8195a_ssi_rom.o,
section .hal.ram.bss* object rtl8195a_gpio.o,
section .hal.ram.bss*,
section .timer2_7_vector_table.data*,
section .infra.ram.bss*,
section .mon.ram.bss*,
section .wlan_ram_map* object rom_wlan_ram_map.o,
section .wlan_ram_map*,
section .libc.ram.bss*,
};
keep { section .start.ram.data* };
define block .ram.start.table with fixed order{ section .start.ram.data* };
keep { section .image1.validate.rodata* };
//keep { section .infra.ram.data* };
//keep { section .timer.ram.data* };
keep { section .infra.ram.data* };
keep { section .timer.ram.data* };
keep { section .hal.ram.data* };
define block .ram_image1.data with fixed order{ section .image1.validate.rodata*,
section .infra.ram.data*,
//section .timer.ram.data*,
section .timer.ram.data*,
section .cutb.ram.data*,
section .hal.ram.data* object rom.o, // for standard libaray __impure_data_ptr
section .cutc.ram.data*,
section .hal.ram.data*
};
//define block .ram_image1.bss with fixed order{ //section .hal.flash.data*,
// section .hal.sdrc.data*
// };
define block .ram_image1.bss with fixed order{ //section .hal.flash.data*,
section .hal.sdrc.data*
};
define block .ram_image1.text with fixed order{ section .hal.ram.text*,
// //section .hal.sdrc.text*,
// //section .text* object startup.o,
section .hal.sdrc.text*,
//section .text* object startup.o,
section .infra.ram.text*,
};
define block IMAGE1 with fixed order { section LOADER };
define block IMAGE1_DBG with fixed order { block .ram.start.table,
block .ram_image1.data,
//block .ram_image1.bss,
block .ram_image1.text };
define block IMAGE1_DBG with fixed order { block .ram.start.table, block .ram_image1.data, block .ram_image1.bss, block .ram_image1.text };
place at start of ROM_USED_RAM_region { //readwrite,
place at start of ROM_USED_RAM_region {
block .vector_table,
block .user_vector_table,
block .user_data_table,
@ -133,136 +120,103 @@ place at start of ROM_USED_RAM_region { //readwrite,
block IMAGE1
};
/**
IMAGE2
**/
keep { section .image2.ram.data* };
define block .image2.start.table1 with fixed order{ section .image2.ram.data* };
keep { section .image2.validate.rodata*, section .custom.validate.rodata* };
define block .image2.start.table2 with fixed order{ section .image2.validate.rodata*, section .custom.validate.rodata* };
/*
define block SHT$$PREINIT_ARRAY { preinit_array };
define block SHT$$INIT_ARRAY { init_array };
define block CPP_INIT with fixed order { block SHT$$PREINIT_ARRAY,
block SHT$$INIT_ARRAY };
*/
define block CPP_INIT with alignment = 8, fixed order {
block SHT$$PREINIT_ARRAY,
block SHT$$INIT_ARRAY
};
define block FPB_REMAP with alignment = 256,fixed order {
section .fpb.remap*
};
define block .ram_image2.text with fixed order{ section .infra.ram.start*,
section .rodata*,
//block CPP_INIT,
block CPP_INIT,
section .mon.ram.text*,
section .hal.flash.text*,
section .hal.gpio.text*,
section .text* object main.o,
section .text*,
section .wlan.text,
section .wps.text,
section CODE,
section .otg.rom.text,
section Veneer object startup.o,
section __DLIB_PERTHREAD
section __DLIB_PERTHREAD,
section .iar.dynexit*,
//section .mdns.text
};
define block .ram.data with fixed order{ section .data*,
section DATA,
section .iar.init_table,
section .data object vector_table_M.o
};
define block IMAGE2 with fixed order { block .image2.start.table1,
block .image2.start.table2,
block .ram_image2.text,
block .ram.data,
readonly,
};
define block .ram.data with fixed order{ readwrite, readonly,
section .data*,
section .wlan.data,
section .wps.data,
section DATA,
section .ram.otg.data.a,
section .iar.init_table,
//section .mdns.data
};
define block IMAGE2 with fixed order { block .image2.start.table1, block .image2.start.table2, block .ram_image2.text, block .ram.data };
define block .ram.bss with fixed order{ section .bss*,
//section .ssl_ram_map,
section .hal.flash.data*,
section .hal.gpio.data*,
section COMMON,
section .bdsram.data*,
};
place at start of BD_RAM_region {
block IMAGE2,
readwrite,
block .ram.bss,
};
place at end of BD_RAM_region{
block HEAP,
//block CSTACK
};
/****************************************
* BD RAM Section config *
****************************************/
section .ssl_ram_map,
section .hal.flash.data*,
section .hal.gpio.data*,
section COMMON,
section .bdsram.data*,
section .bss* object heap_4.o
};
define block .bf_data with fixed order{ section .bfsram.data* };
define block .heap with fixed order{ section .heap* };
define block .stack_dummy with fixed order { section .stack };
place at start of BD_RAM_region {
block IMAGE2,
//block IMAGE1_DBG,
block .ram.bss,
//block .bf_data,
};
//place at address mem:0x10052b00 { readwrite,
place at end of BD_RAM_region {
block .bf_data,
block HEAP,
};
define block SDRAM with fixed order{ section .sdram.text*,
section .sdram.data*,
section .mdns.text*,
section .mdns.data*,
block FPB_REMAP
};
define block SDRBSS with fixed order{
section .sdram.bss*
};
place at start of SDRAM_RAM_region {
block SDRAM,
block SDRBSS,
//block IMAGE1_DBG
};
/*TCM placement */
define overlay TCM_overlay { //section .tcm.heap,
//section .bss object mem.o,
//section .bss object memp.o,
block .heap,
block .stack_dummy
/* TCM placement */
define overlay TCM_overlay {
section .tcm.heap,
section .bss object mem.o,
section .bss object memp.o,
block .heap,
block .stack_dummy
};
/* dummy code placement */
define overlay TCM_overlay { block IMAGE1_DBG };
place at start of TCM_region { //readwrite,
overlay TCM_overlay
};
/* modify by Ian - for mbed stack isr start address setting*/
place at end of TCM_region { block CSTACK };
place at start of TCM_region { overlay TCM_overlay };
define exported symbol __rom_bss_start__ = 0x10000300; // use in rom
define exported symbol __rom_bss_end__ = 0x10000bc8; // use in rom
@ -270,5 +224,5 @@ define exported symbol __ram_start_table_start__= 0x10000bc8; // use in rom
define exported symbol __image1_validate_code__= 0x10000bdc; // needed by ram code
define exported symbol _rtl_impure_ptr = 0x10001c60; // for standard library
define exported symbol __sdio_rom_bss_start__ = 0x1006D000;
define exported symbol __sdio_rom_bss_end__ = 0x1006fa10;

View File

@ -30,28 +30,23 @@
#include "wifi_constants.h"
#include "wifi_conf.h"
#define RTW_EMAC_MTU_SIZE (1500U)
static emac_interface_t *_emac;
static emac_link_input_fn link_input_cb;
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)
{
return 1500U;
return RTW_EMAC_MTU_SIZE;
}
static void wlan_get_ifname(emac_interface_t *emac, char *name, uint8_t size)
{
MBED_ASSERT(name != NULL);
memcpy((void*)name, "r0", 2);
strncpy(name, "r0", size);
}
static uint8_t wlan_get_hwaddr_size(emac_interface_t *emac)
@ -61,16 +56,6 @@ 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);
if (hwaddr == NULL) {
return;
}
memcpy(addr, hwaddr, ETHARP_HWADDR_LEN);
#else
char mac[20];
if(RTW_SUCCESS == wifi_get_mac_address(mac))
{
@ -79,7 +64,6 @@ static void wlan_get_hwaddr(emac_interface_t *emac, uint8_t *addr)
}else{
printf("Get HW address failed\r\n");
}
#endif
}
static void wlan_set_hwaddr(emac_interface_t *emac, uint8_t *addr)
@ -122,7 +106,7 @@ static bool wlan_link_out(emac_interface_t *emac, emac_stack_mem_t *buf)
static bool wlan_power_up(emac_interface_t *emac)
{
printf("Powering up WiFi ...\r\n");
//printf("Powering up WiFi ...\r\n");
wifi_on(RTW_MODE_STA);
wait_ms(1000);
return true;
@ -130,7 +114,7 @@ static bool wlan_power_up(emac_interface_t *emac)
static void wlan_power_down(emac_interface_t *emac)
{
printf("Powering down WiFi ...\r\n");
//printf("Powering down WiFi ...\r\n");
wifi_off();
}
@ -170,7 +154,7 @@ void wlan_emac_recv(struct netif *netif, int len)
for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = p->next) {
sg_list[sg_len].buf = (uint32_t) p->payload;
sg_list[sg_len].len = p->len;
sg_len++;
sg_len++;
}
rltk_wlan_recv(0, sg_list, sg_len);
@ -206,60 +190,29 @@ void mbed_default_mac_address(char *mac) {
return;
}
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");
printf("Get HW address failed\r\n");
mbed_default_mac_address(mac);
}
#endif
}
void wlan_emac_link_down(uint8_t i)
void wlan_emac_link_change(bool up)
{
if (i > 1) {
return;
}
//xnetif[i]->flags &= ~NETIF_FLAG_LINK_UP;
if (link_state_cb) {
link_state_cb(link_state_data, false);
link_state_cb(link_state_data, up);
}
}
void wlan_emac_link_up(uint8_t i)
{
if (i > 1) {
return;
}
//xnetif[i]->flags |= NETIF_FLAG_LINK_UP;
if (link_state_cb) {
link_state_cb(link_state_data, true);
}
}
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;

View File

@ -18,11 +18,8 @@
#include "emac_api.h"
extern void wlan_emac_link_change(bool up);
extern emac_interface_t *wlan_emac_init_interface();
extern void wlan_emac_init_mem();
extern void wlan_emac_init_netif();
extern void wlan_emac_link_up(uint8_t i);
extern void wlan_emac_link_down(uint8_t i);
extern void wlan_emac_recv(struct netif *netif, uint32_t len);
#endif

View File

@ -61,8 +61,7 @@ extern int inic_stop(void);
* Variables Declarations
******************************************************/
#if DEVICE_EMAC
extern struct netif *xnetif[];
//extern struct netif *xnetif[];
#else
extern struct netif xnetif[NET_IF_NUM];
#endif
@ -1004,11 +1003,6 @@ int wifi_off(void)
// TODO:
#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
@ -1682,7 +1676,7 @@ int wifi_restart_ap(
ip_addr_t netmask;
ip_addr_t gw;
#if DEVICE_EMAC
struct netif * pnetif = xnetif[0];
//struct netif * pnetif = xnetif[0];
#else
struct netif * pnetif = &xnetif[0];
#endif
@ -1708,10 +1702,13 @@ int wifi_restart_ap(
else
#endif
{
#if DEVICE_EMAC
#else
IP4_ADDR(&ipaddr, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3);
IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
netif_set_addr(pnetif, &ipaddr, &netmask,&gw);
#endif
wifi_off();
rtw_msleep_os(20);
wifi_on(RTW_MODE_AP);
@ -1753,7 +1750,7 @@ int wifi_restart_ap(
#endif
#if DEVICE_EMAC
// start dhcp server
dhcps_init(xnetif[idx]);
//dhcps_init(xnetif[idx]);
#else
// start dhcp server
dhcps_init(&xnetif[idx]);

View File

@ -158,11 +158,9 @@ 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;
return 1;
#else
struct netif *pnetif = &xnetif[idx];
#endif
struct netif *pnetif = &xnetif[idx];
ip_addr_t addr = { 0 };
@ -196,49 +194,45 @@ int netif_is_valid_IP(int idx, unsigned char *ip_dest)
else
#endif
return 0;
#endif
}
#if DEVICE_EMAC
#else
int netif_get_idx(struct netif *pnetif)
{
#if (CONFIG_LWIP_LAYER == 1)
#if DEVICE_EMAC
if (pnetif == xnetif[0])
return 0;
#else
int idx = pnetif - xnetif;
switch(idx) {
case 0:
return 0;
case 1:
return 1;
default:
return -1;
}
#endif
int idx = pnetif - xnetif;
switch(idx) {
case 0:
return 0;
case 1:
return 1;
default:
return -1;
}
#else
return -1;
return -1;
#endif
}
unsigned char *netif_get_hwaddr(int idx_wlan)
{
#if (CONFIG_LWIP_LAYER == 1)
#if DEVICE_EMAC
return xnetif[idx_wlan]->hwaddr;
#else
return xnetif[idx_wlan].hwaddr;
#endif
#else
return NULL;
#endif
}
#endif
void netif_rx(int idx, unsigned int len)
{
#if (CONFIG_LWIP_LAYER == 1)
#if DEVICE_EMAC
wlan_emac_recv(xnetif[idx], len);
wlan_emac_recv(NULL, len);
#else
ethernetif_recv(&xnetif[idx], len);
#endif