cc3000 hostdriver with the mbed socket interface

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Committer:
SolderSplashLabs
Date:
Thu Oct 03 21:00:00 2013 +0000
Revision:
23:fed7f64dd520
Parent:
0:615c697c33b0
Child:
33:9e23b24fb4f3
Added separate debug messages and VT100 formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SolderSplashLabs 23:fed7f64dd520 1 /*****************************************************************************
SolderSplashLabs 23:fed7f64dd520 2 *
SolderSplashLabs 23:fed7f64dd520 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
SolderSplashLabs 23:fed7f64dd520 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
SolderSplashLabs 23:fed7f64dd520 5 * provided help.
SolderSplashLabs 23:fed7f64dd520 6 *
SolderSplashLabs 23:fed7f64dd520 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
SolderSplashLabs 23:fed7f64dd520 8 * read the following copyright:
SolderSplashLabs 23:fed7f64dd520 9 *
SolderSplashLabs 23:fed7f64dd520 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
SolderSplashLabs 23:fed7f64dd520 11 *
SolderSplashLabs 23:fed7f64dd520 12 * Redistribution and use in source and binary forms, with or without
SolderSplashLabs 23:fed7f64dd520 13 * modification, are permitted provided that the following conditions
SolderSplashLabs 23:fed7f64dd520 14 * are met:
SolderSplashLabs 23:fed7f64dd520 15 *
SolderSplashLabs 23:fed7f64dd520 16 * Redistributions of source code must retain the above copyright
SolderSplashLabs 23:fed7f64dd520 17 * notice, this list of conditions and the following disclaimer.
SolderSplashLabs 23:fed7f64dd520 18 *
SolderSplashLabs 23:fed7f64dd520 19 * Redistributions in binary form must reproduce the above copyright
SolderSplashLabs 23:fed7f64dd520 20 * notice, this list of conditions and the following disclaimer in the
SolderSplashLabs 23:fed7f64dd520 21 * documentation and/or other materials provided with the
SolderSplashLabs 23:fed7f64dd520 22 * distribution.
SolderSplashLabs 23:fed7f64dd520 23 *
SolderSplashLabs 23:fed7f64dd520 24 * Neither the name of Texas Instruments Incorporated nor the names of
SolderSplashLabs 23:fed7f64dd520 25 * its contributors may be used to endorse or promote products derived
SolderSplashLabs 23:fed7f64dd520 26 * from this software without specific prior written permission.
SolderSplashLabs 23:fed7f64dd520 27 *
SolderSplashLabs 23:fed7f64dd520 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
SolderSplashLabs 23:fed7f64dd520 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
SolderSplashLabs 23:fed7f64dd520 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
SolderSplashLabs 23:fed7f64dd520 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SolderSplashLabs 23:fed7f64dd520 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
SolderSplashLabs 23:fed7f64dd520 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
SolderSplashLabs 23:fed7f64dd520 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SolderSplashLabs 23:fed7f64dd520 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
SolderSplashLabs 23:fed7f64dd520 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SolderSplashLabs 23:fed7f64dd520 39 *
SolderSplashLabs 23:fed7f64dd520 40 *****************************************************************************/
SolderSplashLabs 23:fed7f64dd520 41 #include "cc3000.h"
SolderSplashLabs 23:fed7f64dd520 42
SolderSplashLabs 23:fed7f64dd520 43 namespace mbed_cc3000 {
SolderSplashLabs 23:fed7f64dd520 44
SolderSplashLabs 23:fed7f64dd520 45 cc3000_wlan::cc3000_wlan(cc3000_simple_link &simple_link, cc3000_event &event, cc3000_spi &spi, cc3000_hci &hci) :
SolderSplashLabs 23:fed7f64dd520 46 _simple_link(simple_link), _event(event), _spi(spi), _hci(hci) {
SolderSplashLabs 23:fed7f64dd520 47
SolderSplashLabs 23:fed7f64dd520 48 }
SolderSplashLabs 23:fed7f64dd520 49
SolderSplashLabs 23:fed7f64dd520 50 cc3000_wlan::~cc3000_wlan() {
SolderSplashLabs 23:fed7f64dd520 51
SolderSplashLabs 23:fed7f64dd520 52 }
SolderSplashLabs 23:fed7f64dd520 53
SolderSplashLabs 23:fed7f64dd520 54 void cc3000_wlan::simpleLink_init_start(uint16_t patches_available_host) {
SolderSplashLabs 23:fed7f64dd520 55 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 56 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 57
SolderSplashLabs 23:fed7f64dd520 58 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 59 args = (uint8_t *)(ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 60
SolderSplashLabs 23:fed7f64dd520 61 UINT8_TO_STREAM(args, ((patches_available_host) ? SL_PATCHES_REQUEST_FORCE_HOST : SL_PATCHES_REQUEST_DEFAULT));
SolderSplashLabs 23:fed7f64dd520 62
SolderSplashLabs 23:fed7f64dd520 63 // IRQ Line asserted - send HCI_CMND_SIMPLE_LINK_START to CC3000
SolderSplashLabs 23:fed7f64dd520 64 _hci.command_send(HCI_CMND_SIMPLE_LINK_START, ptr, WLAN_SL_INIT_START_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 65 _event.simplelink_wait_event(HCI_CMND_SIMPLE_LINK_START, 0);
SolderSplashLabs 23:fed7f64dd520 66 }
SolderSplashLabs 23:fed7f64dd520 67
SolderSplashLabs 23:fed7f64dd520 68 void cc3000_wlan::start(uint16_t patches_available_host) {
SolderSplashLabs 23:fed7f64dd520 69 uint32_t spi_irq_state;
SolderSplashLabs 23:fed7f64dd520 70
SolderSplashLabs 23:fed7f64dd520 71 _simple_link.set_sent_packets(0);
SolderSplashLabs 23:fed7f64dd520 72 _simple_link.set_number_of_released_packets(0);
SolderSplashLabs 23:fed7f64dd520 73 _simple_link.set_op_code(0);
SolderSplashLabs 23:fed7f64dd520 74 _simple_link.set_number_free_buffers(0);
SolderSplashLabs 23:fed7f64dd520 75 _simple_link.set_buffer_length(0);
SolderSplashLabs 23:fed7f64dd520 76 _simple_link.set_buffer_size(0);
SolderSplashLabs 23:fed7f64dd520 77 _simple_link.set_pending_data(0);
SolderSplashLabs 23:fed7f64dd520 78 _simple_link.set_transmit_error(0);
SolderSplashLabs 23:fed7f64dd520 79 _simple_link.set_data_received_flag(0);
SolderSplashLabs 23:fed7f64dd520 80 _simple_link.set_buffer_size(0);
SolderSplashLabs 23:fed7f64dd520 81
SolderSplashLabs 23:fed7f64dd520 82 // init spi
SolderSplashLabs 23:fed7f64dd520 83 _spi.open();
SolderSplashLabs 23:fed7f64dd520 84 // Check the IRQ line
SolderSplashLabs 23:fed7f64dd520 85 spi_irq_state = _spi.wlan_irq_read();
SolderSplashLabs 23:fed7f64dd520 86 // ASIC 1273 chip enable: toggle WLAN EN line
SolderSplashLabs 23:fed7f64dd520 87 _spi.write_wlan_en(WLAN_ENABLE);
SolderSplashLabs 23:fed7f64dd520 88
SolderSplashLabs 23:fed7f64dd520 89 if (spi_irq_state)
SolderSplashLabs 23:fed7f64dd520 90 {
SolderSplashLabs 23:fed7f64dd520 91 // wait till the IRQ line goes low
SolderSplashLabs 23:fed7f64dd520 92 while(_spi.wlan_irq_read() != 0)
SolderSplashLabs 23:fed7f64dd520 93 {
SolderSplashLabs 23:fed7f64dd520 94 }
SolderSplashLabs 23:fed7f64dd520 95 }
SolderSplashLabs 23:fed7f64dd520 96 else
SolderSplashLabs 23:fed7f64dd520 97 {
SolderSplashLabs 23:fed7f64dd520 98 // wait till the IRQ line goes high and then low
SolderSplashLabs 23:fed7f64dd520 99 while(_spi.wlan_irq_read() == 0)
SolderSplashLabs 23:fed7f64dd520 100 {
SolderSplashLabs 23:fed7f64dd520 101 }
SolderSplashLabs 23:fed7f64dd520 102 while(_spi.wlan_irq_read() != 0)
SolderSplashLabs 23:fed7f64dd520 103 {
SolderSplashLabs 23:fed7f64dd520 104 }
SolderSplashLabs 23:fed7f64dd520 105 }
SolderSplashLabs 23:fed7f64dd520 106 simpleLink_init_start(patches_available_host);
SolderSplashLabs 23:fed7f64dd520 107
SolderSplashLabs 23:fed7f64dd520 108 // Read Buffer's size and finish
SolderSplashLabs 23:fed7f64dd520 109 _hci.command_send(HCI_CMND_READ_BUFFER_SIZE, _simple_link.get_transmit_buffer(), 0);
SolderSplashLabs 23:fed7f64dd520 110 _event.simplelink_wait_event(HCI_CMND_READ_BUFFER_SIZE, 0);
SolderSplashLabs 23:fed7f64dd520 111 }
SolderSplashLabs 23:fed7f64dd520 112
SolderSplashLabs 23:fed7f64dd520 113
SolderSplashLabs 23:fed7f64dd520 114 void cc3000_wlan::stop() {
SolderSplashLabs 23:fed7f64dd520 115 // ASIC 1273 chip disable
SolderSplashLabs 23:fed7f64dd520 116 _spi.write_wlan_en( WLAN_DISABLE );
SolderSplashLabs 23:fed7f64dd520 117
SolderSplashLabs 23:fed7f64dd520 118 // Wait till IRQ line goes high...
SolderSplashLabs 23:fed7f64dd520 119 while(_spi.wlan_irq_read() == 0)
SolderSplashLabs 23:fed7f64dd520 120 {
SolderSplashLabs 23:fed7f64dd520 121 }
SolderSplashLabs 23:fed7f64dd520 122
SolderSplashLabs 23:fed7f64dd520 123 // Free the used by WLAN Driver memory
SolderSplashLabs 23:fed7f64dd520 124 if (_simple_link.get_transmit_buffer())
SolderSplashLabs 23:fed7f64dd520 125 {
SolderSplashLabs 23:fed7f64dd520 126 _simple_link.set_transmit_buffer(0);
SolderSplashLabs 23:fed7f64dd520 127 }
SolderSplashLabs 23:fed7f64dd520 128
SolderSplashLabs 23:fed7f64dd520 129 _spi.close();
SolderSplashLabs 23:fed7f64dd520 130 }
SolderSplashLabs 23:fed7f64dd520 131
SolderSplashLabs 23:fed7f64dd520 132
SolderSplashLabs 23:fed7f64dd520 133 int32_t cc3000_wlan::disconnect() {
SolderSplashLabs 23:fed7f64dd520 134 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 135 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 136
SolderSplashLabs 23:fed7f64dd520 137 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 138 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 139
SolderSplashLabs 23:fed7f64dd520 140 _hci.command_send(HCI_CMND_WLAN_DISCONNECT, ptr, 0);
SolderSplashLabs 23:fed7f64dd520 141
SolderSplashLabs 23:fed7f64dd520 142 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 143 _event.simplelink_wait_event(HCI_CMND_WLAN_DISCONNECT, &ret);
SolderSplashLabs 23:fed7f64dd520 144 errno = ret;
SolderSplashLabs 23:fed7f64dd520 145
SolderSplashLabs 23:fed7f64dd520 146 return(ret);
SolderSplashLabs 23:fed7f64dd520 147 }
SolderSplashLabs 23:fed7f64dd520 148
SolderSplashLabs 23:fed7f64dd520 149
SolderSplashLabs 23:fed7f64dd520 150 int32_t cc3000_wlan::ioctl_set_connection_policy(uint32_t should_connect_to_open_ap,
SolderSplashLabs 23:fed7f64dd520 151 uint32_t use_fast_connect,
SolderSplashLabs 23:fed7f64dd520 152 uint32_t use_profiles) {
SolderSplashLabs 23:fed7f64dd520 153 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 154 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 155 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 156
SolderSplashLabs 23:fed7f64dd520 157 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 158 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 159 args = (uint8_t *)(ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 160
SolderSplashLabs 23:fed7f64dd520 161 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 162 args = UINT32_TO_STREAM(args, should_connect_to_open_ap);
SolderSplashLabs 23:fed7f64dd520 163 args = UINT32_TO_STREAM(args, use_fast_connect);
SolderSplashLabs 23:fed7f64dd520 164 args = UINT32_TO_STREAM(args, use_profiles);
SolderSplashLabs 23:fed7f64dd520 165
SolderSplashLabs 23:fed7f64dd520 166 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 167 _hci.command_send(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, ptr, WLAN_SET_CONNECTION_POLICY_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 168
SolderSplashLabs 23:fed7f64dd520 169 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 170 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, &ret);
SolderSplashLabs 23:fed7f64dd520 171
SolderSplashLabs 23:fed7f64dd520 172 return(ret);
SolderSplashLabs 23:fed7f64dd520 173 }
SolderSplashLabs 23:fed7f64dd520 174
SolderSplashLabs 23:fed7f64dd520 175
SolderSplashLabs 23:fed7f64dd520 176 int32_t cc3000_wlan::ioctl_del_profile(uint32_t index) {
SolderSplashLabs 23:fed7f64dd520 177 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 178 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 179 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 180
SolderSplashLabs 23:fed7f64dd520 181 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 182 args = (uint8_t *)(ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 183
SolderSplashLabs 23:fed7f64dd520 184 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 185 args = UINT32_TO_STREAM(args, index);
SolderSplashLabs 23:fed7f64dd520 186 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 187
SolderSplashLabs 23:fed7f64dd520 188 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 189 _hci.command_send(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, ptr, WLAN_DEL_PROFILE_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 190
SolderSplashLabs 23:fed7f64dd520 191 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 192 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, &ret);
SolderSplashLabs 23:fed7f64dd520 193
SolderSplashLabs 23:fed7f64dd520 194 return(ret);
SolderSplashLabs 23:fed7f64dd520 195 }
SolderSplashLabs 23:fed7f64dd520 196
SolderSplashLabs 23:fed7f64dd520 197 int32_t cc3000_wlan::set_event_mask(uint32_t mask) {
SolderSplashLabs 23:fed7f64dd520 198 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 199 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 200 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 201
SolderSplashLabs 23:fed7f64dd520 202
SolderSplashLabs 23:fed7f64dd520 203 if ((mask & HCI_EVNT_WLAN_TX_COMPLETE) == HCI_EVNT_WLAN_TX_COMPLETE)
SolderSplashLabs 23:fed7f64dd520 204 {
SolderSplashLabs 23:fed7f64dd520 205 _simple_link.set_tx_complete_signal(0);
SolderSplashLabs 23:fed7f64dd520 206
SolderSplashLabs 23:fed7f64dd520 207 // Since an event is a virtual event - i.e. it is not coming from CC3000
SolderSplashLabs 23:fed7f64dd520 208 // there is no need to send anything to the device if it was an only event
SolderSplashLabs 23:fed7f64dd520 209 if (mask == HCI_EVNT_WLAN_TX_COMPLETE)
SolderSplashLabs 23:fed7f64dd520 210 {
SolderSplashLabs 23:fed7f64dd520 211 return 0;
SolderSplashLabs 23:fed7f64dd520 212 }
SolderSplashLabs 23:fed7f64dd520 213
SolderSplashLabs 23:fed7f64dd520 214 mask &= ~HCI_EVNT_WLAN_TX_COMPLETE;
SolderSplashLabs 23:fed7f64dd520 215 mask |= HCI_EVNT_WLAN_UNSOL_BASE;
SolderSplashLabs 23:fed7f64dd520 216 }
SolderSplashLabs 23:fed7f64dd520 217 else
SolderSplashLabs 23:fed7f64dd520 218 {
SolderSplashLabs 23:fed7f64dd520 219 _simple_link.set_tx_complete_signal(1);
SolderSplashLabs 23:fed7f64dd520 220 }
SolderSplashLabs 23:fed7f64dd520 221
SolderSplashLabs 23:fed7f64dd520 222 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 223 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 224 args = (uint8_t *)(ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 225
SolderSplashLabs 23:fed7f64dd520 226 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 227 args = UINT32_TO_STREAM(args, mask);
SolderSplashLabs 23:fed7f64dd520 228
SolderSplashLabs 23:fed7f64dd520 229 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 230 _hci.command_send(HCI_CMND_EVENT_MASK, ptr, WLAN_SET_MASK_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 231
SolderSplashLabs 23:fed7f64dd520 232 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 233 _event.simplelink_wait_event(HCI_CMND_EVENT_MASK, &ret);
SolderSplashLabs 23:fed7f64dd520 234
SolderSplashLabs 23:fed7f64dd520 235 return(ret);
SolderSplashLabs 23:fed7f64dd520 236 }
SolderSplashLabs 23:fed7f64dd520 237
SolderSplashLabs 23:fed7f64dd520 238
SolderSplashLabs 23:fed7f64dd520 239 int32_t cc3000_wlan::smart_config_start(uint32_t encrypted_flag) {
SolderSplashLabs 23:fed7f64dd520 240 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 241 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 242 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 243
SolderSplashLabs 23:fed7f64dd520 244 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 245 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 246 args = (uint8_t *)(ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 247
SolderSplashLabs 23:fed7f64dd520 248 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 249 args = UINT32_TO_STREAM(args, encrypted_flag);
SolderSplashLabs 23:fed7f64dd520 250 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 251
SolderSplashLabs 23:fed7f64dd520 252 _hci.command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, ptr, WLAN_SMART_CONFIG_START_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 253
SolderSplashLabs 23:fed7f64dd520 254 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 255 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, &ret);
SolderSplashLabs 23:fed7f64dd520 256
SolderSplashLabs 23:fed7f64dd520 257 return(ret);
SolderSplashLabs 23:fed7f64dd520 258 }
SolderSplashLabs 23:fed7f64dd520 259
SolderSplashLabs 23:fed7f64dd520 260
SolderSplashLabs 23:fed7f64dd520 261 int32_t cc3000_wlan::smart_config_stop(void) {
SolderSplashLabs 23:fed7f64dd520 262 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 263 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 264
SolderSplashLabs 23:fed7f64dd520 265 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 266 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 267
SolderSplashLabs 23:fed7f64dd520 268 _hci.command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, ptr, 0);
SolderSplashLabs 23:fed7f64dd520 269
SolderSplashLabs 23:fed7f64dd520 270 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 271 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, &ret);
SolderSplashLabs 23:fed7f64dd520 272
SolderSplashLabs 23:fed7f64dd520 273 return(ret);
SolderSplashLabs 23:fed7f64dd520 274 }
SolderSplashLabs 23:fed7f64dd520 275
SolderSplashLabs 23:fed7f64dd520 276 int32_t cc3000_wlan::smart_config_set_prefix(uint8_t *new_prefix) {
SolderSplashLabs 23:fed7f64dd520 277 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 278 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 279 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 280
SolderSplashLabs 23:fed7f64dd520 281 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 282 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 283 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 284
SolderSplashLabs 23:fed7f64dd520 285 if (new_prefix == NULL)
SolderSplashLabs 23:fed7f64dd520 286 return ret;
SolderSplashLabs 23:fed7f64dd520 287 else // with the new Smart Config, prefix must be TTT
SolderSplashLabs 23:fed7f64dd520 288 {
SolderSplashLabs 23:fed7f64dd520 289 *new_prefix = 'T';
SolderSplashLabs 23:fed7f64dd520 290 *(new_prefix + 1) = 'T';
SolderSplashLabs 23:fed7f64dd520 291 *(new_prefix + 2) = 'T';
SolderSplashLabs 23:fed7f64dd520 292 }
SolderSplashLabs 23:fed7f64dd520 293
SolderSplashLabs 23:fed7f64dd520 294 ARRAY_TO_STREAM(args, new_prefix, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
SolderSplashLabs 23:fed7f64dd520 295
SolderSplashLabs 23:fed7f64dd520 296 _hci.command_send(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, ptr, SL_SIMPLE_CONFIG_PREFIX_LENGTH);
SolderSplashLabs 23:fed7f64dd520 297
SolderSplashLabs 23:fed7f64dd520 298 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 299 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, &ret);
SolderSplashLabs 23:fed7f64dd520 300
SolderSplashLabs 23:fed7f64dd520 301 return(ret);
SolderSplashLabs 23:fed7f64dd520 302 }
SolderSplashLabs 23:fed7f64dd520 303
SolderSplashLabs 23:fed7f64dd520 304 #ifndef CC3000_TINY_DRIVER
SolderSplashLabs 23:fed7f64dd520 305 int32_t cc3000_wlan::connect(uint32_t sec_type, const uint8_t *ssid, int32_t ssid_len, uint8_t *bssid,
SolderSplashLabs 23:fed7f64dd520 306 uint8_t *key, int32_t key_len) {
SolderSplashLabs 23:fed7f64dd520 307 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 308 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 309 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 310 uint8_t bssid_zero[] = {0, 0, 0, 0, 0, 0};
SolderSplashLabs 23:fed7f64dd520 311
SolderSplashLabs 23:fed7f64dd520 312 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 313 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 314 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 315
SolderSplashLabs 23:fed7f64dd520 316 // Fill in command buffer
SolderSplashLabs 23:fed7f64dd520 317 args = UINT32_TO_STREAM(args, 0x0000001c);
SolderSplashLabs 23:fed7f64dd520 318 args = UINT32_TO_STREAM(args, ssid_len);
SolderSplashLabs 23:fed7f64dd520 319 args = UINT32_TO_STREAM(args, sec_type);
SolderSplashLabs 23:fed7f64dd520 320 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
SolderSplashLabs 23:fed7f64dd520 321 args = UINT32_TO_STREAM(args, key_len);
SolderSplashLabs 23:fed7f64dd520 322 args = UINT16_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 323
SolderSplashLabs 23:fed7f64dd520 324 // padding shall be zeroed
SolderSplashLabs 23:fed7f64dd520 325 if(bssid)
SolderSplashLabs 23:fed7f64dd520 326 {
SolderSplashLabs 23:fed7f64dd520 327 ARRAY_TO_STREAM(args, bssid, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 328 }
SolderSplashLabs 23:fed7f64dd520 329 else
SolderSplashLabs 23:fed7f64dd520 330 {
SolderSplashLabs 23:fed7f64dd520 331 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 332 }
SolderSplashLabs 23:fed7f64dd520 333
SolderSplashLabs 23:fed7f64dd520 334 ARRAY_TO_STREAM(args, ssid, ssid_len);
SolderSplashLabs 23:fed7f64dd520 335
SolderSplashLabs 23:fed7f64dd520 336 if(key_len && key)
SolderSplashLabs 23:fed7f64dd520 337 {
SolderSplashLabs 23:fed7f64dd520 338 ARRAY_TO_STREAM(args, key, key_len);
SolderSplashLabs 23:fed7f64dd520 339 }
SolderSplashLabs 23:fed7f64dd520 340
SolderSplashLabs 23:fed7f64dd520 341 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 342 _hci.command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len + key_len - 1);
SolderSplashLabs 23:fed7f64dd520 343
SolderSplashLabs 23:fed7f64dd520 344 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 345 _event.simplelink_wait_event(HCI_CMND_WLAN_CONNECT, &ret);
SolderSplashLabs 23:fed7f64dd520 346 errno = ret;
SolderSplashLabs 23:fed7f64dd520 347
SolderSplashLabs 23:fed7f64dd520 348 return(ret);
SolderSplashLabs 23:fed7f64dd520 349 }
SolderSplashLabs 23:fed7f64dd520 350
SolderSplashLabs 23:fed7f64dd520 351 int32_t cc3000_wlan::add_profile(uint32_t sec_type,
SolderSplashLabs 23:fed7f64dd520 352 uint8_t* ssid,
SolderSplashLabs 23:fed7f64dd520 353 uint32_t ssid_length,
SolderSplashLabs 23:fed7f64dd520 354 uint8_t *b_ssid,
SolderSplashLabs 23:fed7f64dd520 355 uint32_t priority,
SolderSplashLabs 23:fed7f64dd520 356 uint32_t pairwise_cipher_or_tx_key_len,
SolderSplashLabs 23:fed7f64dd520 357 uint32_t group_cipher_tx_key_index,
SolderSplashLabs 23:fed7f64dd520 358 uint32_t key_mgmt,
SolderSplashLabs 23:fed7f64dd520 359 uint8_t* pf_or_key,
SolderSplashLabs 23:fed7f64dd520 360 uint32_t pass_phrase_len) {
SolderSplashLabs 23:fed7f64dd520 361 uint16_t arg_len = 0x00;
SolderSplashLabs 23:fed7f64dd520 362 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 363 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 364 int32_t i = 0;
SolderSplashLabs 23:fed7f64dd520 365 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 366 uint8_t bssid_zero[] = {0, 0, 0, 0, 0, 0};
SolderSplashLabs 23:fed7f64dd520 367
SolderSplashLabs 23:fed7f64dd520 368 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 369 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 370
SolderSplashLabs 23:fed7f64dd520 371 args = UINT32_TO_STREAM(args, sec_type);
SolderSplashLabs 23:fed7f64dd520 372
SolderSplashLabs 23:fed7f64dd520 373 // Setup arguments in accordance with the security type
SolderSplashLabs 23:fed7f64dd520 374 switch (sec_type)
SolderSplashLabs 23:fed7f64dd520 375 {
SolderSplashLabs 23:fed7f64dd520 376 //OPEN
SolderSplashLabs 23:fed7f64dd520 377 case WLAN_SEC_UNSEC:
SolderSplashLabs 23:fed7f64dd520 378 {
SolderSplashLabs 23:fed7f64dd520 379 args = UINT32_TO_STREAM(args, 0x00000014);
SolderSplashLabs 23:fed7f64dd520 380 args = UINT32_TO_STREAM(args, ssid_length);
SolderSplashLabs 23:fed7f64dd520 381 args = UINT16_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 382 if(b_ssid)
SolderSplashLabs 23:fed7f64dd520 383 {
SolderSplashLabs 23:fed7f64dd520 384 ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 385 }
SolderSplashLabs 23:fed7f64dd520 386 else
SolderSplashLabs 23:fed7f64dd520 387 {
SolderSplashLabs 23:fed7f64dd520 388 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 389 }
SolderSplashLabs 23:fed7f64dd520 390 args = UINT32_TO_STREAM(args, priority);
SolderSplashLabs 23:fed7f64dd520 391 ARRAY_TO_STREAM(args, ssid, ssid_length);
SolderSplashLabs 23:fed7f64dd520 392
SolderSplashLabs 23:fed7f64dd520 393 arg_len = WLAN_ADD_PROFILE_NOSEC_PARAM_LEN + ssid_length;
SolderSplashLabs 23:fed7f64dd520 394 }
SolderSplashLabs 23:fed7f64dd520 395 break;
SolderSplashLabs 23:fed7f64dd520 396
SolderSplashLabs 23:fed7f64dd520 397 //WEP
SolderSplashLabs 23:fed7f64dd520 398 case WLAN_SEC_WEP:
SolderSplashLabs 23:fed7f64dd520 399 {
SolderSplashLabs 23:fed7f64dd520 400 args = UINT32_TO_STREAM(args, 0x00000020);
SolderSplashLabs 23:fed7f64dd520 401 args = UINT32_TO_STREAM(args, ssid_length);
SolderSplashLabs 23:fed7f64dd520 402 args = UINT16_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 403 if(b_ssid)
SolderSplashLabs 23:fed7f64dd520 404 {
SolderSplashLabs 23:fed7f64dd520 405 ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 406 }
SolderSplashLabs 23:fed7f64dd520 407 else
SolderSplashLabs 23:fed7f64dd520 408 {
SolderSplashLabs 23:fed7f64dd520 409 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 410 }
SolderSplashLabs 23:fed7f64dd520 411 args = UINT32_TO_STREAM(args, priority);
SolderSplashLabs 23:fed7f64dd520 412 args = UINT32_TO_STREAM(args, 0x0000000C + ssid_length);
SolderSplashLabs 23:fed7f64dd520 413 args = UINT32_TO_STREAM(args, pairwise_cipher_or_tx_key_len);
SolderSplashLabs 23:fed7f64dd520 414 args = UINT32_TO_STREAM(args, group_cipher_tx_key_index);
SolderSplashLabs 23:fed7f64dd520 415 ARRAY_TO_STREAM(args, ssid, ssid_length);
SolderSplashLabs 23:fed7f64dd520 416
SolderSplashLabs 23:fed7f64dd520 417 for(i = 0; i < 4; i++)
SolderSplashLabs 23:fed7f64dd520 418 {
SolderSplashLabs 23:fed7f64dd520 419 uint8_t *p = &pf_or_key[i * pairwise_cipher_or_tx_key_len];
SolderSplashLabs 23:fed7f64dd520 420
SolderSplashLabs 23:fed7f64dd520 421 ARRAY_TO_STREAM(args, p, pairwise_cipher_or_tx_key_len);
SolderSplashLabs 23:fed7f64dd520 422 }
SolderSplashLabs 23:fed7f64dd520 423
SolderSplashLabs 23:fed7f64dd520 424 arg_len = WLAN_ADD_PROFILE_WEP_PARAM_LEN + ssid_length +
SolderSplashLabs 23:fed7f64dd520 425 pairwise_cipher_or_tx_key_len * 4;
SolderSplashLabs 23:fed7f64dd520 426
SolderSplashLabs 23:fed7f64dd520 427 }
SolderSplashLabs 23:fed7f64dd520 428 break;
SolderSplashLabs 23:fed7f64dd520 429
SolderSplashLabs 23:fed7f64dd520 430 //WPA
SolderSplashLabs 23:fed7f64dd520 431 //WPA2
SolderSplashLabs 23:fed7f64dd520 432 case WLAN_SEC_WPA:
SolderSplashLabs 23:fed7f64dd520 433 case WLAN_SEC_WPA2:
SolderSplashLabs 23:fed7f64dd520 434 {
SolderSplashLabs 23:fed7f64dd520 435 args = UINT32_TO_STREAM(args, 0x00000028);
SolderSplashLabs 23:fed7f64dd520 436 args = UINT32_TO_STREAM(args, ssid_length);
SolderSplashLabs 23:fed7f64dd520 437 args = UINT16_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 438 if(b_ssid)
SolderSplashLabs 23:fed7f64dd520 439 {
SolderSplashLabs 23:fed7f64dd520 440 ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 441 }
SolderSplashLabs 23:fed7f64dd520 442 else
SolderSplashLabs 23:fed7f64dd520 443 {
SolderSplashLabs 23:fed7f64dd520 444 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 445 }
SolderSplashLabs 23:fed7f64dd520 446 args = UINT32_TO_STREAM(args, priority);
SolderSplashLabs 23:fed7f64dd520 447 args = UINT32_TO_STREAM(args, pairwise_cipher_or_tx_key_len);
SolderSplashLabs 23:fed7f64dd520 448 args = UINT32_TO_STREAM(args, group_cipher_tx_key_index);
SolderSplashLabs 23:fed7f64dd520 449 args = UINT32_TO_STREAM(args, key_mgmt);
SolderSplashLabs 23:fed7f64dd520 450 args = UINT32_TO_STREAM(args, 0x00000008 + ssid_length);
SolderSplashLabs 23:fed7f64dd520 451 args = UINT32_TO_STREAM(args, pass_phrase_len);
SolderSplashLabs 23:fed7f64dd520 452 ARRAY_TO_STREAM(args, ssid, ssid_length);
SolderSplashLabs 23:fed7f64dd520 453 ARRAY_TO_STREAM(args, pf_or_key, pass_phrase_len);
SolderSplashLabs 23:fed7f64dd520 454
SolderSplashLabs 23:fed7f64dd520 455 arg_len = WLAN_ADD_PROFILE_WPA_PARAM_LEN + ssid_length + pass_phrase_len;
SolderSplashLabs 23:fed7f64dd520 456 }
SolderSplashLabs 23:fed7f64dd520 457
SolderSplashLabs 23:fed7f64dd520 458 break;
SolderSplashLabs 23:fed7f64dd520 459 }
SolderSplashLabs 23:fed7f64dd520 460
SolderSplashLabs 23:fed7f64dd520 461 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 462 _hci.command_send(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, ptr, arg_len);
SolderSplashLabs 23:fed7f64dd520 463
SolderSplashLabs 23:fed7f64dd520 464 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 465 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, &ret);
SolderSplashLabs 23:fed7f64dd520 466
SolderSplashLabs 23:fed7f64dd520 467 return(ret);
SolderSplashLabs 23:fed7f64dd520 468 }
SolderSplashLabs 23:fed7f64dd520 469
SolderSplashLabs 23:fed7f64dd520 470 int32_t cc3000_wlan::ioctl_get_scan_results(uint32_t scan_timeout, uint8_t *results) {
SolderSplashLabs 23:fed7f64dd520 471 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 472 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 473
SolderSplashLabs 23:fed7f64dd520 474 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 475 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 476
SolderSplashLabs 23:fed7f64dd520 477 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 478 args = UINT32_TO_STREAM(args, scan_timeout);
SolderSplashLabs 23:fed7f64dd520 479
SolderSplashLabs 23:fed7f64dd520 480 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 481 _hci.command_send(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, ptr, WLAN_GET_SCAN_RESULTS_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 482
SolderSplashLabs 23:fed7f64dd520 483 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 484 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, results);
SolderSplashLabs 23:fed7f64dd520 485
SolderSplashLabs 23:fed7f64dd520 486 return(0);
SolderSplashLabs 23:fed7f64dd520 487 }
SolderSplashLabs 23:fed7f64dd520 488
SolderSplashLabs 23:fed7f64dd520 489 int32_t cc3000_wlan::ioctl_set_scan_params(uint32_t enable,
SolderSplashLabs 23:fed7f64dd520 490 uint32_t min_dwell_time,
SolderSplashLabs 23:fed7f64dd520 491 uint32_t max_dwell_time,
SolderSplashLabs 23:fed7f64dd520 492 uint32_t num_probe_requests,
SolderSplashLabs 23:fed7f64dd520 493 uint32_t channel_mask,
SolderSplashLabs 23:fed7f64dd520 494 int32_t rssi_threshold,
SolderSplashLabs 23:fed7f64dd520 495 uint32_t snr_threshold,
SolderSplashLabs 23:fed7f64dd520 496 uint32_t default_tx_power,
SolderSplashLabs 23:fed7f64dd520 497 uint32_t *interval_list) {
SolderSplashLabs 23:fed7f64dd520 498 uint32_t uiRes;
SolderSplashLabs 23:fed7f64dd520 499 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 500 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 501
SolderSplashLabs 23:fed7f64dd520 502 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 503 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 504
SolderSplashLabs 23:fed7f64dd520 505 // Fill in temporary command buffer
SolderSplashLabs 23:fed7f64dd520 506 args = UINT32_TO_STREAM(args, 36);
SolderSplashLabs 23:fed7f64dd520 507 args = UINT32_TO_STREAM(args, enable);
SolderSplashLabs 23:fed7f64dd520 508 args = UINT32_TO_STREAM(args, min_dwell_time);
SolderSplashLabs 23:fed7f64dd520 509 args = UINT32_TO_STREAM(args, max_dwell_time);
SolderSplashLabs 23:fed7f64dd520 510 args = UINT32_TO_STREAM(args, num_probe_requests);
SolderSplashLabs 23:fed7f64dd520 511 args = UINT32_TO_STREAM(args, channel_mask);
SolderSplashLabs 23:fed7f64dd520 512 args = UINT32_TO_STREAM(args, rssi_threshold);
SolderSplashLabs 23:fed7f64dd520 513 args = UINT32_TO_STREAM(args, snr_threshold);
SolderSplashLabs 23:fed7f64dd520 514 args = UINT32_TO_STREAM(args, default_tx_power);
SolderSplashLabs 23:fed7f64dd520 515 ARRAY_TO_STREAM(args, interval_list, sizeof(uint32_t) * SL_SET_SCAN_PARAMS_INTERVAL_LIST_SIZE);
SolderSplashLabs 23:fed7f64dd520 516
SolderSplashLabs 23:fed7f64dd520 517 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 518 _hci.command_send(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, ptr, WLAN_SET_SCAN_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 519
SolderSplashLabs 23:fed7f64dd520 520 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 521 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SET_SCANPARAM, &uiRes);
SolderSplashLabs 23:fed7f64dd520 522
SolderSplashLabs 23:fed7f64dd520 523 return(uiRes);
SolderSplashLabs 23:fed7f64dd520 524 }
SolderSplashLabs 23:fed7f64dd520 525
SolderSplashLabs 23:fed7f64dd520 526 int32_t cc3000_wlan::ioctl_statusget(void) {
SolderSplashLabs 23:fed7f64dd520 527 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 528 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 529
SolderSplashLabs 23:fed7f64dd520 530 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 531 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 532
SolderSplashLabs 23:fed7f64dd520 533 _hci.command_send(HCI_CMND_WLAN_IOCTL_STATUSGET,ptr, 0);
SolderSplashLabs 23:fed7f64dd520 534
SolderSplashLabs 23:fed7f64dd520 535 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 536 _event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_STATUSGET, &ret);
SolderSplashLabs 23:fed7f64dd520 537
SolderSplashLabs 23:fed7f64dd520 538 return(ret);
SolderSplashLabs 23:fed7f64dd520 539 }
SolderSplashLabs 23:fed7f64dd520 540
SolderSplashLabs 23:fed7f64dd520 541 #else
SolderSplashLabs 23:fed7f64dd520 542 int32_t cc3000_wlan::wlan_add_profile(uint32_t sec_type,
SolderSplashLabs 23:fed7f64dd520 543 uint8_t *ssid,
SolderSplashLabs 23:fed7f64dd520 544 uint32_t ssid_length,
SolderSplashLabs 23:fed7f64dd520 545 uint8_t *b_ssid,
SolderSplashLabs 23:fed7f64dd520 546 uint32_t priority,
SolderSplashLabs 23:fed7f64dd520 547 uint32_t pairwise_cipher_or_tx_key_len,
SolderSplashLabs 23:fed7f64dd520 548 uint32_t group_cipher_tx_key_index,
SolderSplashLabs 23:fed7f64dd520 549 uint32_t key_mgmt,
SolderSplashLabs 23:fed7f64dd520 550 uint8_t* pf_or_key,
SolderSplashLabs 23:fed7f64dd520 551 uint32_t pass_phrase_length)
SolderSplashLabs 23:fed7f64dd520 552 {
SolderSplashLabs 23:fed7f64dd520 553 return -1;
SolderSplashLabs 23:fed7f64dd520 554 }
SolderSplashLabs 23:fed7f64dd520 555
SolderSplashLabs 23:fed7f64dd520 556 int32_t cc3000_wlan::connect(const uint8_t *ssid, int32_t ssid_len) {
SolderSplashLabs 23:fed7f64dd520 557 int32_t ret;
SolderSplashLabs 23:fed7f64dd520 558 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 559 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 560 uint8_t bssid_zero[] = {0, 0, 0, 0, 0, 0};
SolderSplashLabs 23:fed7f64dd520 561
SolderSplashLabs 23:fed7f64dd520 562 ret = EFAIL;
SolderSplashLabs 23:fed7f64dd520 563 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 564 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 565
SolderSplashLabs 23:fed7f64dd520 566 // Fill in command buffer
SolderSplashLabs 23:fed7f64dd520 567 args = UINT32_TO_STREAM(args, 0x0000001c);
SolderSplashLabs 23:fed7f64dd520 568 args = UINT32_TO_STREAM(args, ssid_len);
SolderSplashLabs 23:fed7f64dd520 569 args = UINT32_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 570 args = UINT32_TO_STREAM(args, 0x00000010 + ssid_len);
SolderSplashLabs 23:fed7f64dd520 571 args = UINT32_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 572 args = UINT16_TO_STREAM(args, 0);
SolderSplashLabs 23:fed7f64dd520 573
SolderSplashLabs 23:fed7f64dd520 574 // padding shall be zeroed
SolderSplashLabs 23:fed7f64dd520 575 ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
SolderSplashLabs 23:fed7f64dd520 576 ARRAY_TO_STREAM(args, ssid, ssid_len);
SolderSplashLabs 23:fed7f64dd520 577
SolderSplashLabs 23:fed7f64dd520 578 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 579 _hci.command_send(HCI_CMND_WLAN_CONNECT, ptr, WLAN_CONNECT_PARAM_LEN + ssid_len - 1);
SolderSplashLabs 23:fed7f64dd520 580
SolderSplashLabs 23:fed7f64dd520 581 // Wait for command complete event
SolderSplashLabs 23:fed7f64dd520 582 _event.simplelink_wait_event(HCI_CMND_WLAN_CONNECT, &ret);
SolderSplashLabs 23:fed7f64dd520 583 errno = ret;
SolderSplashLabs 23:fed7f64dd520 584
SolderSplashLabs 23:fed7f64dd520 585 return(ret);
SolderSplashLabs 23:fed7f64dd520 586 }
SolderSplashLabs 23:fed7f64dd520 587 #endif
SolderSplashLabs 23:fed7f64dd520 588
SolderSplashLabs 23:fed7f64dd520 589
SolderSplashLabs 23:fed7f64dd520 590
SolderSplashLabs 23:fed7f64dd520 591 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
SolderSplashLabs 23:fed7f64dd520 592 int32_t cc3000_wlan::smart_config_process(void) {
SolderSplashLabs 23:fed7f64dd520 593 int32_t returnValue;
SolderSplashLabs 23:fed7f64dd520 594 uint32_t ssidLen, keyLen;
SolderSplashLabs 23:fed7f64dd520 595 uint8_t *decKeyPtr;
SolderSplashLabs 23:fed7f64dd520 596 uint8_t *ssidPtr;
SolderSplashLabs 23:fed7f64dd520 597
SolderSplashLabs 23:fed7f64dd520 598 // read the key from EEPROM - fileID 12
SolderSplashLabs 23:fed7f64dd520 599 returnValue = aes_read_key(key);
SolderSplashLabs 23:fed7f64dd520 600
SolderSplashLabs 23:fed7f64dd520 601 if (returnValue != 0)
SolderSplashLabs 23:fed7f64dd520 602 return returnValue;
SolderSplashLabs 23:fed7f64dd520 603
SolderSplashLabs 23:fed7f64dd520 604 // read the received data from fileID #13 and parse it according to the followings:
SolderSplashLabs 23:fed7f64dd520 605 // 1) SSID LEN - not encrypted
SolderSplashLabs 23:fed7f64dd520 606 // 2) SSID - not encrypted
SolderSplashLabs 23:fed7f64dd520 607 // 3) KEY LEN - not encrypted. always 32 bytes long
SolderSplashLabs 23:fed7f64dd520 608 // 4) Security type - not encrypted
SolderSplashLabs 23:fed7f64dd520 609 // 5) KEY - encrypted together with true key length as the first byte in KEY
SolderSplashLabs 23:fed7f64dd520 610 // to elaborate, there are two corner cases:
SolderSplashLabs 23:fed7f64dd520 611 // 1) the KEY is 32 bytes long. In this case, the first byte does not represent KEY length
SolderSplashLabs 23:fed7f64dd520 612 // 2) the KEY is 31 bytes long. In this case, the first byte represent KEY length and equals 31
SolderSplashLabs 23:fed7f64dd520 613 returnValue = nvmem_read(NVMEM_SHARED_MEM_FILEID, SMART_CONFIG_PROFILE_SIZE, 0, profileArray);
SolderSplashLabs 23:fed7f64dd520 614
SolderSplashLabs 23:fed7f64dd520 615 if (returnValue != 0)
SolderSplashLabs 23:fed7f64dd520 616 return returnValue;
SolderSplashLabs 23:fed7f64dd520 617
SolderSplashLabs 23:fed7f64dd520 618 ssidPtr = &profileArray[1];
SolderSplashLabs 23:fed7f64dd520 619
SolderSplashLabs 23:fed7f64dd520 620 ssidLen = profileArray[0];
SolderSplashLabs 23:fed7f64dd520 621
SolderSplashLabs 23:fed7f64dd520 622 decKeyPtr = &profileArray[profileArray[0] + 3];
SolderSplashLabs 23:fed7f64dd520 623
SolderSplashLabs 23:fed7f64dd520 624 aes_decrypt(decKeyPtr, key);
SolderSplashLabs 23:fed7f64dd520 625 if (profileArray[profileArray[0] + 1] > 16)
SolderSplashLabs 23:fed7f64dd520 626 aes_decrypt((uint8_t *)(decKeyPtr + 16), key);
SolderSplashLabs 23:fed7f64dd520 627
SolderSplashLabs 23:fed7f64dd520 628 if (*(uint8_t *)(decKeyPtr +31) != 0)
SolderSplashLabs 23:fed7f64dd520 629 {
SolderSplashLabs 23:fed7f64dd520 630 if (*decKeyPtr == 31)
SolderSplashLabs 23:fed7f64dd520 631 {
SolderSplashLabs 23:fed7f64dd520 632 keyLen = 31;
SolderSplashLabs 23:fed7f64dd520 633 decKeyPtr++;
SolderSplashLabs 23:fed7f64dd520 634 }
SolderSplashLabs 23:fed7f64dd520 635 else
SolderSplashLabs 23:fed7f64dd520 636 {
SolderSplashLabs 23:fed7f64dd520 637 keyLen = 32;
SolderSplashLabs 23:fed7f64dd520 638 }
SolderSplashLabs 23:fed7f64dd520 639 }
SolderSplashLabs 23:fed7f64dd520 640 else
SolderSplashLabs 23:fed7f64dd520 641 {
SolderSplashLabs 23:fed7f64dd520 642 keyLen = *decKeyPtr;
SolderSplashLabs 23:fed7f64dd520 643 decKeyPtr++;
SolderSplashLabs 23:fed7f64dd520 644 }
SolderSplashLabs 23:fed7f64dd520 645
SolderSplashLabs 23:fed7f64dd520 646 // add a profile
SolderSplashLabs 23:fed7f64dd520 647 switch (profileArray[profileArray[0] + 2])
SolderSplashLabs 23:fed7f64dd520 648 {
SolderSplashLabs 23:fed7f64dd520 649 case WLAN_SEC_UNSEC://None
SolderSplashLabs 23:fed7f64dd520 650 {
SolderSplashLabs 23:fed7f64dd520 651 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
SolderSplashLabs 23:fed7f64dd520 652 ssidPtr, // SSID
SolderSplashLabs 23:fed7f64dd520 653 ssidLen, // SSID length
SolderSplashLabs 23:fed7f64dd520 654 NULL, // BSSID
SolderSplashLabs 23:fed7f64dd520 655 1, // Priority
SolderSplashLabs 23:fed7f64dd520 656 0, 0, 0, 0, 0);
SolderSplashLabs 23:fed7f64dd520 657
SolderSplashLabs 23:fed7f64dd520 658 break;
SolderSplashLabs 23:fed7f64dd520 659 }
SolderSplashLabs 23:fed7f64dd520 660
SolderSplashLabs 23:fed7f64dd520 661 case WLAN_SEC_WEP://WEP
SolderSplashLabs 23:fed7f64dd520 662 {
SolderSplashLabs 23:fed7f64dd520 663 returnValue = wlan_add_profile(profileArray[profileArray[0] + 2], // security type
SolderSplashLabs 23:fed7f64dd520 664 ssidPtr, // SSID
SolderSplashLabs 23:fed7f64dd520 665 ssidLen, // SSID length
SolderSplashLabs 23:fed7f64dd520 666 NULL, // BSSID
SolderSplashLabs 23:fed7f64dd520 667 1, // Priority
SolderSplashLabs 23:fed7f64dd520 668 keyLen, // KEY length
SolderSplashLabs 23:fed7f64dd520 669 0, // KEY index
SolderSplashLabs 23:fed7f64dd520 670 0,
SolderSplashLabs 23:fed7f64dd520 671 decKeyPtr, // KEY
SolderSplashLabs 23:fed7f64dd520 672 0);
SolderSplashLabs 23:fed7f64dd520 673
SolderSplashLabs 23:fed7f64dd520 674 break;
SolderSplashLabs 23:fed7f64dd520 675 }
SolderSplashLabs 23:fed7f64dd520 676
SolderSplashLabs 23:fed7f64dd520 677 case WLAN_SEC_WPA: //WPA
SolderSplashLabs 23:fed7f64dd520 678 case WLAN_SEC_WPA2: //WPA2
SolderSplashLabs 23:fed7f64dd520 679 {
SolderSplashLabs 23:fed7f64dd520 680 returnValue = wlan_add_profile(WLAN_SEC_WPA2, // security type
SolderSplashLabs 23:fed7f64dd520 681 ssidPtr,
SolderSplashLabs 23:fed7f64dd520 682 ssidLen,
SolderSplashLabs 23:fed7f64dd520 683 NULL, // BSSID
SolderSplashLabs 23:fed7f64dd520 684 1, // Priority
SolderSplashLabs 23:fed7f64dd520 685 0x18, // PairwiseCipher
SolderSplashLabs 23:fed7f64dd520 686 0x1e, // GroupCipher
SolderSplashLabs 23:fed7f64dd520 687 2, // KEY management
SolderSplashLabs 23:fed7f64dd520 688 decKeyPtr, // KEY
SolderSplashLabs 23:fed7f64dd520 689 keyLen); // KEY length
SolderSplashLabs 23:fed7f64dd520 690
SolderSplashLabs 23:fed7f64dd520 691 break;
SolderSplashLabs 23:fed7f64dd520 692 }
SolderSplashLabs 23:fed7f64dd520 693 }
SolderSplashLabs 23:fed7f64dd520 694
SolderSplashLabs 23:fed7f64dd520 695 return returnValue;
SolderSplashLabs 23:fed7f64dd520 696 }
SolderSplashLabs 23:fed7f64dd520 697 #endif
SolderSplashLabs 23:fed7f64dd520 698
SolderSplashLabs 23:fed7f64dd520 699 }