mbed library sources. Supersedes mbed-src.

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

Committer:
<>
Date:
Tue Nov 08 17:45:16 2016 +0000
Revision:
150:02e0a0aed4ec
Parent:
149:156823d33999
Child:
164:289d4deac6e4
This updates the lib to the mbed lib v129

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 149:156823d33999 1 #if DEVICE_EMAC
<> 149:156823d33999 2
<> 149:156823d33999 3 #include <stdio.h>
<> 149:156823d33999 4 #include "cb_main.h"
<> 149:156823d33999 5 #include "cb_wlan.h"
<> 149:156823d33999 6 #include "cb_wlan_types.h"
<> 149:156823d33999 7 #include "cb_otp.h"
<> 149:156823d33999 8 #include "cb_wlan_target_data.h"
<> 149:156823d33999 9 #include "emac_api.h"
<> 149:156823d33999 10 #include "mbed_assert.h"
<> 149:156823d33999 11 #include "rtos.h"
<> 149:156823d33999 12 #include "mbed_events.h"
<> 149:156823d33999 13
<> 149:156823d33999 14 /*===========================================================================
<> 149:156823d33999 15 * DEFINES
<> 149:156823d33999 16 *=========================================================================*/
<> 149:156823d33999 17 #define WIFI_EMAC_API_MTU_SIZE (1500U)
<> 149:156823d33999 18
<> 149:156823d33999 19 /*===========================================================================
<> 149:156823d33999 20 * TYPES
<> 149:156823d33999 21 *=========================================================================*/
<> 149:156823d33999 22 typedef struct {
<> 149:156823d33999 23 emac_link_input_fn wifi_input_cb;
<> 149:156823d33999 24 emac_link_state_change_fn wifi_state_cb;
<> 149:156823d33999 25 void* link_input_user_data;
<> 149:156823d33999 26 void* link_state_user_data;
<> 149:156823d33999 27 bool linkStateRegistered;
<> 149:156823d33999 28 } wifi_emac_api_s;
<> 149:156823d33999 29
<> 149:156823d33999 30 /*===========================================================================
<> 149:156823d33999 31 * DECLARATIONS
<> 149:156823d33999 32 *=========================================================================*/
<> 149:156823d33999 33 static void statusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data);
<> 149:156823d33999 34 static void packetIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo);
<> 149:156823d33999 35 static cb_boolean handleWlanTargetCopyFromDataFrame(uint8_t* buffer, cbWLANTARGET_dataFrame* frame, uint32_t size, uint32_t offsetInFrame);
<> 149:156823d33999 36 static cb_boolean handleWlanTargetCopyToDataFrame(cbWLANTARGET_dataFrame* frame, uint8_t* buffer, uint32_t size, uint32_t offsetInFrame);
<> 149:156823d33999 37 static cbWLANTARGET_dataFrame* handleWlanTargetAllocDataFrame(uint32_t size);
<> 149:156823d33999 38 static void handleWlanTargetFreeDataFrame(cbWLANTARGET_dataFrame* frame);
<> 149:156823d33999 39 static cb_uint32 handleWlanTargetGetDataFrameSize(cbWLANTARGET_dataFrame* frame);
<> 149:156823d33999 40 static cb_uint8 handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame);
<> 149:156823d33999 41
<> 149:156823d33999 42 static uint32_t wifi_get_mtu_size(emac_interface_t *emac);
<> 149:156823d33999 43 static void wifi_get_ifname(emac_interface_t *emac, char *name, uint8_t size);
<> 149:156823d33999 44 static uint8_t wifi_get_hwaddr_size(emac_interface_t *emac);
<> 149:156823d33999 45 static void wifi_get_hwaddr(emac_interface_t *emac, uint8_t *addr);
<> 149:156823d33999 46 static void wifi_set_hwaddr(emac_interface_t *emac, uint8_t *addr);
<> 149:156823d33999 47 static bool wifi_link_out(emac_interface_t *emac, emac_stack_mem_t *buf);
<> 149:156823d33999 48 static bool wifi_power_up(emac_interface_t *emac);
<> 149:156823d33999 49 static void wifi_power_down(emac_interface_t *emac);
<> 149:156823d33999 50 static void wifi_set_link_input_cb(emac_interface_t *emac, emac_link_input_fn input_cb, void *data);
<> 149:156823d33999 51 static void wifi_set_link_state_cb(emac_interface_t *emac, emac_link_state_change_fn state_cb, void *data);
<> 149:156823d33999 52
<> 149:156823d33999 53 /*===========================================================================
<> 149:156823d33999 54 * DEFINITIONS
<> 149:156823d33999 55 *=========================================================================*/
<> 149:156823d33999 56 static wifi_emac_api_s _admin;
<> 149:156823d33999 57 static const char _ifname[] = "WL0";
<> 149:156823d33999 58
<> 149:156823d33999 59 const emac_interface_ops_t wifi_emac_interface = {
<> 149:156823d33999 60 .get_mtu_size = wifi_get_mtu_size,
<> 149:156823d33999 61 .get_ifname = wifi_get_ifname,
<> 149:156823d33999 62 .get_hwaddr_size = wifi_get_hwaddr_size,
<> 149:156823d33999 63 .get_hwaddr = wifi_get_hwaddr,
<> 149:156823d33999 64 .set_hwaddr = wifi_set_hwaddr,
<> 149:156823d33999 65 .link_out = wifi_link_out,
<> 149:156823d33999 66 .power_up = wifi_power_up,
<> 149:156823d33999 67 .power_down = wifi_power_down,
<> 149:156823d33999 68 .set_link_input_cb = wifi_set_link_input_cb,
<> 149:156823d33999 69 .set_link_state_cb = wifi_set_link_state_cb
<> 149:156823d33999 70 };
<> 149:156823d33999 71
<> 149:156823d33999 72 static emac_interface_t* _intf = NULL;
<> 149:156823d33999 73
<> 149:156823d33999 74 static const cbWLANTARGET_Callback _wlanTargetCallback =
<> 149:156823d33999 75 {
<> 149:156823d33999 76 handleWlanTargetCopyFromDataFrame,
<> 149:156823d33999 77 handleWlanTargetCopyToDataFrame,
<> 149:156823d33999 78 handleWlanTargetAllocDataFrame,
<> 149:156823d33999 79 handleWlanTargetFreeDataFrame,
<> 149:156823d33999 80 handleWlanTargetGetDataFrameSize,
<> 149:156823d33999 81 handleWlanTargetGetDataFrameTID
<> 149:156823d33999 82 };
<> 149:156823d33999 83
<> 149:156823d33999 84 /*===========================================================================
<> 149:156823d33999 85 * FUNCTIONS
<> 149:156823d33999 86 *=========================================================================*/
<> 149:156823d33999 87 static void statusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data)
<> 149:156823d33999 88 {
<> 149:156823d33999 89 bool linkUp = false;
<> 149:156823d33999 90 bool sendCb = true;
<> 149:156823d33999 91 (void)dummy;
<> 149:156823d33999 92 (void)data;
<> 149:156823d33999 93
<> 149:156823d33999 94 switch (status) {
<> 149:156823d33999 95 case cbWLAN_STATUS_CONNECTED:
<> 149:156823d33999 96 case cbWLAN_STATUS_AP_STA_ADDED:
<> 149:156823d33999 97 linkUp = true;
<> 149:156823d33999 98 break;
<> 149:156823d33999 99 case cbWLAN_STATUS_STOPPED:
<> 149:156823d33999 100 case cbWLAN_STATUS_ERROR:
<> 149:156823d33999 101 case cbWLAN_STATUS_DISCONNECTED:
<> 149:156823d33999 102 case cbWLAN_STATUS_CONNECTION_FAILURE:
<> 149:156823d33999 103 break;
<> 149:156823d33999 104 case cbWLAN_STATUS_CONNECTING:
<> 149:156823d33999 105 default:
<> 149:156823d33999 106 sendCb = false;
<> 149:156823d33999 107 break;
<> 149:156823d33999 108 }
<> 149:156823d33999 109 if (sendCb) {
<> 149:156823d33999 110 _admin.wifi_state_cb(_admin.link_state_user_data, linkUp);
<> 149:156823d33999 111 }
<> 149:156823d33999 112 }
<> 149:156823d33999 113
<> 149:156823d33999 114 static void packetIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo)
<> 149:156823d33999 115 {
<> 149:156823d33999 116 (void)dummy;
<> 149:156823d33999 117 _admin.wifi_input_cb(_admin.link_input_user_data, (void*)packetInfo->rxData);
<> 149:156823d33999 118 }
<> 149:156823d33999 119
<> 149:156823d33999 120 static cb_boolean handleWlanTargetCopyFromDataFrame(uint8_t* buffer, cbWLANTARGET_dataFrame* frame, uint32_t size, uint32_t offsetInFrame)
<> 149:156823d33999 121 {
<> 149:156823d33999 122 void* dummy = NULL;
<> 149:156823d33999 123 emac_stack_mem_t** phead = (emac_stack_mem_chain_t **)&frame;
<> 149:156823d33999 124 emac_stack_mem_t* pbuf;
<> 149:156823d33999 125 uint32_t copySize, bytesCopied = 0, pbufOffset = 0;
<> 149:156823d33999 126
<> 149:156823d33999 127 MBED_ASSERT(frame != NULL);
<> 149:156823d33999 128 MBED_ASSERT(buffer != NULL);
<> 149:156823d33999 129
<> 149:156823d33999 130 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 131 while (pbuf != NULL) {
<> 149:156823d33999 132 if ((pbufOffset + emac_stack_mem_len(dummy, pbuf)) >= offsetInFrame) {
<> 149:156823d33999 133 copySize = cb_MIN(size, emac_stack_mem_len(dummy, pbuf) - (offsetInFrame - pbufOffset));
<> 149:156823d33999 134 memcpy(buffer, (int8_t *)emac_stack_mem_ptr(dummy, pbuf) + (offsetInFrame - pbufOffset), copySize);
<> 149:156823d33999 135 buffer += copySize;
<> 149:156823d33999 136 bytesCopied += copySize;
<> 149:156823d33999 137 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 138 break;
<> 149:156823d33999 139 }
<> 149:156823d33999 140 pbufOffset += emac_stack_mem_len(dummy, pbuf);
<> 149:156823d33999 141 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 142 }
<> 149:156823d33999 143
<> 149:156823d33999 144 while (pbuf != NULL && bytesCopied < size) {
<> 149:156823d33999 145 copySize = cb_MIN(emac_stack_mem_len(dummy, pbuf), size - bytesCopied);
<> 149:156823d33999 146 memcpy(buffer, emac_stack_mem_ptr(dummy, pbuf), copySize);
<> 149:156823d33999 147 buffer += copySize;
<> 149:156823d33999 148 bytesCopied += copySize;
<> 149:156823d33999 149 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 150 }
<> 149:156823d33999 151
<> 149:156823d33999 152 MBED_ASSERT(bytesCopied <= size);
<> 149:156823d33999 153
<> 149:156823d33999 154 return (bytesCopied == size);
<> 149:156823d33999 155 }
<> 149:156823d33999 156
<> 149:156823d33999 157 static cb_boolean handleWlanTargetCopyToDataFrame(cbWLANTARGET_dataFrame* frame, uint8_t* buffer, uint32_t size, uint32_t offsetInFrame)
<> 149:156823d33999 158 {
<> 149:156823d33999 159 void* dummy = NULL;
<> 149:156823d33999 160 emac_stack_mem_t** phead = (emac_stack_mem_chain_t **)&frame;
<> 149:156823d33999 161 emac_stack_mem_t* pbuf;
<> 149:156823d33999 162 uint32_t copySize, bytesCopied = 0, pbufOffset = 0;
<> 149:156823d33999 163
<> 149:156823d33999 164 MBED_ASSERT(frame != NULL);
<> 149:156823d33999 165 MBED_ASSERT(buffer != NULL);
<> 149:156823d33999 166
<> 149:156823d33999 167 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 168 while (pbuf != NULL) {
<> 149:156823d33999 169 if ((pbufOffset + emac_stack_mem_len(dummy, pbuf)) >= offsetInFrame) {
<> 149:156823d33999 170 copySize = cb_MIN(size, emac_stack_mem_len(dummy, pbuf) - (offsetInFrame - pbufOffset));
<> 149:156823d33999 171 memcpy((uint8_t *)emac_stack_mem_ptr(dummy, pbuf) + (offsetInFrame - pbufOffset), buffer, copySize);
<> 149:156823d33999 172 buffer += copySize;
<> 149:156823d33999 173 bytesCopied += copySize;
<> 149:156823d33999 174 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 175 break;
<> 149:156823d33999 176 }
<> 149:156823d33999 177 pbufOffset += emac_stack_mem_len(dummy, pbuf);
<> 149:156823d33999 178 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 179 }
<> 149:156823d33999 180
<> 149:156823d33999 181 while (pbuf != NULL && bytesCopied < size) {
<> 149:156823d33999 182 copySize = cb_MIN(emac_stack_mem_len(dummy, pbuf), size - bytesCopied);
<> 149:156823d33999 183 memcpy(emac_stack_mem_ptr(dummy, pbuf), buffer, copySize);
<> 149:156823d33999 184 buffer += copySize;
<> 149:156823d33999 185 bytesCopied += copySize;
<> 149:156823d33999 186 pbuf = emac_stack_mem_chain_dequeue(dummy, phead);
<> 149:156823d33999 187 }
<> 149:156823d33999 188
<> 149:156823d33999 189 MBED_ASSERT(bytesCopied <= size);
<> 149:156823d33999 190
<> 149:156823d33999 191 return (bytesCopied == size);
<> 149:156823d33999 192 }
<> 149:156823d33999 193
<> 149:156823d33999 194 static cbWLANTARGET_dataFrame* handleWlanTargetAllocDataFrame(uint32_t size)
<> 149:156823d33999 195 {
<> 149:156823d33999 196 void* dummy = NULL;
<> 149:156823d33999 197
<> 149:156823d33999 198 return (cbWLANTARGET_dataFrame*)emac_stack_mem_alloc(dummy, size, 0);
<> 149:156823d33999 199 }
<> 149:156823d33999 200
<> 149:156823d33999 201 static void handleWlanTargetFreeDataFrame(cbWLANTARGET_dataFrame* frame)
<> 149:156823d33999 202 {
<> 149:156823d33999 203 void* dummy = NULL;
<> 149:156823d33999 204
<> 149:156823d33999 205 emac_stack_mem_free(dummy, (emac_stack_mem_t*)frame);
<> 149:156823d33999 206 }
<> 149:156823d33999 207
<> 149:156823d33999 208 static uint32_t handleWlanTargetGetDataFrameSize(cbWLANTARGET_dataFrame* frame)
<> 149:156823d33999 209 {
<> 149:156823d33999 210 void* dummy = NULL;
<> 149:156823d33999 211 return emac_stack_mem_chain_len(dummy, (emac_stack_mem_t*)frame);
<> 149:156823d33999 212 }
<> 149:156823d33999 213
<> 149:156823d33999 214 static uint8_t handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame)
<> 149:156823d33999 215 {
<> 149:156823d33999 216 (void)frame;
<> 149:156823d33999 217 return (uint8_t)cbWLAN_AC_BE;
<> 149:156823d33999 218 }
<> 149:156823d33999 219
<> 149:156823d33999 220 /*===========================================================================
<> 149:156823d33999 221 * API FUNCTIONS
<> 149:156823d33999 222 *=========================================================================*/
<> 149:156823d33999 223 static uint32_t wifi_get_mtu_size(emac_interface_t *emac)
<> 149:156823d33999 224 {
<> 149:156823d33999 225 (void)emac;
<> 149:156823d33999 226
<> 149:156823d33999 227 return WIFI_EMAC_API_MTU_SIZE;
<> 149:156823d33999 228 }
<> 149:156823d33999 229
<> 149:156823d33999 230 static void wifi_get_ifname(emac_interface_t *emac, char *name, uint8_t size)
<> 149:156823d33999 231 {
<> 149:156823d33999 232 (void)emac;
<> 149:156823d33999 233 MBED_ASSERT(name != NULL);
<> 149:156823d33999 234 memcpy((void*)name, (void*)&_ifname, cb_MIN(size, sizeof(_ifname)));
<> 149:156823d33999 235 }
<> 149:156823d33999 236
<> 149:156823d33999 237 static uint8_t wifi_get_hwaddr_size(emac_interface_t *emac)
<> 149:156823d33999 238 {
<> 149:156823d33999 239 (void)emac;
<> 149:156823d33999 240
<> 149:156823d33999 241 return sizeof(cbWLAN_MACAddress);
<> 149:156823d33999 242 }
<> 149:156823d33999 243
<> 149:156823d33999 244 static void wifi_get_hwaddr(emac_interface_t *emac, uint8_t *addr)
<> 149:156823d33999 245 {
<> 149:156823d33999 246 (void)emac;
<> 149:156823d33999 247
<> 149:156823d33999 248 cbOTP_read(cbOTP_MAC_WLAN, sizeof(cbWLAN_MACAddress), addr);
<> 149:156823d33999 249 }
<> 149:156823d33999 250
<> 149:156823d33999 251 static void wifi_set_hwaddr(emac_interface_t *emac, uint8_t *addr)
<> 149:156823d33999 252 {
<> 149:156823d33999 253 (void)emac;
<> 149:156823d33999 254 (void)addr;
<> 149:156823d33999 255
<> 149:156823d33999 256 // Do nothing, not possible to change the address
<> 149:156823d33999 257 }
<> 149:156823d33999 258
<> 149:156823d33999 259 static void send_packet(emac_interface_t *emac, void *buf)
<> 149:156823d33999 260 {
<> 149:156823d33999 261 cbWLAN_sendPacket(buf);
<> 149:156823d33999 262 emac_stack_mem_free(emac,buf);
<> 149:156823d33999 263 }
<> 149:156823d33999 264
<> 149:156823d33999 265 static bool wifi_link_out(emac_interface_t *emac, emac_stack_mem_t *buf)
<> 149:156823d33999 266 {
<> 149:156823d33999 267 (void)emac;
<> 149:156823d33999 268 // Break call chain to avoid the driver affecting stack usage for the IP stack thread too much
<> 150:02e0a0aed4ec 269 emac_stack_mem_t *new_buf = emac_stack_mem_alloc(emac, emac_stack_mem_chain_len(emac,buf),0);
<> 150:02e0a0aed4ec 270 if (new_buf != NULL) {
<> 150:02e0a0aed4ec 271 emac_stack_mem_copy(emac, new_buf, buf);
<> 150:02e0a0aed4ec 272 int id = cbMAIN_getEventQueue()->call(send_packet, emac, new_buf);
<> 150:02e0a0aed4ec 273 if (id != 0) {
<> 150:02e0a0aed4ec 274 cbMAIN_dispatchEventQueue();
<> 150:02e0a0aed4ec 275 }
<> 150:02e0a0aed4ec 276 else {
<> 150:02e0a0aed4ec 277 emac_stack_mem_free(emac, new_buf);
<> 150:02e0a0aed4ec 278 }
<> 150:02e0a0aed4ec 279 }
<> 149:156823d33999 280 return true;
<> 149:156823d33999 281 }
<> 149:156823d33999 282
<> 149:156823d33999 283
<> 149:156823d33999 284 static bool wifi_power_up(emac_interface_t *emac)
<> 149:156823d33999 285 {
<> 149:156823d33999 286 (void)emac;
<> 149:156823d33999 287
<> 149:156823d33999 288 return true;
<> 149:156823d33999 289 }
<> 149:156823d33999 290
<> 149:156823d33999 291 static void wifi_power_down(emac_interface_t *emac)
<> 149:156823d33999 292 {
<> 149:156823d33999 293 (void)emac;
<> 149:156823d33999 294 }
<> 149:156823d33999 295
<> 149:156823d33999 296 static void wifi_set_link_input_cb(emac_interface_t *emac, emac_link_input_fn input_cb, void *data)
<> 149:156823d33999 297 {
<> 149:156823d33999 298 void *dummy = NULL;
<> 149:156823d33999 299 (void)emac;
<> 149:156823d33999 300
<> 149:156823d33999 301 _admin.wifi_input_cb = input_cb;
<> 149:156823d33999 302 _admin.link_input_user_data = data;
<> 149:156823d33999 303
<> 149:156823d33999 304 cbMAIN_driverLock();
<> 149:156823d33999 305 cbWLAN_registerPacketIndicationCallback(packetIndication, dummy);
<> 149:156823d33999 306 cbMAIN_driverUnlock();
<> 149:156823d33999 307 }
<> 149:156823d33999 308
<> 149:156823d33999 309 static void wifi_set_link_state_cb(emac_interface_t *emac, emac_link_state_change_fn state_cb, void *data)
<> 149:156823d33999 310 {
<> 149:156823d33999 311 cbRTSL_Status result;
<> 149:156823d33999 312 void *dummy = NULL;
<> 149:156823d33999 313 (void)emac;
<> 149:156823d33999 314
<> 149:156823d33999 315 _admin.wifi_state_cb = state_cb;
<> 149:156823d33999 316 _admin.link_state_user_data = data;
<> 149:156823d33999 317
<> 149:156823d33999 318 if (!_admin.linkStateRegistered) {
<> 149:156823d33999 319 cbMAIN_driverLock();
<> 149:156823d33999 320 result = cbWLAN_registerStatusCallback(statusIndication, dummy);
<> 149:156823d33999 321 cbMAIN_driverUnlock();
<> 149:156823d33999 322 if (result == cbSTATUS_OK) {
<> 149:156823d33999 323 _admin.linkStateRegistered = true;
<> 149:156823d33999 324 }
<> 149:156823d33999 325 }
<> 149:156823d33999 326 }
<> 149:156823d33999 327
<> 149:156823d33999 328 emac_interface_t* wifi_emac_get_interface()
<> 149:156823d33999 329 {
<> 149:156823d33999 330 if (_intf == NULL) {
<> 149:156823d33999 331 _intf = new emac_interface_t();
<> 149:156823d33999 332 _intf->hw = NULL;
<> 149:156823d33999 333 memcpy((void*)&_intf->ops, &wifi_emac_interface, sizeof(wifi_emac_interface));
<> 149:156823d33999 334 }
<> 149:156823d33999 335 return _intf;
<> 149:156823d33999 336 }
<> 149:156823d33999 337
<> 149:156823d33999 338 void wifi_emac_init_mem(void)
<> 149:156823d33999 339 {
<> 149:156823d33999 340 cbWLANTARGET_registerCallbacks((cbWLANTARGET_Callback*)&_wlanTargetCallback);
<> 149:156823d33999 341 }
<> 149:156823d33999 342
<> 149:156823d33999 343 #endif