cc3000 driver with expanded buffers.

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Committer:
SolderSplashLabs
Date:
Tue Oct 08 22:37:53 2013 +0000
Revision:
38:1d374a7f0c0d
Parent:
26:456f73ed2a75
Child:
41:eb1999bd50fb
Enabling debugging

Who changed what in which revision?

UserRevisionLine numberNew 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
SolderSplashLabs 22:d23c59fec0dc 47 #ifdef CC3000_DEBUG_HCI_RX
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 {
SolderSplashLabs 22:d23c59fec0dc 181 #ifdef CC3000_DEBUG_HCI_RX
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
SolderSplashLabs 38:1d374a7f0c0d 201 Timer timer;
Kojto 20:30b6ed7bf8fd 202 uint8_t *cc3000_event::hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen) {
Kojto 20:30b6ed7bf8fd 203 uint8_t *received_data, argument_size;
Kojto 20:30b6ed7bf8fd 204 uint16_t length;
Kojto 20:30b6ed7bf8fd 205 uint8_t *pucReceivedParams;
Kojto 20:30b6ed7bf8fd 206 uint16_t received_op_code = 0;
Kojto 20:30b6ed7bf8fd 207 uint32_t return_value;
Kojto 20:30b6ed7bf8fd 208 uint8_t * RecvParams;
Kojto 20:30b6ed7bf8fd 209 uint8_t *RetParams;
SolderSplashLabs 38:1d374a7f0c0d 210
SolderSplashLabs 38:1d374a7f0c0d 211
SolderSplashLabs 38:1d374a7f0c0d 212 timer.reset();
SolderSplashLabs 38:1d374a7f0c0d 213 timer.start();
SolderSplashLabs 38:1d374a7f0c0d 214
Kojto 20:30b6ed7bf8fd 215 while (1)
Kojto 20:30b6ed7bf8fd 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;
SolderSplashLabs 38:1d374a7f0c0d 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 }
SolderSplashLabs 38:1d374a7f0c0d 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
Kojto 20:30b6ed7bf8fd 439 //tWlanInterruptEnable func_pointer = (tWlanInterruptEnable)_simple_link.get_func_pointer(WLAN_INTERRUPT_ENABLE);
Kojto 20:30b6ed7bf8fd 440 //func_pointer();
Kojto 20:30b6ed7bf8fd 441 _spi.wlan_irq_enable();
Kojto 20:30b6ed7bf8fd 442
Kojto 20:30b6ed7bf8fd 443 // Since we are going to TX - we need to handle this event after the ResumeSPi since we need interrupts
Kojto 20:30b6ed7bf8fd 444 if ((*received_data == HCI_TYPE_EVNT) && (received_op_code == HCI_EVNT_PATCHES_REQ))
Kojto 20:30b6ed7bf8fd 445 {
Kojto 20:30b6ed7bf8fd 446 hci_unsol_handle_patch_request((uint8_t *)received_data);
Kojto 20:30b6ed7bf8fd 447 }
Kojto 20:30b6ed7bf8fd 448 if ((_simple_link.get_op_code() == 0) && (_simple_link.get_pending_data() == 0))
Kojto 20:30b6ed7bf8fd 449 {
Kojto 20:30b6ed7bf8fd 450 return NULL;
Kojto 20:30b6ed7bf8fd 451 }
Kojto 20:30b6ed7bf8fd 452 }
SolderSplashLabs 38:1d374a7f0c0d 453
SolderSplashLabs 38:1d374a7f0c0d 454 if ( timer.read_ms() > 10000)
SolderSplashLabs 38:1d374a7f0c0d 455 {
SolderSplashLabs 38:1d374a7f0c0d 456 DBG_HCI("TIMEOUT Waiting for CC3000 Event - BAD");
SolderSplashLabs 38:1d374a7f0c0d 457 break;
SolderSplashLabs 38:1d374a7f0c0d 458 }
Kojto 20:30b6ed7bf8fd 459 }
Kojto 20:30b6ed7bf8fd 460 }
Kojto 20:30b6ed7bf8fd 461
Kojto 20:30b6ed7bf8fd 462 int32_t cc3000_event::hci_unsol_event_handler(uint8_t *event_hdr) {
Kojto 20:30b6ed7bf8fd 463 uint8_t *data = NULL;
Kojto 20:30b6ed7bf8fd 464 int32_t event_type;
Kojto 20:30b6ed7bf8fd 465 uint32_t number_of_released_packets;
Kojto 20:30b6ed7bf8fd 466 uint32_t number_of_sent_packets;
Kojto 20:30b6ed7bf8fd 467
Kojto 20:30b6ed7bf8fd 468 STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
Kojto 20:30b6ed7bf8fd 469
Kojto 20:30b6ed7bf8fd 470 if (event_type & HCI_EVNT_UNSOL_BASE) {
Kojto 20:30b6ed7bf8fd 471 switch(event_type) {
Kojto 20:30b6ed7bf8fd 472 case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
Kojto 20:30b6ed7bf8fd 473 {
Kojto 20:30b6ed7bf8fd 474 hci_event_unsol_flowcontrol_handler(event_hdr);
Kojto 20:30b6ed7bf8fd 475
Kojto 20:30b6ed7bf8fd 476 number_of_released_packets = _simple_link.get_released_packets();
Kojto 20:30b6ed7bf8fd 477 number_of_sent_packets = _simple_link.get_sent_packets();
Kojto 20:30b6ed7bf8fd 478
Kojto 20:30b6ed7bf8fd 479 if (number_of_released_packets == number_of_sent_packets)
Kojto 20:30b6ed7bf8fd 480 {
Kojto 20:30b6ed7bf8fd 481 if (_simple_link.get_tx_complete_signal())
Kojto 20:30b6ed7bf8fd 482 {
Kojto 20:30b6ed7bf8fd 483 //tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
Kojto 20:30b6ed7bf8fd 484 _cc3000.usync_callback(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
Kojto 20:30b6ed7bf8fd 485 }
Kojto 20:30b6ed7bf8fd 486 }
Kojto 20:30b6ed7bf8fd 487 return 1;
Kojto 20:30b6ed7bf8fd 488 }
Kojto 20:30b6ed7bf8fd 489 }
Kojto 20:30b6ed7bf8fd 490 }
Kojto 20:30b6ed7bf8fd 491
Kojto 20:30b6ed7bf8fd 492 if (event_type & HCI_EVNT_WLAN_UNSOL_BASE) {
Kojto 20:30b6ed7bf8fd 493 switch(event_type) {
Kojto 20:30b6ed7bf8fd 494 case HCI_EVNT_WLAN_KEEPALIVE:
Kojto 20:30b6ed7bf8fd 495 case HCI_EVNT_WLAN_UNSOL_CONNECT:
Kojto 20:30b6ed7bf8fd 496 case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
Kojto 20:30b6ed7bf8fd 497 case HCI_EVNT_WLAN_UNSOL_INIT:
Kojto 20:30b6ed7bf8fd 498 case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
Kojto 20:30b6ed7bf8fd 499 // {
Kojto 20:30b6ed7bf8fd 500 // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
Kojto 20:30b6ed7bf8fd 501 // if( func_pointer )
Kojto 20:30b6ed7bf8fd 502 // {
Kojto 20:30b6ed7bf8fd 503 // func_pointer(event_type, 0, 0);
Kojto 20:30b6ed7bf8fd 504 // }
Kojto 20:30b6ed7bf8fd 505 _cc3000.usync_callback(event_type, 0, 0);
Kojto 20:30b6ed7bf8fd 506 break;
Kojto 20:30b6ed7bf8fd 507 // }
Kojto 20:30b6ed7bf8fd 508 case HCI_EVNT_WLAN_UNSOL_DHCP:
Kojto 20:30b6ed7bf8fd 509 {
Kojto 20:30b6ed7bf8fd 510 uint8_t params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
Kojto 20:30b6ed7bf8fd 511 uint8_t *recParams = params;
Kojto 20:30b6ed7bf8fd 512 data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
Kojto 20:30b6ed7bf8fd 513
Kojto 20:30b6ed7bf8fd 514 //Read IP address
Kojto 20:30b6ed7bf8fd 515 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
Kojto 20:30b6ed7bf8fd 516 data += 4;
Kojto 20:30b6ed7bf8fd 517 //Read subnet
Kojto 20:30b6ed7bf8fd 518 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
Kojto 20:30b6ed7bf8fd 519 data += 4;
Kojto 20:30b6ed7bf8fd 520 //Read default GW
Kojto 20:30b6ed7bf8fd 521 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
Kojto 20:30b6ed7bf8fd 522 data += 4;
Kojto 20:30b6ed7bf8fd 523 //Read DHCP server
Kojto 20:30b6ed7bf8fd 524 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
Kojto 20:30b6ed7bf8fd 525 data += 4;
Kojto 20:30b6ed7bf8fd 526 //Read DNS server
Kojto 20:30b6ed7bf8fd 527 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
Kojto 20:30b6ed7bf8fd 528 // read the status
Kojto 20:30b6ed7bf8fd 529 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
Kojto 20:30b6ed7bf8fd 530
Kojto 20:30b6ed7bf8fd 531 // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
Kojto 20:30b6ed7bf8fd 532 // if( func_pointer )
Kojto 20:30b6ed7bf8fd 533 // {
Kojto 20:30b6ed7bf8fd 534 _cc3000.usync_callback(event_type, (uint8_t *)params, sizeof(params));
Kojto 20:30b6ed7bf8fd 535 // }
Kojto 20:30b6ed7bf8fd 536 break;
Kojto 20:30b6ed7bf8fd 537 }
Kojto 20:30b6ed7bf8fd 538 case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
Kojto 20:30b6ed7bf8fd 539 {
Kojto 20:30b6ed7bf8fd 540 netapp_pingreport_args_t params;
Kojto 20:30b6ed7bf8fd 541 data = (uint8_t *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
Kojto 20:30b6ed7bf8fd 542 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
Kojto 20:30b6ed7bf8fd 543 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
Kojto 20:30b6ed7bf8fd 544 STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
Kojto 20:30b6ed7bf8fd 545 STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
Kojto 20:30b6ed7bf8fd 546 STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
Kojto 20:30b6ed7bf8fd 547
Kojto 20:30b6ed7bf8fd 548 // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
Kojto 20:30b6ed7bf8fd 549 // if (func_pointer)
Kojto 20:30b6ed7bf8fd 550 // {
Kojto 20:30b6ed7bf8fd 551 _cc3000.usync_callback(event_type, (uint8_t *)&params, sizeof(params));
Kojto 20:30b6ed7bf8fd 552 // }
Kojto 20:30b6ed7bf8fd 553 break;
Kojto 20:30b6ed7bf8fd 554 }
Kojto 20:30b6ed7bf8fd 555 case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
Kojto 20:30b6ed7bf8fd 556 {
Kojto 20:30b6ed7bf8fd 557 // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
Kojto 20:30b6ed7bf8fd 558 // if (func_pointer)
Kojto 20:30b6ed7bf8fd 559 // {
Kojto 20:30b6ed7bf8fd 560 _cc3000.usync_callback(event_type, NULL, 0);
Kojto 20:30b6ed7bf8fd 561 // }
Kojto 20:30b6ed7bf8fd 562 break;
Kojto 20:30b6ed7bf8fd 563 }
Kojto 20:30b6ed7bf8fd 564
Kojto 20:30b6ed7bf8fd 565 //'default' case which means "event not supported"
Kojto 20:30b6ed7bf8fd 566 default:
Kojto 20:30b6ed7bf8fd 567 return (0);
Kojto 20:30b6ed7bf8fd 568 }
Kojto 20:30b6ed7bf8fd 569 return(1);
Kojto 20:30b6ed7bf8fd 570 }
Kojto 20:30b6ed7bf8fd 571
Kojto 20:30b6ed7bf8fd 572 if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE)) {
Kojto 20:30b6ed7bf8fd 573 uint8_t *pArg;
Kojto 20:30b6ed7bf8fd 574 int32_t status;
Kojto 20:30b6ed7bf8fd 575 pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
Kojto 20:30b6ed7bf8fd 576 STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
Kojto 20:30b6ed7bf8fd 577 if (ERROR_SOCKET_INACTIVE == status) {
Kojto 20:30b6ed7bf8fd 578 // The only synchronous event that can come from SL device in form of
Kojto 20:30b6ed7bf8fd 579 // command complete is "Command Complete" on data sent, in case SL device
Kojto 20:30b6ed7bf8fd 580 // was unable to transmit
Kojto 20:30b6ed7bf8fd 581 int32_t transmit_error = _simple_link.get_transmit_error();
Kojto 20:30b6ed7bf8fd 582 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, transmit_error);
Kojto 20:30b6ed7bf8fd 583 _simple_link.set_transmit_error(transmit_error);
Kojto 20:30b6ed7bf8fd 584 update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
Kojto 20:30b6ed7bf8fd 585 return (1);
Kojto 20:30b6ed7bf8fd 586 }
Kojto 20:30b6ed7bf8fd 587 else {
Kojto 20:30b6ed7bf8fd 588 return (0);
Kojto 20:30b6ed7bf8fd 589 }
Kojto 20:30b6ed7bf8fd 590 }
Kojto 20:30b6ed7bf8fd 591 return(0);
Kojto 20:30b6ed7bf8fd 592 }
Kojto 20:30b6ed7bf8fd 593
Kojto 20:30b6ed7bf8fd 594 int32_t cc3000_event::hci_unsolicited_event_handler(void) {
Kojto 20:30b6ed7bf8fd 595 uint32_t res = 0;
Kojto 20:30b6ed7bf8fd 596 uint8_t *received_data;
Kojto 20:30b6ed7bf8fd 597
Kojto 20:30b6ed7bf8fd 598 if (_simple_link.get_data_received_flag() != 0) {
Kojto 20:30b6ed7bf8fd 599 received_data = (_simple_link.get_received_data());
Kojto 20:30b6ed7bf8fd 600
Kojto 20:30b6ed7bf8fd 601 if (*received_data == HCI_TYPE_EVNT) {
Kojto 20:30b6ed7bf8fd 602 // unsolicited event received - finish handling
Kojto 20:30b6ed7bf8fd 603 if (hci_unsol_event_handler((uint8_t *)received_data) == 1) {
Kojto 20:30b6ed7bf8fd 604 // An unsolicited event was received:
Kojto 20:30b6ed7bf8fd 605 // release the buffer and clean the event received
Kojto 20:30b6ed7bf8fd 606 _simple_link.set_data_received_flag(0);
Kojto 20:30b6ed7bf8fd 607
Kojto 20:30b6ed7bf8fd 608 res = 1;
Kojto 20:30b6ed7bf8fd 609 _spi.wlan_irq_enable();
Kojto 20:30b6ed7bf8fd 610 }
Kojto 20:30b6ed7bf8fd 611 }
Kojto 20:30b6ed7bf8fd 612 }
Kojto 20:30b6ed7bf8fd 613 return res;
Kojto 20:30b6ed7bf8fd 614 }
Kojto 20:30b6ed7bf8fd 615
Kojto 20:30b6ed7bf8fd 616 void cc3000_event::set_socket_active_status(int32_t sd, int32_t status) {
Kojto 20:30b6ed7bf8fd 617 if (M_IS_VALID_SD(sd) && M_IS_VALID_STATUS(status))
Kojto 20:30b6ed7bf8fd 618 {
Kojto 20:30b6ed7bf8fd 619 socket_active_status &= ~(1 << sd); /* clean socket's mask */
Kojto 20:30b6ed7bf8fd 620 socket_active_status |= (status << sd); /* set new socket's mask */
Kojto 20:30b6ed7bf8fd 621 }
Kojto 20:30b6ed7bf8fd 622 }
Kojto 20:30b6ed7bf8fd 623
Kojto 20:30b6ed7bf8fd 624 int32_t cc3000_event::hci_event_unsol_flowcontrol_handler(uint8_t *event) {
Kojto 20:30b6ed7bf8fd 625 int32_t temp, value;
Kojto 20:30b6ed7bf8fd 626 uint16_t i;
Kojto 20:30b6ed7bf8fd 627 uint16_t pusNumberOfHandles=0;
Kojto 20:30b6ed7bf8fd 628 uint8_t *pReadPayload;
Kojto 20:30b6ed7bf8fd 629
Kojto 20:30b6ed7bf8fd 630 STREAM_TO_UINT16((uint8_t *)event,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
Kojto 20:30b6ed7bf8fd 631 pReadPayload = ((uint8_t *)event + HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
Kojto 20:30b6ed7bf8fd 632 temp = 0;
Kojto 20:30b6ed7bf8fd 633
Kojto 20:30b6ed7bf8fd 634 for(i = 0; i < pusNumberOfHandles; i++) {
Kojto 20:30b6ed7bf8fd 635 STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
Kojto 20:30b6ed7bf8fd 636 temp += value;
Kojto 20:30b6ed7bf8fd 637 pReadPayload += FLOW_CONTROL_EVENT_SIZE;
Kojto 20:30b6ed7bf8fd 638 }
Kojto 20:30b6ed7bf8fd 639
Kojto 20:30b6ed7bf8fd 640 _simple_link.set_number_free_buffers(_simple_link.get_number_free_buffers() + temp);
Kojto 20:30b6ed7bf8fd 641 _simple_link.set_number_of_released_packets(_simple_link.get_released_packets() + temp);
Kojto 20:30b6ed7bf8fd 642
Kojto 20:30b6ed7bf8fd 643 return(ESUCCESS);
Kojto 20:30b6ed7bf8fd 644 }
Kojto 20:30b6ed7bf8fd 645
Kojto 20:30b6ed7bf8fd 646 int32_t cc3000_event::get_socket_active_status(int32_t sd) {
Kojto 20:30b6ed7bf8fd 647 if(M_IS_VALID_SD(sd)) {
Kojto 20:30b6ed7bf8fd 648 return (socket_active_status & (1 << sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
Kojto 20:30b6ed7bf8fd 649 } else {
Kojto 20:30b6ed7bf8fd 650 return SOCKET_STATUS_INACTIVE;
Kojto 20:30b6ed7bf8fd 651 }
Kojto 20:30b6ed7bf8fd 652 }
Kojto 20:30b6ed7bf8fd 653
Kojto 20:30b6ed7bf8fd 654 void cc3000_event::update_socket_active_status(uint8_t *resp_params) {
Kojto 20:30b6ed7bf8fd 655 int32_t status, sd;
Kojto 20:30b6ed7bf8fd 656
Kojto 20:30b6ed7bf8fd 657 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
Kojto 20:30b6ed7bf8fd 658 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
Kojto 20:30b6ed7bf8fd 659
Kojto 20:30b6ed7bf8fd 660 if(ERROR_SOCKET_INACTIVE == status) {
Kojto 20:30b6ed7bf8fd 661 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
Kojto 20:30b6ed7bf8fd 662 }
Kojto 20:30b6ed7bf8fd 663 }
Kojto 20:30b6ed7bf8fd 664
Kojto 20:30b6ed7bf8fd 665 void cc3000_event::simplelink_wait_event(uint16_t op_code, void *ret_param) {
Kojto 20:30b6ed7bf8fd 666 // In the blocking implementation the control to caller will be returned only
Kojto 20:30b6ed7bf8fd 667 // after the end of current transaction
Kojto 20:30b6ed7bf8fd 668 _simple_link.set_op_code(op_code);
Kojto 20:30b6ed7bf8fd 669 hci_event_handler(ret_param, 0, 0);
Kojto 20:30b6ed7bf8fd 670 }
Kojto 20:30b6ed7bf8fd 671
Kojto 20:30b6ed7bf8fd 672 void cc3000_event::simplelink_wait_data(uint8_t *pBuf, uint8_t *from, uint8_t *fromlen) {
Kojto 20:30b6ed7bf8fd 673 // In the blocking implementation the control to caller will be returned only
Kojto 20:30b6ed7bf8fd 674 // after the end of current transaction, i.e. only after data will be received
Kojto 20:30b6ed7bf8fd 675 _simple_link.set_pending_data(1);
Kojto 20:30b6ed7bf8fd 676 hci_event_handler(pBuf, from, fromlen);
Kojto 20:30b6ed7bf8fd 677 }
Kojto 20:30b6ed7bf8fd 678
Kojto 20:30b6ed7bf8fd 679
Kojto 20:30b6ed7bf8fd 680 } /* end of cc3000 namespace */