A Port of TI's Webserver for the CC3000

Dependencies:   mbed

Committer:
dflet
Date:
Mon Sep 16 18:37:14 2013 +0000
Revision:
2:e6a185df9e4c
Parent:
0:6ad60d78b315
ADC and Leds now work on board and config.html page.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:6ad60d78b315 1 /*****************************************************************************
dflet 0:6ad60d78b315 2 *
dflet 0:6ad60d78b315 3 * evnt_handler.c - CC3000 Host Driver Implementation.
dflet 0:6ad60d78b315 4 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:6ad60d78b315 5 *
dflet 0:6ad60d78b315 6 * Redistribution and use in source and binary forms, with or without
dflet 0:6ad60d78b315 7 * modification, are permitted provided that the following conditions
dflet 0:6ad60d78b315 8 * are met:
dflet 0:6ad60d78b315 9 *
dflet 0:6ad60d78b315 10 * Redistributions of source code must retain the above copyright
dflet 0:6ad60d78b315 11 * notice, this list of conditions and the following disclaimer.
dflet 0:6ad60d78b315 12 *
dflet 0:6ad60d78b315 13 * Redistributions in binary form must reproduce the above copyright
dflet 0:6ad60d78b315 14 * notice, this list of conditions and the following disclaimer in the
dflet 0:6ad60d78b315 15 * documentation and/or other materials provided with the
dflet 0:6ad60d78b315 16 * distribution.
dflet 0:6ad60d78b315 17 *
dflet 0:6ad60d78b315 18 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:6ad60d78b315 19 * its contributors may be used to endorse or promote products derived
dflet 0:6ad60d78b315 20 * from this software without specific prior written permission.
dflet 0:6ad60d78b315 21 *
dflet 0:6ad60d78b315 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:6ad60d78b315 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:6ad60d78b315 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:6ad60d78b315 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:6ad60d78b315 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:6ad60d78b315 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:6ad60d78b315 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:6ad60d78b315 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:6ad60d78b315 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:6ad60d78b315 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:6ad60d78b315 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:6ad60d78b315 33 *
dflet 0:6ad60d78b315 34 *****************************************************************************/
dflet 0:6ad60d78b315 35 //*****************************************************************************
dflet 0:6ad60d78b315 36 //
dflet 0:6ad60d78b315 37 //! \addtogroup evnt_handler_api
dflet 0:6ad60d78b315 38 //! @{
dflet 0:6ad60d78b315 39 //
dflet 0:6ad60d78b315 40 //******************************************************************************
dflet 0:6ad60d78b315 41
dflet 0:6ad60d78b315 42 //******************************************************************************
dflet 0:6ad60d78b315 43 // INCLUDE FILES
dflet 0:6ad60d78b315 44 //******************************************************************************
dflet 0:6ad60d78b315 45
dflet 0:6ad60d78b315 46 #include "cc3000_common.h"
dflet 0:6ad60d78b315 47 #include "string.h"
dflet 0:6ad60d78b315 48 #include "hci.h"
dflet 0:6ad60d78b315 49 #include "evnt_handler.h"
dflet 0:6ad60d78b315 50 #include "wlan.h"
dflet 0:6ad60d78b315 51 #include "socket.h"
dflet 0:6ad60d78b315 52 #include "netapp.h"
dflet 0:6ad60d78b315 53 #include "spi.h"
dflet 0:6ad60d78b315 54
dflet 0:6ad60d78b315 55
dflet 0:6ad60d78b315 56
dflet 0:6ad60d78b315 57 //*****************************************************************************
dflet 0:6ad60d78b315 58 // COMMON DEFINES
dflet 0:6ad60d78b315 59 //*****************************************************************************
dflet 0:6ad60d78b315 60
dflet 0:6ad60d78b315 61 #define FLOW_CONTROL_EVENT_HANDLE_OFFSET (0)
dflet 0:6ad60d78b315 62 #define FLOW_CONTROL_EVENT_BLOCK_MODE_OFFSET (1)
dflet 0:6ad60d78b315 63 #define FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET (2)
dflet 0:6ad60d78b315 64 #define FLOW_CONTROL_EVENT_SIZE (4)
dflet 0:6ad60d78b315 65
dflet 0:6ad60d78b315 66 #define BSD_RSP_PARAMS_SOCKET_OFFSET (0)
dflet 0:6ad60d78b315 67 #define BSD_RSP_PARAMS_STATUS_OFFSET (4)
dflet 0:6ad60d78b315 68
dflet 0:6ad60d78b315 69 #define GET_HOST_BY_NAME_RETVAL_OFFSET (0)
dflet 0:6ad60d78b315 70 #define GET_HOST_BY_NAME_ADDR_OFFSET (4)
dflet 0:6ad60d78b315 71
dflet 0:6ad60d78b315 72 #define ACCEPT_SD_OFFSET (0)
dflet 0:6ad60d78b315 73 #define ACCEPT_RETURN_STATUS_OFFSET (4)
dflet 0:6ad60d78b315 74 #define ACCEPT_ADDRESS__OFFSET (8)
dflet 0:6ad60d78b315 75
dflet 0:6ad60d78b315 76 #define SL_RECEIVE_SD_OFFSET (0)
dflet 0:6ad60d78b315 77 #define SL_RECEIVE_NUM_BYTES_OFFSET (4)
dflet 0:6ad60d78b315 78 #define SL_RECEIVE__FLAGS__OFFSET (8)
dflet 0:6ad60d78b315 79
dflet 0:6ad60d78b315 80
dflet 0:6ad60d78b315 81 #define SELECT_STATUS_OFFSET (0)
dflet 0:6ad60d78b315 82 #define SELECT_READFD_OFFSET (4)
dflet 0:6ad60d78b315 83 #define SELECT_WRITEFD_OFFSET (8)
dflet 0:6ad60d78b315 84 #define SELECT_EXFD_OFFSET (12)
dflet 0:6ad60d78b315 85
dflet 0:6ad60d78b315 86
dflet 0:6ad60d78b315 87 #define NETAPP_IPCONFIG_IP_OFFSET (0)
dflet 0:6ad60d78b315 88 #define NETAPP_IPCONFIG_SUBNET_OFFSET (4)
dflet 0:6ad60d78b315 89 #define NETAPP_IPCONFIG_GW_OFFSET (8)
dflet 0:6ad60d78b315 90 #define NETAPP_IPCONFIG_DHCP_OFFSET (12)
dflet 0:6ad60d78b315 91 #define NETAPP_IPCONFIG_DNS_OFFSET (16)
dflet 0:6ad60d78b315 92 #define NETAPP_IPCONFIG_MAC_OFFSET (20)
dflet 0:6ad60d78b315 93 #define NETAPP_IPCONFIG_SSID_OFFSET (26)
dflet 0:6ad60d78b315 94
dflet 0:6ad60d78b315 95 #define NETAPP_IPCONFIG_IP_LENGTH (4)
dflet 0:6ad60d78b315 96 #define NETAPP_IPCONFIG_MAC_LENGTH (6)
dflet 0:6ad60d78b315 97 #define NETAPP_IPCONFIG_SSID_LENGTH (32)
dflet 0:6ad60d78b315 98
dflet 0:6ad60d78b315 99
dflet 0:6ad60d78b315 100 #define NETAPP_PING_PACKETS_SENT_OFFSET (0)
dflet 0:6ad60d78b315 101 #define NETAPP_PING_PACKETS_RCVD_OFFSET (4)
dflet 0:6ad60d78b315 102 #define NETAPP_PING_MIN_RTT_OFFSET (8)
dflet 0:6ad60d78b315 103 #define NETAPP_PING_MAX_RTT_OFFSET (12)
dflet 0:6ad60d78b315 104 #define NETAPP_PING_AVG_RTT_OFFSET (16)
dflet 0:6ad60d78b315 105
dflet 0:6ad60d78b315 106 #define GET_SCAN_RESULTS_TABlE_COUNT_OFFSET (0)
dflet 0:6ad60d78b315 107 #define GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET (4)
dflet 0:6ad60d78b315 108 #define GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET (8)
dflet 0:6ad60d78b315 109 #define GET_SCAN_RESULTS_FRAME_TIME_OFFSET (10)
dflet 0:6ad60d78b315 110 #define GET_SCAN_RESULTS_SSID_MAC_LENGTH (38)
dflet 0:6ad60d78b315 111
dflet 0:6ad60d78b315 112
dflet 0:6ad60d78b315 113
dflet 0:6ad60d78b315 114 //*****************************************************************************
dflet 0:6ad60d78b315 115 // GLOBAL VARAIABLES
dflet 0:6ad60d78b315 116 //*****************************************************************************
dflet 0:6ad60d78b315 117
dflet 0:6ad60d78b315 118 unsigned long socket_active_status = SOCKET_STATUS_INIT_VAL;
dflet 0:6ad60d78b315 119
dflet 0:6ad60d78b315 120
dflet 0:6ad60d78b315 121 //*****************************************************************************
dflet 0:6ad60d78b315 122 // Prototypes for the static functions
dflet 0:6ad60d78b315 123 //*****************************************************************************
dflet 0:6ad60d78b315 124
dflet 0:6ad60d78b315 125 static long hci_event_unsol_flowcontrol_handler(char *pEvent);
dflet 0:6ad60d78b315 126
dflet 0:6ad60d78b315 127 static void update_socket_active_status(char *resp_params);
dflet 0:6ad60d78b315 128
dflet 0:6ad60d78b315 129
dflet 0:6ad60d78b315 130 //*****************************************************************************
dflet 0:6ad60d78b315 131 //
dflet 0:6ad60d78b315 132 //! hci_unsol_handle_patch_request
dflet 0:6ad60d78b315 133 //!
dflet 0:6ad60d78b315 134 //! @param event_hdr event header
dflet 0:6ad60d78b315 135 //!
dflet 0:6ad60d78b315 136 //! @return none
dflet 0:6ad60d78b315 137 //!
dflet 0:6ad60d78b315 138 //! @brief Handle unsolicited event from type patch request
dflet 0:6ad60d78b315 139 //
dflet 0:6ad60d78b315 140 //*****************************************************************************
dflet 0:6ad60d78b315 141 void hci_unsol_handle_patch_request(char *event_hdr)
dflet 0:6ad60d78b315 142 {
dflet 0:6ad60d78b315 143 char *params = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:6ad60d78b315 144 unsigned long ucLength = 0;
dflet 0:6ad60d78b315 145 char *patch;
dflet 0:6ad60d78b315 146
dflet 0:6ad60d78b315 147 switch (*params)
dflet 0:6ad60d78b315 148 {
dflet 0:6ad60d78b315 149 case HCI_EVENT_PATCHES_DRV_REQ:
dflet 0:6ad60d78b315 150
dflet 0:6ad60d78b315 151 if (tSLInformation.sDriverPatches)
dflet 0:6ad60d78b315 152 {
dflet 0:6ad60d78b315 153 patch = tSLInformation.sDriverPatches(&ucLength);
dflet 0:6ad60d78b315 154
dflet 0:6ad60d78b315 155 if (patch)
dflet 0:6ad60d78b315 156 {
dflet 0:6ad60d78b315 157 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ,
dflet 0:6ad60d78b315 158 tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:6ad60d78b315 159 return;
dflet 0:6ad60d78b315 160 }
dflet 0:6ad60d78b315 161 }
dflet 0:6ad60d78b315 162
dflet 0:6ad60d78b315 163 // Send 0 length Patches response event
dflet 0:6ad60d78b315 164 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ,
dflet 0:6ad60d78b315 165 tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:6ad60d78b315 166 break;
dflet 0:6ad60d78b315 167
dflet 0:6ad60d78b315 168 case HCI_EVENT_PATCHES_FW_REQ:
dflet 0:6ad60d78b315 169
dflet 0:6ad60d78b315 170 if (tSLInformation.sFWPatches)
dflet 0:6ad60d78b315 171 {
dflet 0:6ad60d78b315 172 patch = tSLInformation.sFWPatches(&ucLength);
dflet 0:6ad60d78b315 173
dflet 0:6ad60d78b315 174 // Build and send a patch
dflet 0:6ad60d78b315 175 if (patch)
dflet 0:6ad60d78b315 176 {
dflet 0:6ad60d78b315 177 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ,
dflet 0:6ad60d78b315 178 tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:6ad60d78b315 179 return;
dflet 0:6ad60d78b315 180 }
dflet 0:6ad60d78b315 181 }
dflet 0:6ad60d78b315 182
dflet 0:6ad60d78b315 183 // Send 0 length Patches response event
dflet 0:6ad60d78b315 184 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ,
dflet 0:6ad60d78b315 185 tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:6ad60d78b315 186 break;
dflet 0:6ad60d78b315 187
dflet 0:6ad60d78b315 188 case HCI_EVENT_PATCHES_BOOTLOAD_REQ:
dflet 0:6ad60d78b315 189
dflet 0:6ad60d78b315 190 if (tSLInformation.sBootLoaderPatches)
dflet 0:6ad60d78b315 191 {
dflet 0:6ad60d78b315 192 patch = tSLInformation.sBootLoaderPatches(&ucLength);
dflet 0:6ad60d78b315 193
dflet 0:6ad60d78b315 194 if (patch)
dflet 0:6ad60d78b315 195 {
dflet 0:6ad60d78b315 196 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ,
dflet 0:6ad60d78b315 197 tSLInformation.pucTxCommandBuffer, patch, ucLength);
dflet 0:6ad60d78b315 198 return;
dflet 0:6ad60d78b315 199 }
dflet 0:6ad60d78b315 200 }
dflet 0:6ad60d78b315 201
dflet 0:6ad60d78b315 202 // Send 0 length Patches response event
dflet 0:6ad60d78b315 203 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ,
dflet 0:6ad60d78b315 204 tSLInformation.pucTxCommandBuffer, 0, 0);
dflet 0:6ad60d78b315 205 break;
dflet 0:6ad60d78b315 206 }
dflet 0:6ad60d78b315 207 }
dflet 0:6ad60d78b315 208
dflet 0:6ad60d78b315 209
dflet 0:6ad60d78b315 210
dflet 0:6ad60d78b315 211 //*****************************************************************************
dflet 0:6ad60d78b315 212 //
dflet 0:6ad60d78b315 213 //! hci_event_handler
dflet 0:6ad60d78b315 214 //!
dflet 0:6ad60d78b315 215 //! @param pRetParams incoming data buffer
dflet 0:6ad60d78b315 216 //! @param from from information (in case of data received)
dflet 0:6ad60d78b315 217 //! @param fromlen from information length (in case of data received)
dflet 0:6ad60d78b315 218 //!
dflet 0:6ad60d78b315 219 //! @return none
dflet 0:6ad60d78b315 220 //!
dflet 0:6ad60d78b315 221 //! @brief Parse the incoming events packets and issues corresponding
dflet 0:6ad60d78b315 222 //! event handler from global array of handlers pointers
dflet 0:6ad60d78b315 223 //
dflet 0:6ad60d78b315 224 //*****************************************************************************
dflet 0:6ad60d78b315 225
dflet 0:6ad60d78b315 226
dflet 0:6ad60d78b315 227 unsigned char *
dflet 0:6ad60d78b315 228 hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen)
dflet 0:6ad60d78b315 229 {
dflet 0:6ad60d78b315 230 unsigned char *pucReceivedData, ucArgsize;
dflet 0:6ad60d78b315 231 unsigned short usLength;
dflet 0:6ad60d78b315 232 unsigned char *pucReceivedParams;
dflet 0:6ad60d78b315 233 unsigned short usReceivedEventOpcode = 0;
dflet 0:6ad60d78b315 234 unsigned long retValue32;
dflet 0:6ad60d78b315 235 unsigned char * RecvParams;
dflet 0:6ad60d78b315 236 unsigned char *RetParams;
dflet 0:6ad60d78b315 237
dflet 0:6ad60d78b315 238
dflet 0:6ad60d78b315 239 while (1)
dflet 0:6ad60d78b315 240 {
dflet 0:6ad60d78b315 241 //printf("Looping...\r\n");
dflet 0:6ad60d78b315 242 if (tSLInformation.usEventOrDataReceived != 0)
dflet 0:6ad60d78b315 243 {
dflet 0:6ad60d78b315 244 pucReceivedData = (tSLInformation.pucReceivedData);
dflet 0:6ad60d78b315 245
dflet 0:6ad60d78b315 246 if (*pucReceivedData == HCI_TYPE_EVNT)
dflet 0:6ad60d78b315 247 {
dflet 0:6ad60d78b315 248 // Event Received
dflet 0:6ad60d78b315 249 STREAM_TO_UINT16((char *)pucReceivedData, HCI_EVENT_OPCODE_OFFSET,
dflet 0:6ad60d78b315 250 usReceivedEventOpcode);
dflet 0:6ad60d78b315 251 pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE;
dflet 0:6ad60d78b315 252 RecvParams = pucReceivedParams;
dflet 0:6ad60d78b315 253 RetParams = (unsigned char *)pRetParams;
dflet 0:6ad60d78b315 254
dflet 0:6ad60d78b315 255 // In case unsolicited event received - here the handling finished
dflet 0:6ad60d78b315 256 if (hci_unsol_event_handler((char *)pucReceivedData) == 0)
dflet 0:6ad60d78b315 257 {
dflet 0:6ad60d78b315 258 STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength);
dflet 0:6ad60d78b315 259
dflet 0:6ad60d78b315 260 switch(usReceivedEventOpcode)
dflet 0:6ad60d78b315 261 {
dflet 0:6ad60d78b315 262 case HCI_CMND_READ_BUFFER_SIZE:
dflet 0:6ad60d78b315 263 {
dflet 0:6ad60d78b315 264 STREAM_TO_UINT8((char *)pucReceivedParams, 0,
dflet 0:6ad60d78b315 265 tSLInformation.usNumberOfFreeBuffers);
dflet 0:6ad60d78b315 266 STREAM_TO_UINT16((char *)pucReceivedParams, 1,
dflet 0:6ad60d78b315 267 tSLInformation.usSlBufferLength);
dflet 0:6ad60d78b315 268 }
dflet 0:6ad60d78b315 269 break;
dflet 0:6ad60d78b315 270
dflet 0:6ad60d78b315 271 case HCI_CMND_WLAN_CONFIGURE_PATCH:
dflet 0:6ad60d78b315 272 case HCI_NETAPP_DHCP:
dflet 0:6ad60d78b315 273 case HCI_NETAPP_PING_SEND:
dflet 0:6ad60d78b315 274 case HCI_NETAPP_PING_STOP:
dflet 0:6ad60d78b315 275 case HCI_NETAPP_ARP_FLUSH:
dflet 0:6ad60d78b315 276 case HCI_NETAPP_SET_DEBUG_LEVEL:
dflet 0:6ad60d78b315 277 case HCI_NETAPP_SET_TIMERS:
dflet 0:6ad60d78b315 278 case HCI_EVNT_NVMEM_READ:
dflet 0:6ad60d78b315 279 case HCI_EVNT_NVMEM_CREATE_ENTRY:
dflet 0:6ad60d78b315 280 case HCI_CMND_NVMEM_WRITE_PATCH:
dflet 0:6ad60d78b315 281 case HCI_NETAPP_PING_REPORT:
dflet 0:6ad60d78b315 282 case HCI_EVNT_MDNS_ADVERTISE:
dflet 0:6ad60d78b315 283
dflet 0:6ad60d78b315 284 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET
dflet 0:6ad60d78b315 285 ,*(unsigned char *)pRetParams);
dflet 0:6ad60d78b315 286 break;
dflet 0:6ad60d78b315 287
dflet 0:6ad60d78b315 288 case HCI_CMND_SETSOCKOPT:
dflet 0:6ad60d78b315 289 case HCI_CMND_WLAN_CONNECT:
dflet 0:6ad60d78b315 290 case HCI_CMND_WLAN_IOCTL_STATUSGET:
dflet 0:6ad60d78b315 291 case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE:
dflet 0:6ad60d78b315 292 case HCI_CMND_WLAN_IOCTL_DEL_PROFILE:
dflet 0:6ad60d78b315 293 case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY:
dflet 0:6ad60d78b315 294 case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM:
dflet 0:6ad60d78b315 295 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START:
dflet 0:6ad60d78b315 296 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP:
dflet 0:6ad60d78b315 297 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX:
dflet 0:6ad60d78b315 298 case HCI_CMND_EVENT_MASK:
dflet 0:6ad60d78b315 299 case HCI_EVNT_WLAN_DISCONNECT:
dflet 0:6ad60d78b315 300 case HCI_EVNT_SOCKET:
dflet 0:6ad60d78b315 301 case HCI_EVNT_BIND:
dflet 0:6ad60d78b315 302 case HCI_CMND_LISTEN:
dflet 0:6ad60d78b315 303 case HCI_EVNT_CLOSE_SOCKET:
dflet 0:6ad60d78b315 304 case HCI_EVNT_CONNECT:
dflet 0:6ad60d78b315 305 case HCI_EVNT_NVMEM_WRITE:
dflet 0:6ad60d78b315 306
dflet 0:6ad60d78b315 307 STREAM_TO_UINT32((char *)pucReceivedParams,0
dflet 0:6ad60d78b315 308 ,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 309 break;
dflet 0:6ad60d78b315 310
dflet 0:6ad60d78b315 311 case HCI_EVNT_READ_SP_VERSION:
dflet 0:6ad60d78b315 312
dflet 0:6ad60d78b315 313 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET
dflet 0:6ad60d78b315 314 ,*(unsigned char *)pRetParams);
dflet 0:6ad60d78b315 315 pRetParams = ((char *)pRetParams) + 1;
dflet 0:6ad60d78b315 316 STREAM_TO_UINT32((char *)pucReceivedParams, 0, retValue32);
dflet 0:6ad60d78b315 317 UINT32_TO_STREAM((unsigned char *)pRetParams, retValue32);
dflet 0:6ad60d78b315 318 break;
dflet 0:6ad60d78b315 319
dflet 0:6ad60d78b315 320 case HCI_EVNT_BSD_GETHOSTBYNAME:
dflet 0:6ad60d78b315 321
dflet 0:6ad60d78b315 322 STREAM_TO_UINT32((char *)pucReceivedParams
dflet 0:6ad60d78b315 323 ,GET_HOST_BY_NAME_RETVAL_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 324 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 325 STREAM_TO_UINT32((char *)pucReceivedParams
dflet 0:6ad60d78b315 326 ,GET_HOST_BY_NAME_ADDR_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 327 break;
dflet 0:6ad60d78b315 328
dflet 0:6ad60d78b315 329 case HCI_EVNT_ACCEPT:
dflet 0:6ad60d78b315 330 {
dflet 0:6ad60d78b315 331 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_SD_OFFSET
dflet 0:6ad60d78b315 332 ,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 333 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 334 STREAM_TO_UINT32((char *)pucReceivedParams
dflet 0:6ad60d78b315 335 ,ACCEPT_RETURN_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 336 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 337
dflet 0:6ad60d78b315 338 //This argument returns in network order
dflet 0:6ad60d78b315 339 memcpy((unsigned char *)pRetParams,
dflet 0:6ad60d78b315 340 pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr));
dflet 0:6ad60d78b315 341 break;
dflet 0:6ad60d78b315 342 }
dflet 0:6ad60d78b315 343
dflet 0:6ad60d78b315 344 case HCI_EVNT_RECV:
dflet 0:6ad60d78b315 345 case HCI_EVNT_RECVFROM:
dflet 0:6ad60d78b315 346 {
dflet 0:6ad60d78b315 347 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 348 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 349 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 350 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 351 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 352
dflet 0:6ad60d78b315 353 if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE)
dflet 0:6ad60d78b315 354 {
dflet 0:6ad60d78b315 355 set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE);
dflet 0:6ad60d78b315 356 }
dflet 0:6ad60d78b315 357 break;
dflet 0:6ad60d78b315 358 }
dflet 0:6ad60d78b315 359
dflet 0:6ad60d78b315 360 case HCI_EVNT_SEND:
dflet 0:6ad60d78b315 361 case HCI_EVNT_SENDTO:
dflet 0:6ad60d78b315 362 {
dflet 0:6ad60d78b315 363 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 364 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 365 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 366 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 367
dflet 0:6ad60d78b315 368 break;
dflet 0:6ad60d78b315 369 }
dflet 0:6ad60d78b315 370
dflet 0:6ad60d78b315 371 case HCI_EVNT_SELECT:
dflet 0:6ad60d78b315 372 {
dflet 0:6ad60d78b315 373 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 374 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 375 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_READFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 376 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 377 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 378 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 379 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_EXFD_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 380 break;
dflet 0:6ad60d78b315 381 }
dflet 0:6ad60d78b315 382
dflet 0:6ad60d78b315 383 case HCI_CMND_GETSOCKOPT:
dflet 0:6ad60d78b315 384
dflet 0:6ad60d78b315 385 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus);
dflet 0:6ad60d78b315 386 //This argument returns in network order
dflet 0:6ad60d78b315 387 memcpy((unsigned char *)pRetParams, pucReceivedParams, 4);
dflet 0:6ad60d78b315 388 break;
dflet 0:6ad60d78b315 389
dflet 0:6ad60d78b315 390 case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS:
dflet 0:6ad60d78b315 391
dflet 0:6ad60d78b315 392 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 393 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 394 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 395 pRetParams = ((char *)pRetParams) + 4;
dflet 0:6ad60d78b315 396 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 397 pRetParams = ((char *)pRetParams) + 2;
dflet 0:6ad60d78b315 398 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(unsigned long *)pRetParams);
dflet 0:6ad60d78b315 399 pRetParams = ((char *)pRetParams) + 2;
dflet 0:6ad60d78b315 400 memcpy((unsigned char *)pRetParams, (char *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH);
dflet 0:6ad60d78b315 401 break;
dflet 0:6ad60d78b315 402
dflet 0:6ad60d78b315 403 case HCI_CMND_SIMPLE_LINK_START:
dflet 0:6ad60d78b315 404 break;
dflet 0:6ad60d78b315 405
dflet 0:6ad60d78b315 406 case HCI_NETAPP_IPCONFIG:
dflet 0:6ad60d78b315 407
dflet 0:6ad60d78b315 408 //Read IP address
dflet 0:6ad60d78b315 409 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 410 RecvParams += 4;
dflet 0:6ad60d78b315 411
dflet 0:6ad60d78b315 412 //Read subnet
dflet 0:6ad60d78b315 413 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 414 RecvParams += 4;
dflet 0:6ad60d78b315 415
dflet 0:6ad60d78b315 416 //Read default GW
dflet 0:6ad60d78b315 417 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 418 RecvParams += 4;
dflet 0:6ad60d78b315 419
dflet 0:6ad60d78b315 420 //Read DHCP server
dflet 0:6ad60d78b315 421 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 422 RecvParams += 4;
dflet 0:6ad60d78b315 423
dflet 0:6ad60d78b315 424 //Read DNS server
dflet 0:6ad60d78b315 425 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 426 RecvParams += 4;
dflet 0:6ad60d78b315 427
dflet 0:6ad60d78b315 428 //Read Mac address
dflet 0:6ad60d78b315 429 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH);
dflet 0:6ad60d78b315 430 RecvParams += 6;
dflet 0:6ad60d78b315 431
dflet 0:6ad60d78b315 432 //Read SSID
dflet 0:6ad60d78b315 433 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
dflet 0:6ad60d78b315 434
dflet 0:6ad60d78b315 435 }
dflet 0:6ad60d78b315 436 }
dflet 0:6ad60d78b315 437
dflet 0:6ad60d78b315 438 if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode)
dflet 0:6ad60d78b315 439 {
dflet 0:6ad60d78b315 440 tSLInformation.usRxEventOpcode = 0;
dflet 0:6ad60d78b315 441 }
dflet 0:6ad60d78b315 442 }
dflet 0:6ad60d78b315 443 else
dflet 0:6ad60d78b315 444 {
dflet 0:6ad60d78b315 445 pucReceivedParams = pucReceivedData;
dflet 0:6ad60d78b315 446 STREAM_TO_UINT8((char *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize);
dflet 0:6ad60d78b315 447
dflet 0:6ad60d78b315 448 STREAM_TO_UINT16((char *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength);
dflet 0:6ad60d78b315 449
dflet 0:6ad60d78b315 450 // Data received: note that the only case where from and from length
dflet 0:6ad60d78b315 451 // are not null is in recv from, so fill the args accordingly
dflet 0:6ad60d78b315 452 if (from)
dflet 0:6ad60d78b315 453 {
dflet 0:6ad60d78b315 454 STREAM_TO_UINT32((char *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(unsigned long *)fromlen);
dflet 0:6ad60d78b315 455 memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen);
dflet 0:6ad60d78b315 456 }
dflet 0:6ad60d78b315 457
dflet 0:6ad60d78b315 458 memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize,
dflet 0:6ad60d78b315 459 usLength - ucArgsize);
dflet 0:6ad60d78b315 460
dflet 0:6ad60d78b315 461 tSLInformation.usRxDataPending = 0;
dflet 0:6ad60d78b315 462 }
dflet 0:6ad60d78b315 463
dflet 0:6ad60d78b315 464 tSLInformation.usEventOrDataReceived = 0;
dflet 0:6ad60d78b315 465
dflet 0:6ad60d78b315 466 SpiResumeSpi();
dflet 0:6ad60d78b315 467
dflet 0:6ad60d78b315 468 // Since we are going to TX - we need to handle this event after the
dflet 0:6ad60d78b315 469 // ResumeSPi since we need interrupts
dflet 0:6ad60d78b315 470 if ((*pucReceivedData == HCI_TYPE_EVNT) &&
dflet 0:6ad60d78b315 471 (usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ))
dflet 0:6ad60d78b315 472 {
dflet 0:6ad60d78b315 473 hci_unsol_handle_patch_request((char *)pucReceivedData);
dflet 0:6ad60d78b315 474 }
dflet 0:6ad60d78b315 475
dflet 0:6ad60d78b315 476 if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0))
dflet 0:6ad60d78b315 477 {
dflet 0:6ad60d78b315 478 return NULL;
dflet 0:6ad60d78b315 479 }
dflet 0:6ad60d78b315 480 }
dflet 0:6ad60d78b315 481 }
dflet 0:6ad60d78b315 482
dflet 0:6ad60d78b315 483 }
dflet 0:6ad60d78b315 484
dflet 0:6ad60d78b315 485 //*****************************************************************************
dflet 0:6ad60d78b315 486 //
dflet 0:6ad60d78b315 487 //! hci_unsol_event_handler
dflet 0:6ad60d78b315 488 //!
dflet 0:6ad60d78b315 489 //! @param event_hdr event header
dflet 0:6ad60d78b315 490 //!
dflet 0:6ad60d78b315 491 //! @return 1 if event supported and handled
dflet 0:6ad60d78b315 492 //! 0 if event is not supported
dflet 0:6ad60d78b315 493 //!
dflet 0:6ad60d78b315 494 //! @brief Handle unsolicited events
dflet 0:6ad60d78b315 495 //
dflet 0:6ad60d78b315 496 //*****************************************************************************
dflet 0:6ad60d78b315 497 long
dflet 0:6ad60d78b315 498 hci_unsol_event_handler(char *event_hdr)
dflet 0:6ad60d78b315 499 {
dflet 0:6ad60d78b315 500 char * data = NULL;
dflet 0:6ad60d78b315 501 long event_type;
dflet 0:6ad60d78b315 502 unsigned long NumberOfReleasedPackets;
dflet 0:6ad60d78b315 503 unsigned long NumberOfSentPackets;
dflet 0:6ad60d78b315 504
dflet 0:6ad60d78b315 505 STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
dflet 0:6ad60d78b315 506
dflet 0:6ad60d78b315 507 if (event_type & HCI_EVNT_UNSOL_BASE)
dflet 0:6ad60d78b315 508 {
dflet 0:6ad60d78b315 509 switch(event_type)
dflet 0:6ad60d78b315 510 {
dflet 0:6ad60d78b315 511
dflet 0:6ad60d78b315 512 case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
dflet 0:6ad60d78b315 513 {
dflet 0:6ad60d78b315 514 hci_event_unsol_flowcontrol_handler(event_hdr);
dflet 0:6ad60d78b315 515
dflet 0:6ad60d78b315 516 NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
dflet 0:6ad60d78b315 517 NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
dflet 0:6ad60d78b315 518
dflet 0:6ad60d78b315 519 if (NumberOfReleasedPackets == NumberOfSentPackets)
dflet 0:6ad60d78b315 520 {
dflet 0:6ad60d78b315 521 if (tSLInformation.InformHostOnTxComplete)
dflet 0:6ad60d78b315 522 {
dflet 0:6ad60d78b315 523 tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
dflet 0:6ad60d78b315 524 }
dflet 0:6ad60d78b315 525 }
dflet 0:6ad60d78b315 526 return 1;
dflet 0:6ad60d78b315 527
dflet 0:6ad60d78b315 528 }
dflet 0:6ad60d78b315 529 }
dflet 0:6ad60d78b315 530 }
dflet 0:6ad60d78b315 531
dflet 0:6ad60d78b315 532 if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
dflet 0:6ad60d78b315 533 {
dflet 0:6ad60d78b315 534 switch(event_type)
dflet 0:6ad60d78b315 535 {
dflet 0:6ad60d78b315 536 case HCI_EVNT_WLAN_KEEPALIVE:
dflet 0:6ad60d78b315 537 case HCI_EVNT_WLAN_UNSOL_CONNECT:
dflet 0:6ad60d78b315 538 case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
dflet 0:6ad60d78b315 539 case HCI_EVNT_WLAN_UNSOL_INIT:
dflet 0:6ad60d78b315 540 case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
dflet 0:6ad60d78b315 541
dflet 0:6ad60d78b315 542 if( tSLInformation.sWlanCB )
dflet 0:6ad60d78b315 543 {
dflet 0:6ad60d78b315 544 tSLInformation.sWlanCB(event_type, 0, 0);
dflet 0:6ad60d78b315 545 }
dflet 0:6ad60d78b315 546 break;
dflet 0:6ad60d78b315 547
dflet 0:6ad60d78b315 548 case HCI_EVNT_WLAN_UNSOL_DHCP:
dflet 0:6ad60d78b315 549 {
dflet 0:6ad60d78b315 550 unsigned char params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
dflet 0:6ad60d78b315 551 unsigned char *recParams = params;
dflet 0:6ad60d78b315 552
dflet 0:6ad60d78b315 553 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:6ad60d78b315 554
dflet 0:6ad60d78b315 555 //Read IP address
dflet 0:6ad60d78b315 556 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 557 data += 4;
dflet 0:6ad60d78b315 558 //Read subnet
dflet 0:6ad60d78b315 559 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 560 data += 4;
dflet 0:6ad60d78b315 561 //Read default GW
dflet 0:6ad60d78b315 562 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 563 data += 4;
dflet 0:6ad60d78b315 564 //Read DHCP server
dflet 0:6ad60d78b315 565 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 566 data += 4;
dflet 0:6ad60d78b315 567 //Read DNS server
dflet 0:6ad60d78b315 568 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
dflet 0:6ad60d78b315 569 // read the status
dflet 0:6ad60d78b315 570 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
dflet 0:6ad60d78b315 571
dflet 0:6ad60d78b315 572
dflet 0:6ad60d78b315 573 if( tSLInformation.sWlanCB )
dflet 0:6ad60d78b315 574 {
dflet 0:6ad60d78b315 575 tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
dflet 0:6ad60d78b315 576 }
dflet 0:6ad60d78b315 577 }
dflet 0:6ad60d78b315 578 break;
dflet 0:6ad60d78b315 579
dflet 0:6ad60d78b315 580 case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
dflet 0:6ad60d78b315 581 {
dflet 0:6ad60d78b315 582 netapp_pingreport_args_t params;
dflet 0:6ad60d78b315 583 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:6ad60d78b315 584 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
dflet 0:6ad60d78b315 585 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
dflet 0:6ad60d78b315 586 STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
dflet 0:6ad60d78b315 587 STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
dflet 0:6ad60d78b315 588 STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
dflet 0:6ad60d78b315 589
dflet 0:6ad60d78b315 590 if( tSLInformation.sWlanCB )
dflet 0:6ad60d78b315 591 {
dflet 0:6ad60d78b315 592 tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
dflet 0:6ad60d78b315 593 }
dflet 0:6ad60d78b315 594 }
dflet 0:6ad60d78b315 595 break;
dflet 0:6ad60d78b315 596 case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
dflet 0:6ad60d78b315 597 {
dflet 0:6ad60d78b315 598 data = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
dflet 0:6ad60d78b315 599 if( tSLInformation.sWlanCB )
dflet 0:6ad60d78b315 600 {
dflet 0:6ad60d78b315 601 tSLInformation.sWlanCB(event_type, data, 0);
dflet 0:6ad60d78b315 602 }
dflet 0:6ad60d78b315 603 }
dflet 0:6ad60d78b315 604 break;
dflet 0:6ad60d78b315 605
dflet 0:6ad60d78b315 606 //'default' case which means "event not supported"
dflet 0:6ad60d78b315 607 default:
dflet 0:6ad60d78b315 608 return (0);
dflet 0:6ad60d78b315 609 }
dflet 0:6ad60d78b315 610 return(1);
dflet 0:6ad60d78b315 611 }
dflet 0:6ad60d78b315 612
dflet 0:6ad60d78b315 613 if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO)
dflet 0:6ad60d78b315 614 || (event_type == HCI_EVNT_WRITE))
dflet 0:6ad60d78b315 615 {
dflet 0:6ad60d78b315 616 char *pArg;
dflet 0:6ad60d78b315 617 long status;
dflet 0:6ad60d78b315 618
dflet 0:6ad60d78b315 619 pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
dflet 0:6ad60d78b315 620 STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
dflet 0:6ad60d78b315 621
dflet 0:6ad60d78b315 622 if (ERROR_SOCKET_INACTIVE == status)
dflet 0:6ad60d78b315 623 {
dflet 0:6ad60d78b315 624 // The only synchronous event that can come from SL device in form of
dflet 0:6ad60d78b315 625 // command complete is "Command Complete" on data sent, in case SL device
dflet 0:6ad60d78b315 626 // was unable to transmit
dflet 0:6ad60d78b315 627 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
dflet 0:6ad60d78b315 628 update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
dflet 0:6ad60d78b315 629
dflet 0:6ad60d78b315 630 return (1);
dflet 0:6ad60d78b315 631 }
dflet 0:6ad60d78b315 632 else
dflet 0:6ad60d78b315 633 return (0);
dflet 0:6ad60d78b315 634 }
dflet 0:6ad60d78b315 635
dflet 0:6ad60d78b315 636 return(0);
dflet 0:6ad60d78b315 637 }
dflet 0:6ad60d78b315 638
dflet 0:6ad60d78b315 639 //*****************************************************************************
dflet 0:6ad60d78b315 640 //
dflet 0:6ad60d78b315 641 //! hci_unsolicited_event_handler
dflet 0:6ad60d78b315 642 //!
dflet 0:6ad60d78b315 643 //! @param None
dflet 0:6ad60d78b315 644 //!
dflet 0:6ad60d78b315 645 //! @return ESUCCESS if successful, EFAIL if an error occurred
dflet 0:6ad60d78b315 646 //!
dflet 0:6ad60d78b315 647 //! @brief Parse the incoming unsolicited event packets and issues
dflet 0:6ad60d78b315 648 //! corresponding event handler.
dflet 0:6ad60d78b315 649 //
dflet 0:6ad60d78b315 650 //*****************************************************************************
dflet 0:6ad60d78b315 651 long
dflet 0:6ad60d78b315 652 hci_unsolicited_event_handler(void)
dflet 0:6ad60d78b315 653 {
dflet 0:6ad60d78b315 654 unsigned long res = 0;
dflet 0:6ad60d78b315 655 unsigned char *pucReceivedData;
dflet 0:6ad60d78b315 656
dflet 0:6ad60d78b315 657 if (tSLInformation.usEventOrDataReceived != 0)
dflet 0:6ad60d78b315 658 {
dflet 0:6ad60d78b315 659 pucReceivedData = (tSLInformation.pucReceivedData);
dflet 0:6ad60d78b315 660
dflet 0:6ad60d78b315 661 if (*pucReceivedData == HCI_TYPE_EVNT)
dflet 0:6ad60d78b315 662 {
dflet 0:6ad60d78b315 663
dflet 0:6ad60d78b315 664 // In case unsolicited event received - here the handling finished
dflet 0:6ad60d78b315 665 if (hci_unsol_event_handler((char *)pucReceivedData) == 1)
dflet 0:6ad60d78b315 666 {
dflet 0:6ad60d78b315 667
dflet 0:6ad60d78b315 668 // There was an unsolicited event received - we can release the buffer
dflet 0:6ad60d78b315 669 // and clean the event received
dflet 0:6ad60d78b315 670 tSLInformation.usEventOrDataReceived = 0;
dflet 0:6ad60d78b315 671
dflet 0:6ad60d78b315 672 res = 1;
dflet 0:6ad60d78b315 673 SpiResumeSpi();
dflet 0:6ad60d78b315 674 }
dflet 0:6ad60d78b315 675 }
dflet 0:6ad60d78b315 676 }
dflet 0:6ad60d78b315 677
dflet 0:6ad60d78b315 678 return res;
dflet 0:6ad60d78b315 679 }
dflet 0:6ad60d78b315 680
dflet 0:6ad60d78b315 681 //*****************************************************************************
dflet 0:6ad60d78b315 682 //
dflet 0:6ad60d78b315 683 //! set_socket_active_status
dflet 0:6ad60d78b315 684 //!
dflet 0:6ad60d78b315 685 //! @param Sd
dflet 0:6ad60d78b315 686 //! @param Status
dflet 0:6ad60d78b315 687 //! @return none
dflet 0:6ad60d78b315 688 //!
dflet 0:6ad60d78b315 689 //! @brief Check if the socket ID and status are valid and set
dflet 0:6ad60d78b315 690 //! accordingly the global socket status
dflet 0:6ad60d78b315 691 //
dflet 0:6ad60d78b315 692 //*****************************************************************************
dflet 0:6ad60d78b315 693 void set_socket_active_status(long Sd, long Status)
dflet 0:6ad60d78b315 694 {
dflet 0:6ad60d78b315 695 if(M_IS_VALID_SD(Sd) && M_IS_VALID_STATUS(Status))
dflet 0:6ad60d78b315 696 {
dflet 0:6ad60d78b315 697 socket_active_status &= ~(1 << Sd); /* clean socket's mask */
dflet 0:6ad60d78b315 698 socket_active_status |= (Status << Sd); /* set new socket's mask */
dflet 0:6ad60d78b315 699 }
dflet 0:6ad60d78b315 700 }
dflet 0:6ad60d78b315 701
dflet 0:6ad60d78b315 702
dflet 0:6ad60d78b315 703 //*****************************************************************************
dflet 0:6ad60d78b315 704 //
dflet 0:6ad60d78b315 705 //! hci_event_unsol_flowcontrol_handler
dflet 0:6ad60d78b315 706 //!
dflet 0:6ad60d78b315 707 //! @param pEvent pointer to the string contains parameters for IPERF
dflet 0:6ad60d78b315 708 //! @return ESUCCESS if successful, EFAIL if an error occurred
dflet 0:6ad60d78b315 709 //!
dflet 0:6ad60d78b315 710 //! @brief Called in case unsolicited event from type
dflet 0:6ad60d78b315 711 //! HCI_EVNT_DATA_UNSOL_FREE_BUFF has received.
dflet 0:6ad60d78b315 712 //! Keep track on the number of packets transmitted and update the
dflet 0:6ad60d78b315 713 //! number of free buffer in the SL device.
dflet 0:6ad60d78b315 714 //
dflet 0:6ad60d78b315 715 //*****************************************************************************
dflet 0:6ad60d78b315 716 long
dflet 0:6ad60d78b315 717 hci_event_unsol_flowcontrol_handler(char *pEvent)
dflet 0:6ad60d78b315 718 {
dflet 0:6ad60d78b315 719
dflet 0:6ad60d78b315 720 long temp, value;
dflet 0:6ad60d78b315 721 unsigned short i;
dflet 0:6ad60d78b315 722 unsigned short pusNumberOfHandles=0;
dflet 0:6ad60d78b315 723 char *pReadPayload;
dflet 0:6ad60d78b315 724
dflet 0:6ad60d78b315 725 STREAM_TO_UINT16((char *)pEvent,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
dflet 0:6ad60d78b315 726 pReadPayload = ((char *)pEvent +
dflet 0:6ad60d78b315 727 HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
dflet 0:6ad60d78b315 728 temp = 0;
dflet 0:6ad60d78b315 729
dflet 0:6ad60d78b315 730 for(i = 0; i < pusNumberOfHandles ; i++)
dflet 0:6ad60d78b315 731 {
dflet 0:6ad60d78b315 732 STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
dflet 0:6ad60d78b315 733 temp += value;
dflet 0:6ad60d78b315 734 pReadPayload += FLOW_CONTROL_EVENT_SIZE;
dflet 0:6ad60d78b315 735 }
dflet 0:6ad60d78b315 736
dflet 0:6ad60d78b315 737 tSLInformation.usNumberOfFreeBuffers += temp;
dflet 0:6ad60d78b315 738 tSLInformation.NumberOfReleasedPackets += temp;
dflet 0:6ad60d78b315 739
dflet 0:6ad60d78b315 740 return(ESUCCESS);
dflet 0:6ad60d78b315 741 }
dflet 0:6ad60d78b315 742
dflet 0:6ad60d78b315 743 //*****************************************************************************
dflet 0:6ad60d78b315 744 //
dflet 0:6ad60d78b315 745 //! get_socket_active_status
dflet 0:6ad60d78b315 746 //!
dflet 0:6ad60d78b315 747 //! @param Sd Socket IS
dflet 0:6ad60d78b315 748 //! @return Current status of the socket.
dflet 0:6ad60d78b315 749 //!
dflet 0:6ad60d78b315 750 //! @brief Retrieve socket status
dflet 0:6ad60d78b315 751 //
dflet 0:6ad60d78b315 752 //*****************************************************************************
dflet 0:6ad60d78b315 753
dflet 0:6ad60d78b315 754 long
dflet 0:6ad60d78b315 755 get_socket_active_status(long Sd)
dflet 0:6ad60d78b315 756 {
dflet 0:6ad60d78b315 757 if(M_IS_VALID_SD(Sd))
dflet 0:6ad60d78b315 758 {
dflet 0:6ad60d78b315 759 return (socket_active_status & (1 << Sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
dflet 0:6ad60d78b315 760 }
dflet 0:6ad60d78b315 761 return SOCKET_STATUS_INACTIVE;
dflet 0:6ad60d78b315 762 }
dflet 0:6ad60d78b315 763
dflet 0:6ad60d78b315 764 //*****************************************************************************
dflet 0:6ad60d78b315 765 //
dflet 0:6ad60d78b315 766 //! update_socket_active_status
dflet 0:6ad60d78b315 767 //!
dflet 0:6ad60d78b315 768 //! @param resp_params Socket IS
dflet 0:6ad60d78b315 769 //! @return Current status of the socket.
dflet 0:6ad60d78b315 770 //!
dflet 0:6ad60d78b315 771 //! @brief Retrieve socket status
dflet 0:6ad60d78b315 772 //
dflet 0:6ad60d78b315 773 //*****************************************************************************
dflet 0:6ad60d78b315 774 void
dflet 0:6ad60d78b315 775 update_socket_active_status(char *resp_params)
dflet 0:6ad60d78b315 776 {
dflet 0:6ad60d78b315 777 long status, sd;
dflet 0:6ad60d78b315 778
dflet 0:6ad60d78b315 779 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
dflet 0:6ad60d78b315 780 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
dflet 0:6ad60d78b315 781
dflet 0:6ad60d78b315 782 if(ERROR_SOCKET_INACTIVE == status)
dflet 0:6ad60d78b315 783 {
dflet 0:6ad60d78b315 784 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
dflet 0:6ad60d78b315 785 }
dflet 0:6ad60d78b315 786 }
dflet 0:6ad60d78b315 787
dflet 0:6ad60d78b315 788
dflet 0:6ad60d78b315 789 //*****************************************************************************
dflet 0:6ad60d78b315 790 //
dflet 0:6ad60d78b315 791 //! SimpleLinkWaitEvent
dflet 0:6ad60d78b315 792 //!
dflet 0:6ad60d78b315 793 //! @param usOpcode command operation code
dflet 0:6ad60d78b315 794 //! @param pRetParams command return parameters
dflet 0:6ad60d78b315 795 //!
dflet 0:6ad60d78b315 796 //! @return none
dflet 0:6ad60d78b315 797 //!
dflet 0:6ad60d78b315 798 //! @brief Wait for event, pass it to the hci_event_handler and
dflet 0:6ad60d78b315 799 //! update the event opcode in a global variable.
dflet 0:6ad60d78b315 800 //
dflet 0:6ad60d78b315 801 //*****************************************************************************
dflet 0:6ad60d78b315 802
dflet 0:6ad60d78b315 803 void
dflet 0:6ad60d78b315 804 SimpleLinkWaitEvent(unsigned short usOpcode, void *pRetParams)
dflet 0:6ad60d78b315 805 {
dflet 0:6ad60d78b315 806 // In the blocking implementation the control to caller will be returned only
dflet 0:6ad60d78b315 807 // after the end of current transaction
dflet 0:6ad60d78b315 808 tSLInformation.usRxEventOpcode = usOpcode;
dflet 0:6ad60d78b315 809 hci_event_handler(pRetParams, 0, 0);
dflet 0:6ad60d78b315 810 }
dflet 0:6ad60d78b315 811
dflet 0:6ad60d78b315 812 //*****************************************************************************
dflet 0:6ad60d78b315 813 //
dflet 0:6ad60d78b315 814 //! SimpleLinkWaitData
dflet 0:6ad60d78b315 815 //!
dflet 0:6ad60d78b315 816 //! @param pBuf data buffer
dflet 0:6ad60d78b315 817 //! @param from from information
dflet 0:6ad60d78b315 818 //! @param fromlen from information length
dflet 0:6ad60d78b315 819 //!
dflet 0:6ad60d78b315 820 //! @return none
dflet 0:6ad60d78b315 821 //!
dflet 0:6ad60d78b315 822 //! @brief Wait for data, pass it to the hci_event_handler
dflet 0:6ad60d78b315 823 //! and update in a global variable that there is
dflet 0:6ad60d78b315 824 //! data to read.
dflet 0:6ad60d78b315 825 //
dflet 0:6ad60d78b315 826 //*****************************************************************************
dflet 0:6ad60d78b315 827
dflet 0:6ad60d78b315 828 void
dflet 0:6ad60d78b315 829 SimpleLinkWaitData(unsigned char *pBuf, unsigned char *from,
dflet 0:6ad60d78b315 830 unsigned char *fromlen)
dflet 0:6ad60d78b315 831 {
dflet 0:6ad60d78b315 832 // In the blocking implementation the control to caller will be returned only
dflet 0:6ad60d78b315 833 // after the end of current transaction, i.e. only after data will be received
dflet 0:6ad60d78b315 834 tSLInformation.usRxDataPending = 1;
dflet 0:6ad60d78b315 835 hci_event_handler(pBuf, from, fromlen);
dflet 0:6ad60d78b315 836 }
dflet 0:6ad60d78b315 837
dflet 0:6ad60d78b315 838 //*****************************************************************************
dflet 0:6ad60d78b315 839 //
dflet 0:6ad60d78b315 840 // Close the Doxygen group.
dflet 0:6ad60d78b315 841 //! @}
dflet 0:6ad60d78b315 842 //
dflet 0:6ad60d78b315 843 //*****************************************************************************
dflet 0:6ad60d78b315 844