mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Revision:
186:707f6e361f3e
Parent:
174:b96e65c34a4d
Child:
187:0387e8f68319
--- a/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp	Thu Apr 19 17:12:19 2018 +0100
+++ b/targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp	Fri Jun 22 16:45:37 2018 +0100
@@ -20,9 +20,10 @@
 #include "mbed_assert.h"
 #include "mbed_events.h"
 
-#include "emac_api.h"
+#include "rtw_emac.h"
+#include "EMACMemoryManager.h"
+
 #include "rtos.h"
-
 #include "lwip/pbuf.h"
 #include "netif/etharp.h"
 
@@ -32,114 +33,138 @@
 
 #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;
+RTW_EMAC::RTW_EMAC() 
+{
+    set_callback_func((emac_callback)(&RTW_EMAC::wlan_emac_recv), this);
+}
 
-static uint32_t wlan_get_mtu_size(emac_interface_t *emac)
+uint32_t RTW_EMAC::get_mtu_size() const
 {
     return RTW_EMAC_MTU_SIZE;
 }
 
-static void wlan_get_ifname(emac_interface_t *emac, char *name, uint8_t size)
+uint32_t RTW_EMAC::get_align_preference() const
+{
+    return true;
+}
+
+void RTW_EMAC::get_ifname(char *name, uint8_t size) const
 {
     MBED_ASSERT(name != NULL);
     strncpy(name, "r0", size);
 }
 
-static uint8_t wlan_get_hwaddr_size(emac_interface_t *emac)
+uint8_t RTW_EMAC::get_hwaddr_size() const
 {
     return ETHARP_HWADDR_LEN;
 }
 
-static void wlan_get_hwaddr(emac_interface_t *emac, uint8_t *addr)
+bool RTW_EMAC::get_hwaddr(uint8_t *addr) const
 {
-    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)
+    char mac[20];
+    int val[6];
+    int i;
+
+    if (RTW_SUCCESS == wifi_get_mac_address(mac)) {
+        if (sscanf(mac, "%x:%x:%x:%x:%x:%x", 
+            &val[0], &val[1], &val[2], &val[3], &val[4], &val[5]) != 6) {
             printf("Get HW address failed\r\n");
-    }else{
-            printf("Get HW address failed\r\n");
+        }
+        for (i = 0; i < 6; i++) {
+            addr[i] = (unsigned char) val[i];
+        }
+    } else {
+        printf("Get HW address failed\r\n");
     }
 }
 
-static void wlan_set_hwaddr(emac_interface_t *emac, uint8_t *addr)
+void RTW_EMAC::set_hwaddr(const uint8_t *addr)
 {
-    
 }
 
-
-static bool wlan_link_out(emac_interface_t *emac, emac_stack_mem_t *buf)
+bool RTW_EMAC::link_out(emac_mem_buf_t *buf)
 {
-    struct eth_drv_sg * sg_list=0;
+    struct eth_drv_sg *sg_list;
     int sg_len = 0;
     int tot_len;
-    struct pbuf *p;
+    emac_mem_buf_t *p;
     bool ret = true;
-
     if (!rltk_wlan_running(0)) {
+        memory_manager->free(buf);
         return false;
     }
 
     sg_list = (struct eth_drv_sg *)malloc(sizeof(struct eth_drv_sg)*MAX_ETH_DRV_SG);
-    if(sg_list == 0){//malloc fail
+    if (sg_list == 0) {
+        memory_manager->free(buf);
         return false;
     }
-    emac_stack_mem_ref(emac, buf);
 
-    p = (struct pbuf *)buf;
-    tot_len = p->tot_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++;
+    p = buf;
+    tot_len = memory_manager->get_total_len(p);
+    for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = memory_manager->get_next(p)) {
+        sg_list[sg_len].buf = (unsigned int)(static_cast<uint8_t *>(memory_manager->get_ptr(p)));
+        sg_list[sg_len].len = memory_manager->get_len(p);
+        sg_len++;
     }
-
     if (sg_len) {
         if (rltk_wlan_send(0, sg_list, sg_len, tot_len) != 0) {
             ret = false;
         }
     }
 
-    emac_stack_mem_free(emac, buf);
+    memory_manager->free(buf);
     free(sg_list);
     return ret;
 }
 
-static bool wlan_power_up(emac_interface_t *emac)
+bool RTW_EMAC::power_up()
 {
     wifi_on(RTW_MODE_STA);
     wait_ms(1000);
+    wlan_emac_link_change(true);
     return true;
 }
 
-static void wlan_power_down(emac_interface_t *emac)
+void RTW_EMAC::power_down()
 {
     wifi_off();
 }
 
-static void wlan_set_link_input_cb(emac_interface_t *emac, emac_link_input_fn cb, void *data)
+void RTW_EMAC::set_link_input_cb(emac_link_input_cb_t input_cb)
 {
-    link_input_cb = cb;
-    link_input_data = data;
+    emac_link_input_cb = input_cb;
+}
+
+void RTW_EMAC::set_link_state_cb(emac_link_state_change_cb_t state_cb)
+{
+    emac_link_state_cb = state_cb;
+}
+
+void RTW_EMAC::add_multicast_group(const uint8_t *addr)
+{
 }
 
-static void wlan_set_link_state_cb(emac_interface_t *emac, emac_link_state_change_fn cb, void *data)
+void RTW_EMAC::remove_multicast_group(const uint8_t *addr)
 {
-    link_state_cb = cb;
-    link_state_data = data;
+}
+
+void RTW_EMAC::set_all_multicast(bool all)
+{
 }
 
-void wlan_emac_recv(struct netif *netif, int len)
+void RTW_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr)
 {
-    struct eth_drv_sg sg_list[MAX_ETH_DRV_SG];
-    emac_stack_mem_t *buf;
-    struct pbuf *p;
+    memory_manager = &mem_mngr;
+}
+
+void RTW_EMAC::wlan_emac_recv(void *param, struct netif *netif, uint32_t len)
+{
+    struct eth_drv_sg sg_list[MAX_ETH_DRV_SG] = {0};
+    emac_mem_buf_t *buf;
+    RTW_EMAC *enet = static_cast<RTW_EMAC *>(param);
+    emac_mem_buf_t *p;
     int sg_len = 0;
-
     if (!rltk_wlan_running(0)) {
         return;
     }
@@ -148,80 +173,68 @@
         len = MAX_ETH_MSG;
     }
 
-    buf = emac_stack_mem_alloc(NULL, len, 0);
+    buf = enet->memory_manager->alloc_heap(len, 0);
     if (buf == NULL) {
         return;
-    }   
+    } 
 
-    p = (struct pbuf *)buf;
-    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;
+    enet->memory_manager->set_len(buf, len);
+    p = buf;
+    for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = enet->memory_manager->get_next(p)) {
+        sg_list[sg_len].buf = (unsigned int)(static_cast<uint8_t *>(enet->memory_manager->get_ptr(p)));
+        sg_list[sg_len].len = enet->memory_manager->get_len(p);
         sg_len++;
     }
+
     rltk_wlan_recv(0, sg_list, sg_len);
-
-    if (link_input_cb) {
-        link_input_cb(link_input_data, buf);
+    if (enet->emac_link_input_cb) {
+        enet->emac_link_input_cb(buf);
     }
-    return;
 }
 
-const emac_interface_ops_t wlan_emac_interface = {
-    .get_mtu_size = wlan_get_mtu_size,
-    .get_ifname = wlan_get_ifname,
-    .get_hwaddr_size = wlan_get_hwaddr_size,
-    .get_hwaddr = wlan_get_hwaddr,
-    .set_hwaddr = wlan_set_hwaddr,
-    .link_out = wlan_link_out,
-    .power_up = wlan_power_up,
-    .power_down = wlan_power_down,
-    .set_link_input_cb = wlan_set_link_input_cb,
-    .set_link_state_cb = wlan_set_link_state_cb
-};
-
 void mbed_default_mac_address(char *mac) {
     unsigned char RTK_mac_addr[3] = {0x00, 0xE0, 0x4C}; // default Realtek mac address
-
     mac[0] = RTK_mac_addr[0];
     mac[1] = RTK_mac_addr[1];
     mac[2] = RTK_mac_addr[2];
     mac[3] = 0x87;
     mac[4] = 0x00;
     mac[5] = 0x01;
-
     return;
 }
 
 void mbed_mac_address(char *mac)
 {
     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)
+    int val[6];
+    int i;
+    if (RTW_SUCCESS == wifi_get_mac_address(hwaddr)) {
+        if (sscanf(hwaddr, "%x:%x:%x:%x:%x:%x",
+            &val[0], &val[1], &val[2], &val[3], &val[4], &val[5]) != 6) {
             printf("Get HW address failed\r\n");
-    }else{
+        }
+        for (i = 0; i < 6; i++) {
+            mac[i] = (unsigned char) val[i];
+        }
+    } else {
         printf("Get HW address failed\r\n");
         mbed_default_mac_address(mac);
     }
 }
 
-void wlan_emac_link_change(bool up)
+void RTW_EMAC::wlan_emac_link_change(bool up)
 {
-    if (link_state_cb) {
-        link_state_cb(link_state_data, up);
+    if (emac_link_state_cb) {
+        emac_link_state_cb(up);
     }
 }
 
-emac_interface_t *wlan_emac_init_interface()
-{
-
-    if (_emac == NULL) {
-        _emac = (emac_interface_t*) malloc(sizeof(emac_interface_t));
-        MBED_ASSERT(_emac);
-        _emac->hw = NULL;
-        memcpy((void*)&_emac->ops, &wlan_emac_interface, sizeof(wlan_emac_interface));
-    }
-    return _emac;
+RTW_EMAC &RTW_EMAC::get_instance() {
+    static RTW_EMAC rtw_emac;
+    return rtw_emac;
+}
+// Weak so a module can override
+MBED_WEAK EMAC &EMAC::get_default_instance() {
+    return RTW_EMAC::get_instance();
 }
 #endif