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 Nov 29 13:20:07 2013 +0000
Revision:
13:e1ab6b5ab826
Parent:
8:b48bb4df9319
update CC3000_MAXIMAL_RX_SIZE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:c44f0314d6ec 1 /*****************************************************************************
frankvnk 0:c44f0314d6ec 2 *
frankvnk 6:d733efcc2c56 3 * evnt_handler - 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 #include "evnt_handler.h"
frankvnk 0:c44f0314d6ec 37
frankvnk 0:c44f0314d6ec 38 //*****************************************************************************
frankvnk 0:c44f0314d6ec 39 // GLOBAL VARAIABLES
frankvnk 0:c44f0314d6ec 40 //*****************************************************************************
frankvnk 0:c44f0314d6ec 41 unsigned long socket_active_status = SOCKET_STATUS_INIT_VAL;
frankvnk 0:c44f0314d6ec 42
frankvnk 0:c44f0314d6ec 43
frankvnk 0:c44f0314d6ec 44 //*****************************************************************************
frankvnk 0:c44f0314d6ec 45 // Prototypes for the static functions
frankvnk 0:c44f0314d6ec 46 //*****************************************************************************
frankvnk 0:c44f0314d6ec 47 static long hci_event_unsol_flowcontrol_handler(char *pEvent);
frankvnk 0:c44f0314d6ec 48 static void update_socket_active_status(char *resp_params);
frankvnk 0:c44f0314d6ec 49
frankvnk 0:c44f0314d6ec 50
frankvnk 0:c44f0314d6ec 51 void hci_unsol_handle_patch_request(char *event_hdr)
frankvnk 0:c44f0314d6ec 52 {
frankvnk 0:c44f0314d6ec 53 char *params = (char *)(event_hdr) + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 54 unsigned long ucLength = 0;
frankvnk 0:c44f0314d6ec 55 char *patch;
frankvnk 0:c44f0314d6ec 56 switch (*params)
frankvnk 0:c44f0314d6ec 57 {
frankvnk 0:c44f0314d6ec 58 case HCI_EVENT_PATCHES_DRV_REQ:
frankvnk 0:c44f0314d6ec 59
frankvnk 0:c44f0314d6ec 60 if (tSLInformation.sDriverPatches)
frankvnk 0:c44f0314d6ec 61 {
frankvnk 0:c44f0314d6ec 62 patch = tSLInformation.sDriverPatches(&ucLength);
frankvnk 0:c44f0314d6ec 63
frankvnk 0:c44f0314d6ec 64 if (patch)
frankvnk 0:c44f0314d6ec 65 {
frankvnk 0:c44f0314d6ec 66 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
frankvnk 0:c44f0314d6ec 67 return;
frankvnk 0:c44f0314d6ec 68 }
frankvnk 0:c44f0314d6ec 69 }
frankvnk 0:c44f0314d6ec 70
frankvnk 0:c44f0314d6ec 71 // Send 0 length Patches response event
frankvnk 0:c44f0314d6ec 72 hci_patch_send(HCI_EVENT_PATCHES_DRV_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 73 break;
frankvnk 0:c44f0314d6ec 74
frankvnk 0:c44f0314d6ec 75 case HCI_EVENT_PATCHES_FW_REQ:
frankvnk 0:c44f0314d6ec 76
frankvnk 0:c44f0314d6ec 77 if (tSLInformation.sFWPatches)
frankvnk 0:c44f0314d6ec 78 {
frankvnk 0:c44f0314d6ec 79 patch = tSLInformation.sFWPatches(&ucLength);
frankvnk 0:c44f0314d6ec 80
frankvnk 0:c44f0314d6ec 81 // Build and send a patch
frankvnk 0:c44f0314d6ec 82 if (patch)
frankvnk 0:c44f0314d6ec 83 {
frankvnk 0:c44f0314d6ec 84 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
frankvnk 0:c44f0314d6ec 85 return;
frankvnk 0:c44f0314d6ec 86 }
frankvnk 0:c44f0314d6ec 87 }
frankvnk 0:c44f0314d6ec 88
frankvnk 0:c44f0314d6ec 89 // Send 0 length Patches response event
frankvnk 0:c44f0314d6ec 90 hci_patch_send(HCI_EVENT_PATCHES_FW_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 91 break;
frankvnk 0:c44f0314d6ec 92
frankvnk 0:c44f0314d6ec 93 case HCI_EVENT_PATCHES_BOOTLOAD_REQ:
frankvnk 0:c44f0314d6ec 94
frankvnk 0:c44f0314d6ec 95 if (tSLInformation.sBootLoaderPatches)
frankvnk 0:c44f0314d6ec 96 {
frankvnk 0:c44f0314d6ec 97 patch = tSLInformation.sBootLoaderPatches(&ucLength);
frankvnk 0:c44f0314d6ec 98 if (patch)
frankvnk 0:c44f0314d6ec 99 {
frankvnk 0:c44f0314d6ec 100 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, patch, ucLength);
frankvnk 0:c44f0314d6ec 101 return;
frankvnk 0:c44f0314d6ec 102 }
frankvnk 0:c44f0314d6ec 103 }
frankvnk 0:c44f0314d6ec 104
frankvnk 0:c44f0314d6ec 105 // Send 0 length Patches response event
frankvnk 0:c44f0314d6ec 106 hci_patch_send(HCI_EVENT_PATCHES_BOOTLOAD_REQ, tSLInformation.pucTxCommandBuffer, 0, 0);
frankvnk 0:c44f0314d6ec 107 break;
frankvnk 0:c44f0314d6ec 108 }
frankvnk 0:c44f0314d6ec 109 }
frankvnk 0:c44f0314d6ec 110
frankvnk 0:c44f0314d6ec 111
frankvnk 0:c44f0314d6ec 112 unsigned char *hci_event_handler(void *pRetParams, unsigned char *from, unsigned char *fromlen)
frankvnk 0:c44f0314d6ec 113 {
frankvnk 0:c44f0314d6ec 114 unsigned char *pucReceivedData, ucArgsize;
frankvnk 0:c44f0314d6ec 115 unsigned short usLength;
frankvnk 0:c44f0314d6ec 116 unsigned char *pucReceivedParams;
frankvnk 0:c44f0314d6ec 117 unsigned short usReceivedEventOpcode = 0;
frankvnk 0:c44f0314d6ec 118 unsigned long retValue32;
frankvnk 0:c44f0314d6ec 119 unsigned char * RecvParams;
frankvnk 0:c44f0314d6ec 120 unsigned char *RetParams;
frankvnk 0:c44f0314d6ec 121 while (1)
frankvnk 0:c44f0314d6ec 122 {
frankvnk 0:c44f0314d6ec 123 if (tSLInformation.usEventOrDataReceived != 0)
frankvnk 0:c44f0314d6ec 124 {
frankvnk 0:c44f0314d6ec 125 pucReceivedData = (tSLInformation.pucReceivedData);
frankvnk 0:c44f0314d6ec 126 if (*pucReceivedData == HCI_TYPE_EVNT)
frankvnk 0:c44f0314d6ec 127 {
frankvnk 0:c44f0314d6ec 128 // Event Received
frankvnk 0:c44f0314d6ec 129 STREAM_TO_UINT16((char *)pucReceivedData, HCI_EVENT_OPCODE_OFFSET,usReceivedEventOpcode);
frankvnk 0:c44f0314d6ec 130 pucReceivedParams = pucReceivedData + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 131 RecvParams = pucReceivedParams;
frankvnk 0:c44f0314d6ec 132 RetParams = (unsigned char *)pRetParams;
frankvnk 0:c44f0314d6ec 133
frankvnk 4:d8255a5aad46 134 // unsolicited event received - finish handling
frankvnk 0:c44f0314d6ec 135 if (hci_unsol_event_handler((char *)pucReceivedData) == 0)
frankvnk 0:c44f0314d6ec 136 {
frankvnk 0:c44f0314d6ec 137 STREAM_TO_UINT8(pucReceivedData, HCI_DATA_LENGTH_OFFSET, usLength);
frankvnk 0:c44f0314d6ec 138
frankvnk 0:c44f0314d6ec 139 switch(usReceivedEventOpcode)
frankvnk 0:c44f0314d6ec 140 {
frankvnk 0:c44f0314d6ec 141 case HCI_CMND_READ_BUFFER_SIZE:
frankvnk 0:c44f0314d6ec 142 {
frankvnk 0:c44f0314d6ec 143 STREAM_TO_UINT8((char *)pucReceivedParams, 0, tSLInformation.usNumberOfFreeBuffers);
frankvnk 0:c44f0314d6ec 144 STREAM_TO_UINT16((char *)pucReceivedParams, 1, tSLInformation.usSlBufferLength);
frankvnk 0:c44f0314d6ec 145 }
frankvnk 0:c44f0314d6ec 146 break;
frankvnk 0:c44f0314d6ec 147
frankvnk 0:c44f0314d6ec 148 case HCI_CMND_WLAN_CONFIGURE_PATCH:
frankvnk 0:c44f0314d6ec 149 case HCI_NETAPP_DHCP:
frankvnk 0:c44f0314d6ec 150 case HCI_NETAPP_PING_SEND:
frankvnk 0:c44f0314d6ec 151 case HCI_NETAPP_PING_STOP:
frankvnk 0:c44f0314d6ec 152 case HCI_NETAPP_ARP_FLUSH:
frankvnk 0:c44f0314d6ec 153 case HCI_NETAPP_SET_DEBUG_LEVEL:
frankvnk 0:c44f0314d6ec 154 case HCI_NETAPP_SET_TIMERS:
frankvnk 0:c44f0314d6ec 155 case HCI_EVNT_NVMEM_READ:
frankvnk 0:c44f0314d6ec 156 case HCI_EVNT_NVMEM_CREATE_ENTRY:
frankvnk 0:c44f0314d6ec 157 case HCI_CMND_NVMEM_WRITE_PATCH:
frankvnk 0:c44f0314d6ec 158 case HCI_NETAPP_PING_REPORT:
frankvnk 1:bbcaf0b2f367 159 case HCI_EVNT_MDNS_ADVERTISE:
frankvnk 0:c44f0314d6ec 160
frankvnk 0:c44f0314d6ec 161 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
frankvnk 0:c44f0314d6ec 162 break;
frankvnk 0:c44f0314d6ec 163
frankvnk 0:c44f0314d6ec 164 case HCI_CMND_SETSOCKOPT:
frankvnk 0:c44f0314d6ec 165 case HCI_CMND_WLAN_CONNECT:
frankvnk 0:c44f0314d6ec 166 case HCI_CMND_WLAN_IOCTL_STATUSGET:
frankvnk 0:c44f0314d6ec 167 case HCI_EVNT_WLAN_IOCTL_ADD_PROFILE:
frankvnk 0:c44f0314d6ec 168 case HCI_CMND_WLAN_IOCTL_DEL_PROFILE:
frankvnk 0:c44f0314d6ec 169 case HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY:
frankvnk 0:c44f0314d6ec 170 case HCI_CMND_WLAN_IOCTL_SET_SCANPARAM:
frankvnk 0:c44f0314d6ec 171 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START:
frankvnk 0:c44f0314d6ec 172 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP:
frankvnk 0:c44f0314d6ec 173 case HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX:
frankvnk 0:c44f0314d6ec 174 case HCI_CMND_EVENT_MASK:
frankvnk 0:c44f0314d6ec 175 case HCI_EVNT_WLAN_DISCONNECT:
frankvnk 0:c44f0314d6ec 176 case HCI_EVNT_SOCKET:
frankvnk 0:c44f0314d6ec 177 case HCI_EVNT_BIND:
frankvnk 0:c44f0314d6ec 178 case HCI_CMND_LISTEN:
frankvnk 0:c44f0314d6ec 179 case HCI_EVNT_CLOSE_SOCKET:
frankvnk 0:c44f0314d6ec 180 case HCI_EVNT_CONNECT:
frankvnk 0:c44f0314d6ec 181 case HCI_EVNT_NVMEM_WRITE:
frankvnk 0:c44f0314d6ec 182
frankvnk 0:c44f0314d6ec 183 STREAM_TO_UINT32((char *)pucReceivedParams,0, *(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 184 break;
frankvnk 0:c44f0314d6ec 185
frankvnk 0:c44f0314d6ec 186 case HCI_EVNT_READ_SP_VERSION:
frankvnk 0:c44f0314d6ec 187
frankvnk 0:c44f0314d6ec 188 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET, *(unsigned char *)pRetParams);
frankvnk 0:c44f0314d6ec 189 pRetParams = ((char *)pRetParams) + 1;
frankvnk 0:c44f0314d6ec 190 STREAM_TO_UINT32((char *)pucReceivedParams, 0, retValue32);
frankvnk 0:c44f0314d6ec 191 UINT32_TO_STREAM((unsigned char *)pRetParams, retValue32);
frankvnk 0:c44f0314d6ec 192 break;
frankvnk 0:c44f0314d6ec 193
frankvnk 0:c44f0314d6ec 194 case HCI_EVNT_BSD_GETHOSTBYNAME:
frankvnk 0:c44f0314d6ec 195
frankvnk 0:c44f0314d6ec 196 STREAM_TO_UINT32((char *)pucReceivedParams,GET_HOST_BY_NAME_RETVAL_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 197 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 198 STREAM_TO_UINT32((char *)pucReceivedParams,GET_HOST_BY_NAME_ADDR_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 199 break;
frankvnk 0:c44f0314d6ec 200
frankvnk 0:c44f0314d6ec 201 case HCI_EVNT_ACCEPT:
frankvnk 0:c44f0314d6ec 202 {
frankvnk 0:c44f0314d6ec 203 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_SD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 204 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 205 STREAM_TO_UINT32((char *)pucReceivedParams,ACCEPT_RETURN_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 206 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 207
frankvnk 0:c44f0314d6ec 208 //This argument returns in network order
frankvnk 0:c44f0314d6ec 209 memcpy((unsigned char *)pRetParams, pucReceivedParams + ACCEPT_ADDRESS__OFFSET, sizeof(sockaddr));
frankvnk 0:c44f0314d6ec 210 break;
frankvnk 0:c44f0314d6ec 211 }
frankvnk 0:c44f0314d6ec 212
frankvnk 0:c44f0314d6ec 213 case HCI_EVNT_RECV:
frankvnk 0:c44f0314d6ec 214 case HCI_EVNT_RECVFROM:
frankvnk 0:c44f0314d6ec 215 {
frankvnk 0:c44f0314d6ec 216 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 217 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 218 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 219 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 220 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE__FLAGS__OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 221
frankvnk 0:c44f0314d6ec 222 if(((tBsdReadReturnParams *)pRetParams)->iNumberOfBytes == ERROR_SOCKET_INACTIVE)
frankvnk 0:c44f0314d6ec 223 {
frankvnk 0:c44f0314d6ec 224 set_socket_active_status(((tBsdReadReturnParams *)pRetParams)->iSocketDescriptor,SOCKET_STATUS_INACTIVE);
frankvnk 0:c44f0314d6ec 225 }
frankvnk 0:c44f0314d6ec 226 break;
frankvnk 0:c44f0314d6ec 227 }
frankvnk 0:c44f0314d6ec 228
frankvnk 1:bbcaf0b2f367 229 case HCI_EVNT_SEND:
frankvnk 1:bbcaf0b2f367 230 case HCI_EVNT_SENDTO:
frankvnk 1:bbcaf0b2f367 231 {
frankvnk 1:bbcaf0b2f367 232 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_SD_OFFSET ,*(unsigned long *)pRetParams);
frankvnk 1:bbcaf0b2f367 233 pRetParams = ((char *)pRetParams) + 4;
frankvnk 1:bbcaf0b2f367 234 STREAM_TO_UINT32((char *)pucReceivedParams,SL_RECEIVE_NUM_BYTES_OFFSET,*(unsigned long *)pRetParams);
frankvnk 1:bbcaf0b2f367 235 pRetParams = ((char *)pRetParams) + 4;
frankvnk 1:bbcaf0b2f367 236
frankvnk 1:bbcaf0b2f367 237 break;
frankvnk 1:bbcaf0b2f367 238 }
frankvnk 1:bbcaf0b2f367 239
frankvnk 0:c44f0314d6ec 240 case HCI_EVNT_SELECT:
frankvnk 0:c44f0314d6ec 241 {
frankvnk 0:c44f0314d6ec 242 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 243 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 244 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_READFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 245 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 246 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_WRITEFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 247 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 248 STREAM_TO_UINT32((char *)pucReceivedParams,SELECT_EXFD_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 249 break;
frankvnk 0:c44f0314d6ec 250 }
frankvnk 0:c44f0314d6ec 251
frankvnk 0:c44f0314d6ec 252 case HCI_CMND_GETSOCKOPT:
frankvnk 0:c44f0314d6ec 253
frankvnk 0:c44f0314d6ec 254 STREAM_TO_UINT8(pucReceivedData, HCI_EVENT_STATUS_OFFSET,((tBsdGetSockOptReturnParams *)pRetParams)->iStatus);
frankvnk 0:c44f0314d6ec 255 //This argument returns in network order
frankvnk 0:c44f0314d6ec 256 memcpy((unsigned char *)pRetParams, pucReceivedParams, 4);
frankvnk 0:c44f0314d6ec 257 break;
frankvnk 0:c44f0314d6ec 258
frankvnk 0:c44f0314d6ec 259 case HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS:
frankvnk 0:c44f0314d6ec 260
frankvnk 0:c44f0314d6ec 261 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_TABlE_COUNT_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 262 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 263 STREAM_TO_UINT32((char *)pucReceivedParams,GET_SCAN_RESULTS_SCANRESULT_STATUS_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 264 pRetParams = ((char *)pRetParams) + 4;
frankvnk 0:c44f0314d6ec 265 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_ISVALID_TO_SSIDLEN_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 266 pRetParams = ((char *)pRetParams) + 2;
frankvnk 0:c44f0314d6ec 267 STREAM_TO_UINT16((char *)pucReceivedParams,GET_SCAN_RESULTS_FRAME_TIME_OFFSET,*(unsigned long *)pRetParams);
frankvnk 0:c44f0314d6ec 268 pRetParams = ((char *)pRetParams) + 2;
frankvnk 0:c44f0314d6ec 269 memcpy((unsigned char *)pRetParams, (char *)(pucReceivedParams + GET_SCAN_RESULTS_FRAME_TIME_OFFSET + 2), GET_SCAN_RESULTS_SSID_MAC_LENGTH);
frankvnk 0:c44f0314d6ec 270 break;
frankvnk 0:c44f0314d6ec 271
frankvnk 0:c44f0314d6ec 272 case HCI_CMND_SIMPLE_LINK_START:
frankvnk 0:c44f0314d6ec 273 break;
frankvnk 0:c44f0314d6ec 274
frankvnk 0:c44f0314d6ec 275 case HCI_NETAPP_IPCONFIG:
frankvnk 0:c44f0314d6ec 276
frankvnk 0:c44f0314d6ec 277 //Read IP address
frankvnk 0:c44f0314d6ec 278 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 279 RecvParams += 4;
frankvnk 0:c44f0314d6ec 280
frankvnk 0:c44f0314d6ec 281 //Read subnet
frankvnk 0:c44f0314d6ec 282 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 283 RecvParams += 4;
frankvnk 0:c44f0314d6ec 284
frankvnk 0:c44f0314d6ec 285 //Read default GW
frankvnk 0:c44f0314d6ec 286 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 287 RecvParams += 4;
frankvnk 0:c44f0314d6ec 288
frankvnk 0:c44f0314d6ec 289 //Read DHCP server
frankvnk 0:c44f0314d6ec 290 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 291 RecvParams += 4;
frankvnk 0:c44f0314d6ec 292
frankvnk 0:c44f0314d6ec 293 //Read DNS server
frankvnk 0:c44f0314d6ec 294 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 295 RecvParams += 4;
frankvnk 0:c44f0314d6ec 296
frankvnk 0:c44f0314d6ec 297 //Read Mac address
frankvnk 0:c44f0314d6ec 298 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_MAC_LENGTH);
frankvnk 0:c44f0314d6ec 299 RecvParams += 6;
frankvnk 0:c44f0314d6ec 300
frankvnk 0:c44f0314d6ec 301 //Read SSID
frankvnk 0:c44f0314d6ec 302 STREAM_TO_STREAM(RecvParams,RetParams,NETAPP_IPCONFIG_SSID_LENGTH);
frankvnk 0:c44f0314d6ec 303
frankvnk 0:c44f0314d6ec 304 }
frankvnk 0:c44f0314d6ec 305 }
frankvnk 0:c44f0314d6ec 306 if (usReceivedEventOpcode == tSLInformation.usRxEventOpcode)
frankvnk 0:c44f0314d6ec 307 {
frankvnk 0:c44f0314d6ec 308 tSLInformation.usRxEventOpcode = 0;
frankvnk 0:c44f0314d6ec 309 }
frankvnk 0:c44f0314d6ec 310 }
frankvnk 0:c44f0314d6ec 311 else
frankvnk 0:c44f0314d6ec 312 {
frankvnk 0:c44f0314d6ec 313 pucReceivedParams = pucReceivedData;
frankvnk 0:c44f0314d6ec 314 STREAM_TO_UINT8((char *)pucReceivedData, HCI_PACKET_ARGSIZE_OFFSET, ucArgsize);
frankvnk 0:c44f0314d6ec 315
frankvnk 0:c44f0314d6ec 316 STREAM_TO_UINT16((char *)pucReceivedData, HCI_PACKET_LENGTH_OFFSET, usLength);
frankvnk 0:c44f0314d6ec 317
frankvnk 0:c44f0314d6ec 318 // Data received: note that the only case where from and from length
frankvnk 0:c44f0314d6ec 319 // are not null is in recv from, so fill the args accordingly
frankvnk 0:c44f0314d6ec 320 if (from)
frankvnk 0:c44f0314d6ec 321 {
frankvnk 0:c44f0314d6ec 322 STREAM_TO_UINT32((char *)(pucReceivedData + HCI_DATA_HEADER_SIZE), BSD_RECV_FROM_FROMLEN_OFFSET, *(unsigned long *)fromlen);
frankvnk 0:c44f0314d6ec 323 memcpy(from, (pucReceivedData + HCI_DATA_HEADER_SIZE + BSD_RECV_FROM_FROM_OFFSET) ,*fromlen);
frankvnk 0:c44f0314d6ec 324 }
frankvnk 0:c44f0314d6ec 325
frankvnk 0:c44f0314d6ec 326 memcpy(pRetParams, pucReceivedParams + HCI_DATA_HEADER_SIZE + ucArgsize, usLength - ucArgsize);
frankvnk 0:c44f0314d6ec 327
frankvnk 0:c44f0314d6ec 328 tSLInformation.usRxDataPending = 0;
frankvnk 0:c44f0314d6ec 329 }
frankvnk 0:c44f0314d6ec 330
frankvnk 0:c44f0314d6ec 331 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 332
frankvnk 4:d8255a5aad46 333 tSLInformation.WlanInterruptEnable();
frankvnk 0:c44f0314d6ec 334
frankvnk 2:f1d50c7f8bdb 335 // Since we are going to TX - we need to handle this event after the ResumeSPi since we need interrupts
frankvnk 0:c44f0314d6ec 336 if ((*pucReceivedData == HCI_TYPE_EVNT) && (usReceivedEventOpcode == HCI_EVNT_PATCHES_REQ))
frankvnk 0:c44f0314d6ec 337 {
frankvnk 0:c44f0314d6ec 338 hci_unsol_handle_patch_request((char *)pucReceivedData);
frankvnk 0:c44f0314d6ec 339 }
frankvnk 0:c44f0314d6ec 340 if ((tSLInformation.usRxEventOpcode == 0) && (tSLInformation.usRxDataPending == 0))
frankvnk 0:c44f0314d6ec 341 {
frankvnk 0:c44f0314d6ec 342 return NULL;
frankvnk 0:c44f0314d6ec 343 }
frankvnk 0:c44f0314d6ec 344 }
frankvnk 0:c44f0314d6ec 345 }
frankvnk 0:c44f0314d6ec 346 }
frankvnk 0:c44f0314d6ec 347
frankvnk 4:d8255a5aad46 348
frankvnk 0:c44f0314d6ec 349 long hci_unsol_event_handler(char *event_hdr)
frankvnk 0:c44f0314d6ec 350 {
frankvnk 0:c44f0314d6ec 351 char * data = NULL;
frankvnk 0:c44f0314d6ec 352 long event_type;
frankvnk 0:c44f0314d6ec 353 unsigned long NumberOfReleasedPackets;
frankvnk 0:c44f0314d6ec 354 unsigned long NumberOfSentPackets;
frankvnk 0:c44f0314d6ec 355
frankvnk 0:c44f0314d6ec 356 STREAM_TO_UINT16(event_hdr, HCI_EVENT_OPCODE_OFFSET,event_type);
frankvnk 0:c44f0314d6ec 357
frankvnk 0:c44f0314d6ec 358 if (event_type & HCI_EVNT_UNSOL_BASE)
frankvnk 0:c44f0314d6ec 359 {
frankvnk 0:c44f0314d6ec 360 switch(event_type)
frankvnk 0:c44f0314d6ec 361 {
frankvnk 0:c44f0314d6ec 362
frankvnk 0:c44f0314d6ec 363 case HCI_EVNT_DATA_UNSOL_FREE_BUFF:
frankvnk 0:c44f0314d6ec 364 {
frankvnk 0:c44f0314d6ec 365 hci_event_unsol_flowcontrol_handler(event_hdr);
frankvnk 0:c44f0314d6ec 366
frankvnk 0:c44f0314d6ec 367 NumberOfReleasedPackets = tSLInformation.NumberOfReleasedPackets;
frankvnk 0:c44f0314d6ec 368 NumberOfSentPackets = tSLInformation.NumberOfSentPackets;
frankvnk 0:c44f0314d6ec 369
frankvnk 0:c44f0314d6ec 370 if (NumberOfReleasedPackets == NumberOfSentPackets)
frankvnk 0:c44f0314d6ec 371 {
frankvnk 0:c44f0314d6ec 372 if (tSLInformation.InformHostOnTxComplete)
frankvnk 0:c44f0314d6ec 373 {
frankvnk 0:c44f0314d6ec 374 tSLInformation.sWlanCB(HCI_EVENT_CC3000_CAN_SHUT_DOWN, NULL, 0);
frankvnk 0:c44f0314d6ec 375 }
frankvnk 0:c44f0314d6ec 376 }
frankvnk 0:c44f0314d6ec 377 return 1;
frankvnk 0:c44f0314d6ec 378
frankvnk 0:c44f0314d6ec 379 }
frankvnk 0:c44f0314d6ec 380 }
frankvnk 0:c44f0314d6ec 381 }
frankvnk 0:c44f0314d6ec 382
frankvnk 0:c44f0314d6ec 383 if(event_type & HCI_EVNT_WLAN_UNSOL_BASE)
frankvnk 0:c44f0314d6ec 384 {
frankvnk 0:c44f0314d6ec 385 switch(event_type)
frankvnk 0:c44f0314d6ec 386 {
frankvnk 0:c44f0314d6ec 387 case HCI_EVNT_WLAN_KEEPALIVE:
frankvnk 0:c44f0314d6ec 388 case HCI_EVNT_WLAN_UNSOL_CONNECT:
frankvnk 0:c44f0314d6ec 389 case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
frankvnk 0:c44f0314d6ec 390 case HCI_EVNT_WLAN_UNSOL_INIT:
frankvnk 0:c44f0314d6ec 391 case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
frankvnk 0:c44f0314d6ec 392
frankvnk 0:c44f0314d6ec 393 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 394 {
frankvnk 0:c44f0314d6ec 395 tSLInformation.sWlanCB(event_type, 0, 0);
frankvnk 0:c44f0314d6ec 396 }
frankvnk 0:c44f0314d6ec 397 break;
frankvnk 0:c44f0314d6ec 398
frankvnk 0:c44f0314d6ec 399 case HCI_EVNT_WLAN_UNSOL_DHCP:
frankvnk 0:c44f0314d6ec 400 {
frankvnk 8:b48bb4df9319 401 unsigned char params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
frankvnk 8:b48bb4df9319 402 unsigned char *recParams = params;
frankvnk 0:c44f0314d6ec 403 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 404
frankvnk 0:c44f0314d6ec 405 //Read IP address
frankvnk 0:c44f0314d6ec 406 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 407 data += 4;
frankvnk 0:c44f0314d6ec 408 //Read subnet
frankvnk 0:c44f0314d6ec 409 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 410 data += 4;
frankvnk 0:c44f0314d6ec 411 //Read default GW
frankvnk 0:c44f0314d6ec 412 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 413 data += 4;
frankvnk 0:c44f0314d6ec 414 //Read DHCP server
frankvnk 0:c44f0314d6ec 415 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 0:c44f0314d6ec 416 data += 4;
frankvnk 0:c44f0314d6ec 417 //Read DNS server
frankvnk 0:c44f0314d6ec 418 STREAM_TO_STREAM(data,recParams,NETAPP_IPCONFIG_IP_LENGTH);
frankvnk 8:b48bb4df9319 419 // read the status
frankvnk 8:b48bb4df9319 420 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
frankvnk 0:c44f0314d6ec 421
frankvnk 0:c44f0314d6ec 422 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 423 {
frankvnk 8:b48bb4df9319 424 tSLInformation.sWlanCB(event_type, (char *)params, sizeof(params));
frankvnk 0:c44f0314d6ec 425 }
frankvnk 0:c44f0314d6ec 426 }
frankvnk 0:c44f0314d6ec 427 break;
frankvnk 0:c44f0314d6ec 428
frankvnk 0:c44f0314d6ec 429 case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
frankvnk 0:c44f0314d6ec 430 {
frankvnk 0:c44f0314d6ec 431 netapp_pingreport_args_t params;
frankvnk 0:c44f0314d6ec 432 data = (char*)(event_hdr) + HCI_EVENT_HEADER_SIZE;
frankvnk 0:c44f0314d6ec 433 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_SENT_OFFSET, params.packets_sent);
frankvnk 0:c44f0314d6ec 434 STREAM_TO_UINT32(data, NETAPP_PING_PACKETS_RCVD_OFFSET, params.packets_received);
frankvnk 0:c44f0314d6ec 435 STREAM_TO_UINT32(data, NETAPP_PING_MIN_RTT_OFFSET, params.min_round_time);
frankvnk 0:c44f0314d6ec 436 STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
frankvnk 0:c44f0314d6ec 437 STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
frankvnk 0:c44f0314d6ec 438
frankvnk 0:c44f0314d6ec 439 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 440 {
frankvnk 0:c44f0314d6ec 441 tSLInformation.sWlanCB(event_type, (char *)&params, sizeof(params));
frankvnk 0:c44f0314d6ec 442 }
frankvnk 0:c44f0314d6ec 443 }
frankvnk 0:c44f0314d6ec 444 break;
frankvnk 0:c44f0314d6ec 445 case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
frankvnk 0:c44f0314d6ec 446 {
frankvnk 0:c44f0314d6ec 447 if( tSLInformation.sWlanCB )
frankvnk 0:c44f0314d6ec 448 {
frankvnk 0:c44f0314d6ec 449 tSLInformation.sWlanCB(event_type, NULL, 0);
frankvnk 0:c44f0314d6ec 450 }
frankvnk 0:c44f0314d6ec 451 }
frankvnk 0:c44f0314d6ec 452 break;
frankvnk 0:c44f0314d6ec 453
frankvnk 0:c44f0314d6ec 454 //'default' case which means "event not supported"
frankvnk 0:c44f0314d6ec 455 default:
frankvnk 0:c44f0314d6ec 456 return (0);
frankvnk 0:c44f0314d6ec 457 }
frankvnk 0:c44f0314d6ec 458 return(1);
frankvnk 0:c44f0314d6ec 459 }
frankvnk 0:c44f0314d6ec 460
frankvnk 0:c44f0314d6ec 461 if ((event_type == HCI_EVNT_SEND) || (event_type == HCI_EVNT_SENDTO) || (event_type == HCI_EVNT_WRITE))
frankvnk 0:c44f0314d6ec 462 {
frankvnk 8:b48bb4df9319 463 char *pArg;
frankvnk 8:b48bb4df9319 464 long status;
frankvnk 8:b48bb4df9319 465 pArg = M_BSD_RESP_PARAMS_OFFSET(event_hdr);
frankvnk 8:b48bb4df9319 466 STREAM_TO_UINT32(pArg, BSD_RSP_PARAMS_STATUS_OFFSET,status);
frankvnk 8:b48bb4df9319 467 if (ERROR_SOCKET_INACTIVE == status)
frankvnk 8:b48bb4df9319 468 {
frankvnk 8:b48bb4df9319 469 // The only synchronous event that can come from SL device in form of
frankvnk 8:b48bb4df9319 470 // command complete is "Command Complete" on data sent, in case SL device
frankvnk 8:b48bb4df9319 471 // was unable to transmit
frankvnk 8:b48bb4df9319 472 STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, tSLInformation.slTransmitDataError);
frankvnk 8:b48bb4df9319 473 update_socket_active_status(M_BSD_RESP_PARAMS_OFFSET(event_hdr));
frankvnk 8:b48bb4df9319 474 return (1);
frankvnk 8:b48bb4df9319 475 }
frankvnk 8:b48bb4df9319 476 else
frankvnk 8:b48bb4df9319 477 return (0);
frankvnk 0:c44f0314d6ec 478 }
frankvnk 0:c44f0314d6ec 479 return(0);
frankvnk 0:c44f0314d6ec 480 }
frankvnk 0:c44f0314d6ec 481
frankvnk 4:d8255a5aad46 482
frankvnk 0:c44f0314d6ec 483 long hci_unsolicited_event_handler(void)
frankvnk 0:c44f0314d6ec 484 {
frankvnk 4:d8255a5aad46 485 unsigned long res = 0;
frankvnk 0:c44f0314d6ec 486 unsigned char *pucReceivedData;
frankvnk 0:c44f0314d6ec 487 if (tSLInformation.usEventOrDataReceived != 0)
frankvnk 0:c44f0314d6ec 488 {
frankvnk 0:c44f0314d6ec 489 pucReceivedData = (tSLInformation.pucReceivedData);
frankvnk 0:c44f0314d6ec 490
frankvnk 0:c44f0314d6ec 491 if (*pucReceivedData == HCI_TYPE_EVNT)
frankvnk 0:c44f0314d6ec 492 {
frankvnk 0:c44f0314d6ec 493
frankvnk 4:d8255a5aad46 494 // unsolicited event received - finish handling
frankvnk 0:c44f0314d6ec 495 if (hci_unsol_event_handler((char *)pucReceivedData) == 1)
frankvnk 0:c44f0314d6ec 496 {
frankvnk 0:c44f0314d6ec 497
frankvnk 4:d8255a5aad46 498 // An unsolicited event was received:
frankvnk 4:d8255a5aad46 499 // release the buffer and clean the event received
frankvnk 0:c44f0314d6ec 500 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 501
frankvnk 0:c44f0314d6ec 502 res = 1;
frankvnk 4:d8255a5aad46 503 tSLInformation.WlanInterruptEnable();
frankvnk 0:c44f0314d6ec 504 }
frankvnk 0:c44f0314d6ec 505 }
frankvnk 0:c44f0314d6ec 506 }
frankvnk 0:c44f0314d6ec 507 return res;
frankvnk 0:c44f0314d6ec 508 }
frankvnk 0:c44f0314d6ec 509
frankvnk 4:d8255a5aad46 510
frankvnk 0:c44f0314d6ec 511 void set_socket_active_status(long Sd, long Status)
frankvnk 0:c44f0314d6ec 512 {
frankvnk 0:c44f0314d6ec 513 if(M_IS_VALID_SD(Sd) && M_IS_VALID_STATUS(Status))
frankvnk 0:c44f0314d6ec 514 {
frankvnk 0:c44f0314d6ec 515 socket_active_status &= ~(1 << Sd); /* clean socket's mask */
frankvnk 0:c44f0314d6ec 516 socket_active_status |= (Status << Sd); /* set new socket's mask */
frankvnk 0:c44f0314d6ec 517 }
frankvnk 0:c44f0314d6ec 518 }
frankvnk 0:c44f0314d6ec 519
frankvnk 0:c44f0314d6ec 520
frankvnk 0:c44f0314d6ec 521 long hci_event_unsol_flowcontrol_handler(char *pEvent)
frankvnk 0:c44f0314d6ec 522 {
frankvnk 0:c44f0314d6ec 523
frankvnk 0:c44f0314d6ec 524 long temp, value;
frankvnk 0:c44f0314d6ec 525 unsigned short i;
frankvnk 0:c44f0314d6ec 526 unsigned short pusNumberOfHandles=0;
frankvnk 0:c44f0314d6ec 527 char *pReadPayload;
frankvnk 0:c44f0314d6ec 528
frankvnk 0:c44f0314d6ec 529 STREAM_TO_UINT16((char *)pEvent,HCI_EVENT_HEADER_SIZE,pusNumberOfHandles);
frankvnk 0:c44f0314d6ec 530 pReadPayload = ((char *)pEvent + HCI_EVENT_HEADER_SIZE + sizeof(pusNumberOfHandles));
frankvnk 0:c44f0314d6ec 531 temp = 0;
frankvnk 0:c44f0314d6ec 532
frankvnk 0:c44f0314d6ec 533 for(i = 0; i < pusNumberOfHandles ; i++)
frankvnk 0:c44f0314d6ec 534 {
frankvnk 0:c44f0314d6ec 535 STREAM_TO_UINT16(pReadPayload, FLOW_CONTROL_EVENT_FREE_BUFFS_OFFSET, value);
frankvnk 0:c44f0314d6ec 536 temp += value;
frankvnk 0:c44f0314d6ec 537 pReadPayload += FLOW_CONTROL_EVENT_SIZE;
frankvnk 0:c44f0314d6ec 538 }
frankvnk 0:c44f0314d6ec 539
frankvnk 0:c44f0314d6ec 540 tSLInformation.usNumberOfFreeBuffers += temp;
frankvnk 0:c44f0314d6ec 541 tSLInformation.NumberOfReleasedPackets += temp;
frankvnk 0:c44f0314d6ec 542
frankvnk 0:c44f0314d6ec 543 return(ESUCCESS);
frankvnk 0:c44f0314d6ec 544 }
frankvnk 0:c44f0314d6ec 545
frankvnk 0:c44f0314d6ec 546
frankvnk 0:c44f0314d6ec 547 long get_socket_active_status(long Sd)
frankvnk 0:c44f0314d6ec 548 {
frankvnk 0:c44f0314d6ec 549 if(M_IS_VALID_SD(Sd))
frankvnk 0:c44f0314d6ec 550 {
frankvnk 0:c44f0314d6ec 551 return (socket_active_status & (1 << Sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
frankvnk 0:c44f0314d6ec 552 }
frankvnk 0:c44f0314d6ec 553 return SOCKET_STATUS_INACTIVE;
frankvnk 0:c44f0314d6ec 554 }
frankvnk 0:c44f0314d6ec 555
frankvnk 4:d8255a5aad46 556
frankvnk 0:c44f0314d6ec 557 void update_socket_active_status(char *resp_params)
frankvnk 0:c44f0314d6ec 558 {
frankvnk 0:c44f0314d6ec 559 long status, sd;
frankvnk 0:c44f0314d6ec 560
frankvnk 0:c44f0314d6ec 561 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
frankvnk 0:c44f0314d6ec 562 STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
frankvnk 0:c44f0314d6ec 563
frankvnk 0:c44f0314d6ec 564 if(ERROR_SOCKET_INACTIVE == status)
frankvnk 0:c44f0314d6ec 565 {
frankvnk 0:c44f0314d6ec 566 set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
frankvnk 0:c44f0314d6ec 567 }
frankvnk 0:c44f0314d6ec 568 }
frankvnk 0:c44f0314d6ec 569
frankvnk 0:c44f0314d6ec 570
frankvnk 0:c44f0314d6ec 571 void SimpleLinkWaitEvent(unsigned short usOpcode, void *pRetParams)
frankvnk 0:c44f0314d6ec 572 {
frankvnk 0:c44f0314d6ec 573 // In the blocking implementation the control to caller will be returned only
frankvnk 0:c44f0314d6ec 574 // after the end of current transaction
frankvnk 0:c44f0314d6ec 575 tSLInformation.usRxEventOpcode = usOpcode;
frankvnk 0:c44f0314d6ec 576 hci_event_handler(pRetParams, 0, 0);
frankvnk 0:c44f0314d6ec 577 }
frankvnk 0:c44f0314d6ec 578
frankvnk 0:c44f0314d6ec 579
frankvnk 4:d8255a5aad46 580 void SimpleLinkWaitData(unsigned char *pBuf, unsigned char *from, unsigned char *fromlen)
frankvnk 0:c44f0314d6ec 581 {
frankvnk 0:c44f0314d6ec 582 // In the blocking implementation the control to caller will be returned only
frankvnk 0:c44f0314d6ec 583 // after the end of current transaction, i.e. only after data will be received
frankvnk 0:c44f0314d6ec 584 tSLInformation.usRxDataPending = 1;
frankvnk 0:c44f0314d6ec 585 hci_event_handler(pBuf, from, fromlen);
frankvnk 0:c44f0314d6ec 586 }
frankvnk 0:c44f0314d6ec 587
frankvnk 6:d733efcc2c56 588