Driver for CC3000 Wi-Fi module

Dependencies:   NVIC_set_all_priorities

Dependents:   CC3000_Simple_Socket Wi-Go_IOT_Demo

Information

The current code has been reworked to a full object oriented application and contains an mbed socket compatible API.

CC3000 Wi-Fi module library

Info

This is the low level driver for TI's SimpleLink CC3000 device.
Port from Avnet's Wi-Go KEIL code (based on TI's CC3000 code).
Special thanks to Jim Carver from Avnet for providing the Wi-Go board and for his assistance.

Differences with TI's original code

The code functionality stays exactly the same.
In order to make it easier to use the code, following changes were made :

  • Addition of a tool to shift all IRQ priorities to a lower level since it is very important to keep the SPI handler at the highest system priority, the WLAN interrupt the second highest and all other system interrupts at a lower priority, so their handlers can be preempted by the CC3000 interrupts.
  • Addition of low level I/O controls and conditional compiler controls in cc3000_common.h.
  • CC3000 initialisation, pin declarations, SPI and WLAN irq priorities are set in Init_HostDriver , we need to call this function at the start of the main function.
  • The SPI and HCI code are joined into one file.
  • The include list has been rearranged - Only #include "wlan.h" is needed in the user API.
  • Part of the CC3000's user eeprom memory is used to store additional info (52 bytes in NVMEM_USER_FILE_1):
# bytesDescriptionInfo
1First time config parameterUseful when connecting
2Firmware updater versionused with the Firmware update tool
2Service Pack versionused with the Firmware update tool
3Driver Versionused with the Firmware update tool
3Firmware Versionused with the Firmware update tool
1CIK validation (Client Interface Key)
40CIK data (Client Interface Key)used with the exosite

Using the Library

A user API is needed to access the CC3000 functions.
Examples:

Using the library with other processors

cc3000_common.cpp loads the irq tool for all targets:
All current mbed targets are supported by this library.

#include "NVIC_set_all_priorities.h"


All low level settings that need to change are available in cc3000_common.h

//*****************************************************************************
//              PIN CONTROLS & COMPILE CONTROLS
//*****************************************************************************
// Compiler control
#define CC3000_UNENCRYPTED_SMART_CONFIG   // No encryption
//#define CC3000_TINY_DRIVER                // Driver for small memory model CPUs

//Interrupt controls
#define NVIC_ALL_IRQ        NVIC_set_all_irq_priorities(3);         // Set ALL interrupt priorities to level 3
#define NVIC_SPI_IRQ        NVIC_SetPriority(SPI0_IRQn, 0x0);       // Wi-Fi SPI interrupt must be higher priority than SysTick
#define NVIC_PORT_IRQ       NVIC_SetPriority(PORTA_IRQn, 0x1);
#define NVIC_SYSTICK_IRQ    NVIC_SetPriority(SysTick_IRQn, 0x2);    // SysTick set to lower priority than Wi-Fi SPI bus interrupt
//#define NVIC_ADC_IRQ        NVIC_SetPriority(ADC0_IRQn, 0x3);       // ADC is the lowest of all

// Wlan controls
#define WLAN_ISF_PCR        PORTA->PCR[16]
#define WLAN_ISF_ISFR       PORTA->ISFR
#define WLAN_ISF_MASK       (1<<16)

#define WLAN_ASSERT_CS      wlan_cs = 0;   //CS : active low
#define WLAN_DEASSERT_CS    wlan_cs = 1;

#define WLAN_ASSERT_EN      wlan_en = 1;   //EN : active high
#define WLAN_DEASSERT_EN    wlan_en = 0;

#define WLAN_READ_IRQ       wlan_int

#define WLAN_ENABLE_IRQ     wlan_int.fall(&WLAN_IRQHandler);
#define WLAN_DISABLE_IRQ    wlan_int.fall(NULL);

#define WLAN_IRQ_PIN_CREATE         InterruptIn wlan_int (PTA16);
#define WLAN_EN_PIN_CREATE          DigitalOut  wlan_en  (PTA13);
#define WLAN_CS_PIN_CREATE          DigitalOut  wlan_cs  (PTD0);
#define WLAN_SPI_PORT_CREATE        SPI wlan(PTD2, PTD3, PTC5); // mosi, miso, sclk

#define WLAN_SPI_PORT_INIT          wlan.format(8,1);
#define WLAN_SPI_SET_FREQ           wlan.frequency(12000000);
#define WLAN_SPI_SET_IRQ_HANDLER    wlan_int.fall(&WLAN_IRQHandler);

#define WLAN_SPI_WRITE              wlan.write(*data++);
#define WLAN_SPI_READ               wlan.write(0x03);          // !! DO NOT MODIFY the 0x03 parameter (CC3000 will not respond).

API documentation

Due to a little problem with the links on the mbed site, the API documentation is not directly accessible (will be solved in a next release).
Currently, it is only accessible by adding modules.html to the API doc link: http://mbed.org/users/frankvnk/code/CC3000_Hostdriver/docs/tip/modules.html

Committer:
frankvnk
Date:
Fri Jun 28 17:48:37 2013 +0000
Revision:
0:c44f0314d6ec
Child:
1:bbcaf0b2f367
Initial release

Who changed what in which revision?

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