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:
Sat Jul 13 13:12:46 2013 +0000
Revision:
3:3818c9c7b14e
Parent:
2:f1d50c7f8bdb
Child:
4:d8255a5aad46
first working version

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