mbed library sources. Supersedes mbed-src.

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

Committer:
Anna Bridge
Date:
Fri Jun 22 16:45:37 2018 +0100
Revision:
186:707f6e361f3e
Parent:
174:b96e65c34a4d
Child:
187:0387e8f68319
mbed-dev library. Release version 162

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #if DEVICE_EMAC
AnnaBridge 167:e84263d55307 18
AnnaBridge 167:e84263d55307 19 #include <stdio.h>
AnnaBridge 167:e84263d55307 20 #include "mbed_assert.h"
AnnaBridge 167:e84263d55307 21 #include "mbed_events.h"
AnnaBridge 167:e84263d55307 22
Anna Bridge 186:707f6e361f3e 23 #include "rtw_emac.h"
Anna Bridge 186:707f6e361f3e 24 #include "EMACMemoryManager.h"
Anna Bridge 186:707f6e361f3e 25
AnnaBridge 167:e84263d55307 26 #include "rtos.h"
AnnaBridge 167:e84263d55307 27 #include "lwip/pbuf.h"
AnnaBridge 167:e84263d55307 28 #include "netif/etharp.h"
AnnaBridge 167:e84263d55307 29
AnnaBridge 167:e84263d55307 30 #include "lwip_intf.h"
AnnaBridge 167:e84263d55307 31 #include "wifi_constants.h"
AnnaBridge 167:e84263d55307 32 #include "wifi_conf.h"
AnnaBridge 167:e84263d55307 33
AnnaBridge 167:e84263d55307 34 #define RTW_EMAC_MTU_SIZE (1500U)
AnnaBridge 167:e84263d55307 35
Anna Bridge 186:707f6e361f3e 36 RTW_EMAC::RTW_EMAC()
Anna Bridge 186:707f6e361f3e 37 {
Anna Bridge 186:707f6e361f3e 38 set_callback_func((emac_callback)(&RTW_EMAC::wlan_emac_recv), this);
Anna Bridge 186:707f6e361f3e 39 }
AnnaBridge 167:e84263d55307 40
Anna Bridge 186:707f6e361f3e 41 uint32_t RTW_EMAC::get_mtu_size() const
AnnaBridge 167:e84263d55307 42 {
AnnaBridge 167:e84263d55307 43 return RTW_EMAC_MTU_SIZE;
AnnaBridge 167:e84263d55307 44 }
AnnaBridge 167:e84263d55307 45
Anna Bridge 186:707f6e361f3e 46 uint32_t RTW_EMAC::get_align_preference() const
Anna Bridge 186:707f6e361f3e 47 {
Anna Bridge 186:707f6e361f3e 48 return true;
Anna Bridge 186:707f6e361f3e 49 }
Anna Bridge 186:707f6e361f3e 50
Anna Bridge 186:707f6e361f3e 51 void RTW_EMAC::get_ifname(char *name, uint8_t size) const
AnnaBridge 167:e84263d55307 52 {
AnnaBridge 167:e84263d55307 53 MBED_ASSERT(name != NULL);
AnnaBridge 167:e84263d55307 54 strncpy(name, "r0", size);
AnnaBridge 167:e84263d55307 55 }
AnnaBridge 167:e84263d55307 56
Anna Bridge 186:707f6e361f3e 57 uint8_t RTW_EMAC::get_hwaddr_size() const
AnnaBridge 167:e84263d55307 58 {
AnnaBridge 167:e84263d55307 59 return ETHARP_HWADDR_LEN;
AnnaBridge 167:e84263d55307 60 }
AnnaBridge 167:e84263d55307 61
Anna Bridge 186:707f6e361f3e 62 bool RTW_EMAC::get_hwaddr(uint8_t *addr) const
AnnaBridge 167:e84263d55307 63 {
Anna Bridge 186:707f6e361f3e 64 char mac[20];
Anna Bridge 186:707f6e361f3e 65 int val[6];
Anna Bridge 186:707f6e361f3e 66 int i;
Anna Bridge 186:707f6e361f3e 67
Anna Bridge 186:707f6e361f3e 68 if (RTW_SUCCESS == wifi_get_mac_address(mac)) {
Anna Bridge 186:707f6e361f3e 69 if (sscanf(mac, "%x:%x:%x:%x:%x:%x",
Anna Bridge 186:707f6e361f3e 70 &val[0], &val[1], &val[2], &val[3], &val[4], &val[5]) != 6) {
AnnaBridge 167:e84263d55307 71 printf("Get HW address failed\r\n");
Anna Bridge 186:707f6e361f3e 72 }
Anna Bridge 186:707f6e361f3e 73 for (i = 0; i < 6; i++) {
Anna Bridge 186:707f6e361f3e 74 addr[i] = (unsigned char) val[i];
Anna Bridge 186:707f6e361f3e 75 }
Anna Bridge 186:707f6e361f3e 76 } else {
Anna Bridge 186:707f6e361f3e 77 printf("Get HW address failed\r\n");
AnnaBridge 167:e84263d55307 78 }
AnnaBridge 167:e84263d55307 79 }
AnnaBridge 167:e84263d55307 80
Anna Bridge 186:707f6e361f3e 81 void RTW_EMAC::set_hwaddr(const uint8_t *addr)
AnnaBridge 167:e84263d55307 82 {
AnnaBridge 167:e84263d55307 83 }
AnnaBridge 167:e84263d55307 84
Anna Bridge 186:707f6e361f3e 85 bool RTW_EMAC::link_out(emac_mem_buf_t *buf)
AnnaBridge 167:e84263d55307 86 {
Anna Bridge 186:707f6e361f3e 87 struct eth_drv_sg *sg_list;
AnnaBridge 167:e84263d55307 88 int sg_len = 0;
AnnaBridge 167:e84263d55307 89 int tot_len;
Anna Bridge 186:707f6e361f3e 90 emac_mem_buf_t *p;
AnnaBridge 167:e84263d55307 91 bool ret = true;
AnnaBridge 167:e84263d55307 92 if (!rltk_wlan_running(0)) {
Anna Bridge 186:707f6e361f3e 93 memory_manager->free(buf);
AnnaBridge 167:e84263d55307 94 return false;
AnnaBridge 167:e84263d55307 95 }
AnnaBridge 167:e84263d55307 96
AnnaBridge 167:e84263d55307 97 sg_list = (struct eth_drv_sg *)malloc(sizeof(struct eth_drv_sg)*MAX_ETH_DRV_SG);
Anna Bridge 186:707f6e361f3e 98 if (sg_list == 0) {
Anna Bridge 186:707f6e361f3e 99 memory_manager->free(buf);
AnnaBridge 167:e84263d55307 100 return false;
AnnaBridge 167:e84263d55307 101 }
AnnaBridge 167:e84263d55307 102
Anna Bridge 186:707f6e361f3e 103 p = buf;
Anna Bridge 186:707f6e361f3e 104 tot_len = memory_manager->get_total_len(p);
Anna Bridge 186:707f6e361f3e 105 for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = memory_manager->get_next(p)) {
Anna Bridge 186:707f6e361f3e 106 sg_list[sg_len].buf = (unsigned int)(static_cast<uint8_t *>(memory_manager->get_ptr(p)));
Anna Bridge 186:707f6e361f3e 107 sg_list[sg_len].len = memory_manager->get_len(p);
Anna Bridge 186:707f6e361f3e 108 sg_len++;
AnnaBridge 167:e84263d55307 109 }
AnnaBridge 167:e84263d55307 110 if (sg_len) {
AnnaBridge 167:e84263d55307 111 if (rltk_wlan_send(0, sg_list, sg_len, tot_len) != 0) {
AnnaBridge 167:e84263d55307 112 ret = false;
AnnaBridge 167:e84263d55307 113 }
AnnaBridge 167:e84263d55307 114 }
AnnaBridge 167:e84263d55307 115
Anna Bridge 186:707f6e361f3e 116 memory_manager->free(buf);
AnnaBridge 167:e84263d55307 117 free(sg_list);
AnnaBridge 167:e84263d55307 118 return ret;
AnnaBridge 167:e84263d55307 119 }
AnnaBridge 167:e84263d55307 120
Anna Bridge 186:707f6e361f3e 121 bool RTW_EMAC::power_up()
AnnaBridge 167:e84263d55307 122 {
AnnaBridge 167:e84263d55307 123 wifi_on(RTW_MODE_STA);
AnnaBridge 167:e84263d55307 124 wait_ms(1000);
Anna Bridge 186:707f6e361f3e 125 wlan_emac_link_change(true);
AnnaBridge 167:e84263d55307 126 return true;
AnnaBridge 167:e84263d55307 127 }
AnnaBridge 167:e84263d55307 128
Anna Bridge 186:707f6e361f3e 129 void RTW_EMAC::power_down()
AnnaBridge 167:e84263d55307 130 {
AnnaBridge 167:e84263d55307 131 wifi_off();
AnnaBridge 167:e84263d55307 132 }
AnnaBridge 167:e84263d55307 133
Anna Bridge 186:707f6e361f3e 134 void RTW_EMAC::set_link_input_cb(emac_link_input_cb_t input_cb)
AnnaBridge 167:e84263d55307 135 {
Anna Bridge 186:707f6e361f3e 136 emac_link_input_cb = input_cb;
Anna Bridge 186:707f6e361f3e 137 }
Anna Bridge 186:707f6e361f3e 138
Anna Bridge 186:707f6e361f3e 139 void RTW_EMAC::set_link_state_cb(emac_link_state_change_cb_t state_cb)
Anna Bridge 186:707f6e361f3e 140 {
Anna Bridge 186:707f6e361f3e 141 emac_link_state_cb = state_cb;
Anna Bridge 186:707f6e361f3e 142 }
Anna Bridge 186:707f6e361f3e 143
Anna Bridge 186:707f6e361f3e 144 void RTW_EMAC::add_multicast_group(const uint8_t *addr)
Anna Bridge 186:707f6e361f3e 145 {
AnnaBridge 167:e84263d55307 146 }
AnnaBridge 167:e84263d55307 147
Anna Bridge 186:707f6e361f3e 148 void RTW_EMAC::remove_multicast_group(const uint8_t *addr)
AnnaBridge 167:e84263d55307 149 {
Anna Bridge 186:707f6e361f3e 150 }
Anna Bridge 186:707f6e361f3e 151
Anna Bridge 186:707f6e361f3e 152 void RTW_EMAC::set_all_multicast(bool all)
Anna Bridge 186:707f6e361f3e 153 {
AnnaBridge 167:e84263d55307 154 }
AnnaBridge 167:e84263d55307 155
Anna Bridge 186:707f6e361f3e 156 void RTW_EMAC::set_memory_manager(EMACMemoryManager &mem_mngr)
AnnaBridge 167:e84263d55307 157 {
Anna Bridge 186:707f6e361f3e 158 memory_manager = &mem_mngr;
Anna Bridge 186:707f6e361f3e 159 }
Anna Bridge 186:707f6e361f3e 160
Anna Bridge 186:707f6e361f3e 161 void RTW_EMAC::wlan_emac_recv(void *param, struct netif *netif, uint32_t len)
Anna Bridge 186:707f6e361f3e 162 {
Anna Bridge 186:707f6e361f3e 163 struct eth_drv_sg sg_list[MAX_ETH_DRV_SG] = {0};
Anna Bridge 186:707f6e361f3e 164 emac_mem_buf_t *buf;
Anna Bridge 186:707f6e361f3e 165 RTW_EMAC *enet = static_cast<RTW_EMAC *>(param);
Anna Bridge 186:707f6e361f3e 166 emac_mem_buf_t *p;
AnnaBridge 167:e84263d55307 167 int sg_len = 0;
AnnaBridge 167:e84263d55307 168 if (!rltk_wlan_running(0)) {
AnnaBridge 167:e84263d55307 169 return;
AnnaBridge 167:e84263d55307 170 }
AnnaBridge 167:e84263d55307 171
AnnaBridge 167:e84263d55307 172 if (len > MAX_ETH_MSG || len < 0) {
AnnaBridge 167:e84263d55307 173 len = MAX_ETH_MSG;
AnnaBridge 167:e84263d55307 174 }
AnnaBridge 167:e84263d55307 175
Anna Bridge 186:707f6e361f3e 176 buf = enet->memory_manager->alloc_heap(len, 0);
AnnaBridge 167:e84263d55307 177 if (buf == NULL) {
AnnaBridge 167:e84263d55307 178 return;
Anna Bridge 186:707f6e361f3e 179 }
AnnaBridge 167:e84263d55307 180
Anna Bridge 186:707f6e361f3e 181 enet->memory_manager->set_len(buf, len);
Anna Bridge 186:707f6e361f3e 182 p = buf;
Anna Bridge 186:707f6e361f3e 183 for (; p != NULL && sg_len < MAX_ETH_DRV_SG; p = enet->memory_manager->get_next(p)) {
Anna Bridge 186:707f6e361f3e 184 sg_list[sg_len].buf = (unsigned int)(static_cast<uint8_t *>(enet->memory_manager->get_ptr(p)));
Anna Bridge 186:707f6e361f3e 185 sg_list[sg_len].len = enet->memory_manager->get_len(p);
AnnaBridge 167:e84263d55307 186 sg_len++;
AnnaBridge 167:e84263d55307 187 }
Anna Bridge 186:707f6e361f3e 188
AnnaBridge 167:e84263d55307 189 rltk_wlan_recv(0, sg_list, sg_len);
Anna Bridge 186:707f6e361f3e 190 if (enet->emac_link_input_cb) {
Anna Bridge 186:707f6e361f3e 191 enet->emac_link_input_cb(buf);
AnnaBridge 167:e84263d55307 192 }
AnnaBridge 167:e84263d55307 193 }
AnnaBridge 167:e84263d55307 194
AnnaBridge 167:e84263d55307 195 void mbed_default_mac_address(char *mac) {
AnnaBridge 167:e84263d55307 196 unsigned char RTK_mac_addr[3] = {0x00, 0xE0, 0x4C}; // default Realtek mac address
AnnaBridge 167:e84263d55307 197 mac[0] = RTK_mac_addr[0];
AnnaBridge 167:e84263d55307 198 mac[1] = RTK_mac_addr[1];
AnnaBridge 167:e84263d55307 199 mac[2] = RTK_mac_addr[2];
AnnaBridge 167:e84263d55307 200 mac[3] = 0x87;
AnnaBridge 167:e84263d55307 201 mac[4] = 0x00;
AnnaBridge 167:e84263d55307 202 mac[5] = 0x01;
AnnaBridge 167:e84263d55307 203 return;
AnnaBridge 167:e84263d55307 204 }
AnnaBridge 167:e84263d55307 205
AnnaBridge 167:e84263d55307 206 void mbed_mac_address(char *mac)
AnnaBridge 167:e84263d55307 207 {
AnnaBridge 167:e84263d55307 208 char hwaddr[20];
Anna Bridge 186:707f6e361f3e 209 int val[6];
Anna Bridge 186:707f6e361f3e 210 int i;
Anna Bridge 186:707f6e361f3e 211 if (RTW_SUCCESS == wifi_get_mac_address(hwaddr)) {
Anna Bridge 186:707f6e361f3e 212 if (sscanf(hwaddr, "%x:%x:%x:%x:%x:%x",
Anna Bridge 186:707f6e361f3e 213 &val[0], &val[1], &val[2], &val[3], &val[4], &val[5]) != 6) {
AnnaBridge 167:e84263d55307 214 printf("Get HW address failed\r\n");
Anna Bridge 186:707f6e361f3e 215 }
Anna Bridge 186:707f6e361f3e 216 for (i = 0; i < 6; i++) {
Anna Bridge 186:707f6e361f3e 217 mac[i] = (unsigned char) val[i];
Anna Bridge 186:707f6e361f3e 218 }
Anna Bridge 186:707f6e361f3e 219 } else {
AnnaBridge 167:e84263d55307 220 printf("Get HW address failed\r\n");
AnnaBridge 167:e84263d55307 221 mbed_default_mac_address(mac);
AnnaBridge 167:e84263d55307 222 }
AnnaBridge 167:e84263d55307 223 }
AnnaBridge 167:e84263d55307 224
Anna Bridge 186:707f6e361f3e 225 void RTW_EMAC::wlan_emac_link_change(bool up)
AnnaBridge 167:e84263d55307 226 {
Anna Bridge 186:707f6e361f3e 227 if (emac_link_state_cb) {
Anna Bridge 186:707f6e361f3e 228 emac_link_state_cb(up);
AnnaBridge 167:e84263d55307 229 }
AnnaBridge 167:e84263d55307 230 }
AnnaBridge 167:e84263d55307 231
Anna Bridge 186:707f6e361f3e 232 RTW_EMAC &RTW_EMAC::get_instance() {
Anna Bridge 186:707f6e361f3e 233 static RTW_EMAC rtw_emac;
Anna Bridge 186:707f6e361f3e 234 return rtw_emac;
Anna Bridge 186:707f6e361f3e 235 }
Anna Bridge 186:707f6e361f3e 236 // Weak so a module can override
Anna Bridge 186:707f6e361f3e 237 MBED_WEAK EMAC &EMAC::get_default_instance() {
Anna Bridge 186:707f6e361f3e 238 return RTW_EMAC::get_instance();
AnnaBridge 167:e84263d55307 239 }
AnnaBridge 167:e84263d55307 240 #endif