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:
Thu Jul 04 08:10:21 2013 +0000
Revision:
1:bbcaf0b2f367
Parent:
0:c44f0314d6ec
Child:
2:f1d50c7f8bdb
Code cleanup - test printfs added

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 switch (*params)
frankvnk 0:c44f0314d6ec 138 {
frankvnk 0:c44f0314d6ec 139 case HCI_EVENT_PATCHES_DRV_REQ:
frankvnk 0:c44f0314d6ec 140
frankvnk 0:c44f0314d6ec 141 if (tSLInformation.sDriverPatches)
frankvnk 0:c44f0314d6ec 142 {
frankvnk 0:c44f0314d6ec 143 patch = tSLInformation.sDriverPatches(&ucLength);
frankvnk 0:c44f0314d6ec 144
frankvnk 0:c44f0314d6ec 145 if (patch)
frankvnk 0:c44f0314d6ec 146 {
frankvnk 1:bbcaf0b2f367 147 printf("HCI_EVENT_PATCHES_DRV_REQ\n");
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 1:bbcaf0b2f367 154 printf("HCI_EVENT_PATCHES_DRV_REQ - NULL\n");
frankvnk 0:c44f0314d6ec 155 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 156 break;
frankvnk 0:c44f0314d6ec 157
frankvnk 0:c44f0314d6ec 158 case HCI_EVENT_PATCHES_FW_REQ:
frankvnk 0:c44f0314d6ec 159
frankvnk 0:c44f0314d6ec 160 if (tSLInformation.sFWPatches)
frankvnk 0:c44f0314d6ec 161 {
frankvnk 0:c44f0314d6ec 162 patch = tSLInformation.sFWPatches(&ucLength);
frankvnk 0:c44f0314d6ec 163
frankvnk 0:c44f0314d6ec 164 // Build and send a patch
frankvnk 0:c44f0314d6ec 165 if (patch)
frankvnk 0:c44f0314d6ec 166 {
frankvnk 1:bbcaf0b2f367 167 printf("HCI_EVENT_PATCHES_FW_REQ\n");
frankvnk 0:c44f0314d6ec 168 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
frankvnk 0:c44f0314d6ec 169 return;
frankvnk 0:c44f0314d6ec 170 }
frankvnk 0:c44f0314d6ec 171 }
frankvnk 0:c44f0314d6ec 172
frankvnk 0:c44f0314d6ec 173 // Send 0 length Patches response event
frankvnk 1:bbcaf0b2f367 174 printf("HCI_EVENT_PATCHES_FW_REQ - NULL\n");
frankvnk 0:c44f0314d6ec 175 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 176 break;
frankvnk 0:c44f0314d6ec 177
frankvnk 0:c44f0314d6ec 178 case HCI_EVENT_PATCHES_BOOTLOAD_REQ:
frankvnk 0:c44f0314d6ec 179
frankvnk 0:c44f0314d6ec 180 if (tSLInformation.sBootLoaderPatches)
frankvnk 0:c44f0314d6ec 181 {
frankvnk 1:bbcaf0b2f367 182 printf("HCI_EVENT_PATCHES_BOOTLOAD_REQ\n");
frankvnk 0:c44f0314d6ec 183 patch = tSLInformation.sBootLoaderPatches(&ucLength);
frankvnk 0:c44f0314d6ec 184
frankvnk 0:c44f0314d6ec 185 if (patch)
frankvnk 0:c44f0314d6ec 186 {
frankvnk 0:c44f0314d6ec 187 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
frankvnk 0:c44f0314d6ec 188 return;
frankvnk 0:c44f0314d6ec 189 }
frankvnk 0:c44f0314d6ec 190 }
frankvnk 0:c44f0314d6ec 191
frankvnk 0:c44f0314d6ec 192 // Send 0 length Patches response event
frankvnk 1:bbcaf0b2f367 193 printf("HCI_EVENT_PATCHES_BOOTLOAD_REQ - NULL\n");
frankvnk 0:c44f0314d6ec 194 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 195 break;
frankvnk 0:c44f0314d6ec 196 }
frankvnk 0:c44f0314d6ec 197 }
frankvnk 0:c44f0314d6ec 198
frankvnk 0:c44f0314d6ec 199
frankvnk 0:c44f0314d6ec 200
frankvnk 0:c44f0314d6ec 201 //*****************************************************************************
frankvnk 0:c44f0314d6ec 202 //
frankvnk 0:c44f0314d6ec 203 //! hci_event_handler
frankvnk 0:c44f0314d6ec 204 //!
frankvnk 0:c44f0314d6ec 205 //! @param pRetParams incoming data buffer
frankvnk 0:c44f0314d6ec 206 //! @param from from information (in case of data received)
frankvnk 0:c44f0314d6ec 207 //! @param fromlen from information length (in case of data received)
frankvnk 0:c44f0314d6ec 208 //!
frankvnk 0:c44f0314d6ec 209 //! @return none
frankvnk 0:c44f0314d6ec 210 //!
frankvnk 0:c44f0314d6ec 211 //! @brief Parse the incoming events packets and issues corresponding
frankvnk 0:c44f0314d6ec 212 //! event handler from global array of handlers pointers
frankvnk 0:c44f0314d6ec 213 //
frankvnk 0:c44f0314d6ec 214 //*****************************************************************************
frankvnk 0:c44f0314d6ec 215
frankvnk 0:c44f0314d6ec 216
frankvnk 0:c44f0314d6ec 217 unsigned char *hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen)
frankvnk 0:c44f0314d6ec 218 {
frankvnk 0:c44f0314d6ec 219 unsigned char *pucReceivedData, ucArgsize;
frankvnk 0:c44f0314d6ec 220 unsigned short usLength;
frankvnk 0:c44f0314d6ec 221 unsigned char *pucReceivedParams;
frankvnk 0:c44f0314d6ec 222 unsigned short usReceivedEventOpcode = 0;
frankvnk 0:c44f0314d6ec 223 unsigned long retValue32;
frankvnk 0:c44f0314d6ec 224 unsigned char * RecvParams;
frankvnk 0:c44f0314d6ec 225 unsigned char *RetParams;
frankvnk 0:c44f0314d6ec 226 while (1)
frankvnk 0:c44f0314d6ec 227 {
frankvnk 0:c44f0314d6ec 228 if (tSLInformation.usEventOrDataReceived != 0)
frankvnk 0:c44f0314d6ec 229 {
frankvnk 0:c44f0314d6ec 230 pucReceivedData = (tSLInformation.pucReceivedData);
frankvnk 0:c44f0314d6ec 231
frankvnk 0:c44f0314d6ec 232 if (*pucReceivedData == HCI_TYPE_EVNT)
frankvnk 0:c44f0314d6ec 233 {
frankvnk 0:c44f0314d6ec 234 // Event Received
frankvnk 0:c44f0314d6ec 235 STREAM_TO_UINT16((char *)pucReceivedData, HCI_EVENT_OPCODE_OFFSET,usReceivedEventOpcode);
frankvnk 0:c44f0314d6ec 236 pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 237 RecvParams = pucReceivedParams;
frankvnk 0:c44f0314d6ec 238 RetParams = (unsigned char *)pRetParams;
frankvnk 0:c44f0314d6ec 239
frankvnk 0:c44f0314d6ec 240 // In case unsolicited event received - here the handling finished
frankvnk 0:c44f0314d6ec 241 if (hci_unsol_event_handler((char *)pucReceivedData) == 0)
frankvnk 0:c44f0314d6ec 242 {
frankvnk 0:c44f0314d6ec 243 STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength);
frankvnk 0:c44f0314d6ec 244
frankvnk 0:c44f0314d6ec 245 switch(usReceivedEventOpcode)
frankvnk 0:c44f0314d6ec 246 {
frankvnk 0:c44f0314d6ec 247 case HCI_CMND_READ_BUFFER_SIZE:
frankvnk 0:c44f0314d6ec 248 {
frankvnk 0:c44f0314d6ec 249 STREAM_TO_UINT8((char *)pucReceivedParams, 0, tSLInformation.usNumberOfFreeBuffers);
frankvnk 0:c44f0314d6ec 250 STREAM_TO_UINT16((char *)pucReceivedParams, 1, tSLInformation.usSlBufferLength);
frankvnk 0:c44f0314d6ec 251 }
frankvnk 0:c44f0314d6ec 252 break;
frankvnk 0:c44f0314d6ec 253
frankvnk 0:c44f0314d6ec 254 case HCI_CMND_WLAN_CONFIGURE_PATCH:
frankvnk 0:c44f0314d6ec 255 case HCI_NETAPP_DHCP:
frankvnk 0:c44f0314d6ec 256 case HCI_NETAPP_PING_SEND:
frankvnk 0:c44f0314d6ec 257 case HCI_NETAPP_PING_STOP:
frankvnk 0:c44f0314d6ec 258 case HCI_NETAPP_ARP_FLUSH:
frankvnk 0:c44f0314d6ec 259 case HCI_NETAPP_SET_DEBUG_LEVEL:
frankvnk 0:c44f0314d6ec 260 case HCI_NETAPP_SET_TIMERS:
frankvnk 0:c44f0314d6ec 261 case HCI_EVNT_NVMEM_READ:
frankvnk 0:c44f0314d6ec 262 case HCI_EVNT_NVMEM_CREATE_ENTRY:
frankvnk 0:c44f0314d6ec 263 case HCI_CMND_NVMEM_WRITE_PATCH:
frankvnk 0:c44f0314d6ec 264 case HCI_NETAPP_PING_REPORT:
frankvnk 1:bbcaf0b2f367 265 case HCI_EVNT_MDNS_ADVERTISE:
frankvnk 0:c44f0314d6ec 266
frankvnk 0:c44f0314d6ec 267 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
frankvnk 0:c44f0314d6ec 268 break;
frankvnk 0:c44f0314d6ec 269
frankvnk 0:c44f0314d6ec 270 case HCI_CMND_SETSOCKOPT:
frankvnk 0:c44f0314d6ec 271 case HCI_CMND_WLAN_CONNECT:
frankvnk 0:c44f0314d6ec 272 case HCI_CMND_WLAN_IOCTL_STATUSGET:
frankvnk 0:c44f0314d6ec 273 case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE:
frankvnk 0:c44f0314d6ec 274 case HCI_CMND_WLAN_IOCTL_DEL_PROFILE:
frankvnk 0:c44f0314d6ec 275 case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY:
frankvnk 0:c44f0314d6ec 276 case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM:
frankvnk 0:c44f0314d6ec 277 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START:
frankvnk 0:c44f0314d6ec 278 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP:
frankvnk 0:c44f0314d6ec 279 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX:
frankvnk 0:c44f0314d6ec 280 case HCI_CMND_EVENT_MASK:
frankvnk 0:c44f0314d6ec 281 case HCI_EVNT_WLAN_DISCONNECT:
frankvnk 0:c44f0314d6ec 282 case HCI_EVNT_SOCKET:
frankvnk 0:c44f0314d6ec 283 case HCI_EVNT_BIND:
frankvnk 0:c44f0314d6ec 284 case HCI_CMND_LISTEN:
frankvnk 0:c44f0314d6ec 285 case HCI_EVNT_CLOSE_SOCKET:
frankvnk 0:c44f0314d6ec 286 case HCI_EVNT_CONNECT:
frankvnk 0:c44f0314d6ec 287 case HCI_EVNT_NVMEM_WRITE:
frankvnk 0:c44f0314d6ec 288
frankvnk 0:c44f0314d6ec 289 STREAM_TO_UINT32((char *)pucReceivedParams,0, *(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 290 break;
frankvnk 0:c44f0314d6ec 291
frankvnk 0:c44f0314d6ec 292 case HCI_EVNT_READ_SP_VERSION:
frankvnk 0:c44f0314d6ec 293
frankvnk 0:c44f0314d6ec 294 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
frankvnk 0:c44f0314d6ec 295 pRetParams = ((char *)pRetParams) + 1;
frankvnk 0:c44f0314d6ec 296 STREAM_TO_UINT32((char *)pucReceivedParams, 0, retValue32);
frankvnk 0:c44f0314d6ec 297 UINT32_TO_STREAM((unsigned char *)pRetParams, retValue32);
frankvnk 0:c44f0314d6ec 298 break;
frankvnk 0:c44f0314d6ec 299
frankvnk 0:c44f0314d6ec 300 case HCI_EVNT_BSD_GETHOSTBYNAME:
frankvnk 0:c44f0314d6ec 301
frankvnk 0:c44f0314d6ec 302 STREAM_TO_UINT32((char *)pucReceivedParams,GET_HOST_BY_NAME_RETVAL_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 303 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 304 STREAM_TO_UINT32((char *)pucReceivedParams,GET_HOST_BY_NAME_ADDR_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 305 break;
frankvnk 0:c44f0314d6ec 306
frankvnk 0:c44f0314d6ec 307 case HCI_EVNT_ACCEPT:
frankvnk 0:c44f0314d6ec 308 {
frankvnk 0:c44f0314d6ec 309 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_SD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 310 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 311 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_RETURN_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 312 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 313
frankvnk 0:c44f0314d6ec 314 //This argument returns in network order
frankvnk 0:c44f0314d6ec 315 memcpy((unsigned char *)pRetParams, pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr));
frankvnk 0:c44f0314d6ec 316 break;
frankvnk 0:c44f0314d6ec 317 }
frankvnk 0:c44f0314d6ec 318
frankvnk 0:c44f0314d6ec 319 case HCI_EVNT_RECV:
frankvnk 0:c44f0314d6ec 320 case HCI_EVNT_RECVFROM:
frankvnk 0:c44f0314d6ec 321 {
frankvnk 0:c44f0314d6ec 322 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 323 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 324 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 325 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 326 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 327
frankvnk 0:c44f0314d6ec 328 if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE)
frankvnk 0:c44f0314d6ec 329 {
frankvnk 0:c44f0314d6ec 330 set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE);
frankvnk 0:c44f0314d6ec 331 }
frankvnk 0:c44f0314d6ec 332 break;
frankvnk 0:c44f0314d6ec 333 }
frankvnk 0:c44f0314d6ec 334
frankvnk 1:bbcaf0b2f367 335 case HCI_EVNT_SEND:
frankvnk 1:bbcaf0b2f367 336 case HCI_EVNT_SENDTO:
frankvnk 1:bbcaf0b2f367 337 {
frankvnk 1:bbcaf0b2f367 338 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
frankvnk 1:bbcaf0b2f367 339 pRetParams = ((char *)pRetParams) + 4;
frankvnk 1:bbcaf0b2f367 340 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
frankvnk 1:bbcaf0b2f367 341 pRetParams = ((char *)pRetParams) + 4;
frankvnk 1:bbcaf0b2f367 342
frankvnk 1:bbcaf0b2f367 343 break;
frankvnk 1:bbcaf0b2f367 344 }
frankvnk 1:bbcaf0b2f367 345
frankvnk 0:c44f0314d6ec 346 case HCI_EVNT_SELECT:
frankvnk 0:c44f0314d6ec 347 {
frankvnk 0:c44f0314d6ec 348 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 349 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 350 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_READFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 351 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 352 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 353 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 354 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_EXFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 355 break;
frankvnk 0:c44f0314d6ec 356 }
frankvnk 0:c44f0314d6ec 357
frankvnk 0:c44f0314d6ec 358 case HCI_CMND_GETSOCKOPT:
frankvnk 0:c44f0314d6ec 359
frankvnk 0:c44f0314d6ec 360 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus);
frankvnk 0:c44f0314d6ec 361 //This argument returns in network order
frankvnk 0:c44f0314d6ec 362 memcpy((unsigned char *)pRetParams, pucReceivedParams, 4);
frankvnk 0:c44f0314d6ec 363 break;
frankvnk 0:c44f0314d6ec 364
frankvnk 0:c44f0314d6ec 365 case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS:
frankvnk 0:c44f0314d6ec 366
frankvnk 0:c44f0314d6ec 367 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 368 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 369 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 370 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 371 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 372 pRetParams = ((char *)pRetParams) + 2;
frankvnk 0:c44f0314d6ec 373 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 374 pRetParams = ((char *)pRetParams) + 2;
frankvnk 0:c44f0314d6ec 375 memcpy((unsigned char *)pRetParams, (char *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH);
frankvnk 0:c44f0314d6ec 376 break;
frankvnk 0:c44f0314d6ec 377
frankvnk 0:c44f0314d6ec 378 case HCI_CMND_SIMPLE_LINK_START:
frankvnk 0:c44f0314d6ec 379 break;
frankvnk 0:c44f0314d6ec 380
frankvnk 0:c44f0314d6ec 381 case HCI_NETAPP_IPCONFIG:
frankvnk 0:c44f0314d6ec 382
frankvnk 0:c44f0314d6ec 383 //Read IP address
frankvnk 0:c44f0314d6ec 384 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 385 RecvParams += 4;
frankvnk 0:c44f0314d6ec 386
frankvnk 0:c44f0314d6ec 387 //Read subnet
frankvnk 0:c44f0314d6ec 388 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 389 RecvParams += 4;
frankvnk 0:c44f0314d6ec 390
frankvnk 0:c44f0314d6ec 391 //Read default GW
frankvnk 0:c44f0314d6ec 392 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 393 RecvParams += 4;
frankvnk 0:c44f0314d6ec 394
frankvnk 0:c44f0314d6ec 395 //Read DHCP server
frankvnk 0:c44f0314d6ec 396 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 397 RecvParams += 4;
frankvnk 0:c44f0314d6ec 398
frankvnk 0:c44f0314d6ec 399 //Read DNS server
frankvnk 0:c44f0314d6ec 400 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 401 RecvParams += 4;
frankvnk 0:c44f0314d6ec 402
frankvnk 0:c44f0314d6ec 403 //Read Mac address
frankvnk 0:c44f0314d6ec 404 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH);
frankvnk 0:c44f0314d6ec 405 RecvParams += 6;
frankvnk 0:c44f0314d6ec 406
frankvnk 0:c44f0314d6ec 407 //Read SSID
frankvnk 0:c44f0314d6ec 408 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
frankvnk 0:c44f0314d6ec 409
frankvnk 0:c44f0314d6ec 410 }
frankvnk 0:c44f0314d6ec 411 }
frankvnk 0:c44f0314d6ec 412
frankvnk 0:c44f0314d6ec 413 if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode)
frankvnk 0:c44f0314d6ec 414 {
frankvnk 0:c44f0314d6ec 415 tSLInformation.usRxEventOpcode = 0;
frankvnk 0:c44f0314d6ec 416 }
frankvnk 0:c44f0314d6ec 417 }
frankvnk 0:c44f0314d6ec 418 else
frankvnk 0:c44f0314d6ec 419 {
frankvnk 0:c44f0314d6ec 420 pucReceivedParams = pucReceivedData;
frankvnk 0:c44f0314d6ec 421 STREAM_TO_UINT8((char *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize);
frankvnk 0:c44f0314d6ec 422
frankvnk 0:c44f0314d6ec 423 STREAM_TO_UINT16((char *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength);
frankvnk 0:c44f0314d6ec 424
frankvnk 0:c44f0314d6ec 425 // Data received: note that the only case where from and from length
frankvnk 0:c44f0314d6ec 426 // are not null is in recv from, so fill the args accordingly
frankvnk 0:c44f0314d6ec 427 if (from)
frankvnk 0:c44f0314d6ec 428 {
frankvnk 0:c44f0314d6ec 429 STREAM_TO_UINT32((char *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(unsigned long *)fromlen);
frankvnk 0:c44f0314d6ec 430 memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen);
frankvnk 0:c44f0314d6ec 431 }
frankvnk 0:c44f0314d6ec 432
frankvnk 0:c44f0314d6ec 433 memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize, usLength - ucArgsize);
frankvnk 0:c44f0314d6ec 434
frankvnk 0:c44f0314d6ec 435 tSLInformation.usRxDataPending = 0;
frankvnk 0:c44f0314d6ec 436 }
frankvnk 0:c44f0314d6ec 437
frankvnk 0:c44f0314d6ec 438 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 439
frankvnk 0:c44f0314d6ec 440 SpiResumeSpi();
frankvnk 0:c44f0314d6ec 441
frankvnk 0:c44f0314d6ec 442 // Since we are going to TX - we need to handle this event after the
frankvnk 0:c44f0314d6ec 443 // ResumeSPi since we need interrupts
frankvnk 0:c44f0314d6ec 444 if ((*pucReceivedData == HCI_TYPE_EVNT) && (usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ))
frankvnk 0:c44f0314d6ec 445 {
frankvnk 0:c44f0314d6ec 446 hci_unsol_handle_patch_request((char *)pucReceivedData);
frankvnk 0:c44f0314d6ec 447 }
frankvnk 0:c44f0314d6ec 448 if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0))
frankvnk 0:c44f0314d6ec 449 {
frankvnk 0:c44f0314d6ec 450 return NULL;
frankvnk 0:c44f0314d6ec 451 }
frankvnk 0:c44f0314d6ec 452 }
frankvnk 1:bbcaf0b2f367 453 //printf(".");
frankvnk 0:c44f0314d6ec 454 }
frankvnk 0:c44f0314d6ec 455 }
frankvnk 0:c44f0314d6ec 456
frankvnk 0:c44f0314d6ec 457 //*****************************************************************************
frankvnk 0:c44f0314d6ec 458 //
frankvnk 0:c44f0314d6ec 459 //! hci_unsol_event_handler
frankvnk 0:c44f0314d6ec 460 //!
frankvnk 0:c44f0314d6ec 461 //! @param event_hdr event header
frankvnk 0:c44f0314d6ec 462 //!
frankvnk 0:c44f0314d6ec 463 //! @return 1 if event supported and handled
frankvnk 0:c44f0314d6ec 464 //! 0 if event is not supported
frankvnk 0:c44f0314d6ec 465 //!
frankvnk 0:c44f0314d6ec 466 //! @brief Handle unsolicited events
frankvnk 0:c44f0314d6ec 467 //
frankvnk 0:c44f0314d6ec 468 //*****************************************************************************
frankvnk 0:c44f0314d6ec 469 long hci_unsol_event_handler(char *event_hdr)
frankvnk 0:c44f0314d6ec 470 {
frankvnk 0:c44f0314d6ec 471 char * data = NULL;
frankvnk 0:c44f0314d6ec 472 long event_type;
frankvnk 0:c44f0314d6ec 473 unsigned long NumberOfReleasedPackets;
frankvnk 0:c44f0314d6ec 474 unsigned long NumberOfSentPackets;
frankvnk 0:c44f0314d6ec 475
frankvnk 0:c44f0314d6ec 476 STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
frankvnk 0:c44f0314d6ec 477
frankvnk 0:c44f0314d6ec 478 if (event_type & HCI_EVNT_UNSOL_BASE)
frankvnk 0:c44f0314d6ec 479 {
frankvnk 0:c44f0314d6ec 480 switch(event_type)
frankvnk 0:c44f0314d6ec 481 {
frankvnk 0:c44f0314d6ec 482
frankvnk 0:c44f0314d6ec 483 case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
frankvnk 0:c44f0314d6ec 484 {
frankvnk 0:c44f0314d6ec 485 hci_event_unsol_flowcontrol_handler(event_hdr);
frankvnk 0:c44f0314d6ec 486
frankvnk 0:c44f0314d6ec 487 NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
frankvnk 0:c44f0314d6ec 488 NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
frankvnk 0:c44f0314d6ec 489
frankvnk 0:c44f0314d6ec 490 if (NumberOfReleasedPackets == NumberOfSentPackets)
frankvnk 0:c44f0314d6ec 491 {
frankvnk 0:c44f0314d6ec 492 if (tSLInformation.InformHostOnTxComplete)
frankvnk 0:c44f0314d6ec 493 {
frankvnk 0:c44f0314d6ec 494 tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
frankvnk 0:c44f0314d6ec 495 }
frankvnk 0:c44f0314d6ec 496 }
frankvnk 0:c44f0314d6ec 497 return 1;
frankvnk 0:c44f0314d6ec 498
frankvnk 0:c44f0314d6ec 499 }
frankvnk 0:c44f0314d6ec 500 }
frankvnk 0:c44f0314d6ec 501 }
frankvnk 0:c44f0314d6ec 502
frankvnk 0:c44f0314d6ec 503 if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
frankvnk 0:c44f0314d6ec 504 {
frankvnk 0:c44f0314d6ec 505 switch(event_type)
frankvnk 0:c44f0314d6ec 506 {
frankvnk 0:c44f0314d6ec 507 case HCI_EVNT_WLAN_KEEPALIVE:
frankvnk 0:c44f0314d6ec 508 case HCI_EVNT_WLAN_UNSOL_CONNECT:
frankvnk 0:c44f0314d6ec 509 case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
frankvnk 0:c44f0314d6ec 510 case HCI_EVNT_WLAN_UNSOL_INIT:
frankvnk 0:c44f0314d6ec 511 case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
frankvnk 0:c44f0314d6ec 512
frankvnk 0:c44f0314d6ec 513 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 514 {
frankvnk 0:c44f0314d6ec 515 tSLInformation.sWlanCB(event_type, 0, 0);
frankvnk 0:c44f0314d6ec 516 }
frankvnk 0:c44f0314d6ec 517 break;
frankvnk 0:c44f0314d6ec 518
frankvnk 0:c44f0314d6ec 519 case HCI_EVNT_WLAN_UNSOL_DHCP:
frankvnk 0:c44f0314d6ec 520 {
frankvnk 0:c44f0314d6ec 521 tNetappDhcpParams params;
frankvnk 0:c44f0314d6ec 522 unsigned char *recParams = (unsigned char *)&params;
frankvnk 0:c44f0314d6ec 523 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 524
frankvnk 0:c44f0314d6ec 525 //Read IP address
frankvnk 0:c44f0314d6ec 526 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 527 data += 4;
frankvnk 0:c44f0314d6ec 528 //Read subnet
frankvnk 0:c44f0314d6ec 529 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 530 data += 4;
frankvnk 0:c44f0314d6ec 531 //Read default GW
frankvnk 0:c44f0314d6ec 532 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 533 data += 4;
frankvnk 0:c44f0314d6ec 534 //Read DHCP server
frankvnk 0:c44f0314d6ec 535 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 536 data += 4;
frankvnk 0:c44f0314d6ec 537 //Read DNS server
frankvnk 0:c44f0314d6ec 538 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 539
frankvnk 0:c44f0314d6ec 540 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 541 {
frankvnk 0:c44f0314d6ec 542 tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
frankvnk 0:c44f0314d6ec 543 }
frankvnk 0:c44f0314d6ec 544 }
frankvnk 0:c44f0314d6ec 545 break;
frankvnk 0:c44f0314d6ec 546
frankvnk 0:c44f0314d6ec 547 case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
frankvnk 0:c44f0314d6ec 548 {
frankvnk 0:c44f0314d6ec 549 netapp_pingreport_args_t params;
frankvnk 0:c44f0314d6ec 550 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 551 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
frankvnk 0:c44f0314d6ec 552 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
frankvnk 0:c44f0314d6ec 553 STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
frankvnk 0:c44f0314d6ec 554 STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
frankvnk 0:c44f0314d6ec 555 STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
frankvnk 0:c44f0314d6ec 556
frankvnk 0:c44f0314d6ec 557 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 558 {
frankvnk 0:c44f0314d6ec 559 tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
frankvnk 0:c44f0314d6ec 560 }
frankvnk 0:c44f0314d6ec 561 }
frankvnk 0:c44f0314d6ec 562 break;
frankvnk 0:c44f0314d6ec 563 case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
frankvnk 0:c44f0314d6ec 564 {
frankvnk 0:c44f0314d6ec 565 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 566 {
frankvnk 0:c44f0314d6ec 567 tSLInformation.sWlanCB(event_type, NULL, 0);
frankvnk 0:c44f0314d6ec 568 }
frankvnk 0:c44f0314d6ec 569 }
frankvnk 0:c44f0314d6ec 570 break;
frankvnk 0:c44f0314d6ec 571
frankvnk 0:c44f0314d6ec 572 //'default' case which means "event not supported"
frankvnk 0:c44f0314d6ec 573 default:
frankvnk 0:c44f0314d6ec 574 return (0);
frankvnk 0:c44f0314d6ec 575 }
frankvnk 0:c44f0314d6ec 576 return(1);
frankvnk 0:c44f0314d6ec 577 }
frankvnk 0:c44f0314d6ec 578
frankvnk 0:c44f0314d6ec 579 if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE))
frankvnk 0:c44f0314d6ec 580 {
frankvnk 0:c44f0314d6ec 581 // The only synchronous event that can come from SL device in form of
frankvnk 0:c44f0314d6ec 582 // command complete is "Command Complete" on data sent, in case SL device
frankvnk 0:c44f0314d6ec 583 // was unable to transmit
frankvnk 0:c44f0314d6ec 584 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
frankvnk 0:c44f0314d6ec 585 update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
frankvnk 0:c44f0314d6ec 586
frankvnk 0:c44f0314d6ec 587 return (1);
frankvnk 0:c44f0314d6ec 588 }
frankvnk 0:c44f0314d6ec 589
frankvnk 0:c44f0314d6ec 590 return(0);
frankvnk 0:c44f0314d6ec 591 }
frankvnk 0:c44f0314d6ec 592
frankvnk 0:c44f0314d6ec 593 //*****************************************************************************
frankvnk 0:c44f0314d6ec 594 //
frankvnk 0:c44f0314d6ec 595 //! hci_unsolicited_event_handler
frankvnk 0:c44f0314d6ec 596 //!
frankvnk 0:c44f0314d6ec 597 //! @param None
frankvnk 0:c44f0314d6ec 598 //!
frankvnk 0:c44f0314d6ec 599 //! @return ESUCCESS if successful, EFAIL if an error occurred
frankvnk 0:c44f0314d6ec 600 //!
frankvnk 0:c44f0314d6ec 601 //! @brief Parse the incoming unsolicited event packets and issues
frankvnk 0:c44f0314d6ec 602 //! corresponding event handler.
frankvnk 0:c44f0314d6ec 603 //
frankvnk 0:c44f0314d6ec 604 //*****************************************************************************
frankvnk 0:c44f0314d6ec 605 long hci_unsolicited_event_handler(void)
frankvnk 0:c44f0314d6ec 606 {
frankvnk 0:c44f0314d6ec 607 unsigned long res = 0;
frankvnk 0:c44f0314d6ec 608 unsigned char *pucReceivedData;
frankvnk 0:c44f0314d6ec 609
frankvnk 0:c44f0314d6ec 610 if (tSLInformation.usEventOrDataReceived != 0)
frankvnk 0:c44f0314d6ec 611 {
frankvnk 0:c44f0314d6ec 612 pucReceivedData = (tSLInformation.pucReceivedData);
frankvnk 0:c44f0314d6ec 613
frankvnk 0:c44f0314d6ec 614 if (*pucReceivedData == HCI_TYPE_EVNT)
frankvnk 0:c44f0314d6ec 615 {
frankvnk 0:c44f0314d6ec 616
frankvnk 0:c44f0314d6ec 617 // In case unsolicited event received - here the handling finished
frankvnk 0:c44f0314d6ec 618 if (hci_unsol_event_handler((char *)pucReceivedData) == 1)
frankvnk 0:c44f0314d6ec 619 {
frankvnk 0:c44f0314d6ec 620
frankvnk 0:c44f0314d6ec 621 // There was an unsolicited event received - we can release the buffer
frankvnk 0:c44f0314d6ec 622 // and clean the event received
frankvnk 0:c44f0314d6ec 623 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 624
frankvnk 0:c44f0314d6ec 625 res = 1;
frankvnk 0:c44f0314d6ec 626 SpiResumeSpi();
frankvnk 0:c44f0314d6ec 627 }
frankvnk 0:c44f0314d6ec 628 }
frankvnk 0:c44f0314d6ec 629 }
frankvnk 0:c44f0314d6ec 630 return res;
frankvnk 0:c44f0314d6ec 631 }
frankvnk 0:c44f0314d6ec 632
frankvnk 0:c44f0314d6ec 633 //*****************************************************************************
frankvnk 0:c44f0314d6ec 634 //
frankvnk 0:c44f0314d6ec 635 //! set_socket_active_status
frankvnk 0:c44f0314d6ec 636 //!
frankvnk 0:c44f0314d6ec 637 //! @param Sd
frankvnk 0:c44f0314d6ec 638 //! @param Status
frankvnk 0:c44f0314d6ec 639 //! @return none
frankvnk 0:c44f0314d6ec 640 //!
frankvnk 0:c44f0314d6ec 641 //! @brief Check if the socket ID and status are valid and set
frankvnk 0:c44f0314d6ec 642 //! accordingly the global socket status
frankvnk 0:c44f0314d6ec 643 //
frankvnk 0:c44f0314d6ec 644 //*****************************************************************************
frankvnk 0:c44f0314d6ec 645 void set_socket_active_status(long Sd, long Status)
frankvnk 0:c44f0314d6ec 646 {
frankvnk 0:c44f0314d6ec 647 if(M_IS_VALID_SD(Sd) && M_IS_VALID_STATUS(Status))
frankvnk 0:c44f0314d6ec 648 {
frankvnk 0:c44f0314d6ec 649 socket_active_status &= ~(1 << Sd); /* clean socket's mask */
frankvnk 0:c44f0314d6ec 650 socket_active_status |= (Status << Sd); /* set new socket's mask */
frankvnk 0:c44f0314d6ec 651 }
frankvnk 0:c44f0314d6ec 652 }
frankvnk 0:c44f0314d6ec 653
frankvnk 0:c44f0314d6ec 654
frankvnk 0:c44f0314d6ec 655 //*****************************************************************************
frankvnk 0:c44f0314d6ec 656 //
frankvnk 0:c44f0314d6ec 657 //! hci_event_unsol_flowcontrol_handler
frankvnk 0:c44f0314d6ec 658 //!
frankvnk 0:c44f0314d6ec 659 //! @param pEvent pointer to the string contains parameters for IPERF
frankvnk 0:c44f0314d6ec 660 //! @return ESUCCESS if successful, EFAIL if an error occurred
frankvnk 0:c44f0314d6ec 661 //!
frankvnk 0:c44f0314d6ec 662 //! @brief Called in case unsolicited event from type
frankvnk 0:c44f0314d6ec 663 //! HCI_EVNT_DATA_UNSOL_FREE_BUFF has received.
frankvnk 0:c44f0314d6ec 664 //! Keep track on the number of packets transmitted and update the
frankvnk 0:c44f0314d6ec 665 //! number of free buffer in the SL device.
frankvnk 0:c44f0314d6ec 666 //
frankvnk 0:c44f0314d6ec 667 //*****************************************************************************
frankvnk 0:c44f0314d6ec 668 long hci_event_unsol_flowcontrol_handler(char *pEvent)
frankvnk 0:c44f0314d6ec 669 {
frankvnk 0:c44f0314d6ec 670
frankvnk 0:c44f0314d6ec 671 long temp, value;
frankvnk 0:c44f0314d6ec 672 unsigned short i;
frankvnk 0:c44f0314d6ec 673 unsigned short pusNumberOfHandles=0;
frankvnk 0:c44f0314d6ec 674 char *pReadPayload;
frankvnk 0:c44f0314d6ec 675
frankvnk 0:c44f0314d6ec 676 STREAM_TO_UINT16((char *)pEvent,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
frankvnk 0:c44f0314d6ec 677 pReadPayload = ((char *)pEvent + HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
frankvnk 0:c44f0314d6ec 678 temp = 0;
frankvnk 0:c44f0314d6ec 679
frankvnk 0:c44f0314d6ec 680 for(i = 0; i < pusNumberOfHandles ; i++)
frankvnk 0:c44f0314d6ec 681 {
frankvnk 0:c44f0314d6ec 682 STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
frankvnk 0:c44f0314d6ec 683 temp += value;
frankvnk 0:c44f0314d6ec 684 pReadPayload += FLOW_CONTROL_EVENT_SIZE;
frankvnk 0:c44f0314d6ec 685 }
frankvnk 0:c44f0314d6ec 686
frankvnk 0:c44f0314d6ec 687 tSLInformation.usNumberOfFreeBuffers += temp;
frankvnk 0:c44f0314d6ec 688 tSLInformation.NumberOfReleasedPackets += temp;
frankvnk 0:c44f0314d6ec 689
frankvnk 0:c44f0314d6ec 690 return(ESUCCESS);
frankvnk 0:c44f0314d6ec 691 }
frankvnk 0:c44f0314d6ec 692
frankvnk 0:c44f0314d6ec 693 //*****************************************************************************
frankvnk 0:c44f0314d6ec 694 //
frankvnk 0:c44f0314d6ec 695 //! get_socket_active_status
frankvnk 0:c44f0314d6ec 696 //!
frankvnk 0:c44f0314d6ec 697 //! @param Sd Socket IS
frankvnk 0:c44f0314d6ec 698 //! @return Current status of the socket.
frankvnk 0:c44f0314d6ec 699 //!
frankvnk 0:c44f0314d6ec 700 //! @brief Retrieve socket status
frankvnk 0:c44f0314d6ec 701 //
frankvnk 0:c44f0314d6ec 702 //*****************************************************************************
frankvnk 0:c44f0314d6ec 703
frankvnk 0:c44f0314d6ec 704 long get_socket_active_status(long Sd)
frankvnk 0:c44f0314d6ec 705 {
frankvnk 0:c44f0314d6ec 706 if(M_IS_VALID_SD(Sd))
frankvnk 0:c44f0314d6ec 707 {
frankvnk 0:c44f0314d6ec 708 return (socket_active_status & (1 << Sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
frankvnk 0:c44f0314d6ec 709 }
frankvnk 0:c44f0314d6ec 710 return SOCKET_STATUS_INACTIVE;
frankvnk 0:c44f0314d6ec 711 }
frankvnk 0:c44f0314d6ec 712
frankvnk 0:c44f0314d6ec 713 //*****************************************************************************
frankvnk 0:c44f0314d6ec 714 //
frankvnk 0:c44f0314d6ec 715 //! update_socket_active_status
frankvnk 0:c44f0314d6ec 716 //!
frankvnk 0:c44f0314d6ec 717 //! @param resp_params Socket IS
frankvnk 0:c44f0314d6ec 718 //! @return Current status of the socket.
frankvnk 0:c44f0314d6ec 719 //!
frankvnk 0:c44f0314d6ec 720 //! @brief Retrieve socket status
frankvnk 0:c44f0314d6ec 721 //
frankvnk 0:c44f0314d6ec 722 //*****************************************************************************
frankvnk 0:c44f0314d6ec 723 void update_socket_active_status(char *resp_params)
frankvnk 0:c44f0314d6ec 724 {
frankvnk 0:c44f0314d6ec 725 long status, sd;
frankvnk 0:c44f0314d6ec 726
frankvnk 0:c44f0314d6ec 727 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
frankvnk 0:c44f0314d6ec 728 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
frankvnk 0:c44f0314d6ec 729
frankvnk 0:c44f0314d6ec 730 if(ERROR_SOCKET_INACTIVE == status)
frankvnk 0:c44f0314d6ec 731 {
frankvnk 0:c44f0314d6ec 732 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
frankvnk 0:c44f0314d6ec 733 }
frankvnk 0:c44f0314d6ec 734 }
frankvnk 0:c44f0314d6ec 735
frankvnk 0:c44f0314d6ec 736
frankvnk 0:c44f0314d6ec 737 //*****************************************************************************
frankvnk 0:c44f0314d6ec 738 //
frankvnk 0:c44f0314d6ec 739 //! SimpleLinkWaitEvent
frankvnk 0:c44f0314d6ec 740 //!
frankvnk 0:c44f0314d6ec 741 //! @param usOpcode command operation code
frankvnk 0:c44f0314d6ec 742 //! @param pRetParams command return parameters
frankvnk 0:c44f0314d6ec 743 //!
frankvnk 0:c44f0314d6ec 744 //! @return none
frankvnk 0:c44f0314d6ec 745 //!
frankvnk 0:c44f0314d6ec 746 //! @brief Wait for event, pass it to the hci_event_handler and
frankvnk 0:c44f0314d6ec 747 //! update the event opcode in a global variable.
frankvnk 0:c44f0314d6ec 748 //
frankvnk 0:c44f0314d6ec 749 //*****************************************************************************
frankvnk 0:c44f0314d6ec 750
frankvnk 0:c44f0314d6ec 751 void SimpleLinkWaitEvent(unsigned short usOpcode, void *pRetParams)
frankvnk 0:c44f0314d6ec 752 {
frankvnk 0:c44f0314d6ec 753 // In the blocking implementation the control to caller will be returned only
frankvnk 0:c44f0314d6ec 754 // after the end of current transaction
frankvnk 0:c44f0314d6ec 755 tSLInformation.usRxEventOpcode = usOpcode;
frankvnk 0:c44f0314d6ec 756 hci_event_handler(pRetParams, 0, 0);
frankvnk 1:bbcaf0b2f367 757 printf("SLWE EXIT\n");
frankvnk 0:c44f0314d6ec 758 }
frankvnk 0:c44f0314d6ec 759
frankvnk 0:c44f0314d6ec 760 //*****************************************************************************
frankvnk 0:c44f0314d6ec 761 //
frankvnk 0:c44f0314d6ec 762 //! SimpleLinkWaitData
frankvnk 0:c44f0314d6ec 763 //!
frankvnk 0:c44f0314d6ec 764 //! @param pBuf data buffer
frankvnk 0:c44f0314d6ec 765 //! @param from from information
frankvnk 0:c44f0314d6ec 766 //! @param fromlen from information length
frankvnk 0:c44f0314d6ec 767 //!
frankvnk 0:c44f0314d6ec 768 //! @return none
frankvnk 0:c44f0314d6ec 769 //!
frankvnk 0:c44f0314d6ec 770 //! @brief Wait for data, pass it to the hci_event_handler
frankvnk 0:c44f0314d6ec 771 //! and update in a global variable that there is
frankvnk 0:c44f0314d6ec 772 //! data to read.
frankvnk 0:c44f0314d6ec 773 //
frankvnk 0:c44f0314d6ec 774 //*****************************************************************************
frankvnk 0:c44f0314d6ec 775
frankvnk 0:c44f0314d6ec 776 void
frankvnk 0:c44f0314d6ec 777 SimpleLinkWaitData(unsigned char *pBuf, unsigned char *from, unsigned char *fromlen)
frankvnk 0:c44f0314d6ec 778 {
frankvnk 0:c44f0314d6ec 779 // In the blocking implementation the control to caller will be returned only
frankvnk 0:c44f0314d6ec 780 // after the end of current transaction, i.e. only after data will be received
frankvnk 0:c44f0314d6ec 781 tSLInformation.usRxDataPending = 1;
frankvnk 0:c44f0314d6ec 782 hci_event_handler(pBuf, from, fromlen);
frankvnk 0:c44f0314d6ec 783 }
frankvnk 0:c44f0314d6ec 784
frankvnk 0:c44f0314d6ec 785 //*****************************************************************************
frankvnk 0:c44f0314d6ec 786 //
frankvnk 0:c44f0314d6ec 787 // Close the Doxygen group.
frankvnk 0:c44f0314d6ec 788 //! @}
frankvnk 0:c44f0314d6ec 789 //
frankvnk 0:c44f0314d6ec 790 //*****************************************************************************
frankvnk 0:c44f0314d6ec 791
frankvnk 0:c44f0314d6ec 792
frankvnk 0:c44f0314d6ec 793