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:
Mon Jul 08 13:18:12 2013 +0000
Revision:
2:f1d50c7f8bdb
Parent:
1:bbcaf0b2f367
Child:
3:3818c9c7b14e
See history.h

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