Driver for CC3000 Wi-Fi module

Dependencies:   NVIC_set_all_priorities

Dependents:   CC3000_Simple_Socket Wi-Go_IOT_Demo

Information

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

CC3000 Wi-Fi module library

Info

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

Differences with TI's original code

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

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

Using the Library

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

Using the library with other processors

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

#include "NVIC_set_all_priorities.h"


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

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

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

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

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

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

#define WLAN_READ_IRQ       wlan_int

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

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

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

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

API documentation

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

Committer:
frankvnk
Date:
Fri Nov 29 13:20:07 2013 +0000
Revision:
13:e1ab6b5ab826
Parent:
6:d733efcc2c56
update CC3000_MAXIMAL_RX_SIZE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:c44f0314d6ec 1 /*****************************************************************************
frankvnk 0:c44f0314d6ec 2 *
frankvnk 6:d733efcc2c56 3 * wlan - CC3000 Host Driver Implementation.
frankvnk 0:c44f0314d6ec 4 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
frankvnk 0:c44f0314d6ec 5 *
frankvnk 0:c44f0314d6ec 6 * Redistribution and use in source and binary forms, with or without
frankvnk 0:c44f0314d6ec 7 * modification, are permitted provided that the following conditions
frankvnk 0:c44f0314d6ec 8 * are met:
frankvnk 0:c44f0314d6ec 9 *
frankvnk 0:c44f0314d6ec 10 * Redistributions of source code must retain the above copyright
frankvnk 0:c44f0314d6ec 11 * notice, this list of conditions and the following disclaimer.
frankvnk 0:c44f0314d6ec 12 *
frankvnk 0:c44f0314d6ec 13 * Redistributions in binary form must reproduce the above copyright
frankvnk 0:c44f0314d6ec 14 * notice, this list of conditions and the following disclaimer in the
frankvnk 0:c44f0314d6ec 15 * documentation and/or other materials provided with the
frankvnk 0:c44f0314d6ec 16 * distribution.
frankvnk 0:c44f0314d6ec 17 *
frankvnk 0:c44f0314d6ec 18 * Neither the name of Texas Instruments Incorporated nor the names of
frankvnk 0:c44f0314d6ec 19 * its contributors may be used to endorse or promote products derived
frankvnk 0:c44f0314d6ec 20 * from this software without specific prior written permission.
frankvnk 0:c44f0314d6ec 21 *
frankvnk 0:c44f0314d6ec 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
frankvnk 0:c44f0314d6ec 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
frankvnk 0:c44f0314d6ec 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
frankvnk 0:c44f0314d6ec 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
frankvnk 0:c44f0314d6ec 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
frankvnk 0:c44f0314d6ec 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
frankvnk 0:c44f0314d6ec 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
frankvnk 0:c44f0314d6ec 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
frankvnk 0:c44f0314d6ec 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
frankvnk 0:c44f0314d6ec 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
frankvnk 0:c44f0314d6ec 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
frankvnk 0:c44f0314d6ec 33 *
frankvnk 0:c44f0314d6ec 34 *****************************************************************************/
frankvnk 0:c44f0314d6ec 35
frankvnk 0:c44f0314d6ec 36 #include "wlan.h"
frankvnk 0:c44f0314d6ec 37
frankvnk 0:c44f0314d6ec 38 extern void WriteWlanPin( unsigned char val );
frankvnk 0:c44f0314d6ec 39 volatile sSimplLinkInformation tSLInformation;
frankvnk 0:c44f0314d6ec 40
frankvnk 0:c44f0314d6ec 41 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 42 unsigned char key[AES128_KEY_SIZE];
frankvnk 0:c44f0314d6ec 43 unsigned char profileArray[SMART_CONFIG_PROFILE_SIZE];
frankvnk 0:c44f0314d6ec 44 #endif //CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 45
frankvnk 0:c44f0314d6ec 46
frankvnk 0:c44f0314d6ec 47 static void SimpleLink_Init_Start(unsigned short usPatchesAvailableAtHost)
frankvnk 0:c44f0314d6ec 48 {
frankvnk 0:c44f0314d6ec 49 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 50 unsigned char *args;
frankvnk 0:c44f0314d6ec 51
frankvnk 0:c44f0314d6ec 52 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 53 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 54
frankvnk 0:c44f0314d6ec 55 UINT8_TO_STREAM(args, ((usPatchesAvailableAtHost) ? SL_PATCHES_REQUEST_FORCE_HOST : SL_PATCHES_REQUEST_DEFAULT));
frankvnk 0:c44f0314d6ec 56
frankvnk 0:c44f0314d6ec 57 // IRQ Line asserted - send HCI_CMND_SIMPLE_LINK_START to CC3000
frankvnk 0:c44f0314d6ec 58 hci_command_send(HCI_CMND_SIMPLE_LINK_START, ptr, WLAN_SL_INIT_START_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 59 SimpleLinkWaitEvent(HCI_CMND_SIMPLE_LINK_START, 0);
frankvnk 0:c44f0314d6ec 60 }
frankvnk 0:c44f0314d6ec 61
frankvnk 0:c44f0314d6ec 62
frankvnk 0:c44f0314d6ec 63 void wlan_init(tWlanCB sWlanCB,
frankvnk 0:c44f0314d6ec 64 tFWPatches sFWPatches,
frankvnk 0:c44f0314d6ec 65 tDriverPatches sDriverPatches,
frankvnk 0:c44f0314d6ec 66 tBootLoaderPatches sBootLoaderPatches,
frankvnk 0:c44f0314d6ec 67 tWlanReadInteruptPin sReadWlanInterruptPin,
frankvnk 0:c44f0314d6ec 68 tWlanInterruptEnable sWlanInterruptEnable,
frankvnk 0:c44f0314d6ec 69 tWlanInterruptDisable sWlanInterruptDisable,
frankvnk 0:c44f0314d6ec 70 tWriteWlanPin sWriteWlanPin)
frankvnk 0:c44f0314d6ec 71 {
frankvnk 0:c44f0314d6ec 72
frankvnk 0:c44f0314d6ec 73 tSLInformation.sFWPatches = sFWPatches;
frankvnk 0:c44f0314d6ec 74 tSLInformation.sDriverPatches = sDriverPatches;
frankvnk 0:c44f0314d6ec 75 tSLInformation.sBootLoaderPatches = sBootLoaderPatches;
frankvnk 0:c44f0314d6ec 76
frankvnk 0:c44f0314d6ec 77 // init io callback
frankvnk 0:c44f0314d6ec 78 tSLInformation.ReadWlanInterruptPin = sReadWlanInterruptPin;
frankvnk 0:c44f0314d6ec 79 tSLInformation.WlanInterruptEnable = sWlanInterruptEnable;
frankvnk 0:c44f0314d6ec 80 tSLInformation.WlanInterruptDisable = sWlanInterruptDisable;
frankvnk 0:c44f0314d6ec 81 tSLInformation.WriteWlanPin = sWriteWlanPin;
frankvnk 0:c44f0314d6ec 82
frankvnk 0:c44f0314d6ec 83 //init asynchronous events callback
frankvnk 0:c44f0314d6ec 84 tSLInformation.sWlanCB= sWlanCB;
frankvnk 0:c44f0314d6ec 85
frankvnk 0:c44f0314d6ec 86 // By default TX Complete events are routed to host too
frankvnk 0:c44f0314d6ec 87 tSLInformation.InformHostOnTxComplete = 1;
frankvnk 0:c44f0314d6ec 88 }
frankvnk 0:c44f0314d6ec 89
frankvnk 4:d8255a5aad46 90
frankvnk 0:c44f0314d6ec 91 void SpiReceiveHandler(void *pvBuffer)
frankvnk 0:c44f0314d6ec 92 {
frankvnk 0:c44f0314d6ec 93 tSLInformation.usEventOrDataReceived = 1;
frankvnk 0:c44f0314d6ec 94 tSLInformation.pucReceivedData = (unsigned char *)pvBuffer;
frankvnk 0:c44f0314d6ec 95
frankvnk 0:c44f0314d6ec 96 hci_unsolicited_event_handler();
frankvnk 0:c44f0314d6ec 97 }
frankvnk 0:c44f0314d6ec 98
frankvnk 0:c44f0314d6ec 99
frankvnk 0:c44f0314d6ec 100 void wlan_start(unsigned short usPatchesAvailableAtHost)
frankvnk 0:c44f0314d6ec 101 {
frankvnk 0:c44f0314d6ec 102
frankvnk 0:c44f0314d6ec 103 unsigned long ulSpiIRQState;
frankvnk 0:c44f0314d6ec 104
frankvnk 0:c44f0314d6ec 105 tSLInformation.NumberOfSentPackets = 0;
frankvnk 0:c44f0314d6ec 106 tSLInformation.NumberOfReleasedPackets = 0;
frankvnk 0:c44f0314d6ec 107 tSLInformation.usRxEventOpcode = 0;
frankvnk 0:c44f0314d6ec 108 tSLInformation.usNumberOfFreeBuffers = 0;
frankvnk 0:c44f0314d6ec 109 tSLInformation.usSlBufferLength = 0;
frankvnk 0:c44f0314d6ec 110 tSLInformation.usBufferSize = 0;
frankvnk 0:c44f0314d6ec 111 tSLInformation.usRxDataPending = 0;
frankvnk 0:c44f0314d6ec 112 tSLInformation.slTransmitDataError = 0;
frankvnk 0:c44f0314d6ec 113 tSLInformation.usEventOrDataReceived = 0;
frankvnk 0:c44f0314d6ec 114 tSLInformation.pucReceivedData = 0;
frankvnk 2:f1d50c7f8bdb 115
frankvnk 0:c44f0314d6ec 116 // Allocate the memory for the RX/TX data transactions
frankvnk 0:c44f0314d6ec 117 tSLInformation.pucTxCommandBuffer = (unsigned char *)wlan_tx_buffer;
frankvnk 0:c44f0314d6ec 118
frankvnk 0:c44f0314d6ec 119 // init spi
frankvnk 0:c44f0314d6ec 120 SpiOpen(SpiReceiveHandler);
frankvnk 0:c44f0314d6ec 121 // Check the IRQ line
frankvnk 0:c44f0314d6ec 122 ulSpiIRQState = tSLInformation.ReadWlanInterruptPin();
frankvnk 0:c44f0314d6ec 123 // ASIC 1273 chip enable: toggle WLAN EN line
frankvnk 0:c44f0314d6ec 124 tSLInformation.WriteWlanPin( WLAN_ENABLE );
frankvnk 3:3818c9c7b14e 125
frankvnk 0:c44f0314d6ec 126 if (ulSpiIRQState)
frankvnk 0:c44f0314d6ec 127 {
frankvnk 0:c44f0314d6ec 128 // wait till the IRQ line goes low
frankvnk 1:bbcaf0b2f367 129 while(tSLInformation.ReadWlanInterruptPin() != 0)
frankvnk 1:bbcaf0b2f367 130 {
frankvnk 1:bbcaf0b2f367 131 }
frankvnk 0:c44f0314d6ec 132 }
frankvnk 0:c44f0314d6ec 133 else
frankvnk 0:c44f0314d6ec 134 {
frankvnk 3:3818c9c7b14e 135 // wait till the IRQ line goes high and then low
frankvnk 0:c44f0314d6ec 136 while(tSLInformation.ReadWlanInterruptPin() == 0)
frankvnk 0:c44f0314d6ec 137 {
frankvnk 0:c44f0314d6ec 138 }
frankvnk 0:c44f0314d6ec 139 while(tSLInformation.ReadWlanInterruptPin() != 0)
frankvnk 0:c44f0314d6ec 140 {
frankvnk 0:c44f0314d6ec 141 }
frankvnk 0:c44f0314d6ec 142 }
frankvnk 0:c44f0314d6ec 143 SimpleLink_Init_Start(usPatchesAvailableAtHost);
frankvnk 0:c44f0314d6ec 144
frankvnk 0:c44f0314d6ec 145 // Read Buffer's size and finish
frankvnk 0:c44f0314d6ec 146 hci_command_send(HCI_CMND_READ_BUFFER_SIZE, tSLInformation.pucTxCommandBuffer, 0);
frankvnk 0:c44f0314d6ec 147 SimpleLinkWaitEvent(HCI_CMND_READ_BUFFER_SIZE, 0);
frankvnk 0:c44f0314d6ec 148 }
frankvnk 0:c44f0314d6ec 149
frankvnk 0:c44f0314d6ec 150
frankvnk 0:c44f0314d6ec 151 void wlan_stop(void)
frankvnk 0:c44f0314d6ec 152 {
frankvnk 0:c44f0314d6ec 153 // ASIC 1273 chip disable
frankvnk 0:c44f0314d6ec 154 tSLInformation.WriteWlanPin( WLAN_DISABLE );
frankvnk 0:c44f0314d6ec 155
frankvnk 0:c44f0314d6ec 156 // Wait till IRQ line goes high...
frankvnk 0:c44f0314d6ec 157 while(tSLInformation.ReadWlanInterruptPin() == 0)
frankvnk 0:c44f0314d6ec 158 {
frankvnk 0:c44f0314d6ec 159 }
frankvnk 0:c44f0314d6ec 160
frankvnk 0:c44f0314d6ec 161 // Free the used by WLAN Driver memory
frankvnk 0:c44f0314d6ec 162 if (tSLInformation.pucTxCommandBuffer)
frankvnk 0:c44f0314d6ec 163 {
frankvnk 0:c44f0314d6ec 164 tSLInformation.pucTxCommandBuffer = 0;
frankvnk 0:c44f0314d6ec 165 }
frankvnk 0:c44f0314d6ec 166
frankvnk 0:c44f0314d6ec 167 SpiClose();
frankvnk 0:c44f0314d6ec 168 }
frankvnk 0:c44f0314d6ec 169
frankvnk 0:c44f0314d6ec 170
frankvnk 0:c44f0314d6ec 171 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 172 long wlan_connect(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 173 char *ssid,
frankvnk 0:c44f0314d6ec 174 long ssid_len,
frankvnk 0:c44f0314d6ec 175 unsigned char *bssid,
frankvnk 0:c44f0314d6ec 176 unsigned char *key,
frankvnk 0:c44f0314d6ec 177 long key_len)
frankvnk 0:c44f0314d6ec 178 {
frankvnk 0:c44f0314d6ec 179 long ret;
frankvnk 0:c44f0314d6ec 180 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 181 unsigned char *args;
frankvnk 0:c44f0314d6ec 182 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 183
frankvnk 0:c44f0314d6ec 184 ret = EFAIL;
frankvnk 0:c44f0314d6ec 185 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 186 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 187
frankvnk 0:c44f0314d6ec 188 // Fill in command buffer
frankvnk 0:c44f0314d6ec 189 args = UINT32_TO_STREAM(args, 0x0000001c);
frankvnk 0:c44f0314d6ec 190 args = UINT32_TO_STREAM(args, ssid_len);
frankvnk 0:c44f0314d6ec 191 args = UINT32_TO_STREAM(args, ulSecType);
frankvnk 0:c44f0314d6ec 192 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
frankvnk 0:c44f0314d6ec 193 args = UINT32_TO_STREAM(args, key_len);
frankvnk 0:c44f0314d6ec 194 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 195
frankvnk 0:c44f0314d6ec 196 // padding shall be zeroed
frankvnk 0:c44f0314d6ec 197 if(bssid)
frankvnk 0:c44f0314d6ec 198 {
frankvnk 0:c44f0314d6ec 199 ARRAY_TO_STREAM(args, bssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 200 }
frankvnk 0:c44f0314d6ec 201 else
frankvnk 0:c44f0314d6ec 202 {
frankvnk 0:c44f0314d6ec 203 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 204 }
frankvnk 0:c44f0314d6ec 205
frankvnk 0:c44f0314d6ec 206 ARRAY_TO_STREAM(args, ssid, ssid_len);
frankvnk 0:c44f0314d6ec 207
frankvnk 0:c44f0314d6ec 208 if(key_len && key)
frankvnk 0:c44f0314d6ec 209 {
frankvnk 0:c44f0314d6ec 210 ARRAY_TO_STREAM(args, key, key_len);
frankvnk 0:c44f0314d6ec 211 }
frankvnk 0:c44f0314d6ec 212
frankvnk 0:c44f0314d6ec 213 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 214 hci_command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len + key_len - 1);
frankvnk 0:c44f0314d6ec 215
frankvnk 0:c44f0314d6ec 216 // Wait for command complete event
frankvnk 0:c44f0314d6ec 217 SimpleLinkWaitEvent(HCI_CMND_WLAN_CONNECT, &ret);
frankvnk 0:c44f0314d6ec 218 errno = ret;
frankvnk 0:c44f0314d6ec 219
frankvnk 0:c44f0314d6ec 220 return(ret);
frankvnk 0:c44f0314d6ec 221 }
frankvnk 0:c44f0314d6ec 222 #else
frankvnk 0:c44f0314d6ec 223 long wlan_connect(char *ssid, long ssid_len)
frankvnk 0:c44f0314d6ec 224 {
frankvnk 0:c44f0314d6ec 225 long ret;
frankvnk 0:c44f0314d6ec 226 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 227 unsigned char *args;
frankvnk 0:c44f0314d6ec 228 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 229
frankvnk 0:c44f0314d6ec 230 ret = EFAIL;
frankvnk 0:c44f0314d6ec 231 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 232 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 233
frankvnk 0:c44f0314d6ec 234 // Fill in command buffer
frankvnk 0:c44f0314d6ec 235 args = UINT32_TO_STREAM(args, 0x0000001c);
frankvnk 0:c44f0314d6ec 236 args = UINT32_TO_STREAM(args, ssid_len);
frankvnk 0:c44f0314d6ec 237 args = UINT32_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 238 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
frankvnk 0:c44f0314d6ec 239 args = UINT32_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 240 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 241
frankvnk 0:c44f0314d6ec 242 // padding shall be zeroed
frankvnk 0:c44f0314d6ec 243 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 244 ARRAY_TO_STREAM(args, ssid, ssid_len);
frankvnk 0:c44f0314d6ec 245
frankvnk 0:c44f0314d6ec 246 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 247 hci_command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len - 1);
frankvnk 0:c44f0314d6ec 248
frankvnk 0:c44f0314d6ec 249 // Wait for command complete event
frankvnk 0:c44f0314d6ec 250 SimpleLinkWaitEvent(HCI_CMND_WLAN_CONNECT, &ret);
frankvnk 0:c44f0314d6ec 251 errno = ret;
frankvnk 0:c44f0314d6ec 252
frankvnk 0:c44f0314d6ec 253 return(ret);
frankvnk 0:c44f0314d6ec 254 }
frankvnk 0:c44f0314d6ec 255 #endif
frankvnk 0:c44f0314d6ec 256
frankvnk 0:c44f0314d6ec 257
frankvnk 0:c44f0314d6ec 258 long wlan_disconnect()
frankvnk 0:c44f0314d6ec 259 {
frankvnk 0:c44f0314d6ec 260 long ret;
frankvnk 0:c44f0314d6ec 261 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 262
frankvnk 0:c44f0314d6ec 263 ret = EFAIL;
frankvnk 0:c44f0314d6ec 264 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 265
frankvnk 0:c44f0314d6ec 266 hci_command_send(HCI_CMND_WLAN_DISCONNECT, ptr, 0);
frankvnk 0:c44f0314d6ec 267
frankvnk 0:c44f0314d6ec 268 // Wait for command complete event
frankvnk 0:c44f0314d6ec 269 SimpleLinkWaitEvent(HCI_CMND_WLAN_DISCONNECT, &ret);
frankvnk 0:c44f0314d6ec 270 errno = ret;
frankvnk 0:c44f0314d6ec 271
frankvnk 0:c44f0314d6ec 272 return(ret);
frankvnk 0:c44f0314d6ec 273 }
frankvnk 0:c44f0314d6ec 274
frankvnk 0:c44f0314d6ec 275
frankvnk 0:c44f0314d6ec 276 long wlan_ioctl_set_connection_policy(unsigned long should_connect_to_open_ap,
frankvnk 0:c44f0314d6ec 277 unsigned long ulShouldUseFastConnect,
frankvnk 0:c44f0314d6ec 278 unsigned long ulUseProfiles)
frankvnk 0:c44f0314d6ec 279 {
frankvnk 0:c44f0314d6ec 280 long ret;
frankvnk 0:c44f0314d6ec 281 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 282 unsigned char *args;
frankvnk 0:c44f0314d6ec 283
frankvnk 0:c44f0314d6ec 284 ret = EFAIL;
frankvnk 0:c44f0314d6ec 285 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 286 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 287
frankvnk 0:c44f0314d6ec 288 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 289 args = UINT32_TO_STREAM(args, should_connect_to_open_ap);
frankvnk 0:c44f0314d6ec 290 args = UINT32_TO_STREAM(args, ulShouldUseFastConnect);
frankvnk 0:c44f0314d6ec 291 args = UINT32_TO_STREAM(args, ulUseProfiles);
frankvnk 0:c44f0314d6ec 292
frankvnk 0:c44f0314d6ec 293 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 294 hci_command_send(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, ptr, WLAN_SET_CONNECTION_POLICY_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 295
frankvnk 0:c44f0314d6ec 296 // Wait for command complete event
frankvnk 0:c44f0314d6ec 297 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, &ret);
frankvnk 0:c44f0314d6ec 298
frankvnk 0:c44f0314d6ec 299 return(ret);
frankvnk 0:c44f0314d6ec 300 }
frankvnk 0:c44f0314d6ec 301
frankvnk 0:c44f0314d6ec 302
frankvnk 0:c44f0314d6ec 303 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 304 long wlan_add_profile(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 305 unsigned char* ucSsid,
frankvnk 0:c44f0314d6ec 306 unsigned long ulSsidLen,
frankvnk 0:c44f0314d6ec 307 unsigned char *ucBssid,
frankvnk 0:c44f0314d6ec 308 unsigned long ulPriority,
frankvnk 0:c44f0314d6ec 309 unsigned long ulPairwiseCipher_Or_TxKeyLen,
frankvnk 0:c44f0314d6ec 310 unsigned long ulGroupCipher_TxKeyIndex,
frankvnk 0:c44f0314d6ec 311 unsigned long ulKeyMgmt,
frankvnk 0:c44f0314d6ec 312 unsigned char* ucPf_OrKey,
frankvnk 0:c44f0314d6ec 313 unsigned long ulPassPhraseLen)
frankvnk 0:c44f0314d6ec 314 {
frankvnk 0:c44f0314d6ec 315 unsigned short arg_len = 0x00;
frankvnk 0:c44f0314d6ec 316 long ret;
frankvnk 0:c44f0314d6ec 317 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 318 long i = 0;
frankvnk 0:c44f0314d6ec 319 unsigned char *args;
frankvnk 0:c44f0314d6ec 320 unsigned char bssid_zero[] = {0, 0, 0, 0, 0, 0};
frankvnk 0:c44f0314d6ec 321
frankvnk 0:c44f0314d6ec 322 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 323 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 324
frankvnk 0:c44f0314d6ec 325 args = UINT32_TO_STREAM(args, ulSecType);
frankvnk 0:c44f0314d6ec 326
frankvnk 0:c44f0314d6ec 327 // Setup arguments in accordance with the security type
frankvnk 0:c44f0314d6ec 328 switch (ulSecType)
frankvnk 0:c44f0314d6ec 329 {
frankvnk 0:c44f0314d6ec 330 //OPEN
frankvnk 0:c44f0314d6ec 331 case WLAN_SEC_UNSEC:
frankvnk 0:c44f0314d6ec 332 {
frankvnk 0:c44f0314d6ec 333 args = UINT32_TO_STREAM(args, 0x00000014);
frankvnk 0:c44f0314d6ec 334 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 335 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 336 if(ucBssid)
frankvnk 0:c44f0314d6ec 337 {
frankvnk 0:c44f0314d6ec 338 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 339 }
frankvnk 0:c44f0314d6ec 340 else
frankvnk 0:c44f0314d6ec 341 {
frankvnk 0:c44f0314d6ec 342 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 343 }
frankvnk 0:c44f0314d6ec 344 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 345 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 346
frankvnk 0:c44f0314d6ec 347 arg_len = WLAN_ADD_PROFILE_NOSEC_PARAM_LEN + ulSsidLen;
frankvnk 0:c44f0314d6ec 348 }
frankvnk 0:c44f0314d6ec 349 break;
frankvnk 0:c44f0314d6ec 350
frankvnk 0:c44f0314d6ec 351 //WEP
frankvnk 0:c44f0314d6ec 352 case WLAN_SEC_WEP:
frankvnk 0:c44f0314d6ec 353 {
frankvnk 0:c44f0314d6ec 354 args = UINT32_TO_STREAM(args, 0x00000020);
frankvnk 0:c44f0314d6ec 355 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 356 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 357 if(ucBssid)
frankvnk 0:c44f0314d6ec 358 {
frankvnk 0:c44f0314d6ec 359 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 360 }
frankvnk 0:c44f0314d6ec 361 else
frankvnk 0:c44f0314d6ec 362 {
frankvnk 0:c44f0314d6ec 363 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 364 }
frankvnk 0:c44f0314d6ec 365 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 366 args = UINT32_TO_STREAM(args, 0x0000000C + ulSsidLen);
frankvnk 0:c44f0314d6ec 367 args = UINT32_TO_STREAM(args, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 368 args = UINT32_TO_STREAM(args, ulGroupCipher_TxKeyIndex);
frankvnk 0:c44f0314d6ec 369 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 370
frankvnk 0:c44f0314d6ec 371 for(i = 0; i < 4; i++)
frankvnk 0:c44f0314d6ec 372 {
frankvnk 0:c44f0314d6ec 373 unsigned char *p = &ucPf_OrKey[i * ulPairwiseCipher_Or_TxKeyLen];
frankvnk 0:c44f0314d6ec 374
frankvnk 0:c44f0314d6ec 375 ARRAY_TO_STREAM(args, p, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 376 }
frankvnk 0:c44f0314d6ec 377
frankvnk 0:c44f0314d6ec 378 arg_len = WLAN_ADD_PROFILE_WEP_PARAM_LEN + ulSsidLen +
frankvnk 0:c44f0314d6ec 379 ulPairwiseCipher_Or_TxKeyLen * 4;
frankvnk 0:c44f0314d6ec 380
frankvnk 0:c44f0314d6ec 381 }
frankvnk 0:c44f0314d6ec 382 break;
frankvnk 0:c44f0314d6ec 383
frankvnk 0:c44f0314d6ec 384 //WPA
frankvnk 0:c44f0314d6ec 385 //WPA2
frankvnk 0:c44f0314d6ec 386 case WLAN_SEC_WPA:
frankvnk 0:c44f0314d6ec 387 case WLAN_SEC_WPA2:
frankvnk 0:c44f0314d6ec 388 {
frankvnk 0:c44f0314d6ec 389 args = UINT32_TO_STREAM(args, 0x00000028);
frankvnk 0:c44f0314d6ec 390 args = UINT32_TO_STREAM(args, ulSsidLen);
frankvnk 0:c44f0314d6ec 391 args = UINT16_TO_STREAM(args, 0);
frankvnk 0:c44f0314d6ec 392 if(ucBssid)
frankvnk 0:c44f0314d6ec 393 {
frankvnk 0:c44f0314d6ec 394 ARRAY_TO_STREAM(args, ucBssid, ETH_ALEN);
frankvnk 0:c44f0314d6ec 395 }
frankvnk 0:c44f0314d6ec 396 else
frankvnk 0:c44f0314d6ec 397 {
frankvnk 0:c44f0314d6ec 398 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
frankvnk 0:c44f0314d6ec 399 }
frankvnk 0:c44f0314d6ec 400 args = UINT32_TO_STREAM(args, ulPriority);
frankvnk 0:c44f0314d6ec 401 args = UINT32_TO_STREAM(args, ulPairwiseCipher_Or_TxKeyLen);
frankvnk 0:c44f0314d6ec 402 args = UINT32_TO_STREAM(args, ulGroupCipher_TxKeyIndex);
frankvnk 0:c44f0314d6ec 403 args = UINT32_TO_STREAM(args, ulKeyMgmt);
frankvnk 0:c44f0314d6ec 404 args = UINT32_TO_STREAM(args, 0x00000008 + ulSsidLen);
frankvnk 0:c44f0314d6ec 405 args = UINT32_TO_STREAM(args, ulPassPhraseLen);
frankvnk 0:c44f0314d6ec 406 ARRAY_TO_STREAM(args, ucSsid, ulSsidLen);
frankvnk 0:c44f0314d6ec 407 ARRAY_TO_STREAM(args, ucPf_OrKey, ulPassPhraseLen);
frankvnk 0:c44f0314d6ec 408
frankvnk 0:c44f0314d6ec 409 arg_len = WLAN_ADD_PROFILE_WPA_PARAM_LEN + ulSsidLen + ulPassPhraseLen;
frankvnk 0:c44f0314d6ec 410 }
frankvnk 0:c44f0314d6ec 411
frankvnk 0:c44f0314d6ec 412 break;
frankvnk 0:c44f0314d6ec 413 }
frankvnk 0:c44f0314d6ec 414
frankvnk 0:c44f0314d6ec 415 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 416 hci_command_send(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, ptr, arg_len);
frankvnk 0:c44f0314d6ec 417
frankvnk 0:c44f0314d6ec 418 // Wait for command complete event
frankvnk 0:c44f0314d6ec 419 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, &ret);
frankvnk 0:c44f0314d6ec 420
frankvnk 0:c44f0314d6ec 421 return(ret);
frankvnk 0:c44f0314d6ec 422 }
frankvnk 0:c44f0314d6ec 423 #else
frankvnk 0:c44f0314d6ec 424 long wlan_add_profile(unsigned long ulSecType,
frankvnk 0:c44f0314d6ec 425 unsigned char* ucSsid,
frankvnk 0:c44f0314d6ec 426 unsigned long ulSsidLen,
frankvnk 0:c44f0314d6ec 427 unsigned char *ucBssid,
frankvnk 0:c44f0314d6ec 428 unsigned long ulPriority,
frankvnk 0:c44f0314d6ec 429 unsigned long ulPairwiseCipher_Or_TxKeyLen,
frankvnk 0:c44f0314d6ec 430 unsigned long ulGroupCipher_TxKeyIndex,
frankvnk 0:c44f0314d6ec 431 unsigned long ulKeyMgmt,
frankvnk 0:c44f0314d6ec 432 unsigned char* ucPf_OrKey,
frankvnk 0:c44f0314d6ec 433 unsigned long ulPassPhraseLen)
frankvnk 0:c44f0314d6ec 434 {
frankvnk 0:c44f0314d6ec 435 return -1;
frankvnk 0:c44f0314d6ec 436 }
frankvnk 0:c44f0314d6ec 437 #endif
frankvnk 0:c44f0314d6ec 438
frankvnk 0:c44f0314d6ec 439
frankvnk 0:c44f0314d6ec 440 long wlan_ioctl_del_profile(unsigned long ulIndex)
frankvnk 0:c44f0314d6ec 441 {
frankvnk 0:c44f0314d6ec 442 long ret;
frankvnk 0:c44f0314d6ec 443 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 444 unsigned char *args;
frankvnk 0:c44f0314d6ec 445
frankvnk 0:c44f0314d6ec 446 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 447 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 448
frankvnk 0:c44f0314d6ec 449 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 450 args = UINT32_TO_STREAM(args, ulIndex);
frankvnk 0:c44f0314d6ec 451 ret = EFAIL;
frankvnk 0:c44f0314d6ec 452
frankvnk 0:c44f0314d6ec 453 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 454 hci_command_send(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, ptr, WLAN_DEL_PROFILE_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 455
frankvnk 0:c44f0314d6ec 456 // Wait for command complete event
frankvnk 0:c44f0314d6ec 457 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, &ret);
frankvnk 0:c44f0314d6ec 458
frankvnk 0:c44f0314d6ec 459 return(ret);
frankvnk 0:c44f0314d6ec 460 }
frankvnk 0:c44f0314d6ec 461
frankvnk 0:c44f0314d6ec 462
frankvnk 0:c44f0314d6ec 463 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 464 long wlan_ioctl_get_scan_results(unsigned long ulScanTimeout,
frankvnk 0:c44f0314d6ec 465 unsigned char *ucResults)
frankvnk 0:c44f0314d6ec 466 {
frankvnk 0:c44f0314d6ec 467 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 468 unsigned char *args;
frankvnk 0:c44f0314d6ec 469
frankvnk 0:c44f0314d6ec 470 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 471 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 472
frankvnk 0:c44f0314d6ec 473 // Fill in temporary command buffer
frankvnk 0:c44f0314d6ec 474 args = UINT32_TO_STREAM(args, ulScanTimeout);
frankvnk 0:c44f0314d6ec 475
frankvnk 0:c44f0314d6ec 476 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 477 hci_command_send(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, ptr, WLAN_GET_SCAN_RESULTS_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 478
frankvnk 0:c44f0314d6ec 479 // Wait for command complete event
frankvnk 0:c44f0314d6ec 480 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, ucResults);
frankvnk 0:c44f0314d6ec 481
frankvnk 0:c44f0314d6ec 482 return(0);
frankvnk 0:c44f0314d6ec 483 }
frankvnk 0:c44f0314d6ec 484 #endif
frankvnk 0:c44f0314d6ec 485
frankvnk 0:c44f0314d6ec 486
frankvnk 0:c44f0314d6ec 487 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 488 long wlan_ioctl_set_scan_params(unsigned long uiEnable,
frankvnk 0:c44f0314d6ec 489 unsigned long uiMinDwellTime,
frankvnk 0:c44f0314d6ec 490 unsigned long uiMaxDwellTime,
frankvnk 0:c44f0314d6ec 491 unsigned long uiNumOfProbeRequests,
frankvnk 0:c44f0314d6ec 492 unsigned long uiChannelMask,
frankvnk 0:c44f0314d6ec 493 long iRSSIThreshold,
frankvnk 0:c44f0314d6ec 494 unsigned long uiSNRThreshold,
frankvnk 0:c44f0314d6ec 495 unsigned long uiDefaultTxPower,
frankvnk 0:c44f0314d6ec 496 unsigned long *aiIntervalList)
frankvnk 0:c44f0314d6ec 497 {
frankvnk 0:c44f0314d6ec 498 unsigned long uiRes;
frankvnk 0:c44f0314d6ec 499 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 500 unsigned char *args;
frankvnk 0:c44f0314d6ec 501
frankvnk 0:c44f0314d6ec 502 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 503 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 504
frankvnk 0:c44f0314d6ec 505 // Fill in temporary command buffer
frankvnk 0:c44f0314d6ec 506 args = UINT32_TO_STREAM(args, 36);
frankvnk 0:c44f0314d6ec 507 args = UINT32_TO_STREAM(args, uiEnable);
frankvnk 0:c44f0314d6ec 508 args = UINT32_TO_STREAM(args, uiMinDwellTime);
frankvnk 0:c44f0314d6ec 509 args = UINT32_TO_STREAM(args, uiMaxDwellTime);
frankvnk 0:c44f0314d6ec 510 args = UINT32_TO_STREAM(args, uiNumOfProbeRequests);
frankvnk 0:c44f0314d6ec 511 args = UINT32_TO_STREAM(args, uiChannelMask);
frankvnk 0:c44f0314d6ec 512 args = UINT32_TO_STREAM(args, iRSSIThreshold);
frankvnk 0:c44f0314d6ec 513 args = UINT32_TO_STREAM(args, uiSNRThreshold);
frankvnk 0:c44f0314d6ec 514 args = UINT32_TO_STREAM(args, uiDefaultTxPower);
frankvnk 0:c44f0314d6ec 515 ARRAY_TO_STREAM(args, aiIntervalList, sizeof(unsigned long) * SL_SET_SCAN_PARAMS_INTERVAL_LIST_SIZE);
frankvnk 0:c44f0314d6ec 516
frankvnk 0:c44f0314d6ec 517 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 518 hci_command_send(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, ptr, WLAN_SET_SCAN_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 519
frankvnk 0:c44f0314d6ec 520 // Wait for command complete event
frankvnk 0:c44f0314d6ec 521 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, &uiRes);
frankvnk 0:c44f0314d6ec 522
frankvnk 0:c44f0314d6ec 523 return(uiRes);
frankvnk 0:c44f0314d6ec 524 }
frankvnk 0:c44f0314d6ec 525 #endif
frankvnk 0:c44f0314d6ec 526
frankvnk 0:c44f0314d6ec 527
frankvnk 0:c44f0314d6ec 528 long wlan_set_event_mask(unsigned long ulMask)
frankvnk 0:c44f0314d6ec 529 {
frankvnk 0:c44f0314d6ec 530 long ret;
frankvnk 0:c44f0314d6ec 531 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 532 unsigned char *args;
frankvnk 0:c44f0314d6ec 533
frankvnk 0:c44f0314d6ec 534
frankvnk 0:c44f0314d6ec 535 if ((ulMask & HCI_EVNT_WLAN_TX_COMPLETE) == HCI_EVNT_WLAN_TX_COMPLETE)
frankvnk 0:c44f0314d6ec 536 {
frankvnk 0:c44f0314d6ec 537 tSLInformation.InformHostOnTxComplete = 0;
frankvnk 0:c44f0314d6ec 538
frankvnk 0:c44f0314d6ec 539 // Since an event is a virtual event - i.e. it is not coming from CC3000
frankvnk 0:c44f0314d6ec 540 // there is no need to send anything to the device if it was an only event
frankvnk 0:c44f0314d6ec 541 if (ulMask == HCI_EVNT_WLAN_TX_COMPLETE)
frankvnk 0:c44f0314d6ec 542 {
frankvnk 0:c44f0314d6ec 543 return 0;
frankvnk 0:c44f0314d6ec 544 }
frankvnk 0:c44f0314d6ec 545
frankvnk 0:c44f0314d6ec 546 ulMask &= ~HCI_EVNT_WLAN_TX_COMPLETE;
frankvnk 0:c44f0314d6ec 547 ulMask |= HCI_EVNT_WLAN_UNSOL_BASE;
frankvnk 0:c44f0314d6ec 548 }
frankvnk 0:c44f0314d6ec 549 else
frankvnk 0:c44f0314d6ec 550 {
frankvnk 0:c44f0314d6ec 551 tSLInformation.InformHostOnTxComplete = 1;
frankvnk 0:c44f0314d6ec 552 }
frankvnk 0:c44f0314d6ec 553
frankvnk 0:c44f0314d6ec 554 ret = EFAIL;
frankvnk 0:c44f0314d6ec 555 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 556 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 557
frankvnk 0:c44f0314d6ec 558 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 559 args = UINT32_TO_STREAM(args, ulMask);
frankvnk 0:c44f0314d6ec 560
frankvnk 0:c44f0314d6ec 561 // Initiate a HCI command
frankvnk 0:c44f0314d6ec 562 hci_command_send(HCI_CMND_EVENT_MASK, ptr, WLAN_SET_MASK_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 563
frankvnk 0:c44f0314d6ec 564 // Wait for command complete event
frankvnk 0:c44f0314d6ec 565 SimpleLinkWaitEvent(HCI_CMND_EVENT_MASK, &ret);
frankvnk 0:c44f0314d6ec 566
frankvnk 0:c44f0314d6ec 567 return(ret);
frankvnk 0:c44f0314d6ec 568 }
frankvnk 0:c44f0314d6ec 569
frankvnk 0:c44f0314d6ec 570
frankvnk 0:c44f0314d6ec 571 #ifndef CC3000_TINY_DRIVER
frankvnk 0:c44f0314d6ec 572 long wlan_ioctl_statusget(void)
frankvnk 0:c44f0314d6ec 573 {
frankvnk 0:c44f0314d6ec 574 long ret;
frankvnk 0:c44f0314d6ec 575 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 576
frankvnk 0:c44f0314d6ec 577 ret = EFAIL;
frankvnk 0:c44f0314d6ec 578 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 579
frankvnk 0:c44f0314d6ec 580 hci_command_send(HCI_CMND_WLAN_IOCTL_STATUSGET,ptr, 0);
frankvnk 0:c44f0314d6ec 581
frankvnk 0:c44f0314d6ec 582 // Wait for command complete event
frankvnk 0:c44f0314d6ec 583 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_STATUSGET, &ret);
frankvnk 0:c44f0314d6ec 584
frankvnk 0:c44f0314d6ec 585 return(ret);
frankvnk 0:c44f0314d6ec 586 }
frankvnk 0:c44f0314d6ec 587 #endif
frankvnk 0:c44f0314d6ec 588
frankvnk 0:c44f0314d6ec 589
frankvnk 0:c44f0314d6ec 590 long wlan_smart_config_start(unsigned long algoEncryptedFlag)
frankvnk 0:c44f0314d6ec 591 {
frankvnk 0:c44f0314d6ec 592 long ret;
frankvnk 0:c44f0314d6ec 593 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 594 unsigned char *args;
frankvnk 0:c44f0314d6ec 595
frankvnk 0:c44f0314d6ec 596 ret = EFAIL;
frankvnk 0:c44f0314d6ec 597 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 598 args = (unsigned char *)(ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 599
frankvnk 0:c44f0314d6ec 600 // Fill in HCI packet structure
frankvnk 0:c44f0314d6ec 601 args = UINT32_TO_STREAM(args, algoEncryptedFlag);
frankvnk 0:c44f0314d6ec 602 ret = EFAIL;
frankvnk 0:c44f0314d6ec 603
frankvnk 0:c44f0314d6ec 604 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, ptr, WLAN_SMART_CONFIG_START_PARAMS_LEN);
frankvnk 0:c44f0314d6ec 605
frankvnk 0:c44f0314d6ec 606 // Wait for command complete event
frankvnk 0:c44f0314d6ec 607 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, &ret);
frankvnk 0:c44f0314d6ec 608
frankvnk 0:c44f0314d6ec 609 return(ret);
frankvnk 0:c44f0314d6ec 610 }
frankvnk 0:c44f0314d6ec 611
frankvnk 0:c44f0314d6ec 612
frankvnk 0:c44f0314d6ec 613 long wlan_smart_config_stop(void)
frankvnk 0:c44f0314d6ec 614 {
frankvnk 0:c44f0314d6ec 615 long ret;
frankvnk 0:c44f0314d6ec 616 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 617
frankvnk 0:c44f0314d6ec 618 ret = EFAIL;
frankvnk 0:c44f0314d6ec 619 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 620
frankvnk 0:c44f0314d6ec 621 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, ptr, 0);
frankvnk 0:c44f0314d6ec 622
frankvnk 0:c44f0314d6ec 623 // Wait for command complete event
frankvnk 0:c44f0314d6ec 624 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, &ret);
frankvnk 0:c44f0314d6ec 625
frankvnk 0:c44f0314d6ec 626 return(ret);
frankvnk 0:c44f0314d6ec 627 }
frankvnk 0:c44f0314d6ec 628
frankvnk 0:c44f0314d6ec 629
frankvnk 0:c44f0314d6ec 630 long wlan_smart_config_set_prefix(char* cNewPrefix)
frankvnk 0:c44f0314d6ec 631 {
frankvnk 0:c44f0314d6ec 632 long ret;
frankvnk 0:c44f0314d6ec 633 unsigned char *ptr;
frankvnk 0:c44f0314d6ec 634 unsigned char *args;
frankvnk 0:c44f0314d6ec 635
frankvnk 0:c44f0314d6ec 636 ret = EFAIL;
frankvnk 0:c44f0314d6ec 637 ptr = tSLInformation.pucTxCommandBuffer;
frankvnk 0:c44f0314d6ec 638 args = (ptr + HEADERS_SIZE_CMD);
frankvnk 0:c44f0314d6ec 639
frankvnk 0:c44f0314d6ec 640 if (cNewPrefix == NULL)
frankvnk 0:c44f0314d6ec 641 return ret;
frankvnk 0:c44f0314d6ec 642 else // with the new Smart Config, prefix must be TTT
frankvnk 0:c44f0314d6ec 643 {
frankvnk 0:c44f0314d6ec 644 *cNewPrefix = 'T';
frankvnk 0:c44f0314d6ec 645 *(cNewPrefix + 1) = 'T';
frankvnk 0:c44f0314d6ec 646 *(cNewPrefix + 2) = 'T';
frankvnk 0:c44f0314d6ec 647 }
frankvnk 0:c44f0314d6ec 648
frankvnk 0:c44f0314d6ec 649 ARRAY_TO_STREAM(args, cNewPrefix, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
frankvnk 0:c44f0314d6ec 650
frankvnk 0:c44f0314d6ec 651 hci_command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, ptr, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
frankvnk 0:c44f0314d6ec 652
frankvnk 0:c44f0314d6ec 653 // Wait for command complete event
frankvnk 0:c44f0314d6ec 654 SimpleLinkWaitEvent(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, &ret);
frankvnk 0:c44f0314d6ec 655
frankvnk 0:c44f0314d6ec 656 return(ret);
frankvnk 0:c44f0314d6ec 657 }
frankvnk 0:c44f0314d6ec 658
frankvnk 0:c44f0314d6ec 659
frankvnk 0:c44f0314d6ec 660 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:c44f0314d6ec 661 long wlan_smart_config_process()
frankvnk 0:c44f0314d6ec 662 {
frankvnk 0:c44f0314d6ec 663 signed long returnValue;
frankvnk 0:c44f0314d6ec 664 unsigned long ssidLen, keyLen;
frankvnk 0:c44f0314d6ec 665 unsigned char *decKeyPtr;
frankvnk 0:c44f0314d6ec 666 unsigned char *ssidPtr;
frankvnk 0:c44f0314d6ec 667
frankvnk 0:c44f0314d6ec 668 // read the key from EEPROM - fileID 12
frankvnk 0:c44f0314d6ec 669 returnValue = aes_read_key(key);
frankvnk 0:c44f0314d6ec 670
frankvnk 0:c44f0314d6ec 671 if (returnValue != 0)
frankvnk 0:c44f0314d6ec 672 return returnValue;
frankvnk 0:c44f0314d6ec 673
frankvnk 0:c44f0314d6ec 674 // read the received data from fileID #13 and parse it according to the followings:
frankvnk 0:c44f0314d6ec 675 // 1) SSID LEN - not encrypted
frankvnk 0:c44f0314d6ec 676 // 2) SSID - not encrypted
frankvnk 0:c44f0314d6ec 677 // 3) KEY LEN - not encrypted. always 32 bytes long
frankvnk 0:c44f0314d6ec 678 // 4) Security type - not encrypted
frankvnk 0:c44f0314d6ec 679 // 5) KEY - encrypted together with true key length as the first byte in KEY
frankvnk 0:c44f0314d6ec 680 // to elaborate, there are two corner cases:
frankvnk 0:c44f0314d6ec 681 // 1) the KEY is 32 bytes long. In this case, the first byte does not represent KEY length
frankvnk 0:c44f0314d6ec 682 // 2) the KEY is 31 bytes long. In this case, the first byte represent KEY length and equals 31
frankvnk 0:c44f0314d6ec 683 returnValue = nvmem_read(NVMEM_SHARED_MEM_FILEID, SMART_CONFIG_PROFILE_SIZE, 0, profileArray);
frankvnk 0:c44f0314d6ec 684
frankvnk 0:c44f0314d6ec 685 if (returnValue != 0)
frankvnk 0:c44f0314d6ec 686 return returnValue;
frankvnk 0:c44f0314d6ec 687
frankvnk 0:c44f0314d6ec 688 ssidPtr = &profileArray[1];
frankvnk 0:c44f0314d6ec 689
frankvnk 0:c44f0314d6ec 690 ssidLen = profileArray[0];
frankvnk 0:c44f0314d6ec 691
frankvnk 0:c44f0314d6ec 692 decKeyPtr = &profileArray[profileArray[0] + 3];
frankvnk 0:c44f0314d6ec 693
frankvnk 0:c44f0314d6ec 694 aes_decrypt(decKeyPtr, key);
frankvnk 0:c44f0314d6ec 695 if (profileArray[profileArray[0] + 1] > 16)
frankvnk 0:c44f0314d6ec 696 aes_decrypt((unsigned char *)(decKeyPtr + 16), key);
frankvnk 0:c44f0314d6ec 697
frankvnk 0:c44f0314d6ec 698 if (*(unsigned char *)(decKeyPtr +31) != 0)
frankvnk 0:c44f0314d6ec 699 {
frankvnk 0:c44f0314d6ec 700 if (*decKeyPtr == 31)
frankvnk 0:c44f0314d6ec 701 {
frankvnk 0:c44f0314d6ec 702 keyLen = 31;
frankvnk 0:c44f0314d6ec 703 decKeyPtr++;
frankvnk 0:c44f0314d6ec 704 }
frankvnk 0:c44f0314d6ec 705 else
frankvnk 0:c44f0314d6ec 706 {
frankvnk 0:c44f0314d6ec 707 keyLen = 32;
frankvnk 0:c44f0314d6ec 708 }
frankvnk 0:c44f0314d6ec 709 }
frankvnk 0:c44f0314d6ec 710 else
frankvnk 0:c44f0314d6ec 711 {
frankvnk 0:c44f0314d6ec 712 keyLen = *decKeyPtr;
frankvnk 0:c44f0314d6ec 713 decKeyPtr++;
frankvnk 0:c44f0314d6ec 714 }
frankvnk 0:c44f0314d6ec 715
frankvnk 0:c44f0314d6ec 716 // add a profile
frankvnk 0:c44f0314d6ec 717 switch (profileArray[profileArray[0] + 2])
frankvnk 0:c44f0314d6ec 718 {
frankvnk 0:c44f0314d6ec 719 case WLAN_SEC_UNSEC://None
frankvnk 0:c44f0314d6ec 720 {
frankvnk 0:c44f0314d6ec 721 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
frankvnk 0:c44f0314d6ec 722 ssidPtr, // SSID
frankvnk 0:c44f0314d6ec 723 ssidLen, // SSID length
frankvnk 0:c44f0314d6ec 724 NULL, // BSSID
frankvnk 0:c44f0314d6ec 725 1, // Priority
frankvnk 0:c44f0314d6ec 726 0, 0, 0, 0, 0);
frankvnk 0:c44f0314d6ec 727
frankvnk 0:c44f0314d6ec 728 break;
frankvnk 0:c44f0314d6ec 729 }
frankvnk 0:c44f0314d6ec 730
frankvnk 0:c44f0314d6ec 731 case WLAN_SEC_WEP://WEP
frankvnk 0:c44f0314d6ec 732 {
frankvnk 0:c44f0314d6ec 733 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
frankvnk 0:c44f0314d6ec 734 ssidPtr, // SSID
frankvnk 0:c44f0314d6ec 735 ssidLen, // SSID length
frankvnk 0:c44f0314d6ec 736 NULL, // BSSID
frankvnk 0:c44f0314d6ec 737 1, // Priority
frankvnk 0:c44f0314d6ec 738 keyLen, // KEY length
frankvnk 0:c44f0314d6ec 739 0, // KEY index
frankvnk 0:c44f0314d6ec 740 0,
frankvnk 0:c44f0314d6ec 741 decKeyPtr, // KEY
frankvnk 0:c44f0314d6ec 742 0);
frankvnk 0:c44f0314d6ec 743
frankvnk 0:c44f0314d6ec 744 break;
frankvnk 0:c44f0314d6ec 745 }
frankvnk 0:c44f0314d6ec 746
frankvnk 4:d8255a5aad46 747 case WLAN_SEC_WPA: //WPA
frankvnk 4:d8255a5aad46 748 case WLAN_SEC_WPA2: //WPA2
frankvnk 0:c44f0314d6ec 749 {
frankvnk 0:c44f0314d6ec 750 returnValue = wlan_add_profile(WLAN_SEC_WPA2, // security type
frankvnk 0:c44f0314d6ec 751 ssidPtr,
frankvnk 0:c44f0314d6ec 752 ssidLen,
frankvnk 0:c44f0314d6ec 753 NULL, // BSSID
frankvnk 0:c44f0314d6ec 754 1, // Priority
frankvnk 0:c44f0314d6ec 755 0x18, // PairwiseCipher
frankvnk 0:c44f0314d6ec 756 0x1e, // GroupCipher
frankvnk 0:c44f0314d6ec 757 2, // KEY management
frankvnk 0:c44f0314d6ec 758 decKeyPtr, // KEY
frankvnk 0:c44f0314d6ec 759 keyLen); // KEY length
frankvnk 0:c44f0314d6ec 760
frankvnk 0:c44f0314d6ec 761 break;
frankvnk 0:c44f0314d6ec 762 }
frankvnk 0:c44f0314d6ec 763 }
frankvnk 0:c44f0314d6ec 764
frankvnk 0:c44f0314d6ec 765 return returnValue;
frankvnk 0:c44f0314d6ec 766 }
frankvnk 0:c44f0314d6ec 767 #endif //CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 6:d733efcc2c56 768
frankvnk 6:d733efcc2c56 769