cc3000 driver with expanded buffers.
Fork of cc3000_hostdriver_mbedsocket by
cc3000_event.cpp@56:9ab991c1d2db, 2014-05-06 (annotated)
- Committer:
- heroic
- Date:
- Tue May 06 22:38:34 2014 +0000
- Revision:
- 56:9ab991c1d2db
- Parent:
- 55:3d640d25a7ec
Stop hci event handler from locking up in the situation where the micro thinks there's an event about to happen and the cc3000 disagrees.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kojto | 20:30b6ed7bf8fd | 1 | /***************************************************************************** |
Kojto | 20:30b6ed7bf8fd | 2 | * |
Kojto | 20:30b6ed7bf8fd | 3 | * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to |
Kojto | 20:30b6ed7bf8fd | 4 | * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and |
Kojto | 20:30b6ed7bf8fd | 5 | * provided help. |
Kojto | 20:30b6ed7bf8fd | 6 | * |
Kojto | 20:30b6ed7bf8fd | 7 | * This version of "host driver" uses CC3000 Host Driver Implementation. Thus |
Kojto | 20:30b6ed7bf8fd | 8 | * read the following copyright: |
Kojto | 20:30b6ed7bf8fd | 9 | * |
Kojto | 20:30b6ed7bf8fd | 10 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ |
Kojto | 20:30b6ed7bf8fd | 11 | * |
Kojto | 20:30b6ed7bf8fd | 12 | * Redistribution and use in source and binary forms, with or without |
Kojto | 20:30b6ed7bf8fd | 13 | * modification, are permitted provided that the following conditions |
Kojto | 20:30b6ed7bf8fd | 14 | * are met: |
Kojto | 20:30b6ed7bf8fd | 15 | * |
Kojto | 20:30b6ed7bf8fd | 16 | * Redistributions of source code must retain the above copyright |
Kojto | 20:30b6ed7bf8fd | 17 | * notice, this list of conditions and the following disclaimer. |
Kojto | 20:30b6ed7bf8fd | 18 | * |
Kojto | 20:30b6ed7bf8fd | 19 | * Redistributions in binary form must reproduce the above copyright |
Kojto | 20:30b6ed7bf8fd | 20 | * notice, this list of conditions and the following disclaimer in the |
Kojto | 20:30b6ed7bf8fd | 21 | * documentation and/or other materials provided with the |
Kojto | 20:30b6ed7bf8fd | 22 | * distribution. |
Kojto | 20:30b6ed7bf8fd | 23 | * |
Kojto | 20:30b6ed7bf8fd | 24 | * Neither the name of Texas Instruments Incorporated nor the names of |
Kojto | 20:30b6ed7bf8fd | 25 | * its contributors may be used to endorse or promote products derived |
Kojto | 20:30b6ed7bf8fd | 26 | * from this software without specific prior written permission. |
Kojto | 20:30b6ed7bf8fd | 27 | * |
Kojto | 20:30b6ed7bf8fd | 28 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
Kojto | 20:30b6ed7bf8fd | 29 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
Kojto | 20:30b6ed7bf8fd | 30 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
Kojto | 20:30b6ed7bf8fd | 31 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
Kojto | 20:30b6ed7bf8fd | 32 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
Kojto | 20:30b6ed7bf8fd | 33 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
Kojto | 20:30b6ed7bf8fd | 34 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
Kojto | 20:30b6ed7bf8fd | 35 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
Kojto | 20:30b6ed7bf8fd | 36 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
Kojto | 20:30b6ed7bf8fd | 37 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
Kojto | 20:30b6ed7bf8fd | 38 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Kojto | 20:30b6ed7bf8fd | 39 | * |
Kojto | 20:30b6ed7bf8fd | 40 | *****************************************************************************/ |
Kojto | 20:30b6ed7bf8fd | 41 | #include "cc3000.h" |
Kojto | 20:30b6ed7bf8fd | 42 | #include "cc3000_event.h" |
Kojto | 20:30b6ed7bf8fd | 43 | #include "cc3000_netapp.h" |
Kojto | 20:30b6ed7bf8fd | 44 | |
Kojto | 20:30b6ed7bf8fd | 45 | namespace mbed_cc3000 { |
Kojto | 20:30b6ed7bf8fd | 46 | |
Kojto | 44:960b73df5981 | 47 | #if (CC3000_DEBUG_HCI_RX == 1) |
Kojto | 20:30b6ed7bf8fd | 48 | const char *HCI_EVENT_STR[] = |
Kojto | 20:30b6ed7bf8fd | 49 | { |
Kojto | 20:30b6ed7bf8fd | 50 | "Socket", |
Kojto | 20:30b6ed7bf8fd | 51 | "Bind", |
Kojto | 20:30b6ed7bf8fd | 52 | "Send", |
Kojto | 20:30b6ed7bf8fd | 53 | "Recv", |
Kojto | 20:30b6ed7bf8fd | 54 | "Accept", |
Kojto | 20:30b6ed7bf8fd | 55 | "Listen", |
Kojto | 20:30b6ed7bf8fd | 56 | "Connect", |
Kojto | 20:30b6ed7bf8fd | 57 | "BSD Select", |
Kojto | 20:30b6ed7bf8fd | 58 | "Set Socket Options", |
Kojto | 20:30b6ed7bf8fd | 59 | "Get Socket Options", |
Kojto | 20:30b6ed7bf8fd | 60 | "Close Socket", |
Kojto | 20:30b6ed7bf8fd | 61 | "Unknown", |
Kojto | 20:30b6ed7bf8fd | 62 | "Recv From", |
Kojto | 20:30b6ed7bf8fd | 63 | "Write", |
Kojto | 20:30b6ed7bf8fd | 64 | "Send To", |
Kojto | 20:30b6ed7bf8fd | 65 | "Get Hostname", |
Kojto | 20:30b6ed7bf8fd | 66 | "mDNS Advertise" |
Kojto | 20:30b6ed7bf8fd | 67 | }; |
Kojto | 20:30b6ed7bf8fd | 68 | |
Kojto | 20:30b6ed7bf8fd | 69 | const char *HCI_NETAPP_STR[] = |
Kojto | 20:30b6ed7bf8fd | 70 | { |
Kojto | 20:30b6ed7bf8fd | 71 | "DHCP", |
Kojto | 20:30b6ed7bf8fd | 72 | "Ping Sent", |
Kojto | 20:30b6ed7bf8fd | 73 | "Ping Report", |
Kojto | 20:30b6ed7bf8fd | 74 | "Ping Stop", |
Kojto | 20:30b6ed7bf8fd | 75 | "IP Config", |
Kojto | 20:30b6ed7bf8fd | 76 | "ARP Flush", |
Kojto | 20:30b6ed7bf8fd | 77 | "Unknown", |
Kojto | 20:30b6ed7bf8fd | 78 | "Set Debug level", |
Kojto | 20:30b6ed7bf8fd | 79 | "Set Timers" |
Kojto | 20:30b6ed7bf8fd | 80 | }; |
Kojto | 20:30b6ed7bf8fd | 81 | |
Kojto | 20:30b6ed7bf8fd | 82 | // from 0-7 |
Kojto | 20:30b6ed7bf8fd | 83 | const char *HCI_MISC_STR[] = |
Kojto | 20:30b6ed7bf8fd | 84 | { |
Kojto | 20:30b6ed7bf8fd | 85 | "BASE - Error?", |
Kojto | 20:30b6ed7bf8fd | 86 | "Connecting", |
Kojto | 20:30b6ed7bf8fd | 87 | "Disconnect", |
Kojto | 20:30b6ed7bf8fd | 88 | "Scan Param", |
Kojto | 20:30b6ed7bf8fd | 89 | "Connect Policy", |
Kojto | 20:30b6ed7bf8fd | 90 | "Add Profile", |
Kojto | 20:30b6ed7bf8fd | 91 | "Del Profile", |
Kojto | 20:30b6ed7bf8fd | 92 | "Get Scan Res", |
Kojto | 20:30b6ed7bf8fd | 93 | "Event Mask", |
Kojto | 20:30b6ed7bf8fd | 94 | "Status Req", |
Kojto | 20:30b6ed7bf8fd | 95 | "Config Start", |
Kojto | 20:30b6ed7bf8fd | 96 | "Config Stop", |
Kojto | 20:30b6ed7bf8fd | 97 | "Config Set Prefix", |
Kojto | 20:30b6ed7bf8fd | 98 | "Config Patch", |
Kojto | 20:30b6ed7bf8fd | 99 | }; |
Kojto | 20:30b6ed7bf8fd | 100 | #endif |
Kojto | 20:30b6ed7bf8fd | 101 | |
Kojto | 20:30b6ed7bf8fd | 102 | cc3000_event::cc3000_event(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_spi &spi, cc3000 &cc3000) |
Kojto | 20:30b6ed7bf8fd | 103 | : socket_active_status(SOCKET_STATUS_INIT_VAL), _simple_link(simplelink), _hci(hci), _spi(spi), _cc3000(cc3000) { |
Kojto | 20:30b6ed7bf8fd | 104 | |
Kojto | 20:30b6ed7bf8fd | 105 | } |
Kojto | 20:30b6ed7bf8fd | 106 | |
Kojto | 20:30b6ed7bf8fd | 107 | cc3000_event::~cc3000_event() { |
Kojto | 20:30b6ed7bf8fd | 108 | |
Kojto | 20:30b6ed7bf8fd | 109 | } |
Kojto | 20:30b6ed7bf8fd | 110 | |
Kojto | 20:30b6ed7bf8fd | 111 | /* TODO removed buffer, set it in init */ |
Kojto | 20:30b6ed7bf8fd | 112 | void cc3000_event::received_handler(uint8_t *buffer) { |
Kojto | 20:30b6ed7bf8fd | 113 | _simple_link.set_data_received_flag(1); |
Kojto | 20:30b6ed7bf8fd | 114 | _simple_link.set_received_data(buffer); |
Kojto | 20:30b6ed7bf8fd | 115 | |
Kojto | 20:30b6ed7bf8fd | 116 | hci_unsolicited_event_handler(); |
Kojto | 20:30b6ed7bf8fd | 117 | } |
Kojto | 20:30b6ed7bf8fd | 118 | |
Kojto | 20:30b6ed7bf8fd | 119 | void cc3000_event::hci_unsol_handle_patch_request(uint8_t *event_hdr) { |
Kojto | 20:30b6ed7bf8fd | 120 | uint8_t *params = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE; |
Kojto | 20:30b6ed7bf8fd | 121 | uint32_t length = 0; |
Kojto | 20:30b6ed7bf8fd | 122 | uint8_t *patch; |
Kojto | 20:30b6ed7bf8fd | 123 | |
Kojto | 20:30b6ed7bf8fd | 124 | switch (*params) |
Kojto | 20:30b6ed7bf8fd | 125 | { |
Kojto | 20:30b6ed7bf8fd | 126 | case HCI_EVENT_PATCHES_DRV_REQ: |
Kojto | 20:30b6ed7bf8fd | 127 | { |
Kojto | 20:30b6ed7bf8fd | 128 | tDriverPatches func_pointer = (tDriverPatches)_simple_link.get_func_pointer(DRIVER_PATCHES); |
Kojto | 20:30b6ed7bf8fd | 129 | if (func_pointer) |
Kojto | 20:30b6ed7bf8fd | 130 | { |
Kojto | 20:30b6ed7bf8fd | 131 | patch = func_pointer(&length); |
Kojto | 20:30b6ed7bf8fd | 132 | if (patch) |
Kojto | 20:30b6ed7bf8fd | 133 | { |
Kojto | 20:30b6ed7bf8fd | 134 | _hci.patch_send(HCI_EVENT_PATCHES_DRV_REQ, _simple_link.get_transmit_buffer(), patch, length); |
Kojto | 20:30b6ed7bf8fd | 135 | return; |
Kojto | 20:30b6ed7bf8fd | 136 | } |
Kojto | 20:30b6ed7bf8fd | 137 | } |
Kojto | 20:30b6ed7bf8fd | 138 | |
Kojto | 20:30b6ed7bf8fd | 139 | // Send 0 length Patches response event |
Kojto | 20:30b6ed7bf8fd | 140 | _hci.patch_send(HCI_EVENT_PATCHES_DRV_REQ, _simple_link.get_transmit_buffer(), 0, 0); |
Kojto | 20:30b6ed7bf8fd | 141 | break; |
Kojto | 20:30b6ed7bf8fd | 142 | } |
Kojto | 20:30b6ed7bf8fd | 143 | case HCI_EVENT_PATCHES_FW_REQ: |
Kojto | 20:30b6ed7bf8fd | 144 | { |
Kojto | 20:30b6ed7bf8fd | 145 | tFWPatches func_pointer = (tFWPatches)_simple_link.get_func_pointer(FW_PATCHES); |
Kojto | 20:30b6ed7bf8fd | 146 | if (func_pointer) |
Kojto | 20:30b6ed7bf8fd | 147 | { |
Kojto | 20:30b6ed7bf8fd | 148 | patch = func_pointer(&length); |
Kojto | 20:30b6ed7bf8fd | 149 | // Build and send a patch |
Kojto | 20:30b6ed7bf8fd | 150 | if (patch) |
Kojto | 20:30b6ed7bf8fd | 151 | { |
Kojto | 20:30b6ed7bf8fd | 152 | _hci.patch_send(HCI_EVENT_PATCHES_FW_REQ, _simple_link.get_transmit_buffer(), patch, length); |
Kojto | 20:30b6ed7bf8fd | 153 | return; |
Kojto | 20:30b6ed7bf8fd | 154 | } |
Kojto | 20:30b6ed7bf8fd | 155 | } |
Kojto | 20:30b6ed7bf8fd | 156 | // Send 0 length Patches response event |
Kojto | 20:30b6ed7bf8fd | 157 | _hci.patch_send(HCI_EVENT_PATCHES_FW_REQ, _simple_link.get_transmit_buffer(), 0, 0); |
Kojto | 20:30b6ed7bf8fd | 158 | break; |
Kojto | 20:30b6ed7bf8fd | 159 | } |
Kojto | 20:30b6ed7bf8fd | 160 | case HCI_EVENT_PATCHES_BOOTLOAD_REQ: |
Kojto | 20:30b6ed7bf8fd | 161 | { |
Kojto | 20:30b6ed7bf8fd | 162 | tBootLoaderPatches func_pointer = (tBootLoaderPatches)_simple_link.get_func_pointer(BOOTLOADER_PATCHES); |
Kojto | 20:30b6ed7bf8fd | 163 | if (func_pointer) |
Kojto | 20:30b6ed7bf8fd | 164 | { |
Kojto | 20:30b6ed7bf8fd | 165 | patch = func_pointer(&length); |
Kojto | 20:30b6ed7bf8fd | 166 | if (patch) |
Kojto | 20:30b6ed7bf8fd | 167 | { |
Kojto | 20:30b6ed7bf8fd | 168 | _hci.patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, _simple_link.get_transmit_buffer(), patch, length); |
Kojto | 20:30b6ed7bf8fd | 169 | return; |
Kojto | 20:30b6ed7bf8fd | 170 | } |
Kojto | 20:30b6ed7bf8fd | 171 | } |
Kojto | 20:30b6ed7bf8fd | 172 | // Send 0 length Patches response event |
Kojto | 20:30b6ed7bf8fd | 173 | _hci.patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, _simple_link.get_transmit_buffer(), 0, 0); |
Kojto | 20:30b6ed7bf8fd | 174 | break; |
Kojto | 20:30b6ed7bf8fd | 175 | } |
Kojto | 20:30b6ed7bf8fd | 176 | } |
Kojto | 20:30b6ed7bf8fd | 177 | } |
Kojto | 20:30b6ed7bf8fd | 178 | |
Kojto | 20:30b6ed7bf8fd | 179 | static void hci_event_debug_print(uint16_t hciEventNo) |
Kojto | 20:30b6ed7bf8fd | 180 | { |
Kojto | 44:960b73df5981 | 181 | #if (CC3000_DEBUG_HCI_RX == 1) |
Kojto | 20:30b6ed7bf8fd | 182 | if ((hciEventNo > HCI_CMND_SOCKET_BASE) && ( hciEventNo <= HCI_CMND_MDNS_ADVERTISE)) |
Kojto | 20:30b6ed7bf8fd | 183 | { |
Kojto | 20:30b6ed7bf8fd | 184 | DBG_HCI("Event Received : 0x%04X - %s", hciEventNo, HCI_EVENT_STR[hciEventNo-HCI_CMND_SOCKET]); |
Kojto | 20:30b6ed7bf8fd | 185 | } |
Kojto | 20:30b6ed7bf8fd | 186 | else if ((hciEventNo > HCI_CMND_NETAPP_BASE) && ( hciEventNo <= HCI_NETAPP_SET_TIMERS)) |
Kojto | 20:30b6ed7bf8fd | 187 | { |
Kojto | 20:30b6ed7bf8fd | 188 | DBG_HCI("Event Received : 0x%04X - %s", hciEventNo, HCI_NETAPP_STR[hciEventNo-HCI_NETAPP_DHCP]); |
Kojto | 20:30b6ed7bf8fd | 189 | } |
Kojto | 20:30b6ed7bf8fd | 190 | else if (hciEventNo < HCI_CMND_WLAN_CONFIGURE_PATCH+1) |
Kojto | 20:30b6ed7bf8fd | 191 | { |
Kojto | 20:30b6ed7bf8fd | 192 | DBG_HCI("Event Received : 0x%04X - %s", hciEventNo, HCI_MISC_STR[hciEventNo]); |
Kojto | 20:30b6ed7bf8fd | 193 | } |
Kojto | 20:30b6ed7bf8fd | 194 | else |
Kojto | 20:30b6ed7bf8fd | 195 | { |
Kojto | 20:30b6ed7bf8fd | 196 | DBG_HCI("Event Received : 0x%04X", hciEventNo); |
Kojto | 20:30b6ed7bf8fd | 197 | } |
Kojto | 20:30b6ed7bf8fd | 198 | #endif |
Kojto | 20:30b6ed7bf8fd | 199 | } |
Kojto | 20:30b6ed7bf8fd | 200 | |
Kojto | 20:30b6ed7bf8fd | 201 | uint8_t *cc3000_event::hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen) { |
Kojto | 20:30b6ed7bf8fd | 202 | uint8_t *received_data, argument_size; |
Kojto | 20:30b6ed7bf8fd | 203 | uint16_t length; |
Kojto | 20:30b6ed7bf8fd | 204 | uint8_t *pucReceivedParams; |
Kojto | 20:30b6ed7bf8fd | 205 | uint16_t received_op_code = 0; |
Kojto | 20:30b6ed7bf8fd | 206 | uint32_t return_value; |
Kojto | 20:30b6ed7bf8fd | 207 | uint8_t * RecvParams; |
Kojto | 20:30b6ed7bf8fd | 208 | uint8_t *RetParams; |
heroic | 56:9ab991c1d2db | 209 | int escapeCounter; |
heroic | 56:9ab991c1d2db | 210 | escapeCounter = 100000000; |
Kojto | 20:30b6ed7bf8fd | 211 | while (1) |
heroic | 54:cae3dfc6df20 | 212 | { |
heroic | 56:9ab991c1d2db | 213 | escapeCounter--; |
heroic | 56:9ab991c1d2db | 214 | if (!escapeCounter) |
heroic | 56:9ab991c1d2db | 215 | return NULL; |
heroic | 56:9ab991c1d2db | 216 | |
Kojto | 20:30b6ed7bf8fd | 217 | if (_simple_link.get_data_received_flag() != 0) |
Kojto | 20:30b6ed7bf8fd | 218 | { |
Kojto | 20:30b6ed7bf8fd | 219 | received_data = _simple_link.get_received_data(); |
Kojto | 20:30b6ed7bf8fd | 220 | if (*received_data == HCI_TYPE_EVNT) |
Kojto | 20:30b6ed7bf8fd | 221 | { |
Kojto | 20:30b6ed7bf8fd | 222 | // Event Received |
Kojto | 20:30b6ed7bf8fd | 223 | STREAM_TO_UINT16((uint8_t *)received_data, HCI_EVENT_OPCODE_OFFSET,received_op_code); |
Kojto | 20:30b6ed7bf8fd | 224 | pucReceivedParams = received_data + HCI_EVENT_HEADER_SIZE; |
Kojto | 20:30b6ed7bf8fd | 225 | RecvParams = pucReceivedParams; |
Kojto | 20:30b6ed7bf8fd | 226 | RetParams = (uint8_t *)ret_param; |
Kojto | 20:30b6ed7bf8fd | 227 | |
Kojto | 20:30b6ed7bf8fd | 228 | // unsolicited event received - finish handling |
Kojto | 20:30b6ed7bf8fd | 229 | if (hci_unsol_event_handler((uint8_t *)received_data) == 0) |
Kojto | 20:30b6ed7bf8fd | 230 | { |
Kojto | 20:30b6ed7bf8fd | 231 | STREAM_TO_UINT8(received_data, HCI_DATA_LENGTH_OFFSET, length); |
Kojto | 20:30b6ed7bf8fd | 232 | |
Kojto | 20:30b6ed7bf8fd | 233 | hci_event_debug_print( received_op_code ); |
Kojto | 20:30b6ed7bf8fd | 234 | |
Kojto | 20:30b6ed7bf8fd | 235 | switch(received_op_code) |
Kojto | 20:30b6ed7bf8fd | 236 | { |
Kojto | 20:30b6ed7bf8fd | 237 | case HCI_CMND_READ_BUFFER_SIZE: |
Kojto | 20:30b6ed7bf8fd | 238 | { |
Kojto | 20:30b6ed7bf8fd | 239 | uint16_t temp = _simple_link.get_number_free_buffers(); |
Kojto | 20:30b6ed7bf8fd | 240 | STREAM_TO_UINT8((uint8_t *)pucReceivedParams, 0, temp); |
Kojto | 20:30b6ed7bf8fd | 241 | _simple_link.set_number_free_buffers(temp); |
Kojto | 20:30b6ed7bf8fd | 242 | |
Kojto | 20:30b6ed7bf8fd | 243 | temp = _simple_link.get_buffer_length(); |
Kojto | 20:30b6ed7bf8fd | 244 | STREAM_TO_UINT16((uint8_t *)pucReceivedParams, 1, temp); |
Kojto | 20:30b6ed7bf8fd | 245 | _simple_link.set_buffer_length(temp); |
Kojto | 20:30b6ed7bf8fd | 246 | } |
Kojto | 20:30b6ed7bf8fd | 247 | break; |
Kojto | 20:30b6ed7bf8fd | 248 | |
Kojto | 20:30b6ed7bf8fd | 249 | case HCI_CMND_WLAN_CONFIGURE_PATCH: |
Kojto | 20:30b6ed7bf8fd | 250 | case HCI_NETAPP_DHCP: |
Kojto | 20:30b6ed7bf8fd | 251 | case HCI_NETAPP_PING_SEND: |
Kojto | 20:30b6ed7bf8fd | 252 | case HCI_NETAPP_PING_STOP: |
Kojto | 20:30b6ed7bf8fd | 253 | case HCI_NETAPP_ARP_FLUSH: |
Kojto | 20:30b6ed7bf8fd | 254 | case HCI_NETAPP_SET_DEBUG_LEVEL: |
Kojto | 20:30b6ed7bf8fd | 255 | case HCI_NETAPP_SET_TIMERS: |
Kojto | 20:30b6ed7bf8fd | 256 | case HCI_EVNT_NVMEM_READ: |
Kojto | 20:30b6ed7bf8fd | 257 | case HCI_EVNT_NVMEM_CREATE_ENTRY: |
Kojto | 20:30b6ed7bf8fd | 258 | case HCI_CMND_NVMEM_WRITE_PATCH: |
Kojto | 20:30b6ed7bf8fd | 259 | case HCI_NETAPP_PING_REPORT: |
Kojto | 20:30b6ed7bf8fd | 260 | case HCI_EVNT_MDNS_ADVERTISE: |
Kojto | 20:30b6ed7bf8fd | 261 | |
Kojto | 20:30b6ed7bf8fd | 262 | STREAM_TO_UINT8(received_data, HCI_EVENT_STATUS_OFFSET, *(uint8_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 263 | break; |
Kojto | 20:30b6ed7bf8fd | 264 | |
Kojto | 20:30b6ed7bf8fd | 265 | case HCI_CMND_SETSOCKOPT: |
Kojto | 20:30b6ed7bf8fd | 266 | case HCI_CMND_WLAN_CONNECT: |
Kojto | 20:30b6ed7bf8fd | 267 | case HCI_CMND_WLAN_IOCTL_STATUSGET: |
Kojto | 20:30b6ed7bf8fd | 268 | case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE: |
Kojto | 20:30b6ed7bf8fd | 269 | case HCI_CMND_WLAN_IOCTL_DEL_PROFILE: |
Kojto | 20:30b6ed7bf8fd | 270 | case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY: |
Kojto | 20:30b6ed7bf8fd | 271 | case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM: |
Kojto | 20:30b6ed7bf8fd | 272 | case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START: |
Kojto | 20:30b6ed7bf8fd | 273 | case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP: |
Kojto | 20:30b6ed7bf8fd | 274 | case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX: |
Kojto | 20:30b6ed7bf8fd | 275 | case HCI_CMND_EVENT_MASK: |
Kojto | 20:30b6ed7bf8fd | 276 | case HCI_EVNT_WLAN_DISCONNECT: |
Kojto | 20:30b6ed7bf8fd | 277 | case HCI_EVNT_SOCKET: |
Kojto | 20:30b6ed7bf8fd | 278 | case HCI_EVNT_BIND: |
Kojto | 20:30b6ed7bf8fd | 279 | case HCI_CMND_LISTEN: |
Kojto | 20:30b6ed7bf8fd | 280 | case HCI_EVNT_CLOSE_SOCKET: |
Kojto | 20:30b6ed7bf8fd | 281 | case HCI_EVNT_CONNECT: |
Kojto | 20:30b6ed7bf8fd | 282 | case HCI_EVNT_NVMEM_WRITE: |
Kojto | 20:30b6ed7bf8fd | 283 | |
Kojto | 20:30b6ed7bf8fd | 284 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,0, *(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 285 | break; |
Kojto | 20:30b6ed7bf8fd | 286 | |
Kojto | 20:30b6ed7bf8fd | 287 | case HCI_EVNT_READ_SP_VERSION: |
Kojto | 20:30b6ed7bf8fd | 288 | |
Kojto | 20:30b6ed7bf8fd | 289 | STREAM_TO_UINT8(received_data, HCI_EVENT_STATUS_OFFSET, *(uint8_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 290 | ret_param = ((uint8_t *)ret_param) + 1; |
Kojto | 20:30b6ed7bf8fd | 291 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams, 0, return_value); |
Kojto | 20:30b6ed7bf8fd | 292 | UINT32_TO_STREAM((uint8_t *)ret_param, return_value); |
Kojto | 20:30b6ed7bf8fd | 293 | break; |
Kojto | 20:30b6ed7bf8fd | 294 | |
Kojto | 20:30b6ed7bf8fd | 295 | case HCI_EVNT_BSD_GETHOSTBYNAME: |
Kojto | 20:30b6ed7bf8fd | 296 | |
Kojto | 20:30b6ed7bf8fd | 297 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,GET_HOST_BY_NAME_RETVAL_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 298 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 299 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,GET_HOST_BY_NAME_ADDR_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 300 | break; |
Kojto | 20:30b6ed7bf8fd | 301 | |
Kojto | 20:30b6ed7bf8fd | 302 | case HCI_EVNT_ACCEPT: |
Kojto | 20:30b6ed7bf8fd | 303 | { |
Kojto | 20:30b6ed7bf8fd | 304 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,ACCEPT_SD_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 305 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 306 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,ACCEPT_RETURN_STATUS_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 307 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 308 | |
Kojto | 20:30b6ed7bf8fd | 309 | //This argument returns in network order |
Kojto | 20:30b6ed7bf8fd | 310 | memcpy((uint8_t *)ret_param, pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr)); |
Kojto | 20:30b6ed7bf8fd | 311 | break; |
Kojto | 20:30b6ed7bf8fd | 312 | } |
Kojto | 20:30b6ed7bf8fd | 313 | |
Kojto | 20:30b6ed7bf8fd | 314 | case HCI_EVNT_RECV: |
Kojto | 20:30b6ed7bf8fd | 315 | case HCI_EVNT_RECVFROM: |
Kojto | 20:30b6ed7bf8fd | 316 | { |
Kojto | 20:30b6ed7bf8fd | 317 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 318 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 319 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 320 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 321 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 322 | |
Kojto | 20:30b6ed7bf8fd | 323 | if(((tBsdReadReturnParams *)ret_param)->iNumberOfBytes == ERROR_SOCKET_INACTIVE) |
Kojto | 20:30b6ed7bf8fd | 324 | { |
Kojto | 20:30b6ed7bf8fd | 325 | set_socket_active_status(((tBsdReadReturnParams *)ret_param)->iSocketDescriptor,SOCKET_STATUS_INACTIVE); |
Kojto | 20:30b6ed7bf8fd | 326 | } |
Kojto | 20:30b6ed7bf8fd | 327 | break; |
Kojto | 20:30b6ed7bf8fd | 328 | } |
Kojto | 20:30b6ed7bf8fd | 329 | |
Kojto | 20:30b6ed7bf8fd | 330 | case HCI_EVNT_SEND: |
Kojto | 20:30b6ed7bf8fd | 331 | case HCI_EVNT_SENDTO: |
Kojto | 20:30b6ed7bf8fd | 332 | { |
Kojto | 20:30b6ed7bf8fd | 333 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 334 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 335 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 336 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 337 | |
Kojto | 20:30b6ed7bf8fd | 338 | break; |
Kojto | 20:30b6ed7bf8fd | 339 | } |
Kojto | 20:30b6ed7bf8fd | 340 | |
Kojto | 20:30b6ed7bf8fd | 341 | case HCI_EVNT_SELECT: |
Kojto | 20:30b6ed7bf8fd | 342 | { |
Kojto | 20:30b6ed7bf8fd | 343 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SELECT_STATUS_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 344 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 345 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SELECT_READFD_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 346 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 347 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 348 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 349 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,SELECT_EXFD_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 350 | break; |
Kojto | 20:30b6ed7bf8fd | 351 | } |
Kojto | 20:30b6ed7bf8fd | 352 | |
Kojto | 20:30b6ed7bf8fd | 353 | case HCI_CMND_GETSOCKOPT: |
Kojto | 20:30b6ed7bf8fd | 354 | |
Kojto | 20:30b6ed7bf8fd | 355 | STREAM_TO_UINT8(received_data, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)ret_param)->iStatus); |
Kojto | 20:30b6ed7bf8fd | 356 | //This argument returns in network order |
Kojto | 20:30b6ed7bf8fd | 357 | memcpy((uint8_t *)ret_param, pucReceivedParams, 4); |
Kojto | 20:30b6ed7bf8fd | 358 | break; |
Kojto | 20:30b6ed7bf8fd | 359 | |
Kojto | 20:30b6ed7bf8fd | 360 | case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS: |
Kojto | 20:30b6ed7bf8fd | 361 | |
Kojto | 20:30b6ed7bf8fd | 362 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 363 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 364 | STREAM_TO_UINT32((uint8_t *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 365 | ret_param = ((uint8_t *)ret_param) + 4; |
Kojto | 20:30b6ed7bf8fd | 366 | STREAM_TO_UINT16((uint8_t *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 367 | ret_param = ((uint8_t *)ret_param) + 2; |
Kojto | 20:30b6ed7bf8fd | 368 | STREAM_TO_UINT16((uint8_t *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(uint32_t *)ret_param); |
Kojto | 20:30b6ed7bf8fd | 369 | ret_param = ((uint8_t *)ret_param) + 2; |
Kojto | 20:30b6ed7bf8fd | 370 | memcpy((uint8_t *)ret_param, (uint8_t *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 371 | break; |
Kojto | 20:30b6ed7bf8fd | 372 | |
Kojto | 20:30b6ed7bf8fd | 373 | case HCI_CMND_SIMPLE_LINK_START: |
Kojto | 20:30b6ed7bf8fd | 374 | break; |
Kojto | 20:30b6ed7bf8fd | 375 | |
Kojto | 20:30b6ed7bf8fd | 376 | case HCI_NETAPP_IPCONFIG: |
Kojto | 20:30b6ed7bf8fd | 377 | |
Kojto | 20:30b6ed7bf8fd | 378 | //Read IP address |
Kojto | 20:30b6ed7bf8fd | 379 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 380 | RecvParams += 4; |
Kojto | 20:30b6ed7bf8fd | 381 | |
Kojto | 20:30b6ed7bf8fd | 382 | //Read subnet |
Kojto | 20:30b6ed7bf8fd | 383 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 384 | RecvParams += 4; |
Kojto | 20:30b6ed7bf8fd | 385 | |
Kojto | 20:30b6ed7bf8fd | 386 | //Read default GW |
Kojto | 20:30b6ed7bf8fd | 387 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 388 | RecvParams += 4; |
Kojto | 20:30b6ed7bf8fd | 389 | |
Kojto | 20:30b6ed7bf8fd | 390 | //Read DHCP server |
Kojto | 20:30b6ed7bf8fd | 391 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 392 | RecvParams += 4; |
Kojto | 20:30b6ed7bf8fd | 393 | |
Kojto | 20:30b6ed7bf8fd | 394 | //Read DNS server |
Kojto | 20:30b6ed7bf8fd | 395 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 396 | RecvParams += 4; |
Kojto | 20:30b6ed7bf8fd | 397 | |
Kojto | 20:30b6ed7bf8fd | 398 | //Read Mac address |
Kojto | 20:30b6ed7bf8fd | 399 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 400 | RecvParams += 6; |
Kojto | 20:30b6ed7bf8fd | 401 | |
Kojto | 20:30b6ed7bf8fd | 402 | //Read SSID |
Kojto | 20:30b6ed7bf8fd | 403 | STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH); |
SolderSplashLabs | 38:1d374a7f0c0d | 404 | break; |
Kojto | 44:960b73df5981 | 405 | |
SolderSplashLabs | 38:1d374a7f0c0d | 406 | default : |
SolderSplashLabs | 38:1d374a7f0c0d | 407 | DBG_HCI("UNKNOWN Event Received : 0x%04X ", received_op_code); |
SolderSplashLabs | 38:1d374a7f0c0d | 408 | break; |
Kojto | 20:30b6ed7bf8fd | 409 | } |
Kojto | 44:960b73df5981 | 410 | |
Kojto | 20:30b6ed7bf8fd | 411 | } |
Kojto | 20:30b6ed7bf8fd | 412 | if (received_op_code == _simple_link.get_op_code()) |
Kojto | 20:30b6ed7bf8fd | 413 | { |
Kojto | 20:30b6ed7bf8fd | 414 | _simple_link.set_op_code(0); |
Kojto | 20:30b6ed7bf8fd | 415 | } |
Kojto | 20:30b6ed7bf8fd | 416 | } |
Kojto | 20:30b6ed7bf8fd | 417 | else |
Kojto | 20:30b6ed7bf8fd | 418 | { |
Kojto | 20:30b6ed7bf8fd | 419 | pucReceivedParams = received_data; |
Kojto | 20:30b6ed7bf8fd | 420 | STREAM_TO_UINT8((uint8_t *)received_data, HCI_PACKET_ARGSIZE_OFFSET, argument_size); |
Kojto | 20:30b6ed7bf8fd | 421 | |
Kojto | 20:30b6ed7bf8fd | 422 | STREAM_TO_UINT16((uint8_t *)received_data, HCI_PACKET_LENGTH_OFFSET, length); |
Kojto | 20:30b6ed7bf8fd | 423 | |
Kojto | 20:30b6ed7bf8fd | 424 | // Data received: note that the only case where from and from length |
Kojto | 20:30b6ed7bf8fd | 425 | // are not null is in recv from, so fill the args accordingly |
Kojto | 20:30b6ed7bf8fd | 426 | if (from) |
Kojto | 20:30b6ed7bf8fd | 427 | { |
Kojto | 20:30b6ed7bf8fd | 428 | STREAM_TO_UINT32((uint8_t *)(received_data + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(uint32_t *)fromlen); |
Kojto | 20:30b6ed7bf8fd | 429 | memcpy(from, (received_data + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen); |
Kojto | 20:30b6ed7bf8fd | 430 | } |
Kojto | 20:30b6ed7bf8fd | 431 | |
Kojto | 20:30b6ed7bf8fd | 432 | memcpy(ret_param, pucReceivedParams + HCI_DATA_HEADER_SIZE + argument_size, length - argument_size); |
Kojto | 20:30b6ed7bf8fd | 433 | |
Kojto | 20:30b6ed7bf8fd | 434 | _simple_link.set_pending_data(0); |
Kojto | 20:30b6ed7bf8fd | 435 | } |
Kojto | 20:30b6ed7bf8fd | 436 | |
Kojto | 20:30b6ed7bf8fd | 437 | _simple_link.set_data_received_flag(0); |
Kojto | 20:30b6ed7bf8fd | 438 | _spi.wlan_irq_enable(); |
Kojto | 20:30b6ed7bf8fd | 439 | |
Kojto | 20:30b6ed7bf8fd | 440 | // Since we are going to TX - we need to handle this event after the ResumeSPi since we need interrupts |
Kojto | 20:30b6ed7bf8fd | 441 | if ((*received_data == HCI_TYPE_EVNT) && (received_op_code == HCI_EVNT_PATCHES_REQ)) |
Kojto | 20:30b6ed7bf8fd | 442 | { |
Kojto | 20:30b6ed7bf8fd | 443 | hci_unsol_handle_patch_request((uint8_t *)received_data); |
Kojto | 20:30b6ed7bf8fd | 444 | } |
Kojto | 20:30b6ed7bf8fd | 445 | if ((_simple_link.get_op_code() == 0) && (_simple_link.get_pending_data() == 0)) |
Kojto | 20:30b6ed7bf8fd | 446 | { |
Kojto | 20:30b6ed7bf8fd | 447 | return NULL; |
Kojto | 20:30b6ed7bf8fd | 448 | } |
Kojto | 20:30b6ed7bf8fd | 449 | } |
Kojto | 20:30b6ed7bf8fd | 450 | } |
Kojto | 20:30b6ed7bf8fd | 451 | } |
Kojto | 20:30b6ed7bf8fd | 452 | |
Kojto | 20:30b6ed7bf8fd | 453 | int32_t cc3000_event::hci_unsol_event_handler(uint8_t *event_hdr) { |
Kojto | 20:30b6ed7bf8fd | 454 | uint8_t *data = NULL; |
Kojto | 20:30b6ed7bf8fd | 455 | int32_t event_type; |
Kojto | 20:30b6ed7bf8fd | 456 | uint32_t number_of_released_packets; |
Kojto | 20:30b6ed7bf8fd | 457 | uint32_t number_of_sent_packets; |
Kojto | 20:30b6ed7bf8fd | 458 | |
Kojto | 20:30b6ed7bf8fd | 459 | STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type); |
Kojto | 20:30b6ed7bf8fd | 460 | |
Kojto | 20:30b6ed7bf8fd | 461 | if (event_type & HCI_EVNT_UNSOL_BASE) { |
Kojto | 20:30b6ed7bf8fd | 462 | switch(event_type) { |
Kojto | 20:30b6ed7bf8fd | 463 | case HCI_EVNT_DATA_UNSOL_FREE_BUFF: |
Kojto | 20:30b6ed7bf8fd | 464 | { |
Kojto | 20:30b6ed7bf8fd | 465 | hci_event_unsol_flowcontrol_handler(event_hdr); |
Kojto | 20:30b6ed7bf8fd | 466 | |
Kojto | 20:30b6ed7bf8fd | 467 | number_of_released_packets = _simple_link.get_released_packets(); |
Kojto | 20:30b6ed7bf8fd | 468 | number_of_sent_packets = _simple_link.get_sent_packets(); |
Kojto | 20:30b6ed7bf8fd | 469 | |
Kojto | 20:30b6ed7bf8fd | 470 | if (number_of_released_packets == number_of_sent_packets) |
Kojto | 20:30b6ed7bf8fd | 471 | { |
Kojto | 20:30b6ed7bf8fd | 472 | if (_simple_link.get_tx_complete_signal()) |
Kojto | 20:30b6ed7bf8fd | 473 | { |
Kojto | 20:30b6ed7bf8fd | 474 | //tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB); |
Kojto | 20:30b6ed7bf8fd | 475 | _cc3000.usync_callback(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0); |
Kojto | 20:30b6ed7bf8fd | 476 | } |
Kojto | 20:30b6ed7bf8fd | 477 | } |
Kojto | 20:30b6ed7bf8fd | 478 | return 1; |
Kojto | 20:30b6ed7bf8fd | 479 | } |
Kojto | 20:30b6ed7bf8fd | 480 | } |
Kojto | 20:30b6ed7bf8fd | 481 | } |
Kojto | 20:30b6ed7bf8fd | 482 | |
Kojto | 20:30b6ed7bf8fd | 483 | if (event_type & HCI_EVNT_WLAN_UNSOL_BASE) { |
Kojto | 20:30b6ed7bf8fd | 484 | switch(event_type) { |
Kojto | 20:30b6ed7bf8fd | 485 | case HCI_EVNT_WLAN_KEEPALIVE: |
Kojto | 20:30b6ed7bf8fd | 486 | case HCI_EVNT_WLAN_UNSOL_CONNECT: |
Kojto | 20:30b6ed7bf8fd | 487 | case HCI_EVNT_WLAN_UNSOL_DISCONNECT: |
Kojto | 20:30b6ed7bf8fd | 488 | case HCI_EVNT_WLAN_UNSOL_INIT: |
Kojto | 20:30b6ed7bf8fd | 489 | case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE: |
Kojto | 45:50ab13d8f2dc | 490 | _cc3000.usync_callback(event_type, 0, 0); |
Kojto | 20:30b6ed7bf8fd | 491 | break; |
Kojto | 20:30b6ed7bf8fd | 492 | case HCI_EVNT_WLAN_UNSOL_DHCP: |
Kojto | 20:30b6ed7bf8fd | 493 | { |
Kojto | 20:30b6ed7bf8fd | 494 | uint8_t params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status |
Kojto | 20:30b6ed7bf8fd | 495 | uint8_t *recParams = params; |
Kojto | 20:30b6ed7bf8fd | 496 | data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE; |
Kojto | 20:30b6ed7bf8fd | 497 | |
Kojto | 20:30b6ed7bf8fd | 498 | //Read IP address |
Kojto | 20:30b6ed7bf8fd | 499 | STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 500 | data += 4; |
Kojto | 20:30b6ed7bf8fd | 501 | //Read subnet |
Kojto | 20:30b6ed7bf8fd | 502 | STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 503 | data += 4; |
Kojto | 20:30b6ed7bf8fd | 504 | //Read default GW |
Kojto | 20:30b6ed7bf8fd | 505 | STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 506 | data += 4; |
Kojto | 20:30b6ed7bf8fd | 507 | //Read DHCP server |
Kojto | 20:30b6ed7bf8fd | 508 | STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 509 | data += 4; |
Kojto | 20:30b6ed7bf8fd | 510 | //Read DNS server |
Kojto | 20:30b6ed7bf8fd | 511 | STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH); |
Kojto | 20:30b6ed7bf8fd | 512 | // read the status |
Kojto | 20:30b6ed7bf8fd | 513 | STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams); |
Kojto | 20:30b6ed7bf8fd | 514 | |
Kojto | 45:50ab13d8f2dc | 515 | _cc3000.usync_callback(event_type, (uint8_t *)params, sizeof(params)); |
Kojto | 45:50ab13d8f2dc | 516 | |
Kojto | 20:30b6ed7bf8fd | 517 | break; |
Kojto | 20:30b6ed7bf8fd | 518 | } |
Kojto | 20:30b6ed7bf8fd | 519 | case HCI_EVNT_WLAN_ASYNC_PING_REPORT: |
Kojto | 20:30b6ed7bf8fd | 520 | { |
Kojto | 20:30b6ed7bf8fd | 521 | netapp_pingreport_args_t params; |
Kojto | 20:30b6ed7bf8fd | 522 | data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE; |
Kojto | 20:30b6ed7bf8fd | 523 | STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent); |
Kojto | 20:30b6ed7bf8fd | 524 | STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received); |
Kojto | 20:30b6ed7bf8fd | 525 | STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time); |
Kojto | 20:30b6ed7bf8fd | 526 | STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time); |
Kojto | 20:30b6ed7bf8fd | 527 | STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time); |
Kojto | 20:30b6ed7bf8fd | 528 | |
Kojto | 45:50ab13d8f2dc | 529 | _cc3000.usync_callback(event_type, (uint8_t *)¶ms, sizeof(params)); |
Kojto | 20:30b6ed7bf8fd | 530 | break; |
Kojto | 20:30b6ed7bf8fd | 531 | } |
Kojto | 20:30b6ed7bf8fd | 532 | case HCI_EVNT_BSD_TCP_CLOSE_WAIT: |
Kojto | 20:30b6ed7bf8fd | 533 | { |
Kojto | 45:50ab13d8f2dc | 534 | _cc3000.usync_callback(event_type, NULL, 0); |
Kojto | 20:30b6ed7bf8fd | 535 | break; |
Kojto | 20:30b6ed7bf8fd | 536 | } |
Kojto | 20:30b6ed7bf8fd | 537 | |
Kojto | 20:30b6ed7bf8fd | 538 | //'default' case which means "event not supported" |
Kojto | 20:30b6ed7bf8fd | 539 | default: |
Kojto | 20:30b6ed7bf8fd | 540 | return (0); |
Kojto | 20:30b6ed7bf8fd | 541 | } |
Kojto | 20:30b6ed7bf8fd | 542 | return(1); |
Kojto | 20:30b6ed7bf8fd | 543 | } |
Kojto | 20:30b6ed7bf8fd | 544 | |
Kojto | 20:30b6ed7bf8fd | 545 | if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE)) { |
Kojto | 20:30b6ed7bf8fd | 546 | uint8_t *pArg; |
Kojto | 20:30b6ed7bf8fd | 547 | int32_t status; |
Kojto | 20:30b6ed7bf8fd | 548 | pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr); |
Kojto | 20:30b6ed7bf8fd | 549 | STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status); |
Kojto | 20:30b6ed7bf8fd | 550 | if (ERROR_SOCKET_INACTIVE == status) { |
Kojto | 20:30b6ed7bf8fd | 551 | // The only synchronous event that can come from SL device in form of |
Kojto | 20:30b6ed7bf8fd | 552 | // command complete is "Command Complete" on data sent, in case SL device |
Kojto | 20:30b6ed7bf8fd | 553 | // was unable to transmit |
Kojto | 20:30b6ed7bf8fd | 554 | int32_t transmit_error = _simple_link.get_transmit_error(); |
Kojto | 20:30b6ed7bf8fd | 555 | STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, transmit_error); |
Kojto | 20:30b6ed7bf8fd | 556 | _simple_link.set_transmit_error(transmit_error); |
Kojto | 20:30b6ed7bf8fd | 557 | update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr)); |
Kojto | 20:30b6ed7bf8fd | 558 | return (1); |
Kojto | 20:30b6ed7bf8fd | 559 | } |
Kojto | 20:30b6ed7bf8fd | 560 | else { |
Kojto | 20:30b6ed7bf8fd | 561 | return (0); |
Kojto | 20:30b6ed7bf8fd | 562 | } |
Kojto | 20:30b6ed7bf8fd | 563 | } |
Kojto | 20:30b6ed7bf8fd | 564 | return(0); |
Kojto | 20:30b6ed7bf8fd | 565 | } |
Kojto | 20:30b6ed7bf8fd | 566 | |
Kojto | 20:30b6ed7bf8fd | 567 | int32_t cc3000_event::hci_unsolicited_event_handler(void) { |
Kojto | 20:30b6ed7bf8fd | 568 | uint32_t res = 0; |
Kojto | 20:30b6ed7bf8fd | 569 | uint8_t *received_data; |
Kojto | 20:30b6ed7bf8fd | 570 | |
Kojto | 20:30b6ed7bf8fd | 571 | if (_simple_link.get_data_received_flag() != 0) { |
Kojto | 20:30b6ed7bf8fd | 572 | received_data = (_simple_link.get_received_data()); |
Kojto | 20:30b6ed7bf8fd | 573 | |
Kojto | 20:30b6ed7bf8fd | 574 | if (*received_data == HCI_TYPE_EVNT) { |
Kojto | 20:30b6ed7bf8fd | 575 | // unsolicited event received - finish handling |
Kojto | 20:30b6ed7bf8fd | 576 | if (hci_unsol_event_handler((uint8_t *)received_data) == 1) { |
Kojto | 20:30b6ed7bf8fd | 577 | // An unsolicited event was received: |
Kojto | 20:30b6ed7bf8fd | 578 | // release the buffer and clean the event received |
Kojto | 20:30b6ed7bf8fd | 579 | _simple_link.set_data_received_flag(0); |
Kojto | 20:30b6ed7bf8fd | 580 | |
Kojto | 20:30b6ed7bf8fd | 581 | res = 1; |
Kojto | 20:30b6ed7bf8fd | 582 | _spi.wlan_irq_enable(); |
Kojto | 20:30b6ed7bf8fd | 583 | } |
Kojto | 20:30b6ed7bf8fd | 584 | } |
Kojto | 20:30b6ed7bf8fd | 585 | } |
Kojto | 20:30b6ed7bf8fd | 586 | return res; |
Kojto | 20:30b6ed7bf8fd | 587 | } |
Kojto | 20:30b6ed7bf8fd | 588 | |
Kojto | 20:30b6ed7bf8fd | 589 | void cc3000_event::set_socket_active_status(int32_t sd, int32_t status) { |
Kojto | 45:50ab13d8f2dc | 590 | if (M_IS_VALID_SD(sd) && M_IS_VALID_STATUS(status)) { |
Kojto | 20:30b6ed7bf8fd | 591 | socket_active_status &= ~(1 << sd); /* clean socket's mask */ |
Kojto | 20:30b6ed7bf8fd | 592 | socket_active_status |= (status << sd); /* set new socket's mask */ |
Kojto | 20:30b6ed7bf8fd | 593 | } |
Kojto | 20:30b6ed7bf8fd | 594 | } |
Kojto | 20:30b6ed7bf8fd | 595 | |
Kojto | 20:30b6ed7bf8fd | 596 | int32_t cc3000_event::hci_event_unsol_flowcontrol_handler(uint8_t *event) { |
Kojto | 20:30b6ed7bf8fd | 597 | int32_t temp, value; |
Kojto | 20:30b6ed7bf8fd | 598 | uint16_t i; |
Kojto | 20:30b6ed7bf8fd | 599 | uint16_t pusNumberOfHandles=0; |
Kojto | 20:30b6ed7bf8fd | 600 | uint8_t *pReadPayload; |
Kojto | 20:30b6ed7bf8fd | 601 | |
Kojto | 20:30b6ed7bf8fd | 602 | STREAM_TO_UINT16((uint8_t *)event,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles); |
Kojto | 20:30b6ed7bf8fd | 603 | pReadPayload = ((uint8_t *)event + HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles)); |
Kojto | 20:30b6ed7bf8fd | 604 | temp = 0; |
Kojto | 20:30b6ed7bf8fd | 605 | |
Kojto | 20:30b6ed7bf8fd | 606 | for(i = 0; i < pusNumberOfHandles; i++) { |
Kojto | 20:30b6ed7bf8fd | 607 | STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value); |
Kojto | 20:30b6ed7bf8fd | 608 | temp += value; |
Kojto | 20:30b6ed7bf8fd | 609 | pReadPayload += FLOW_CONTROL_EVENT_SIZE; |
Kojto | 20:30b6ed7bf8fd | 610 | } |
Kojto | 20:30b6ed7bf8fd | 611 | |
Kojto | 20:30b6ed7bf8fd | 612 | _simple_link.set_number_free_buffers(_simple_link.get_number_free_buffers() + temp); |
Kojto | 20:30b6ed7bf8fd | 613 | _simple_link.set_number_of_released_packets(_simple_link.get_released_packets() + temp); |
Kojto | 20:30b6ed7bf8fd | 614 | |
Kojto | 20:30b6ed7bf8fd | 615 | return(ESUCCESS); |
Kojto | 20:30b6ed7bf8fd | 616 | } |
Kojto | 20:30b6ed7bf8fd | 617 | |
Kojto | 20:30b6ed7bf8fd | 618 | int32_t cc3000_event::get_socket_active_status(int32_t sd) { |
Kojto | 45:50ab13d8f2dc | 619 | if (M_IS_VALID_SD(sd)) { |
Kojto | 20:30b6ed7bf8fd | 620 | return (socket_active_status & (1 << sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE; |
Kojto | 20:30b6ed7bf8fd | 621 | } else { |
Kojto | 20:30b6ed7bf8fd | 622 | return SOCKET_STATUS_INACTIVE; |
Kojto | 20:30b6ed7bf8fd | 623 | } |
Kojto | 20:30b6ed7bf8fd | 624 | } |
Kojto | 20:30b6ed7bf8fd | 625 | |
Kojto | 20:30b6ed7bf8fd | 626 | void cc3000_event::update_socket_active_status(uint8_t *resp_params) { |
Kojto | 20:30b6ed7bf8fd | 627 | int32_t status, sd; |
Kojto | 20:30b6ed7bf8fd | 628 | |
Kojto | 20:30b6ed7bf8fd | 629 | STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd); |
Kojto | 20:30b6ed7bf8fd | 630 | STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status); |
Kojto | 20:30b6ed7bf8fd | 631 | |
Kojto | 45:50ab13d8f2dc | 632 | if (ERROR_SOCKET_INACTIVE == status) { |
Kojto | 20:30b6ed7bf8fd | 633 | set_socket_active_status(sd, SOCKET_STATUS_INACTIVE); |
Kojto | 20:30b6ed7bf8fd | 634 | } |
Kojto | 20:30b6ed7bf8fd | 635 | } |
Kojto | 20:30b6ed7bf8fd | 636 | |
Kojto | 20:30b6ed7bf8fd | 637 | void cc3000_event::simplelink_wait_event(uint16_t op_code, void *ret_param) { |
Kojto | 20:30b6ed7bf8fd | 638 | // In the blocking implementation the control to caller will be returned only |
Kojto | 20:30b6ed7bf8fd | 639 | // after the end of current transaction |
Kojto | 20:30b6ed7bf8fd | 640 | _simple_link.set_op_code(op_code); |
Kojto | 20:30b6ed7bf8fd | 641 | hci_event_handler(ret_param, 0, 0); |
Kojto | 20:30b6ed7bf8fd | 642 | } |
Kojto | 20:30b6ed7bf8fd | 643 | |
Kojto | 20:30b6ed7bf8fd | 644 | void cc3000_event::simplelink_wait_data(uint8_t *pBuf, uint8_t *from, uint8_t *fromlen) { |
Kojto | 20:30b6ed7bf8fd | 645 | // In the blocking implementation the control to caller will be returned only |
Kojto | 20:30b6ed7bf8fd | 646 | // after the end of current transaction, i.e. only after data will be received |
Kojto | 20:30b6ed7bf8fd | 647 | _simple_link.set_pending_data(1); |
Kojto | 20:30b6ed7bf8fd | 648 | hci_event_handler(pBuf, from, fromlen); |
Kojto | 20:30b6ed7bf8fd | 649 | } |
Kojto | 20:30b6ed7bf8fd | 650 | |
Kojto | 20:30b6ed7bf8fd | 651 | |
Kojto | 45:50ab13d8f2dc | 652 | } // end of cc3000 |