mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Realtek/TARGET_AMEBA/rtw_emac.cpp@186:707f6e361f3e, 2018-06-22 (annotated)
- 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?
User | Revision | Line number | New 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 |