Driver for CC3000 Wi-Fi module

Dependencies:   NVIC_set_all_priorities

Dependents:   CC3000_Simple_Socket Wi-Go_IOT_Demo

Information

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

CC3000 Wi-Fi module library

Info

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

Differences with TI's original code

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

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

Using the Library

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

Using the library with other processors

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

#include "NVIC_set_all_priorities.h"


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

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

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

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

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

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

#define WLAN_READ_IRQ       wlan_int

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

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

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

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

API documentation

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

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:c44f0314d6ec 1 /*****************************************************************************
frankvnk 0:c44f0314d6ec 2 *
frankvnk 0:c44f0314d6ec 3 * wlan.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 //
frankvnk 0:c44f0314d6ec 38 //! \addtogroup wlan_api
frankvnk 0:c44f0314d6ec 39 //! @{
frankvnk 0:c44f0314d6ec 40 //
frankvnk 0:c44f0314d6ec 41 //*****************************************************************************
frankvnk 0:c44f0314d6ec 42 #include "wlan.h"
frankvnk 0:c44f0314d6ec 43
frankvnk 0:c44f0314d6ec 44 extern int sss;
frankvnk 0:c44f0314d6ec 45 extern void WriteWlanPin( unsigned char val );
frankvnk 0:c44f0314d6ec 46 volatile sSimplLinkInformation tSLInformation;
frankvnk 0:c44f0314d6ec 47
frankvnk 0:c44f0314d6ec 48 #define SMART_CONFIG_PROFILE_SIZE 67 // 67 = 32 (max ssid) + 32 (max key) + 1 (SSID length) + 1 (security type) + 1 (key length)
frankvnk 0:c44f0314d6ec 49
frankvnk 0:c44f0314d6ec 50 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 51 unsigned char key[AES128_KEY_SIZE];
frankvnk 0:c44f0314d6ec 52 unsigned char profileArray[SMART_CONFIG_PROFILE_SIZE];
frankvnk 0:c44f0314d6ec 53 #endif //CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 54
frankvnk 0:c44f0314d6ec 55 /* patches type */
frankvnk 0:c44f0314d6ec 56 #define PATCHES_HOST_TYPE_WLAN_DRIVER 0x01
frankvnk 0:c44f0314d6ec 57 #define PATCHES_HOST_TYPE_WLAN_FW 0x02
frankvnk 0:c44f0314d6ec 58 #define PATCHES_HOST_TYPE_BOOTLOADER 0x03
frankvnk 0:c44f0314d6ec 59
frankvnk 0:c44f0314d6ec 60 #define SL_SET_SCAN_PARAMS_INTERVAL_LIST_SIZE (16)
frankvnk 0:c44f0314d6ec 61 #define SL_SIMPLE_CONFIG_PREFIX_LENGTH (3)
frankvnk 0:c44f0314d6ec 62 #define ETH_ALEN (6)
frankvnk 0:c44f0314d6ec 63 #define MAXIMAL_SSID_LENGTH (32)
frankvnk 0:c44f0314d6ec 64
frankvnk 0:c44f0314d6ec 65 #define SL_PATCHES_REQUEST_DEFAULT (0)
frankvnk 0:c44f0314d6ec 66 #define SL_PATCHES_REQUEST_FORCE_HOST (1)
frankvnk 0:c44f0314d6ec 67 #define SL_PATCHES_REQUEST_FORCE_NONE (2)
frankvnk 0:c44f0314d6ec 68
frankvnk 0:c44f0314d6ec 69
frankvnk 0:c44f0314d6ec 70 #define WLAN_SEC_UNSEC (0)
frankvnk 0:c44f0314d6ec 71 #define WLAN_SEC_WEP (1)
frankvnk 0:c44f0314d6ec 72 #define WLAN_SEC_WPA (2)
frankvnk 0:c44f0314d6ec 73 #define WLAN_SEC_WPA2 (3)
frankvnk 0:c44f0314d6ec 74
frankvnk 0:c44f0314d6ec 75
frankvnk 0:c44f0314d6ec 76 #define WLAN_SL_INIT_START_PARAMS_LEN (1)
frankvnk 0:c44f0314d6ec 77 #define WLAN_PATCH_PARAMS_LENGTH (8)
frankvnk 0:c44f0314d6ec 78 #define WLAN_SET_CONNECTION_POLICY_PARAMS_LEN (12)
frankvnk 0:c44f0314d6ec 79 #define WLAN_DEL_PROFILE_PARAMS_LEN (4)
frankvnk 0:c44f0314d6ec 80 #define WLAN_SET_MASK_PARAMS_LEN (4)
frankvnk 0:c44f0314d6ec 81 #define WLAN_SET_SCAN_PARAMS_LEN (100)
frankvnk 0:c44f0314d6ec 82 #define WLAN_GET_SCAN_RESULTS_PARAMS_LEN (4)
frankvnk 0:c44f0314d6ec 83 #define WLAN_ADD_PROFILE_NOSEC_PARAM_LEN (24)
frankvnk 0:c44f0314d6ec 84 #define WLAN_ADD_PROFILE_WEP_PARAM_LEN (36)
frankvnk 0:c44f0314d6ec 85 #define WLAN_ADD_PROFILE_WPA_PARAM_LEN (44)
frankvnk 0:c44f0314d6ec 86 #define WLAN_CONNECT_PARAM_LEN (29)
frankvnk 0:c44f0314d6ec 87 #define WLAN_SMART_CONFIG_START_PARAMS_LEN (4)
frankvnk 0:c44f0314d6ec 88
frankvnk 0:c44f0314d6ec 89
frankvnk 0:c44f0314d6ec 90
frankvnk 0:c44f0314d6ec 91
frankvnk 0:c44f0314d6ec 92 //*****************************************************************************
frankvnk 0:c44f0314d6ec 93 //
frankvnk 0:c44f0314d6ec 94 //! SimpleLink_Init_Start
frankvnk 0:c44f0314d6ec 95 //!
frankvnk 0:c44f0314d6ec 96 //! @param usPatchesAvailableAtHost flag to indicate if patches available
frankvnk 0:c44f0314d6ec 97 //! from host or from EEPROM. Due to the
frankvnk 0:c44f0314d6ec 98 //! fact the patches are burn to the EEPROM
frankvnk 0:c44f0314d6ec 99 //! using the patch programmer utility, the
frankvnk 0:c44f0314d6ec 100 //! patches will be available from the EEPROM
frankvnk 0:c44f0314d6ec 101 //! and not from the host.
frankvnk 0:c44f0314d6ec 102 //!
frankvnk 0:c44f0314d6ec 103 //! @return none
frankvnk 0:c44f0314d6ec 104 //!
frankvnk 0:c44f0314d6ec 105 //! @brief Send HCI_CMND_SIMPLE_LINK_START to CC3000
frankvnk 0:c44f0314d6ec 106 //
frankvnk 0:c44f0314d6ec 107 //*****************************************************************************
frankvnk 0:c44f0314d6ec 108 static void SimpleLink_Init_Start(unsigned short usPatchesAvailableAtHost)
frankvnk 0:c44f0314d6ec 109 {
frankvnk 0:c44f0314d6ec 110 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 111 unsigned char *args;
frankvnk 0:c44f0314d6ec 112
frankvnk 0:c44f0314d6ec 113 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 114 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 115
frankvnk 0:c44f0314d6ec 116 UINT8_TO_STREAM(args, ((usPatchesAvailableAtHost) ? SL_PATCHES_REQUEST_FORCE_HOST : SL_PATCHES_REQUEST_DEFAULT));
frankvnk 0:c44f0314d6ec 117
frankvnk 0:c44f0314d6ec 118 // IRQ Line asserted - send HCI_CMND_SIMPLE_LINK_START to CC3000
frankvnk 0:c44f0314d6ec 119 hci_command_send(HCI_CMND_SIMPLE_LINK_START, ptr, WLAN_SL_INIT_START_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 120
frankvnk 0:c44f0314d6ec 121 SimpleLinkWaitEvent(HCI_CMND_SIMPLE_LINK_START, 0);
frankvnk 0:c44f0314d6ec 122 }
frankvnk 0:c44f0314d6ec 123
frankvnk 0:c44f0314d6ec 124
frankvnk 0:c44f0314d6ec 125
frankvnk 0:c44f0314d6ec 126 //*****************************************************************************
frankvnk 0:c44f0314d6ec 127 //
frankvnk 0:c44f0314d6ec 128 //! wlan_init
frankvnk 0:c44f0314d6ec 129 //!
frankvnk 0:c44f0314d6ec 130 //! @param sWlanCB Asynchronous events callback.
frankvnk 0:c44f0314d6ec 131 //! 0 no event call back.
frankvnk 0:c44f0314d6ec 132 //! -call back parameters:
frankvnk 0:c44f0314d6ec 133 //! 1) event_type: HCI_EVNT_WLAN_UNSOL_CONNECT connect event,
frankvnk 0:c44f0314d6ec 134 //! HCI_EVNT_WLAN_UNSOL_DISCONNECT disconnect event,
frankvnk 0:c44f0314d6ec 135 //! HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE config done,
frankvnk 0:c44f0314d6ec 136 //! HCI_EVNT_WLAN_UNSOL_DHCP dhcp report,
frankvnk 0:c44f0314d6ec 137 //! HCI_EVNT_WLAN_ASYNC_PING_REPORT ping report OR
frankvnk 0:c44f0314d6ec 138 //! HCI_EVNT_WLAN_KEEPALIVE keepalive.
frankvnk 0:c44f0314d6ec 139 //! 2) data: pointer to extra data that received by the event
frankvnk 0:c44f0314d6ec 140 //! (NULL no data).
frankvnk 0:c44f0314d6ec 141 //! 3) length: data length.
frankvnk 0:c44f0314d6ec 142 //! -Events with extra data:
frankvnk 0:c44f0314d6ec 143 //! HCI_EVNT_WLAN_UNSOL_DHCP: 4 bytes IP, 4 bytes Mask,
frankvnk 0:c44f0314d6ec 144 //! 4 bytes default gateway, 4 bytes DHCP server and 4 bytes
frankvnk 0:c44f0314d6ec 145 //! for DNS server.
frankvnk 0:c44f0314d6ec 146 //! HCI_EVNT_WLAN_ASYNC_PING_REPORT: 4 bytes Packets sent,
frankvnk 0:c44f0314d6ec 147 //! 4 bytes Packets received, 4 bytes Min round time,
frankvnk 0:c44f0314d6ec 148 //! 4 bytes Max round time and 4 bytes for Avg round time.
frankvnk 0:c44f0314d6ec 149 //!
frankvnk 0:c44f0314d6ec 150 //! @param sFWPatches 0 no patch or pointer to FW patches
frankvnk 0:c44f0314d6ec 151 //! @param sDriverPatches 0 no patch or pointer to driver patches
frankvnk 0:c44f0314d6ec 152 //! @param sBootLoaderPatches 0 no patch or pointer to bootloader patches
frankvnk 0:c44f0314d6ec 153 //! @param sReadWlanInterruptPin init callback. the callback read wlan
frankvnk 0:c44f0314d6ec 154 //! interrupt status.
frankvnk 0:c44f0314d6ec 155 //! @param sWlanInterruptEnable init callback. the callback enable wlan
frankvnk 0:c44f0314d6ec 156 //! interrupt.
frankvnk 0:c44f0314d6ec 157 //! @param sWlanInterruptDisable init callback. the callback disable wlan
frankvnk 0:c44f0314d6ec 158 //! interrupt.
frankvnk 0:c44f0314d6ec 159 //! @param sWriteWlanPin init callback. the callback write value
frankvnk 0:c44f0314d6ec 160 //! to device pin.
frankvnk 0:c44f0314d6ec 161 //!
frankvnk 0:c44f0314d6ec 162 //! @return none
frankvnk 0:c44f0314d6ec 163 //!
frankvnk 0:c44f0314d6ec 164 //! @sa wlan_set_event_mask , wlan_start , wlan_stop
frankvnk 0:c44f0314d6ec 165 //!
frankvnk 0:c44f0314d6ec 166 //! @brief Initialize wlan driver
frankvnk 0:c44f0314d6ec 167 //!
frankvnk 0:c44f0314d6ec 168 //! @warning This function must be called before ANY other wlan driver function
frankvnk 0:c44f0314d6ec 169 //
frankvnk 0:c44f0314d6ec 170 //*****************************************************************************
frankvnk 0:c44f0314d6ec 171
frankvnk 0:c44f0314d6ec 172 void wlan_init(tWlanCB sWlanCB,
frankvnk 0:c44f0314d6ec 173 tFWPatches sFWPatches,
frankvnk 0:c44f0314d6ec 174 tDriverPatches sDriverPatches,
frankvnk 0:c44f0314d6ec 175 tBootLoaderPatches sBootLoaderPatches,
frankvnk 0:c44f0314d6ec 176 tWlanReadInteruptPin sReadWlanInterruptPin,
frankvnk 0:c44f0314d6ec 177 tWlanInterruptEnable sWlanInterruptEnable,
frankvnk 0:c44f0314d6ec 178 tWlanInterruptDisable sWlanInterruptDisable,
frankvnk 0:c44f0314d6ec 179 tWriteWlanPin sWriteWlanPin)
frankvnk 0:c44f0314d6ec 180 {
frankvnk 0:c44f0314d6ec 181
frankvnk 0:c44f0314d6ec 182 tSLInformation.sFWPatches = sFWPatches;
frankvnk 0:c44f0314d6ec 183 tSLInformation.sDriverPatches = sDriverPatches;
frankvnk 0:c44f0314d6ec 184 tSLInformation.sBootLoaderPatches = sBootLoaderPatches;
frankvnk 0:c44f0314d6ec 185
frankvnk 0:c44f0314d6ec 186 // init io callback
frankvnk 0:c44f0314d6ec 187 tSLInformation.ReadWlanInterruptPin = sReadWlanInterruptPin;
frankvnk 0:c44f0314d6ec 188 tSLInformation.WlanInterruptEnable = sWlanInterruptEnable;
frankvnk 0:c44f0314d6ec 189 tSLInformation.WlanInterruptDisable = sWlanInterruptDisable;
frankvnk 0:c44f0314d6ec 190 tSLInformation.WriteWlanPin = sWriteWlanPin;
frankvnk 0:c44f0314d6ec 191
frankvnk 0:c44f0314d6ec 192 //init asynchronous events callback
frankvnk 0:c44f0314d6ec 193 tSLInformation.sWlanCB= sWlanCB;
frankvnk 0:c44f0314d6ec 194
frankvnk 0:c44f0314d6ec 195 // By default TX Complete events are routed to host too
frankvnk 0:c44f0314d6ec 196 tSLInformation.InformHostOnTxComplete = 1;
frankvnk 0:c44f0314d6ec 197 }
frankvnk 0:c44f0314d6ec 198
frankvnk 0:c44f0314d6ec 199 //*****************************************************************************
frankvnk 0:c44f0314d6ec 200 //
frankvnk 0:c44f0314d6ec 201 //! SpiReceiveHandler
frankvnk 0:c44f0314d6ec 202 //!
frankvnk 0:c44f0314d6ec 203 //! @param pvBuffer - pointer to the received data buffer
frankvnk 0:c44f0314d6ec 204 //! The function triggers Received event/data processing
frankvnk 0:c44f0314d6ec 205 //!
frankvnk 0:c44f0314d6ec 206 //! @param Pointer to the received data
frankvnk 0:c44f0314d6ec 207 //! @return none
frankvnk 0:c44f0314d6ec 208 //!
frankvnk 0:c44f0314d6ec 209 //! @brief The function triggers Received event/data processing. It is
frankvnk 0:c44f0314d6ec 210 //! called from the SPI library to receive the data
frankvnk 0:c44f0314d6ec 211 //
frankvnk 0:c44f0314d6ec 212 //*****************************************************************************
frankvnk 0:c44f0314d6ec 213 void SpiReceiveHandler(void *pvBuffer)
frankvnk 0:c44f0314d6ec 214 {
frankvnk 0:c44f0314d6ec 215 tSLInformation.usEventOrDataReceived = 1;
frankvnk 0:c44f0314d6ec 216 tSLInformation.pucReceivedData = (unsigned char *)pvBuffer;
frankvnk 0:c44f0314d6ec 217
frankvnk 0:c44f0314d6ec 218 hci_unsolicited_event_handler();
frankvnk 0:c44f0314d6ec 219 }
frankvnk 0:c44f0314d6ec 220
frankvnk 0:c44f0314d6ec 221 //wait until the IRQ line goes low
frankvnk 0:c44f0314d6ec 222 void do_lan_wait(void)
frankvnk 0:c44f0314d6ec 223 {
frankvnk 0:c44f0314d6ec 224 int t;
frankvnk 0:c44f0314d6ec 225 t = sss + 3;
frankvnk 0:c44f0314d6ec 226 while(tSLInformation.ReadWlanInterruptPin() != 0)
frankvnk 0:c44f0314d6ec 227 {
frankvnk 0:c44f0314d6ec 228 if(t <= sss)
frankvnk 0:c44f0314d6ec 229 {
frankvnk 0:c44f0314d6ec 230 WriteWlanPin(0);
frankvnk 0:c44f0314d6ec 231 t = sss + 3;
frankvnk 0:c44f0314d6ec 232 while(sss < t);
frankvnk 0:c44f0314d6ec 233 WriteWlanPin(1);
frankvnk 0:c44f0314d6ec 234 t = sss + 3;
frankvnk 0:c44f0314d6ec 235 //printf("Retry %x\n", ReadWlanInterruptPin());
frankvnk 0:c44f0314d6ec 236 }
frankvnk 0:c44f0314d6ec 237
frankvnk 0:c44f0314d6ec 238 }
frankvnk 0:c44f0314d6ec 239 }
frankvnk 0:c44f0314d6ec 240
frankvnk 0:c44f0314d6ec 241 //*****************************************************************************
frankvnk 0:c44f0314d6ec 242 //
frankvnk 0:c44f0314d6ec 243 //! wlan_start
frankvnk 0:c44f0314d6ec 244 //!
frankvnk 0:c44f0314d6ec 245 //! @param usPatchesAvailableAtHost - flag to indicate if patches available
frankvnk 0:c44f0314d6ec 246 //! from host or from EEPROM. Due to the
frankvnk 0:c44f0314d6ec 247 //! fact the patches are burn to the EEPROM
frankvnk 0:c44f0314d6ec 248 //! using the patch programmer utility, the
frankvnk 0:c44f0314d6ec 249 //! patches will be available from the EEPROM
frankvnk 0:c44f0314d6ec 250 //! and not from the host.
frankvnk 0:c44f0314d6ec 251 //!
frankvnk 0:c44f0314d6ec 252 //! @return none
frankvnk 0:c44f0314d6ec 253 //!
frankvnk 0:c44f0314d6ec 254 //! @brief Start WLAN device. This function asserts the enable pin of
frankvnk 0:c44f0314d6ec 255 //! the device (WLAN_EN), starting the HW initialization process.
frankvnk 0:c44f0314d6ec 256 //! The function blocked until device Initialization is completed.
frankvnk 0:c44f0314d6ec 257 //! Function also configure patches (FW, driver or bootloader)
frankvnk 0:c44f0314d6ec 258 //! and calls appropriate device callbacks.
frankvnk 0:c44f0314d6ec 259 //!
frankvnk 0:c44f0314d6ec 260 //! @Note Prior calling the function wlan_init shall be called.
frankvnk 0:c44f0314d6ec 261 //! @Warning This function must be called after wlan_init and before any
frankvnk 0:c44f0314d6ec 262 //! other wlan API
frankvnk 0:c44f0314d6ec 263 //! @sa wlan_init , wlan_stop
frankvnk 0:c44f0314d6ec 264 //!
frankvnk 0:c44f0314d6ec 265 //
frankvnk 0:c44f0314d6ec 266 //*****************************************************************************
frankvnk 0:c44f0314d6ec 267
frankvnk 0:c44f0314d6ec 268 void wlan_start(unsigned short usPatchesAvailableAtHost)
frankvnk 0:c44f0314d6ec 269 {
frankvnk 0:c44f0314d6ec 270
frankvnk 0:c44f0314d6ec 271 unsigned long ulSpiIRQState;
frankvnk 0:c44f0314d6ec 272
frankvnk 0:c44f0314d6ec 273 tSLInformation.NumberOfSentPackets = 0;
frankvnk 0:c44f0314d6ec 274 tSLInformation.NumberOfReleasedPackets = 0;
frankvnk 0:c44f0314d6ec 275 tSLInformation.usRxEventOpcode = 0;
frankvnk 0:c44f0314d6ec 276 tSLInformation.usNumberOfFreeBuffers = 0;
frankvnk 0:c44f0314d6ec 277 tSLInformation.usSlBufferLength = 0;
frankvnk 0:c44f0314d6ec 278 tSLInformation.usBufferSize = 0;
frankvnk 0:c44f0314d6ec 279 tSLInformation.usRxDataPending = 0;
frankvnk 0:c44f0314d6ec 280 tSLInformation.slTransmitDataError = 0;
frankvnk 0:c44f0314d6ec 281 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 282 tSLInformation.pucReceivedData = 0;
frankvnk 0:c44f0314d6ec 283
frankvnk 0:c44f0314d6ec 284 // Allocate the memory for the RX/TX data transactions
frankvnk 0:c44f0314d6ec 285 tSLInformation.pucTxCommandBuffer = (unsigned char *)wlan_tx_buffer;
frankvnk 0:c44f0314d6ec 286
frankvnk 0:c44f0314d6ec 287 // init spi
frankvnk 0:c44f0314d6ec 288 SpiOpen(SpiReceiveHandler);
frankvnk 0:c44f0314d6ec 289
frankvnk 0:c44f0314d6ec 290 // Check the IRQ line
frankvnk 0:c44f0314d6ec 291 ulSpiIRQState = tSLInformation.ReadWlanInterruptPin();
frankvnk 0:c44f0314d6ec 292
frankvnk 0:c44f0314d6ec 293 // ASIC 1273 chip enable: toggle WLAN EN line
frankvnk 0:c44f0314d6ec 294 tSLInformation.WriteWlanPin( WLAN_ENABLE );
frankvnk 0:c44f0314d6ec 295
frankvnk 0:c44f0314d6ec 296 if (ulSpiIRQState)
frankvnk 0:c44f0314d6ec 297 {
frankvnk 0:c44f0314d6ec 298 // wait till the IRQ line goes low
frankvnk 0:c44f0314d6ec 299 do_lan_wait();
frankvnk 0:c44f0314d6ec 300 }
frankvnk 0:c44f0314d6ec 301 else
frankvnk 0:c44f0314d6ec 302 {
frankvnk 0:c44f0314d6ec 303 // wait till the IRQ line goes high and than low
frankvnk 0:c44f0314d6ec 304 while(tSLInformation.ReadWlanInterruptPin() == 0)
frankvnk 0:c44f0314d6ec 305 {
frankvnk 0:c44f0314d6ec 306 }
frankvnk 0:c44f0314d6ec 307
frankvnk 0:c44f0314d6ec 308 while(tSLInformation.ReadWlanInterruptPin() != 0)
frankvnk 0:c44f0314d6ec 309 {
frankvnk 0:c44f0314d6ec 310 }
frankvnk 0:c44f0314d6ec 311 }
frankvnk 0:c44f0314d6ec 312
frankvnk 0:c44f0314d6ec 313 SimpleLink_Init_Start(usPatchesAvailableAtHost);
frankvnk 0:c44f0314d6ec 314
frankvnk 0:c44f0314d6ec 315 // Read Buffer's size and finish
frankvnk 0:c44f0314d6ec 316 hci_command_send(HCI_CMND_READ_BUFFER_SIZE, tSLInformation.pucTxCommandBuffer, 0);
frankvnk 0:c44f0314d6ec 317 SimpleLinkWaitEvent(HCI_CMND_READ_BUFFER_SIZE, 0);
frankvnk 0:c44f0314d6ec 318 }
frankvnk 0:c44f0314d6ec 319
frankvnk 0:c44f0314d6ec 320
frankvnk 0:c44f0314d6ec 321 //*****************************************************************************
frankvnk 0:c44f0314d6ec 322 //
frankvnk 0:c44f0314d6ec 323 //! wlan_stop
frankvnk 0:c44f0314d6ec 324 //!
frankvnk 0:c44f0314d6ec 325 //! @param none
frankvnk 0:c44f0314d6ec 326 //!
frankvnk 0:c44f0314d6ec 327 //! @return none
frankvnk 0:c44f0314d6ec 328 //!
frankvnk 0:c44f0314d6ec 329 //! @brief Stop WLAN device by putting it into reset state.
frankvnk 0:c44f0314d6ec 330 //!
frankvnk 0:c44f0314d6ec 331 //! @sa wlan_start
frankvnk 0:c44f0314d6ec 332 //
frankvnk 0:c44f0314d6ec 333 //*****************************************************************************
frankvnk 0:c44f0314d6ec 334
frankvnk 0:c44f0314d6ec 335 void wlan_stop(void)
frankvnk 0:c44f0314d6ec 336 {
frankvnk 0:c44f0314d6ec 337 // ASIC 1273 chip disable
frankvnk 0:c44f0314d6ec 338 tSLInformation.WriteWlanPin( WLAN_DISABLE );
frankvnk 0:c44f0314d6ec 339
frankvnk 0:c44f0314d6ec 340 // Wait till IRQ line goes high...
frankvnk 0:c44f0314d6ec 341 while(tSLInformation.ReadWlanInterruptPin() == 0)
frankvnk 0:c44f0314d6ec 342 {
frankvnk 0:c44f0314d6ec 343 }
frankvnk 0:c44f0314d6ec 344
frankvnk 0:c44f0314d6ec 345 // Free the used by WLAN Driver memory
frankvnk 0:c44f0314d6ec 346 if (tSLInformation.pucTxCommandBuffer)
frankvnk 0:c44f0314d6ec 347 {
frankvnk 0:c44f0314d6ec 348 tSLInformation.pucTxCommandBuffer = 0;
frankvnk 0:c44f0314d6ec 349 }
frankvnk 0:c44f0314d6ec 350
frankvnk 0:c44f0314d6ec 351 SpiClose();
frankvnk 0:c44f0314d6ec 352 }
frankvnk 0:c44f0314d6ec 353
frankvnk 0:c44f0314d6ec 354
frankvnk 0:c44f0314d6ec 355 //*****************************************************************************
frankvnk 0:c44f0314d6ec 356 //
frankvnk 0:c44f0314d6ec 357 //! wlan_connect
frankvnk 0:c44f0314d6ec 358 //!
frankvnk 0:c44f0314d6ec 359 //! @param sec_type security options:
frankvnk 0:c44f0314d6ec 360 //! WLAN_SEC_UNSEC,
frankvnk 0:c44f0314d6ec 361 //! WLAN_SEC_WEP (ASCII support only),
frankvnk 0:c44f0314d6ec 362 //! WLAN_SEC_WPA or WLAN_SEC_WPA2
frankvnk 0:c44f0314d6ec 363 //! @param ssid up to 32 bytes and is ASCII SSID of the AP
frankvnk 0:c44f0314d6ec 364 //! @param ssid_len length of the SSID
frankvnk 0:c44f0314d6ec 365 //! @param bssid 6 bytes specified the AP bssid
frankvnk 0:c44f0314d6ec 366 //! @param key up to 16 bytes specified the AP security key
frankvnk 0:c44f0314d6ec 367 //! @param key_len key length
frankvnk 0:c44f0314d6ec 368 //!
frankvnk 0:c44f0314d6ec 369 //! @return On success, zero is returned. On error, negative is returned.
frankvnk 0:c44f0314d6ec 370 //! Note that even though a zero is returned on success to trigger
frankvnk 0:c44f0314d6ec 371 //! connection operation, it does not mean that CCC3000 is already
frankvnk 0:c44f0314d6ec 372 //! connected. An asynchronous "Connected" event is generated when
frankvnk 0:c44f0314d6ec 373 //! actual association process finishes and CC3000 is connected to
frankvnk 0:c44f0314d6ec 374 //! the AP. If DHCP is set, An asynchronous "DHCP" event is
frankvnk 0:c44f0314d6ec 375 //! generated when DHCP process is finish.
frankvnk 0:c44f0314d6ec 376 //!
frankvnk 0:c44f0314d6ec 377 //!
frankvnk 0:c44f0314d6ec 378 //! @brief Connect to AP
frankvnk 0:c44f0314d6ec 379 //! @warning Please Note that when connection to AP configured with security
frankvnk 0:c44f0314d6ec 380 //! type WEP, please confirm that the key is set as ASCII and not
frankvnk 0:c44f0314d6ec 381 //! as HEX.
frankvnk 0:c44f0314d6ec 382 //! @sa wlan_disconnect
frankvnk 0:c44f0314d6ec 383 //
frankvnk 0:c44f0314d6ec 384 //*****************************************************************************
frankvnk 0:c44f0314d6ec 385 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 386 long wlan_connect(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 387 char *ssid,
frankvnk 0:c44f0314d6ec 388 long ssid_len,
frankvnk 0:c44f0314d6ec 389 unsigned char *bssid,
frankvnk 0:c44f0314d6ec 390 unsigned char *key,
frankvnk 0:c44f0314d6ec 391 long key_len)
frankvnk 0:c44f0314d6ec 392 {
frankvnk 0:c44f0314d6ec 393 long ret;
frankvnk 0:c44f0314d6ec 394 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 395 unsigned char *args;
frankvnk 0:c44f0314d6ec 396 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 397
frankvnk 0:c44f0314d6ec 398 ret = EFAIL;
frankvnk 0:c44f0314d6ec 399 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 400 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 401
frankvnk 0:c44f0314d6ec 402 // Fill in command buffer
frankvnk 0:c44f0314d6ec 403 args = UINT32_TO_STREAM(args, 0x0000001c);
frankvnk 0:c44f0314d6ec 404 args = UINT32_TO_STREAM(args, ssid_len);
frankvnk 0:c44f0314d6ec 405 args = UINT32_TO_STREAM(args, ulSecType);
frankvnk 0:c44f0314d6ec 406 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
frankvnk 0:c44f0314d6ec 407 args = UINT32_TO_STREAM(args, key_len);
frankvnk 0:c44f0314d6ec 408 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 409
frankvnk 0:c44f0314d6ec 410 // padding shall be zeroed
frankvnk 0:c44f0314d6ec 411 if(bssid)
frankvnk 0:c44f0314d6ec 412 {
frankvnk 0:c44f0314d6ec 413 ARRAY_TO_STREAM(args, bssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 414 }
frankvnk 0:c44f0314d6ec 415 else
frankvnk 0:c44f0314d6ec 416 {
frankvnk 0:c44f0314d6ec 417 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 418 }
frankvnk 0:c44f0314d6ec 419
frankvnk 0:c44f0314d6ec 420 ARRAY_TO_STREAM(args, ssid, ssid_len);
frankvnk 0:c44f0314d6ec 421
frankvnk 0:c44f0314d6ec 422 if(key_len && key)
frankvnk 0:c44f0314d6ec 423 {
frankvnk 0:c44f0314d6ec 424 ARRAY_TO_STREAM(args, key, key_len);
frankvnk 0:c44f0314d6ec 425 }
frankvnk 0:c44f0314d6ec 426
frankvnk 0:c44f0314d6ec 427 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 428 hci_command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len + key_len - 1);
frankvnk 0:c44f0314d6ec 429
frankvnk 0:c44f0314d6ec 430 // Wait for command complete event
frankvnk 0:c44f0314d6ec 431 SimpleLinkWaitEvent(HCI_CMND_WLAN_CONNECT, &ret);
frankvnk 0:c44f0314d6ec 432 errno = ret;
frankvnk 0:c44f0314d6ec 433
frankvnk 0:c44f0314d6ec 434 return(ret);
frankvnk 0:c44f0314d6ec 435 }
frankvnk 0:c44f0314d6ec 436 #else
frankvnk 0:c44f0314d6ec 437 long wlan_connect(char *ssid, long ssid_len)
frankvnk 0:c44f0314d6ec 438 {
frankvnk 0:c44f0314d6ec 439 long ret;
frankvnk 0:c44f0314d6ec 440 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 441 unsigned char *args;
frankvnk 0:c44f0314d6ec 442 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 443
frankvnk 0:c44f0314d6ec 444 ret = EFAIL;
frankvnk 0:c44f0314d6ec 445 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 446 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 447
frankvnk 0:c44f0314d6ec 448 // Fill in command buffer
frankvnk 0:c44f0314d6ec 449 args = UINT32_TO_STREAM(args, 0x0000001c);
frankvnk 0:c44f0314d6ec 450 args = UINT32_TO_STREAM(args, ssid_len);
frankvnk 0:c44f0314d6ec 451 args = UINT32_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 452 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
frankvnk 0:c44f0314d6ec 453 args = UINT32_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 454 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 455
frankvnk 0:c44f0314d6ec 456 // padding shall be zeroed
frankvnk 0:c44f0314d6ec 457 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 458 ARRAY_TO_STREAM(args, ssid, ssid_len);
frankvnk 0:c44f0314d6ec 459
frankvnk 0:c44f0314d6ec 460 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 461 hci_command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len - 1);
frankvnk 0:c44f0314d6ec 462
frankvnk 0:c44f0314d6ec 463 // Wait for command complete event
frankvnk 0:c44f0314d6ec 464 SimpleLinkWaitEvent(HCI_CMND_WLAN_CONNECT, &ret);
frankvnk 0:c44f0314d6ec 465 errno = ret;
frankvnk 0:c44f0314d6ec 466
frankvnk 0:c44f0314d6ec 467 return(ret);
frankvnk 0:c44f0314d6ec 468 }
frankvnk 0:c44f0314d6ec 469 #endif
frankvnk 0:c44f0314d6ec 470
frankvnk 0:c44f0314d6ec 471 //*****************************************************************************
frankvnk 0:c44f0314d6ec 472 //
frankvnk 0:c44f0314d6ec 473 //! wlan_disconnect
frankvnk 0:c44f0314d6ec 474 //!
frankvnk 0:c44f0314d6ec 475 //! @return 0 disconnected done, other CC3000 already disconnected
frankvnk 0:c44f0314d6ec 476 //!
frankvnk 0:c44f0314d6ec 477 //! @brief Disconnect connection from AP.
frankvnk 0:c44f0314d6ec 478 //!
frankvnk 0:c44f0314d6ec 479 //! @sa wlan_connect
frankvnk 0:c44f0314d6ec 480 //
frankvnk 0:c44f0314d6ec 481 //*****************************************************************************
frankvnk 0:c44f0314d6ec 482
frankvnk 0:c44f0314d6ec 483 long wlan_disconnect()
frankvnk 0:c44f0314d6ec 484 {
frankvnk 0:c44f0314d6ec 485 long ret;
frankvnk 0:c44f0314d6ec 486 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 487
frankvnk 0:c44f0314d6ec 488 ret = EFAIL;
frankvnk 0:c44f0314d6ec 489 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 490
frankvnk 0:c44f0314d6ec 491 hci_command_send(HCI_CMND_WLAN_DISCONNECT, ptr, 0);
frankvnk 0:c44f0314d6ec 492
frankvnk 0:c44f0314d6ec 493 // Wait for command complete event
frankvnk 0:c44f0314d6ec 494 SimpleLinkWaitEvent(HCI_CMND_WLAN_DISCONNECT, &ret);
frankvnk 0:c44f0314d6ec 495 errno = ret;
frankvnk 0:c44f0314d6ec 496
frankvnk 0:c44f0314d6ec 497 return(ret);
frankvnk 0:c44f0314d6ec 498 }
frankvnk 0:c44f0314d6ec 499
frankvnk 0:c44f0314d6ec 500 //*****************************************************************************
frankvnk 0:c44f0314d6ec 501 //
frankvnk 0:c44f0314d6ec 502 //! wlan_ioctl_set_connection_policy
frankvnk 0:c44f0314d6ec 503 //!
frankvnk 0:c44f0314d6ec 504 //! @param should_connect_to_open_ap enable(1), disable(0) connect to any
frankvnk 0:c44f0314d6ec 505 //! available AP. This parameter corresponds to the configuration of
frankvnk 0:c44f0314d6ec 506 //! item # 3 in the brief description.
frankvnk 0:c44f0314d6ec 507 //! @param should_use_fast_connect enable(1), disable(0). if enabled, tries
frankvnk 0:c44f0314d6ec 508 //! to connect to the last connected AP. This parameter corresponds
frankvnk 0:c44f0314d6ec 509 //! to the configuration of item # 1 in the brief description.
frankvnk 0:c44f0314d6ec 510 //! @param auto_start enable(1), disable(0) auto connect
frankvnk 0:c44f0314d6ec 511 //! after reset and periodically reconnect if needed. This
frankvnk 0:c44f0314d6ec 512 //! configuration configures option 2 in the above description.
frankvnk 0:c44f0314d6ec 513 //!
frankvnk 0:c44f0314d6ec 514 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 515 //!
frankvnk 0:c44f0314d6ec 516 //! @brief When auto is enabled, the device tries to connect according
frankvnk 0:c44f0314d6ec 517 //! the following policy:
frankvnk 0:c44f0314d6ec 518 //! 1) If fast connect is enabled and last connection is valid,
frankvnk 0:c44f0314d6ec 519 //! the device will try to connect to it without the scanning
frankvnk 0:c44f0314d6ec 520 //! procedure (fast). The last connection will be marked as
frankvnk 0:c44f0314d6ec 521 //! invalid, due to adding/removing profile.
frankvnk 0:c44f0314d6ec 522 //! 2) If profile exists, the device will try to connect it
frankvnk 0:c44f0314d6ec 523 //! (Up to seven profiles).
frankvnk 0:c44f0314d6ec 524 //! 3) If fast and profiles are not found, and open mode is
frankvnk 0:c44f0314d6ec 525 //! enabled, the device will try to connect to any AP.
frankvnk 0:c44f0314d6ec 526 //! * Note that the policy settings are stored in the CC3000 NVMEM.
frankvnk 0:c44f0314d6ec 527 //!
frankvnk 0:c44f0314d6ec 528 //! @sa wlan_add_profile , wlan_ioctl_del_profile
frankvnk 0:c44f0314d6ec 529 //
frankvnk 0:c44f0314d6ec 530 //*****************************************************************************
frankvnk 0:c44f0314d6ec 531
frankvnk 0:c44f0314d6ec 532 long wlan_ioctl_set_connection_policy(unsigned long should_connect_to_open_ap,
frankvnk 0:c44f0314d6ec 533 unsigned long ulShouldUseFastConnect,
frankvnk 0:c44f0314d6ec 534 unsigned long ulUseProfiles)
frankvnk 0:c44f0314d6ec 535 {
frankvnk 0:c44f0314d6ec 536 long ret;
frankvnk 0:c44f0314d6ec 537 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 538 unsigned char *args;
frankvnk 0:c44f0314d6ec 539
frankvnk 0:c44f0314d6ec 540 ret = EFAIL;
frankvnk 0:c44f0314d6ec 541 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 542 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 543
frankvnk 0:c44f0314d6ec 544 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 545 args = UINT32_TO_STREAM(args, should_connect_to_open_ap);
frankvnk 0:c44f0314d6ec 546 args = UINT32_TO_STREAM(args, ulShouldUseFastConnect);
frankvnk 0:c44f0314d6ec 547 args = UINT32_TO_STREAM(args, ulUseProfiles);
frankvnk 0:c44f0314d6ec 548
frankvnk 0:c44f0314d6ec 549 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 550 hci_command_send(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, ptr, WLAN_SET_CONNECTION_POLICY_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 551
frankvnk 0:c44f0314d6ec 552 // Wait for command complete event
frankvnk 0:c44f0314d6ec 553 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, &ret);
frankvnk 0:c44f0314d6ec 554
frankvnk 0:c44f0314d6ec 555 return(ret);
frankvnk 0:c44f0314d6ec 556 }
frankvnk 0:c44f0314d6ec 557
frankvnk 0:c44f0314d6ec 558 //*****************************************************************************
frankvnk 0:c44f0314d6ec 559 //
frankvnk 0:c44f0314d6ec 560 //! wlan_add_profile
frankvnk 0:c44f0314d6ec 561 //!
frankvnk 0:c44f0314d6ec 562 //! @param ulSecType WLAN_SEC_UNSEC,WLAN_SEC_WEP,WLAN_SEC_WPA,WLAN_SEC_WPA2
frankvnk 0:c44f0314d6ec 563 //! @param ucSsid ssid SSID up to 32 bytes
frankvnk 0:c44f0314d6ec 564 //! @param ulSsidLen ssid length
frankvnk 0:c44f0314d6ec 565 //! @param ucBssid bssid 6 bytes
frankvnk 0:c44f0314d6ec 566 //! @param ulPriority ulPriority profile priority. Lowest priority:0.
frankvnk 0:c44f0314d6ec 567 //! @param ulPairwiseCipher_Or_TxKeyLen key length for WEP security
frankvnk 0:c44f0314d6ec 568 //! @param ulGroupCipher_TxKeyIndex key index
frankvnk 0:c44f0314d6ec 569 //! @param ulKeyMgmt KEY management
frankvnk 0:c44f0314d6ec 570 //! @param ucPf_OrKey security key
frankvnk 0:c44f0314d6ec 571 //! @param ulPassPhraseLen security key length for WPA\WPA2
frankvnk 0:c44f0314d6ec 572 //!
frankvnk 0:c44f0314d6ec 573 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 574 //!
frankvnk 0:c44f0314d6ec 575 //! @brief When auto start is enabled, the device connects to
frankvnk 0:c44f0314d6ec 576 //! station from the profiles table. Up to 7 profiles are supported.
frankvnk 0:c44f0314d6ec 577 //! If several profiles configured the device choose the highest
frankvnk 0:c44f0314d6ec 578 //! priority profile, within each priority group, device will choose
frankvnk 0:c44f0314d6ec 579 //! profile based on security policy, signal strength, etc
frankvnk 0:c44f0314d6ec 580 //! parameters. All the profiles are stored in CC3000 NVMEM.
frankvnk 0:c44f0314d6ec 581 //!
frankvnk 0:c44f0314d6ec 582 //! @sa wlan_ioctl_del_profile
frankvnk 0:c44f0314d6ec 583 //
frankvnk 0:c44f0314d6ec 584 //*****************************************************************************
frankvnk 0:c44f0314d6ec 585
frankvnk 0:c44f0314d6ec 586 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 587 long wlan_add_profile(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 588 unsigned char* ucSsid,
frankvnk 0:c44f0314d6ec 589 unsigned long ulSsidLen,
frankvnk 0:c44f0314d6ec 590 unsigned char *ucBssid,
frankvnk 0:c44f0314d6ec 591 unsigned long ulPriority,
frankvnk 0:c44f0314d6ec 592 unsigned long ulPairwiseCipher_Or_TxKeyLen,
frankvnk 0:c44f0314d6ec 593 unsigned long ulGroupCipher_TxKeyIndex,
frankvnk 0:c44f0314d6ec 594 unsigned long ulKeyMgmt,
frankvnk 0:c44f0314d6ec 595 unsigned char* ucPf_OrKey,
frankvnk 0:c44f0314d6ec 596 unsigned long ulPassPhraseLen)
frankvnk 0:c44f0314d6ec 597 {
frankvnk 0:c44f0314d6ec 598 unsigned short arg_len = 0x00;
frankvnk 0:c44f0314d6ec 599 long ret;
frankvnk 0:c44f0314d6ec 600 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 601 long i = 0;
frankvnk 0:c44f0314d6ec 602 unsigned char *args;
frankvnk 0:c44f0314d6ec 603 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 604
frankvnk 0:c44f0314d6ec 605 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 606 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 607
frankvnk 0:c44f0314d6ec 608 args = UINT32_TO_STREAM(args, ulSecType);
frankvnk 0:c44f0314d6ec 609
frankvnk 0:c44f0314d6ec 610 // Setup arguments in accordance with the security type
frankvnk 0:c44f0314d6ec 611 switch (ulSecType)
frankvnk 0:c44f0314d6ec 612 {
frankvnk 0:c44f0314d6ec 613 //OPEN
frankvnk 0:c44f0314d6ec 614 case WLAN_SEC_UNSEC:
frankvnk 0:c44f0314d6ec 615 {
frankvnk 0:c44f0314d6ec 616 args = UINT32_TO_STREAM(args, 0x00000014);
frankvnk 0:c44f0314d6ec 617 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 618 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 619 if(ucBssid)
frankvnk 0:c44f0314d6ec 620 {
frankvnk 0:c44f0314d6ec 621 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 622 }
frankvnk 0:c44f0314d6ec 623 else
frankvnk 0:c44f0314d6ec 624 {
frankvnk 0:c44f0314d6ec 625 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 626 }
frankvnk 0:c44f0314d6ec 627 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 628 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 629
frankvnk 0:c44f0314d6ec 630 arg_len = WLAN_ADD_PROFILE_NOSEC_PARAM_LEN + ulSsidLen;
frankvnk 0:c44f0314d6ec 631 }
frankvnk 0:c44f0314d6ec 632 break;
frankvnk 0:c44f0314d6ec 633
frankvnk 0:c44f0314d6ec 634 //WEP
frankvnk 0:c44f0314d6ec 635 case WLAN_SEC_WEP:
frankvnk 0:c44f0314d6ec 636 {
frankvnk 0:c44f0314d6ec 637 args = UINT32_TO_STREAM(args, 0x00000020);
frankvnk 0:c44f0314d6ec 638 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 639 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 640 if(ucBssid)
frankvnk 0:c44f0314d6ec 641 {
frankvnk 0:c44f0314d6ec 642 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 643 }
frankvnk 0:c44f0314d6ec 644 else
frankvnk 0:c44f0314d6ec 645 {
frankvnk 0:c44f0314d6ec 646 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 647 }
frankvnk 0:c44f0314d6ec 648 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 649 args = UINT32_TO_STREAM(args, 0x0000000C + ulSsidLen);
frankvnk 0:c44f0314d6ec 650 args = UINT32_TO_STREAM(args, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 651 args = UINT32_TO_STREAM(args, ulGroupCipher_TxKeyIndex);
frankvnk 0:c44f0314d6ec 652 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 653
frankvnk 0:c44f0314d6ec 654 for(i = 0; i < 4; i++)
frankvnk 0:c44f0314d6ec 655 {
frankvnk 0:c44f0314d6ec 656 unsigned char *p = &ucPf_OrKey[i * ulPairwiseCipher_Or_TxKeyLen];
frankvnk 0:c44f0314d6ec 657
frankvnk 0:c44f0314d6ec 658 ARRAY_TO_STREAM(args, p, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 659 }
frankvnk 0:c44f0314d6ec 660
frankvnk 0:c44f0314d6ec 661 arg_len = WLAN_ADD_PROFILE_WEP_PARAM_LEN + ulSsidLen +
frankvnk 0:c44f0314d6ec 662 ulPairwiseCipher_Or_TxKeyLen * 4;
frankvnk 0:c44f0314d6ec 663
frankvnk 0:c44f0314d6ec 664 }
frankvnk 0:c44f0314d6ec 665 break;
frankvnk 0:c44f0314d6ec 666
frankvnk 0:c44f0314d6ec 667 //WPA
frankvnk 0:c44f0314d6ec 668 //WPA2
frankvnk 0:c44f0314d6ec 669 case WLAN_SEC_WPA:
frankvnk 0:c44f0314d6ec 670 case WLAN_SEC_WPA2:
frankvnk 0:c44f0314d6ec 671 {
frankvnk 0:c44f0314d6ec 672 args = UINT32_TO_STREAM(args, 0x00000028);
frankvnk 0:c44f0314d6ec 673 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 674 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 675 if(ucBssid)
frankvnk 0:c44f0314d6ec 676 {
frankvnk 0:c44f0314d6ec 677 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 678 }
frankvnk 0:c44f0314d6ec 679 else
frankvnk 0:c44f0314d6ec 680 {
frankvnk 0:c44f0314d6ec 681 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 682 }
frankvnk 0:c44f0314d6ec 683 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 684 args = UINT32_TO_STREAM(args, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 685 args = UINT32_TO_STREAM(args, ulGroupCipher_TxKeyIndex);
frankvnk 0:c44f0314d6ec 686 args = UINT32_TO_STREAM(args, ulKeyMgmt);
frankvnk 0:c44f0314d6ec 687 args = UINT32_TO_STREAM(args, 0x00000008 + ulSsidLen);
frankvnk 0:c44f0314d6ec 688 args = UINT32_TO_STREAM(args, ulPassPhraseLen);
frankvnk 0:c44f0314d6ec 689 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 690 ARRAY_TO_STREAM(args, ucPf_OrKey, ulPassPhraseLen);
frankvnk 0:c44f0314d6ec 691
frankvnk 0:c44f0314d6ec 692 arg_len = WLAN_ADD_PROFILE_WPA_PARAM_LEN + ulSsidLen + ulPassPhraseLen;
frankvnk 0:c44f0314d6ec 693 }
frankvnk 0:c44f0314d6ec 694
frankvnk 0:c44f0314d6ec 695 break;
frankvnk 0:c44f0314d6ec 696 }
frankvnk 0:c44f0314d6ec 697
frankvnk 0:c44f0314d6ec 698 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 699 hci_command_send(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, ptr, arg_len);
frankvnk 0:c44f0314d6ec 700
frankvnk 0:c44f0314d6ec 701 // Wait for command complete event
frankvnk 0:c44f0314d6ec 702 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, &ret);
frankvnk 0:c44f0314d6ec 703
frankvnk 0:c44f0314d6ec 704 return(ret);
frankvnk 0:c44f0314d6ec 705 }
frankvnk 0:c44f0314d6ec 706 #else
frankvnk 0:c44f0314d6ec 707 long wlan_add_profile(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 708 unsigned char* ucSsid,
frankvnk 0:c44f0314d6ec 709 unsigned long ulSsidLen,
frankvnk 0:c44f0314d6ec 710 unsigned char *ucBssid,
frankvnk 0:c44f0314d6ec 711 unsigned long ulPriority,
frankvnk 0:c44f0314d6ec 712 unsigned long ulPairwiseCipher_Or_TxKeyLen,
frankvnk 0:c44f0314d6ec 713 unsigned long ulGroupCipher_TxKeyIndex,
frankvnk 0:c44f0314d6ec 714 unsigned long ulKeyMgmt,
frankvnk 0:c44f0314d6ec 715 unsigned char* ucPf_OrKey,
frankvnk 0:c44f0314d6ec 716 unsigned long ulPassPhraseLen)
frankvnk 0:c44f0314d6ec 717 {
frankvnk 0:c44f0314d6ec 718 return -1;
frankvnk 0:c44f0314d6ec 719 }
frankvnk 0:c44f0314d6ec 720 #endif
frankvnk 0:c44f0314d6ec 721
frankvnk 0:c44f0314d6ec 722 //*****************************************************************************
frankvnk 0:c44f0314d6ec 723 //
frankvnk 0:c44f0314d6ec 724 //! wlan_ioctl_del_profile
frankvnk 0:c44f0314d6ec 725 //!
frankvnk 0:c44f0314d6ec 726 //! @param index number of profile to delete
frankvnk 0:c44f0314d6ec 727 //!
frankvnk 0:c44f0314d6ec 728 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 729 //!
frankvnk 0:c44f0314d6ec 730 //! @brief Delete WLAN profile
frankvnk 0:c44f0314d6ec 731 //!
frankvnk 0:c44f0314d6ec 732 //! @Note In order to delete all stored profile, set index to 255.
frankvnk 0:c44f0314d6ec 733 //!
frankvnk 0:c44f0314d6ec 734 //! @sa wlan_add_profile
frankvnk 0:c44f0314d6ec 735 //
frankvnk 0:c44f0314d6ec 736 //*****************************************************************************
frankvnk 0:c44f0314d6ec 737
frankvnk 0:c44f0314d6ec 738 long wlan_ioctl_del_profile(unsigned long ulIndex)
frankvnk 0:c44f0314d6ec 739 {
frankvnk 0:c44f0314d6ec 740 long ret;
frankvnk 0:c44f0314d6ec 741 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 742 unsigned char *args;
frankvnk 0:c44f0314d6ec 743
frankvnk 0:c44f0314d6ec 744 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 745 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 746
frankvnk 0:c44f0314d6ec 747 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 748 args = UINT32_TO_STREAM(args, ulIndex);
frankvnk 0:c44f0314d6ec 749 ret = EFAIL;
frankvnk 0:c44f0314d6ec 750
frankvnk 0:c44f0314d6ec 751 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 752 hci_command_send(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, ptr, WLAN_DEL_PROFILE_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 753
frankvnk 0:c44f0314d6ec 754 // Wait for command complete event
frankvnk 0:c44f0314d6ec 755 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, &ret);
frankvnk 0:c44f0314d6ec 756
frankvnk 0:c44f0314d6ec 757 return(ret);
frankvnk 0:c44f0314d6ec 758 }
frankvnk 0:c44f0314d6ec 759
frankvnk 0:c44f0314d6ec 760 //*****************************************************************************
frankvnk 0:c44f0314d6ec 761 //
frankvnk 0:c44f0314d6ec 762 //! wlan_ioctl_get_scan_results
frankvnk 0:c44f0314d6ec 763 //!
frankvnk 0:c44f0314d6ec 764 //! @param[in] scan_timeout parameter not supported
frankvnk 0:c44f0314d6ec 765 //! @param[out] ucResults scan results (_wlan_full_scan_results_args_t)
frankvnk 0:c44f0314d6ec 766 //!
frankvnk 0:c44f0314d6ec 767 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 768 //!
frankvnk 0:c44f0314d6ec 769 //! @brief Gets entry from scan result table.
frankvnk 0:c44f0314d6ec 770 //! The scan results are returned one by one, and each entry
frankvnk 0:c44f0314d6ec 771 //! represents a single AP found in the area. The following is a
frankvnk 0:c44f0314d6ec 772 //! format of the scan result:
frankvnk 0:c44f0314d6ec 773 //! - 4 Bytes: number of networks found
frankvnk 0:c44f0314d6ec 774 //! - 4 Bytes: The status of the scan: 0 - aged results,
frankvnk 0:c44f0314d6ec 775 //! 1 - results valid, 2 - no results
frankvnk 0:c44f0314d6ec 776 //! - 42 bytes: Result entry, where the bytes are arranged as follows:
frankvnk 0:c44f0314d6ec 777 //!
frankvnk 0:c44f0314d6ec 778 //! - 1 bit isValid - is result valid or not
frankvnk 0:c44f0314d6ec 779 //! - 7 bits rssi - RSSI value;
frankvnk 0:c44f0314d6ec 780 //! - 2 bits: securityMode - security mode of the AP:
frankvnk 0:c44f0314d6ec 781 //! 0 - Open, 1 - WEP, 2 WPA, 3 WPA2
frankvnk 0:c44f0314d6ec 782 //! - 6 bits: SSID name length
frankvnk 0:c44f0314d6ec 783 //! - 2 bytes: the time at which the entry has entered into
frankvnk 0:c44f0314d6ec 784 //! scans result table
frankvnk 0:c44f0314d6ec 785 //! - 32 bytes: SSID name
frankvnk 0:c44f0314d6ec 786 //! - 6 bytes: BSSID
frankvnk 0:c44f0314d6ec 787 //!
frankvnk 0:c44f0314d6ec 788 //! @Note scan_timeout, is not supported on this version.
frankvnk 0:c44f0314d6ec 789 //!
frankvnk 0:c44f0314d6ec 790 //! @sa wlan_ioctl_set_scan_params
frankvnk 0:c44f0314d6ec 791 //
frankvnk 0:c44f0314d6ec 792 //*****************************************************************************
frankvnk 0:c44f0314d6ec 793
frankvnk 0:c44f0314d6ec 794 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 795 long wlan_ioctl_get_scan_results(unsigned long ulScanTimeout,
frankvnk 0:c44f0314d6ec 796 unsigned char *ucResults)
frankvnk 0:c44f0314d6ec 797 {
frankvnk 0:c44f0314d6ec 798 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 799 unsigned char *args;
frankvnk 0:c44f0314d6ec 800
frankvnk 0:c44f0314d6ec 801 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 802 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 803
frankvnk 0:c44f0314d6ec 804 // Fill in temporary command buffer
frankvnk 0:c44f0314d6ec 805 args = UINT32_TO_STREAM(args, ulScanTimeout);
frankvnk 0:c44f0314d6ec 806
frankvnk 0:c44f0314d6ec 807 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 808 hci_command_send(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, ptr, WLAN_GET_SCAN_RESULTS_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 809
frankvnk 0:c44f0314d6ec 810 // Wait for command complete event
frankvnk 0:c44f0314d6ec 811 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, ucResults);
frankvnk 0:c44f0314d6ec 812
frankvnk 0:c44f0314d6ec 813 return(0);
frankvnk 0:c44f0314d6ec 814 }
frankvnk 0:c44f0314d6ec 815 #endif
frankvnk 0:c44f0314d6ec 816
frankvnk 0:c44f0314d6ec 817 //*****************************************************************************
frankvnk 0:c44f0314d6ec 818 //
frankvnk 0:c44f0314d6ec 819 //! wlan_ioctl_set_scan_params
frankvnk 0:c44f0314d6ec 820 //!
frankvnk 0:c44f0314d6ec 821 //! @param uiEnable - start/stop application scan:
frankvnk 0:c44f0314d6ec 822 //! 1 = start scan with default interval value of 10 min.
frankvnk 0:c44f0314d6ec 823 //! in order to set a different scan interval value apply the value
frankvnk 0:c44f0314d6ec 824 //! in milliseconds. minimum 1 second. 0=stop). Wlan reset
frankvnk 0:c44f0314d6ec 825 //! (wlan_stop() wlan_start()) is needed when changing scan interval
frankvnk 0:c44f0314d6ec 826 //! value. Saved: No
frankvnk 0:c44f0314d6ec 827 //! @param uiMinDwellTime minimum dwell time value to be used for each
frankvnk 0:c44f0314d6ec 828 //! channel, in milliseconds. Saved: yes
frankvnk 0:c44f0314d6ec 829 //! Recommended Value: 100 (Default: 20)
frankvnk 0:c44f0314d6ec 830 //! @param uiMaxDwellTime maximum dwell time value to be used for each
frankvnk 0:c44f0314d6ec 831 //! channel, in milliseconds. Saved: yes
frankvnk 0:c44f0314d6ec 832 //! Recommended Value: 100 (Default: 30)
frankvnk 0:c44f0314d6ec 833 //! @param uiNumOfProbeRequests max probe request between dwell time.
frankvnk 0:c44f0314d6ec 834 //! Saved: yes. Recommended Value: 5 (Default:2)
frankvnk 0:c44f0314d6ec 835 //! @param uiChannelMask bitwise, up to 13 channels (0x1fff).
frankvnk 0:c44f0314d6ec 836 //! Saved: yes. Default: 0x7ff
frankvnk 0:c44f0314d6ec 837 //! @param uiRSSIThreshold RSSI threshold. Saved: yes (Default: -80)
frankvnk 0:c44f0314d6ec 838 //! @param uiSNRThreshold NSR threshold. Saved: yes (Default: 0)
frankvnk 0:c44f0314d6ec 839 //! @param uiDefaultTxPower probe Tx power. Saved: yes (Default: 205)
frankvnk 0:c44f0314d6ec 840 //! @param aiIntervalList pointer to array with 16 entries (16 channels)
frankvnk 0:c44f0314d6ec 841 //! each entry (unsigned long) holds timeout between periodic scan
frankvnk 0:c44f0314d6ec 842 //! (connection scan) - in millisecond. Saved: yes. Default 2000ms.
frankvnk 0:c44f0314d6ec 843 //!
frankvnk 0:c44f0314d6ec 844 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 845 //!
frankvnk 0:c44f0314d6ec 846 //! @brief start and stop scan procedure. Set scan parameters.
frankvnk 0:c44f0314d6ec 847 //!
frankvnk 0:c44f0314d6ec 848 //! @Note uiDefaultTxPower, is not supported on this version.
frankvnk 0:c44f0314d6ec 849 //!
frankvnk 0:c44f0314d6ec 850 //! @sa wlan_ioctl_get_scan_results
frankvnk 0:c44f0314d6ec 851 //
frankvnk 0:c44f0314d6ec 852 //*****************************************************************************
frankvnk 0:c44f0314d6ec 853
frankvnk 0:c44f0314d6ec 854 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 855 long wlan_ioctl_set_scan_params(unsigned long uiEnable,
frankvnk 0:c44f0314d6ec 856 unsigned long uiMinDwellTime,
frankvnk 0:c44f0314d6ec 857 unsigned long uiMaxDwellTime,
frankvnk 0:c44f0314d6ec 858 unsigned long uiNumOfProbeRequests,
frankvnk 0:c44f0314d6ec 859 unsigned long uiChannelMask,
frankvnk 0:c44f0314d6ec 860 long iRSSIThreshold,
frankvnk 0:c44f0314d6ec 861 unsigned long uiSNRThreshold,
frankvnk 0:c44f0314d6ec 862 unsigned long uiDefaultTxPower,
frankvnk 0:c44f0314d6ec 863 unsigned long *aiIntervalList)
frankvnk 0:c44f0314d6ec 864 {
frankvnk 0:c44f0314d6ec 865 unsigned long uiRes;
frankvnk 0:c44f0314d6ec 866 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 867 unsigned char *args;
frankvnk 0:c44f0314d6ec 868
frankvnk 0:c44f0314d6ec 869 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 870 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 871
frankvnk 0:c44f0314d6ec 872 // Fill in temporary command buffer
frankvnk 0:c44f0314d6ec 873 args = UINT32_TO_STREAM(args, 36);
frankvnk 0:c44f0314d6ec 874 args = UINT32_TO_STREAM(args, uiEnable);
frankvnk 0:c44f0314d6ec 875 args = UINT32_TO_STREAM(args, uiMinDwellTime);
frankvnk 0:c44f0314d6ec 876 args = UINT32_TO_STREAM(args, uiMaxDwellTime);
frankvnk 0:c44f0314d6ec 877 args = UINT32_TO_STREAM(args, uiNumOfProbeRequests);
frankvnk 0:c44f0314d6ec 878 args = UINT32_TO_STREAM(args, uiChannelMask);
frankvnk 0:c44f0314d6ec 879 args = UINT32_TO_STREAM(args, iRSSIThreshold);
frankvnk 0:c44f0314d6ec 880 args = UINT32_TO_STREAM(args, uiSNRThreshold);
frankvnk 0:c44f0314d6ec 881 args = UINT32_TO_STREAM(args, uiDefaultTxPower);
frankvnk 0:c44f0314d6ec 882 ARRAY_TO_STREAM(args, aiIntervalList, sizeof(unsigned long) * SL_SET_SCAN_PARAMS_INTERVAL_LIST_SIZE);
frankvnk 0:c44f0314d6ec 883
frankvnk 0:c44f0314d6ec 884 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 885 hci_command_send(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, ptr, WLAN_SET_SCAN_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 886
frankvnk 0:c44f0314d6ec 887 // Wait for command complete event
frankvnk 0:c44f0314d6ec 888 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, &uiRes);
frankvnk 0:c44f0314d6ec 889
frankvnk 0:c44f0314d6ec 890 return(uiRes);
frankvnk 0:c44f0314d6ec 891 }
frankvnk 0:c44f0314d6ec 892 #endif
frankvnk 0:c44f0314d6ec 893
frankvnk 0:c44f0314d6ec 894 //*****************************************************************************
frankvnk 0:c44f0314d6ec 895 //
frankvnk 0:c44f0314d6ec 896 //! wlan_set_event_mask
frankvnk 0:c44f0314d6ec 897 //!
frankvnk 0:c44f0314d6ec 898 //! @param mask mask option:
frankvnk 0:c44f0314d6ec 899 //! HCI_EVNT_WLAN_UNSOL_CONNECT connect event
frankvnk 0:c44f0314d6ec 900 //! HCI_EVNT_WLAN_UNSOL_DISCONNECT disconnect event
frankvnk 0:c44f0314d6ec 901 //! HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE smart config done
frankvnk 0:c44f0314d6ec 902 //! HCI_EVNT_WLAN_UNSOL_INIT init done
frankvnk 0:c44f0314d6ec 903 //! HCI_EVNT_WLAN_UNSOL_DHCP dhcp event report
frankvnk 0:c44f0314d6ec 904 //! HCI_EVNT_WLAN_ASYNC_PING_REPORT ping report
frankvnk 0:c44f0314d6ec 905 //! HCI_EVNT_WLAN_KEEPALIVE keepalive
frankvnk 0:c44f0314d6ec 906 //! HCI_EVNT_WLAN_TX_COMPLETE - disable information on end of transmission
frankvnk 0:c44f0314d6ec 907 //! Saved: no.
frankvnk 0:c44f0314d6ec 908 //!
frankvnk 0:c44f0314d6ec 909 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 910 //!
frankvnk 0:c44f0314d6ec 911 //! @brief Mask event according to bit mask. In case that event is
frankvnk 0:c44f0314d6ec 912 //! masked (1), the device will not send the masked event to host.
frankvnk 0:c44f0314d6ec 913 //
frankvnk 0:c44f0314d6ec 914 //*****************************************************************************
frankvnk 0:c44f0314d6ec 915
frankvnk 0:c44f0314d6ec 916 long wlan_set_event_mask(unsigned long ulMask)
frankvnk 0:c44f0314d6ec 917 {
frankvnk 0:c44f0314d6ec 918 long ret;
frankvnk 0:c44f0314d6ec 919 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 920 unsigned char *args;
frankvnk 0:c44f0314d6ec 921
frankvnk 0:c44f0314d6ec 922
frankvnk 0:c44f0314d6ec 923 if ((ulMask & HCI_EVNT_WLAN_TX_COMPLETE) == HCI_EVNT_WLAN_TX_COMPLETE)
frankvnk 0:c44f0314d6ec 924 {
frankvnk 0:c44f0314d6ec 925 tSLInformation.InformHostOnTxComplete = 0;
frankvnk 0:c44f0314d6ec 926
frankvnk 0:c44f0314d6ec 927 // Since an event is a virtual event - i.e. it is not coming from CC3000
frankvnk 0:c44f0314d6ec 928 // there is no need to send anything to the device if it was an only event
frankvnk 0:c44f0314d6ec 929 if (ulMask == HCI_EVNT_WLAN_TX_COMPLETE)
frankvnk 0:c44f0314d6ec 930 {
frankvnk 0:c44f0314d6ec 931 return 0;
frankvnk 0:c44f0314d6ec 932 }
frankvnk 0:c44f0314d6ec 933
frankvnk 0:c44f0314d6ec 934 ulMask &= ~HCI_EVNT_WLAN_TX_COMPLETE;
frankvnk 0:c44f0314d6ec 935 ulMask |= HCI_EVNT_WLAN_UNSOL_BASE;
frankvnk 0:c44f0314d6ec 936 }
frankvnk 0:c44f0314d6ec 937 else
frankvnk 0:c44f0314d6ec 938 {
frankvnk 0:c44f0314d6ec 939 tSLInformation.InformHostOnTxComplete = 1;
frankvnk 0:c44f0314d6ec 940 }
frankvnk 0:c44f0314d6ec 941
frankvnk 0:c44f0314d6ec 942 ret = EFAIL;
frankvnk 0:c44f0314d6ec 943 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 944 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 945
frankvnk 0:c44f0314d6ec 946 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 947 args = UINT32_TO_STREAM(args, ulMask);
frankvnk 0:c44f0314d6ec 948
frankvnk 0:c44f0314d6ec 949 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 950 hci_command_send(HCI_CMND_EVENT_MASK, ptr, WLAN_SET_MASK_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 951
frankvnk 0:c44f0314d6ec 952 // Wait for command complete event
frankvnk 0:c44f0314d6ec 953 SimpleLinkWaitEvent(HCI_CMND_EVENT_MASK, &ret);
frankvnk 0:c44f0314d6ec 954
frankvnk 0:c44f0314d6ec 955 return(ret);
frankvnk 0:c44f0314d6ec 956 }
frankvnk 0:c44f0314d6ec 957
frankvnk 0:c44f0314d6ec 958 //*****************************************************************************
frankvnk 0:c44f0314d6ec 959 //
frankvnk 0:c44f0314d6ec 960 //! wlan_ioctl_statusget
frankvnk 0:c44f0314d6ec 961 //!
frankvnk 0:c44f0314d6ec 962 //! @param none
frankvnk 0:c44f0314d6ec 963 //!
frankvnk 0:c44f0314d6ec 964 //! @return WLAN_STATUS_DISCONNECTED, WLAN_STATUS_SCANING,
frankvnk 0:c44f0314d6ec 965 //! STATUS_CONNECTING or WLAN_STATUS_CONNECTED
frankvnk 0:c44f0314d6ec 966 //!
frankvnk 0:c44f0314d6ec 967 //! @brief get wlan status: disconnected, scanning, connecting or connected
frankvnk 0:c44f0314d6ec 968 //
frankvnk 0:c44f0314d6ec 969 //*****************************************************************************
frankvnk 0:c44f0314d6ec 970
frankvnk 0:c44f0314d6ec 971 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 972 long wlan_ioctl_statusget(void)
frankvnk 0:c44f0314d6ec 973 {
frankvnk 0:c44f0314d6ec 974 long ret;
frankvnk 0:c44f0314d6ec 975 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 976
frankvnk 0:c44f0314d6ec 977 ret = EFAIL;
frankvnk 0:c44f0314d6ec 978 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 979
frankvnk 0:c44f0314d6ec 980 hci_command_send(HCI_CMND_WLAN_IOCTL_STATUSGET,ptr, 0);
frankvnk 0:c44f0314d6ec 981
frankvnk 0:c44f0314d6ec 982 // Wait for command complete event
frankvnk 0:c44f0314d6ec 983 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_STATUSGET, &ret);
frankvnk 0:c44f0314d6ec 984
frankvnk 0:c44f0314d6ec 985 return(ret);
frankvnk 0:c44f0314d6ec 986 }
frankvnk 0:c44f0314d6ec 987 #endif
frankvnk 0:c44f0314d6ec 988
frankvnk 0:c44f0314d6ec 989 //*****************************************************************************
frankvnk 0:c44f0314d6ec 990 //
frankvnk 0:c44f0314d6ec 991 //! wlan_smart_config_start
frankvnk 0:c44f0314d6ec 992 //!
frankvnk 0:c44f0314d6ec 993 //! @param algoEncryptedFlag indicates whether the information is encrypted
frankvnk 0:c44f0314d6ec 994 //!
frankvnk 0:c44f0314d6ec 995 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 996 //!
frankvnk 0:c44f0314d6ec 997 //! @brief Start to acquire device profile. The device acquire its own
frankvnk 0:c44f0314d6ec 998 //! profile, if profile message is found. The acquired AP information
frankvnk 0:c44f0314d6ec 999 //! is stored in CC3000 EEPROM only in case AES128 encryption is used.
frankvnk 0:c44f0314d6ec 1000 //! In case AES128 encryption is not used, a profile is created by
frankvnk 0:c44f0314d6ec 1001 //! CC3000 internally.
frankvnk 0:c44f0314d6ec 1002 //!
frankvnk 0:c44f0314d6ec 1003 //! @Note An asynchronous event - Smart Config Done will be generated as soon
frankvnk 0:c44f0314d6ec 1004 //! as the process finishes successfully.
frankvnk 0:c44f0314d6ec 1005 //!
frankvnk 0:c44f0314d6ec 1006 //! @sa wlan_smart_config_set_prefix , wlan_smart_config_stop
frankvnk 0:c44f0314d6ec 1007 //
frankvnk 0:c44f0314d6ec 1008 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1009
frankvnk 0:c44f0314d6ec 1010 long wlan_smart_config_start(unsigned long algoEncryptedFlag)
frankvnk 0:c44f0314d6ec 1011 {
frankvnk 0:c44f0314d6ec 1012 long ret;
frankvnk 0:c44f0314d6ec 1013 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 1014 unsigned char *args;
frankvnk 0:c44f0314d6ec 1015
frankvnk 0:c44f0314d6ec 1016 ret = EFAIL;
frankvnk 0:c44f0314d6ec 1017 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 1018 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 1019
frankvnk 0:c44f0314d6ec 1020 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 1021 args = UINT32_TO_STREAM(args, algoEncryptedFlag);
frankvnk 0:c44f0314d6ec 1022 ret = EFAIL;
frankvnk 0:c44f0314d6ec 1023
frankvnk 0:c44f0314d6ec 1024 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, ptr, WLAN_SMART_CONFIG_START_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 1025
frankvnk 0:c44f0314d6ec 1026 // Wait for command complete event
frankvnk 0:c44f0314d6ec 1027 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, &ret);
frankvnk 0:c44f0314d6ec 1028
frankvnk 0:c44f0314d6ec 1029 return(ret);
frankvnk 0:c44f0314d6ec 1030 }
frankvnk 0:c44f0314d6ec 1031
frankvnk 0:c44f0314d6ec 1032 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1033 //
frankvnk 0:c44f0314d6ec 1034 //! wlan_smart_config_stop
frankvnk 0:c44f0314d6ec 1035 //!
frankvnk 0:c44f0314d6ec 1036 //! @param algoEncryptedFlag indicates whether the information is encrypted
frankvnk 0:c44f0314d6ec 1037 //!
frankvnk 0:c44f0314d6ec 1038 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 1039 //!
frankvnk 0:c44f0314d6ec 1040 //! @brief Stop the acquire profile procedure
frankvnk 0:c44f0314d6ec 1041 //!
frankvnk 0:c44f0314d6ec 1042 //! @sa wlan_smart_config_start , wlan_smart_config_set_prefix
frankvnk 0:c44f0314d6ec 1043 //
frankvnk 0:c44f0314d6ec 1044 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1045
frankvnk 0:c44f0314d6ec 1046 long wlan_smart_config_stop(void)
frankvnk 0:c44f0314d6ec 1047 {
frankvnk 0:c44f0314d6ec 1048 long ret;
frankvnk 0:c44f0314d6ec 1049 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 1050
frankvnk 0:c44f0314d6ec 1051 ret = EFAIL;
frankvnk 0:c44f0314d6ec 1052 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 1053
frankvnk 0:c44f0314d6ec 1054 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, ptr, 0);
frankvnk 0:c44f0314d6ec 1055
frankvnk 0:c44f0314d6ec 1056 // Wait for command complete event
frankvnk 0:c44f0314d6ec 1057 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, &ret);
frankvnk 0:c44f0314d6ec 1058
frankvnk 0:c44f0314d6ec 1059 return(ret);
frankvnk 0:c44f0314d6ec 1060 }
frankvnk 0:c44f0314d6ec 1061
frankvnk 0:c44f0314d6ec 1062 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1063 //
frankvnk 0:c44f0314d6ec 1064 //! wlan_smart_config_set_prefix
frankvnk 0:c44f0314d6ec 1065 //!
frankvnk 0:c44f0314d6ec 1066 //! @param newPrefix 3 bytes identify the SSID prefix for the Smart Config.
frankvnk 0:c44f0314d6ec 1067 //!
frankvnk 0:c44f0314d6ec 1068 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 1069 //!
frankvnk 0:c44f0314d6ec 1070 //! @brief Configure station ssid prefix. The prefix is used internally
frankvnk 0:c44f0314d6ec 1071 //! in CC3000. It should always be TTT.
frankvnk 0:c44f0314d6ec 1072 //!
frankvnk 0:c44f0314d6ec 1073 //! @Note The prefix is stored in CC3000 NVMEM
frankvnk 0:c44f0314d6ec 1074 //!
frankvnk 0:c44f0314d6ec 1075 //! @sa wlan_smart_config_start , wlan_smart_config_stop
frankvnk 0:c44f0314d6ec 1076 //
frankvnk 0:c44f0314d6ec 1077 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1078
frankvnk 0:c44f0314d6ec 1079 long wlan_smart_config_set_prefix(char* cNewPrefix)
frankvnk 0:c44f0314d6ec 1080 {
frankvnk 0:c44f0314d6ec 1081 long ret;
frankvnk 0:c44f0314d6ec 1082 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 1083 unsigned char *args;
frankvnk 0:c44f0314d6ec 1084
frankvnk 0:c44f0314d6ec 1085 ret = EFAIL;
frankvnk 0:c44f0314d6ec 1086 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 1087 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 1088
frankvnk 0:c44f0314d6ec 1089 if (cNewPrefix == NULL)
frankvnk 0:c44f0314d6ec 1090 return ret;
frankvnk 0:c44f0314d6ec 1091 else // with the new Smart Config, prefix must be TTT
frankvnk 0:c44f0314d6ec 1092 {
frankvnk 0:c44f0314d6ec 1093 *cNewPrefix = 'T';
frankvnk 0:c44f0314d6ec 1094 *(cNewPrefix + 1) = 'T';
frankvnk 0:c44f0314d6ec 1095 *(cNewPrefix + 2) = 'T';
frankvnk 0:c44f0314d6ec 1096 }
frankvnk 0:c44f0314d6ec 1097
frankvnk 0:c44f0314d6ec 1098 ARRAY_TO_STREAM(args, cNewPrefix, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
frankvnk 0:c44f0314d6ec 1099
frankvnk 0:c44f0314d6ec 1100 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, ptr, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
frankvnk 0:c44f0314d6ec 1101
frankvnk 0:c44f0314d6ec 1102 // Wait for command complete event
frankvnk 0:c44f0314d6ec 1103 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, &ret);
frankvnk 0:c44f0314d6ec 1104
frankvnk 0:c44f0314d6ec 1105 return(ret);
frankvnk 0:c44f0314d6ec 1106 }
frankvnk 0:c44f0314d6ec 1107
frankvnk 0:c44f0314d6ec 1108 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1109 //
frankvnk 0:c44f0314d6ec 1110 //! wlan_smart_config_process
frankvnk 0:c44f0314d6ec 1111 //!
frankvnk 0:c44f0314d6ec 1112 //! @param none
frankvnk 0:c44f0314d6ec 1113 //!
frankvnk 0:c44f0314d6ec 1114 //! @return On success, zero is returned. On error, -1 is returned
frankvnk 0:c44f0314d6ec 1115 //!
frankvnk 0:c44f0314d6ec 1116 //! @brief process the acquired data and store it as a profile. The acquired
frankvnk 0:c44f0314d6ec 1117 //! AP information is stored in CC3000 EEPROM encrypted.
frankvnk 0:c44f0314d6ec 1118 //! The encrypted data is decrypted and stored as a profile.
frankvnk 0:c44f0314d6ec 1119 //! behavior is as defined by connection policy.
frankvnk 0:c44f0314d6ec 1120 //
frankvnk 0:c44f0314d6ec 1121 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1122
frankvnk 0:c44f0314d6ec 1123
frankvnk 0:c44f0314d6ec 1124 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 1125 long wlan_smart_config_process()
frankvnk 0:c44f0314d6ec 1126 {
frankvnk 0:c44f0314d6ec 1127 signed long returnValue;
frankvnk 0:c44f0314d6ec 1128 unsigned long ssidLen, keyLen;
frankvnk 0:c44f0314d6ec 1129 unsigned char *decKeyPtr;
frankvnk 0:c44f0314d6ec 1130 unsigned char *ssidPtr;
frankvnk 0:c44f0314d6ec 1131
frankvnk 0:c44f0314d6ec 1132 // read the key from EEPROM - fileID 12
frankvnk 0:c44f0314d6ec 1133 returnValue = aes_read_key(key);
frankvnk 0:c44f0314d6ec 1134
frankvnk 0:c44f0314d6ec 1135 if (returnValue != 0)
frankvnk 0:c44f0314d6ec 1136 return returnValue;
frankvnk 0:c44f0314d6ec 1137
frankvnk 0:c44f0314d6ec 1138 // read the received data from fileID #13 and parse it according to the followings:
frankvnk 0:c44f0314d6ec 1139 // 1) SSID LEN - not encrypted
frankvnk 0:c44f0314d6ec 1140 // 2) SSID - not encrypted
frankvnk 0:c44f0314d6ec 1141 // 3) KEY LEN - not encrypted. always 32 bytes long
frankvnk 0:c44f0314d6ec 1142 // 4) Security type - not encrypted
frankvnk 0:c44f0314d6ec 1143 // 5) KEY - encrypted together with true key length as the first byte in KEY
frankvnk 0:c44f0314d6ec 1144 // to elaborate, there are two corner cases:
frankvnk 0:c44f0314d6ec 1145 // 1) the KEY is 32 bytes long. In this case, the first byte does not represent KEY length
frankvnk 0:c44f0314d6ec 1146 // 2) the KEY is 31 bytes long. In this case, the first byte represent KEY length and equals 31
frankvnk 0:c44f0314d6ec 1147 returnValue = nvmem_read(NVMEM_SHARED_MEM_FILEID, SMART_CONFIG_PROFILE_SIZE, 0, profileArray);
frankvnk 0:c44f0314d6ec 1148
frankvnk 0:c44f0314d6ec 1149 if (returnValue != 0)
frankvnk 0:c44f0314d6ec 1150 return returnValue;
frankvnk 0:c44f0314d6ec 1151
frankvnk 0:c44f0314d6ec 1152 ssidPtr = &profileArray[1];
frankvnk 0:c44f0314d6ec 1153
frankvnk 0:c44f0314d6ec 1154 ssidLen = profileArray[0];
frankvnk 0:c44f0314d6ec 1155
frankvnk 0:c44f0314d6ec 1156 decKeyPtr = &profileArray[profileArray[0] + 3];
frankvnk 0:c44f0314d6ec 1157
frankvnk 0:c44f0314d6ec 1158 aes_decrypt(decKeyPtr, key);
frankvnk 0:c44f0314d6ec 1159 if (profileArray[profileArray[0] + 1] > 16)
frankvnk 0:c44f0314d6ec 1160 aes_decrypt((unsigned char *)(decKeyPtr + 16), key);
frankvnk 0:c44f0314d6ec 1161
frankvnk 0:c44f0314d6ec 1162 if (*(unsigned char *)(decKeyPtr +31) != 0)
frankvnk 0:c44f0314d6ec 1163 {
frankvnk 0:c44f0314d6ec 1164 if (*decKeyPtr == 31)
frankvnk 0:c44f0314d6ec 1165 {
frankvnk 0:c44f0314d6ec 1166 keyLen = 31;
frankvnk 0:c44f0314d6ec 1167 decKeyPtr++;
frankvnk 0:c44f0314d6ec 1168 }
frankvnk 0:c44f0314d6ec 1169 else
frankvnk 0:c44f0314d6ec 1170 {
frankvnk 0:c44f0314d6ec 1171 keyLen = 32;
frankvnk 0:c44f0314d6ec 1172 }
frankvnk 0:c44f0314d6ec 1173 }
frankvnk 0:c44f0314d6ec 1174 else
frankvnk 0:c44f0314d6ec 1175 {
frankvnk 0:c44f0314d6ec 1176 keyLen = *decKeyPtr;
frankvnk 0:c44f0314d6ec 1177 decKeyPtr++;
frankvnk 0:c44f0314d6ec 1178 }
frankvnk 0:c44f0314d6ec 1179
frankvnk 0:c44f0314d6ec 1180 // add a profile
frankvnk 0:c44f0314d6ec 1181 switch (profileArray[profileArray[0] + 2])
frankvnk 0:c44f0314d6ec 1182 {
frankvnk 0:c44f0314d6ec 1183 case WLAN_SEC_UNSEC://None
frankvnk 0:c44f0314d6ec 1184 {
frankvnk 0:c44f0314d6ec 1185 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
frankvnk 0:c44f0314d6ec 1186 ssidPtr, // SSID
frankvnk 0:c44f0314d6ec 1187 ssidLen, // SSID length
frankvnk 0:c44f0314d6ec 1188 NULL, // BSSID
frankvnk 0:c44f0314d6ec 1189 1, // Priority
frankvnk 0:c44f0314d6ec 1190 0, 0, 0, 0, 0);
frankvnk 0:c44f0314d6ec 1191
frankvnk 0:c44f0314d6ec 1192 break;
frankvnk 0:c44f0314d6ec 1193 }
frankvnk 0:c44f0314d6ec 1194
frankvnk 0:c44f0314d6ec 1195 case WLAN_SEC_WEP://WEP
frankvnk 0:c44f0314d6ec 1196 {
frankvnk 0:c44f0314d6ec 1197 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
frankvnk 0:c44f0314d6ec 1198 ssidPtr, // SSID
frankvnk 0:c44f0314d6ec 1199 ssidLen, // SSID length
frankvnk 0:c44f0314d6ec 1200 NULL, // BSSID
frankvnk 0:c44f0314d6ec 1201 1, // Priority
frankvnk 0:c44f0314d6ec 1202 keyLen, // KEY length
frankvnk 0:c44f0314d6ec 1203 0, // KEY index
frankvnk 0:c44f0314d6ec 1204 0,
frankvnk 0:c44f0314d6ec 1205 decKeyPtr, // KEY
frankvnk 0:c44f0314d6ec 1206 0);
frankvnk 0:c44f0314d6ec 1207
frankvnk 0:c44f0314d6ec 1208 break;
frankvnk 0:c44f0314d6ec 1209 }
frankvnk 0:c44f0314d6ec 1210
frankvnk 0:c44f0314d6ec 1211 case WLAN_SEC_WPA://WPA
frankvnk 0:c44f0314d6ec 1212 case WLAN_SEC_WPA2://WPA2
frankvnk 0:c44f0314d6ec 1213 {
frankvnk 0:c44f0314d6ec 1214 returnValue = wlan_add_profile(WLAN_SEC_WPA2, // security type
frankvnk 0:c44f0314d6ec 1215 ssidPtr,
frankvnk 0:c44f0314d6ec 1216 ssidLen,
frankvnk 0:c44f0314d6ec 1217 NULL, // BSSID
frankvnk 0:c44f0314d6ec 1218 1, // Priority
frankvnk 0:c44f0314d6ec 1219 0x18, // PairwiseCipher
frankvnk 0:c44f0314d6ec 1220 0x1e, // GroupCipher
frankvnk 0:c44f0314d6ec 1221 2, // KEY management
frankvnk 0:c44f0314d6ec 1222 decKeyPtr, // KEY
frankvnk 0:c44f0314d6ec 1223 keyLen); // KEY length
frankvnk 0:c44f0314d6ec 1224
frankvnk 0:c44f0314d6ec 1225 break;
frankvnk 0:c44f0314d6ec 1226 }
frankvnk 0:c44f0314d6ec 1227 }
frankvnk 0:c44f0314d6ec 1228
frankvnk 0:c44f0314d6ec 1229 return returnValue;
frankvnk 0:c44f0314d6ec 1230 }
frankvnk 0:c44f0314d6ec 1231 #endif //CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 1232
frankvnk 0:c44f0314d6ec 1233 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1234 //
frankvnk 0:c44f0314d6ec 1235 // Close the Doxygen group.
frankvnk 0:c44f0314d6ec 1236 //! @}
frankvnk 0:c44f0314d6ec 1237 //
frankvnk 0:c44f0314d6ec 1238 //*****************************************************************************
frankvnk 0:c44f0314d6ec 1239
frankvnk 0:c44f0314d6ec 1240