version_2.0

Dependents:   cc3000_ping_demo_try_2

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Committer:
erezi
Date:
Wed Jun 25 06:08:39 2014 +0000
Revision:
47:e9d12b82813e
Parent:
45:50ab13d8f2dc
version_2.0

Who changed what in which revision?

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