The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /*****************************************************************************
sinrab 0:5464d5e415e5 2 *
sinrab 0:5464d5e415e5 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
sinrab 0:5464d5e415e5 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
sinrab 0:5464d5e415e5 5 * provided help.
sinrab 0:5464d5e415e5 6 *
sinrab 0:5464d5e415e5 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
sinrab 0:5464d5e415e5 8 * read the following copyright:
sinrab 0:5464d5e415e5 9 *
sinrab 0:5464d5e415e5 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
sinrab 0:5464d5e415e5 11 *
sinrab 0:5464d5e415e5 12 * Redistribution and use in source and binary forms, with or without
sinrab 0:5464d5e415e5 13 * modification, are permitted provided that the following conditions
sinrab 0:5464d5e415e5 14 * are met:
sinrab 0:5464d5e415e5 15 *
sinrab 0:5464d5e415e5 16 * Redistributions of source code must retain the above copyright
sinrab 0:5464d5e415e5 17 * notice, this list of conditions and the following disclaimer.
sinrab 0:5464d5e415e5 18 *
sinrab 0:5464d5e415e5 19 * Redistributions in binary form must reproduce the above copyright
sinrab 0:5464d5e415e5 20 * notice, this list of conditions and the following disclaimer in the
sinrab 0:5464d5e415e5 21 * documentation and/or other materials provided with the
sinrab 0:5464d5e415e5 22 * distribution.
sinrab 0:5464d5e415e5 23 *
sinrab 0:5464d5e415e5 24 * Neither the name of Texas Instruments Incorporated nor the names of
sinrab 0:5464d5e415e5 25 * its contributors may be used to endorse or promote products derived
sinrab 0:5464d5e415e5 26 * from this software without specific prior written permission.
sinrab 0:5464d5e415e5 27 *
sinrab 0:5464d5e415e5 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
sinrab 0:5464d5e415e5 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
sinrab 0:5464d5e415e5 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
sinrab 0:5464d5e415e5 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
sinrab 0:5464d5e415e5 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
sinrab 0:5464d5e415e5 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
sinrab 0:5464d5e415e5 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
sinrab 0:5464d5e415e5 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
sinrab 0:5464d5e415e5 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
sinrab 0:5464d5e415e5 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
sinrab 0:5464d5e415e5 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sinrab 0:5464d5e415e5 39 *
sinrab 0:5464d5e415e5 40 *****************************************************************************/
sinrab 0:5464d5e415e5 41 #include "cc3000.h"
sinrab 0:5464d5e415e5 42 #include "cc3000_event.h"
sinrab 0:5464d5e415e5 43
sinrab 0:5464d5e415e5 44 namespace mbed_cc3000 {
sinrab 0:5464d5e415e5 45
sinrab 0:5464d5e415e5 46 /* TODO this prefix remove? verify */
sinrab 0:5464d5e415e5 47 static uint8_t cc3000_prefix[] = {'T', 'T', 'T'};
sinrab 0:5464d5e415e5 48 cc3000 *cc3000::_inst;
sinrab 0:5464d5e415e5 49
sinrab 0:5464d5e415e5 50 cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi)
sinrab 0:5464d5e415e5 51 : _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
sinrab 0:5464d5e415e5 52 _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
sinrab 0:5464d5e415e5 53 _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
sinrab 0:5464d5e415e5 54 _wlan(_simple_link, _event, _spi, _hci) {
sinrab 0:5464d5e415e5 55 _simple_link.set_tx_complete_signal(1);
sinrab 0:5464d5e415e5 56 memset(&_status, 0, sizeof(_status));
sinrab 0:5464d5e415e5 57 _inst = this;
sinrab 0:5464d5e415e5 58 }
sinrab 0:5464d5e415e5 59
sinrab 0:5464d5e415e5 60 cc3000::~cc3000() {
sinrab 0:5464d5e415e5 61 }
sinrab 0:5464d5e415e5 62
sinrab 0:5464d5e415e5 63 #if (CC3000_ETH_COMPAT == 1)
sinrab 0:5464d5e415e5 64 cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, const char *ssid,
sinrab 0:5464d5e415e5 65 const char *phrase, Security sec, bool smart_config)
sinrab 0:5464d5e415e5 66 : _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
sinrab 0:5464d5e415e5 67 _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
sinrab 0:5464d5e415e5 68 _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
sinrab 0:5464d5e415e5 69 _wlan(_simple_link, _event, _spi, _hci), _sec(sec), _smart_config(smart_config) {
sinrab 0:5464d5e415e5 70 _simple_link.set_tx_complete_signal(1);
sinrab 0:5464d5e415e5 71 memset(&_status, 0, sizeof(_status));
sinrab 0:5464d5e415e5 72 strcpy((char *)_ssid, ssid);
sinrab 0:5464d5e415e5 73 strcpy((char *)_phrase, phrase);
sinrab 0:5464d5e415e5 74 _inst = this;
sinrab 0:5464d5e415e5 75 }
sinrab 0:5464d5e415e5 76
sinrab 0:5464d5e415e5 77 // Ethernet library compatible, functions return strings
sinrab 0:5464d5e415e5 78 // Caches the ipconfig from the usync callback
sinrab 0:5464d5e415e5 79 static char mac_addr[19]= "\0";
sinrab 0:5464d5e415e5 80 static char ip_addr[17] = "\0";
sinrab 0:5464d5e415e5 81 static char gateway[17] = "\0";
sinrab 0:5464d5e415e5 82 static char networkmask[17] = "\0";
sinrab 0:5464d5e415e5 83
sinrab 0:5464d5e415e5 84 void cc3000::init() {
sinrab 0:5464d5e415e5 85 _wlan.start(0);
sinrab 0:5464d5e415e5 86
sinrab 0:5464d5e415e5 87 uint32_t subnet[4] = {0};
sinrab 0:5464d5e415e5 88 uint32_t ip[4] = {0};
sinrab 0:5464d5e415e5 89 uint32_t getway[4] = {0};
sinrab 0:5464d5e415e5 90 uint32_t dns[4] = {0};
sinrab 0:5464d5e415e5 91
sinrab 0:5464d5e415e5 92 _netapp.dhcp(ip, subnet, getway, dns);
sinrab 0:5464d5e415e5 93 _wlan.stop();
sinrab 0:5464d5e415e5 94 wait(1);
sinrab 0:5464d5e415e5 95 _wlan.start(0);
sinrab 0:5464d5e415e5 96
sinrab 0:5464d5e415e5 97 _status.enabled = 1;
sinrab 0:5464d5e415e5 98 _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
sinrab 0:5464d5e415e5 99 }
sinrab 0:5464d5e415e5 100
sinrab 0:5464d5e415e5 101 void cc3000::init(const char *ip, const char *mask, const char *gateway) {
sinrab 0:5464d5e415e5 102 _netapp.dhcp((uint32_t *)ip, (uint32_t *)mask, (uint32_t *)gateway, (uint32_t *)ip); //dns = ip
sinrab 0:5464d5e415e5 103 _wlan.stop();
sinrab 0:5464d5e415e5 104 wait(1);
sinrab 0:5464d5e415e5 105 _wlan.start(0);
sinrab 0:5464d5e415e5 106
sinrab 0:5464d5e415e5 107 _status.enabled = 1;
sinrab 0:5464d5e415e5 108 _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
sinrab 0:5464d5e415e5 109 }
sinrab 0:5464d5e415e5 110
sinrab 0:5464d5e415e5 111 int cc3000::connect(unsigned int timeout_ms) {
sinrab 0:5464d5e415e5 112 Timer t;
sinrab 0:5464d5e415e5 113 int ret = 0;
sinrab 0:5464d5e415e5 114
sinrab 0:5464d5e415e5 115 if (_smart_config == false) {
sinrab 0:5464d5e415e5 116 _wlan.ioctl_set_connection_policy(0, 0, 0);
sinrab 0:5464d5e415e5 117 } else {
sinrab 0:5464d5e415e5 118 tUserFS user_info;
sinrab 0:5464d5e415e5 119 get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
sinrab 0:5464d5e415e5 120 if (user_info.FTC == 1) {
sinrab 0:5464d5e415e5 121 _wlan.ioctl_set_connection_policy(0, 1, 1);
sinrab 0:5464d5e415e5 122 } else {
sinrab 0:5464d5e415e5 123 DBG_CC("Smart config is not set. Please run the first time configuration.");
sinrab 0:5464d5e415e5 124 return -1;
sinrab 0:5464d5e415e5 125 }
sinrab 0:5464d5e415e5 126 }
sinrab 0:5464d5e415e5 127
sinrab 0:5464d5e415e5 128 t.start();
sinrab 0:5464d5e415e5 129 while (is_connected() == false) {
sinrab 0:5464d5e415e5 130 if (strlen((const char *)_phrase) < 8) {
sinrab 0:5464d5e415e5 131 if (connect_open(_ssid)) {
sinrab 0:5464d5e415e5 132 break;
sinrab 0:5464d5e415e5 133 }
sinrab 0:5464d5e415e5 134 } else {
sinrab 0:5464d5e415e5 135 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 136 if (connect_secure(_ssid,_phrase, _sec)) {
sinrab 0:5464d5e415e5 137 break;
sinrab 0:5464d5e415e5 138 }
sinrab 0:5464d5e415e5 139 #else
sinrab 0:5464d5e415e5 140 return -1; /* secure connection not supported with TINY_DRIVER */
sinrab 0:5464d5e415e5 141 #endif
sinrab 0:5464d5e415e5 142 }
sinrab 0:5464d5e415e5 143
sinrab 0:5464d5e415e5 144 if (t.read_ms() > timeout_ms) {
sinrab 0:5464d5e415e5 145 ret = -1;
sinrab 0:5464d5e415e5 146 DBG_CC("Connection to AP failed");
sinrab 0:5464d5e415e5 147 break;
sinrab 0:5464d5e415e5 148 }
sinrab 0:5464d5e415e5 149 }
sinrab 0:5464d5e415e5 150
sinrab 0:5464d5e415e5 151 while (is_dhcp_configured() == false)
sinrab 0:5464d5e415e5 152 {
sinrab 0:5464d5e415e5 153 if (t.read_ms() > timeout_ms) {
sinrab 0:5464d5e415e5 154 ret = -1;
sinrab 0:5464d5e415e5 155 DBG_CC("Connection to AP failed");
sinrab 0:5464d5e415e5 156 break;
sinrab 0:5464d5e415e5 157 }
sinrab 0:5464d5e415e5 158 }
sinrab 0:5464d5e415e5 159
sinrab 0:5464d5e415e5 160 return ret;
sinrab 0:5464d5e415e5 161 }
sinrab 0:5464d5e415e5 162
sinrab 0:5464d5e415e5 163 char* cc3000::getMACAddress() {
sinrab 0:5464d5e415e5 164 return mac_addr;
sinrab 0:5464d5e415e5 165 }
sinrab 0:5464d5e415e5 166
sinrab 0:5464d5e415e5 167 char* cc3000::getIPAddress() {
sinrab 0:5464d5e415e5 168 return ip_addr;
sinrab 0:5464d5e415e5 169 }
sinrab 0:5464d5e415e5 170
sinrab 0:5464d5e415e5 171 char* cc3000::getGateway() {
sinrab 0:5464d5e415e5 172 return gateway;
sinrab 0:5464d5e415e5 173 }
sinrab 0:5464d5e415e5 174
sinrab 0:5464d5e415e5 175 char* cc3000::getNetworkMask() {
sinrab 0:5464d5e415e5 176 return networkmask;
sinrab 0:5464d5e415e5 177 }
sinrab 0:5464d5e415e5 178
sinrab 0:5464d5e415e5 179 int cc3000::disconnect(void){
sinrab 0:5464d5e415e5 180 if (_wlan.disconnect()) {
sinrab 0:5464d5e415e5 181 return -1;
sinrab 0:5464d5e415e5 182 } else {
sinrab 0:5464d5e415e5 183 return 0;
sinrab 0:5464d5e415e5 184 }
sinrab 0:5464d5e415e5 185 }
sinrab 0:5464d5e415e5 186
sinrab 0:5464d5e415e5 187 #endif
sinrab 0:5464d5e415e5 188
sinrab 0:5464d5e415e5 189 void cc3000::usync_callback(int32_t event_type, uint8_t *data, uint8_t length) {
sinrab 0:5464d5e415e5 190 if (event_type == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE) {
sinrab 0:5464d5e415e5 191 DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE");
sinrab 0:5464d5e415e5 192 _status.smart_config_complete = 1;
sinrab 0:5464d5e415e5 193 _status.stop_smart_config = 1;
sinrab 0:5464d5e415e5 194 }
sinrab 0:5464d5e415e5 195
sinrab 0:5464d5e415e5 196 if (event_type == HCI_EVNT_WLAN_UNSOL_CONNECT) {
sinrab 0:5464d5e415e5 197 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_CONNECT");
sinrab 0:5464d5e415e5 198 _status.connected = 1;
sinrab 0:5464d5e415e5 199 // Connect message is always followed by a DHCP message, connection is not useable until then
sinrab 0:5464d5e415e5 200 _status.dhcp = 0;
sinrab 0:5464d5e415e5 201 }
sinrab 0:5464d5e415e5 202
sinrab 0:5464d5e415e5 203 if (event_type == HCI_EVNT_WLAN_UNSOL_DISCONNECT) {
sinrab 0:5464d5e415e5 204 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DISCONNECT");
sinrab 0:5464d5e415e5 205 _status.connected = 0;
sinrab 0:5464d5e415e5 206 _status.dhcp = 0;
sinrab 0:5464d5e415e5 207 _status.dhcp_configured = 0;
sinrab 0:5464d5e415e5 208 }
sinrab 0:5464d5e415e5 209
sinrab 0:5464d5e415e5 210 if (event_type == HCI_EVNT_WLAN_UNSOL_DHCP) {
sinrab 0:5464d5e415e5 211 #if (CC3000_ETH_COMPAT == 1)
sinrab 0:5464d5e415e5 212 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_IP_OFFSET]))), ip_addr, 17);
sinrab 0:5464d5e415e5 213 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_GW_OFFSET]))), gateway, 17);
sinrab 0:5464d5e415e5 214 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_SUBNET_OFFSET]))), networkmask, 17);
sinrab 0:5464d5e415e5 215 _socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_MAC_OFFSET]))), mac_addr, 19);
sinrab 0:5464d5e415e5 216 #endif
sinrab 0:5464d5e415e5 217 if (*(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0) {
sinrab 0:5464d5e415e5 218 _status.dhcp = 1;
sinrab 0:5464d5e415e5 219 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DHCP %i.%i.%i.%i", data[3], data[2], data[1], data[0]);
sinrab 0:5464d5e415e5 220 } else {
sinrab 0:5464d5e415e5 221 DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DHCP - Disconnecting");
sinrab 0:5464d5e415e5 222 _status.dhcp = 0;
sinrab 0:5464d5e415e5 223 }
sinrab 0:5464d5e415e5 224 }
sinrab 0:5464d5e415e5 225
sinrab 0:5464d5e415e5 226 if (event_type == HCI_EVENT_CC3000_CAN_SHUT_DOWN) {
sinrab 0:5464d5e415e5 227 // Note this means the modules is idle, so it could be shutdown..
sinrab 0:5464d5e415e5 228 //DBG_CC("Callback : HCI_EVENT_CC3000_CAN_SHUT_DOWN");
sinrab 0:5464d5e415e5 229 _status.ok_to_shut_down = 1;
sinrab 0:5464d5e415e5 230 }
sinrab 0:5464d5e415e5 231
sinrab 0:5464d5e415e5 232 if (event_type == HCI_EVNT_WLAN_ASYNC_PING_REPORT) {
sinrab 0:5464d5e415e5 233 DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_PING_REPORT");
sinrab 0:5464d5e415e5 234 memcpy(&_ping_report, data, length);
sinrab 0:5464d5e415e5 235 }
sinrab 0:5464d5e415e5 236
sinrab 0:5464d5e415e5 237 if (event_type == HCI_EVNT_BSD_TCP_CLOSE_WAIT) {
sinrab 0:5464d5e415e5 238 uint8_t socketnum = data[0];
sinrab 0:5464d5e415e5 239 DBG_CC("Callback : HCI_EVNT_BSD_TCP_CLOSE_WAIT - Socket : %d", socketnum);
sinrab 0:5464d5e415e5 240 if (socketnum < MAX_SOCKETS) {
sinrab 0:5464d5e415e5 241 _closed_sockets[socketnum] = true; /* clients socket is closed */
sinrab 0:5464d5e415e5 242 }
sinrab 0:5464d5e415e5 243 }
sinrab 0:5464d5e415e5 244 }
sinrab 0:5464d5e415e5 245
sinrab 0:5464d5e415e5 246 void cc3000::start_smart_config(const uint8_t *smart_config_key) {
sinrab 0:5464d5e415e5 247 _status.smart_config_complete = 0;
sinrab 0:5464d5e415e5 248 _wlan.ioctl_set_connection_policy(0, 0, 0);
sinrab 0:5464d5e415e5 249
sinrab 0:5464d5e415e5 250 if (_status.connected == 1) {
sinrab 0:5464d5e415e5 251 disconnect();
sinrab 0:5464d5e415e5 252 }
sinrab 0:5464d5e415e5 253
sinrab 0:5464d5e415e5 254 //Wait until CC3000 is disconected
sinrab 0:5464d5e415e5 255 while (_status.connected == 1) {
sinrab 0:5464d5e415e5 256 wait_us(5);
sinrab 0:5464d5e415e5 257 _event.hci_unsolicited_event_handler();
sinrab 0:5464d5e415e5 258 }
sinrab 0:5464d5e415e5 259
sinrab 0:5464d5e415e5 260 // Trigger the Smart Config process
sinrab 0:5464d5e415e5 261 _wlan.smart_config_set_prefix(cc3000_prefix);
sinrab 0:5464d5e415e5 262 // Start the Smart Config process with AES disabled
sinrab 0:5464d5e415e5 263 _wlan.smart_config_start(0);
sinrab 0:5464d5e415e5 264
sinrab 0:5464d5e415e5 265 DBG_CC("Waiting for smartconfig to be completed");
sinrab 0:5464d5e415e5 266
sinrab 0:5464d5e415e5 267 // Wait for Smart config finished
sinrab 0:5464d5e415e5 268 while (_status.smart_config_complete == 0) {
sinrab 0:5464d5e415e5 269 wait_ms(100);
sinrab 0:5464d5e415e5 270 }
sinrab 0:5464d5e415e5 271
sinrab 0:5464d5e415e5 272 DBG_CC("Smartconfig finished");
sinrab 0:5464d5e415e5 273
sinrab 0:5464d5e415e5 274 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
sinrab 0:5464d5e415e5 275 // create new entry for AES encryption key
sinrab 0:5464d5e415e5 276 _nvmem.create_entry(NVMEM_AES128_KEY_FILEID, 16);
sinrab 0:5464d5e415e5 277 // write AES key to NVMEM
sinrab 0:5464d5e415e5 278 _security.aes_write_key((uint8_t *)(&smart_config_key[0]));
sinrab 0:5464d5e415e5 279 // Decrypt configuration information and add profile
sinrab 0:5464d5e415e5 280 _wlan.smart_config_process();
sinrab 0:5464d5e415e5 281 #endif
sinrab 0:5464d5e415e5 282
sinrab 0:5464d5e415e5 283 // Configure to connect automatically to the AP retrieved in the
sinrab 0:5464d5e415e5 284 // Smart config process
sinrab 0:5464d5e415e5 285 _wlan.ioctl_set_connection_policy(0, 0, 1);
sinrab 0:5464d5e415e5 286
sinrab 0:5464d5e415e5 287 // reset the CC3000
sinrab 0:5464d5e415e5 288 _wlan.stop();
sinrab 0:5464d5e415e5 289 _status.enabled = 0;
sinrab 0:5464d5e415e5 290 wait(5);
sinrab 0:5464d5e415e5 291 _wlan.start(0);
sinrab 0:5464d5e415e5 292 _status.enabled = 1;
sinrab 0:5464d5e415e5 293
sinrab 0:5464d5e415e5 294 // Mask out all non-required events
sinrab 0:5464d5e415e5 295 _wlan.set_event_mask(HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
sinrab 0:5464d5e415e5 296 }
sinrab 0:5464d5e415e5 297
sinrab 0:5464d5e415e5 298 bool cc3000::connect_secure(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
sinrab 0:5464d5e415e5 299 #ifdef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 300 return false; /* not supported*/
sinrab 0:5464d5e415e5 301 #else
sinrab 0:5464d5e415e5 302 uint32_t ret;
sinrab 0:5464d5e415e5 303
sinrab 0:5464d5e415e5 304 //_wlan.disconnect();
sinrab 0:5464d5e415e5 305 wait_ms(3);
sinrab 0:5464d5e415e5 306 ret = _wlan.connect(security_mode, ssid, strlen((const char *)ssid), 0, (uint8_t *)key, strlen((const char *)key));
sinrab 0:5464d5e415e5 307 if (ret == 0) { /* TODO static internal cc3000 state 0 to TRUE */
sinrab 0:5464d5e415e5 308 ret = true;
sinrab 0:5464d5e415e5 309 } else {
sinrab 0:5464d5e415e5 310 ret = false;
sinrab 0:5464d5e415e5 311 }
sinrab 0:5464d5e415e5 312 return ret;
sinrab 0:5464d5e415e5 313 #endif
sinrab 0:5464d5e415e5 314 }
sinrab 0:5464d5e415e5 315
sinrab 0:5464d5e415e5 316 bool cc3000::connect_non_blocking(const uint8_t *ssid, const uint8_t *key, int32_t security_mode)
sinrab 0:5464d5e415e5 317 {
sinrab 0:5464d5e415e5 318 bool ret = false;
sinrab 0:5464d5e415e5 319
sinrab 0:5464d5e415e5 320 if (key == 0) {
sinrab 0:5464d5e415e5 321 if (connect_open(ssid)) {
sinrab 0:5464d5e415e5 322 ret = true;
sinrab 0:5464d5e415e5 323 }
sinrab 0:5464d5e415e5 324 } else {
sinrab 0:5464d5e415e5 325 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 326 if (connect_secure(ssid,key,security_mode)) {
sinrab 0:5464d5e415e5 327 ret = true;
sinrab 0:5464d5e415e5 328 }
sinrab 0:5464d5e415e5 329 #else
sinrab 0:5464d5e415e5 330 /* secure connection not supported with TINY_DRIVER */
sinrab 0:5464d5e415e5 331 #endif
sinrab 0:5464d5e415e5 332 }
sinrab 0:5464d5e415e5 333
sinrab 0:5464d5e415e5 334 return ret;
sinrab 0:5464d5e415e5 335 }
sinrab 0:5464d5e415e5 336
sinrab 0:5464d5e415e5 337 bool cc3000::connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
sinrab 0:5464d5e415e5 338 Timer t;
sinrab 0:5464d5e415e5 339 bool ret = true;
sinrab 0:5464d5e415e5 340
sinrab 0:5464d5e415e5 341 t.start();
sinrab 0:5464d5e415e5 342 while (is_connected() == false) {
sinrab 0:5464d5e415e5 343 if (key == 0) {
sinrab 0:5464d5e415e5 344 if (connect_open(ssid)) {
sinrab 0:5464d5e415e5 345 break;
sinrab 0:5464d5e415e5 346 }
sinrab 0:5464d5e415e5 347 } else {
sinrab 0:5464d5e415e5 348 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 349 if (connect_secure(ssid,key,security_mode)) {
sinrab 0:5464d5e415e5 350 break;
sinrab 0:5464d5e415e5 351 }
sinrab 0:5464d5e415e5 352 #else
sinrab 0:5464d5e415e5 353 return false; /* secure connection not supported with TINY_DRIVER */
sinrab 0:5464d5e415e5 354 #endif
sinrab 0:5464d5e415e5 355 }
sinrab 0:5464d5e415e5 356
sinrab 0:5464d5e415e5 357 /* timeout 10 seconds */
sinrab 0:5464d5e415e5 358 if (t.read_ms() > 10000) {
sinrab 0:5464d5e415e5 359 ret = false;
sinrab 0:5464d5e415e5 360 DBG_CC("Connection to AP failed");
sinrab 0:5464d5e415e5 361 break;
sinrab 0:5464d5e415e5 362 }
sinrab 0:5464d5e415e5 363 }
sinrab 0:5464d5e415e5 364
sinrab 0:5464d5e415e5 365 return ret;
sinrab 0:5464d5e415e5 366 }
sinrab 0:5464d5e415e5 367
sinrab 0:5464d5e415e5 368 void cc3000::start(uint8_t patch) {
sinrab 0:5464d5e415e5 369 _wlan.start(patch);
sinrab 0:5464d5e415e5 370 _status.enabled = 1;
sinrab 0:5464d5e415e5 371 _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
sinrab 0:5464d5e415e5 372 }
sinrab 0:5464d5e415e5 373
sinrab 0:5464d5e415e5 374 void cc3000::stop(void) {
sinrab 0:5464d5e415e5 375 _wlan.stop();
sinrab 0:5464d5e415e5 376 _status.enabled = 0;
sinrab 0:5464d5e415e5 377 }
sinrab 0:5464d5e415e5 378
sinrab 0:5464d5e415e5 379 void cc3000::restart(uint8_t patch) {
sinrab 0:5464d5e415e5 380 _wlan.stop();
sinrab 0:5464d5e415e5 381 _status.enabled = 0;
sinrab 0:5464d5e415e5 382 wait_ms(500);
sinrab 0:5464d5e415e5 383 _wlan.start(patch);
sinrab 0:5464d5e415e5 384 _status.enabled = 1;
sinrab 0:5464d5e415e5 385 }
sinrab 0:5464d5e415e5 386
sinrab 0:5464d5e415e5 387 bool cc3000::connect_open(const uint8_t *ssid) {
sinrab 0:5464d5e415e5 388 _wlan.disconnect();
sinrab 0:5464d5e415e5 389 wait_ms(3);
sinrab 0:5464d5e415e5 390 uint32_t ret;
sinrab 0:5464d5e415e5 391 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 392 ret = _wlan.connect(0,ssid, strlen((const char *)ssid), 0, 0, 0);
sinrab 0:5464d5e415e5 393 #else
sinrab 0:5464d5e415e5 394 ret = _wlan.connect(ssid, strlen((const char *)ssid));
sinrab 0:5464d5e415e5 395 #endif
sinrab 0:5464d5e415e5 396 if (ret == 0) {
sinrab 0:5464d5e415e5 397 ret = true;
sinrab 0:5464d5e415e5 398 } else {
sinrab 0:5464d5e415e5 399 ret = false;
sinrab 0:5464d5e415e5 400 }
sinrab 0:5464d5e415e5 401 return ret;
sinrab 0:5464d5e415e5 402 }
sinrab 0:5464d5e415e5 403
sinrab 0:5464d5e415e5 404 bool cc3000::is_enabled()
sinrab 0:5464d5e415e5 405 {
sinrab 0:5464d5e415e5 406 return _status.enabled;
sinrab 0:5464d5e415e5 407 }
sinrab 0:5464d5e415e5 408
sinrab 0:5464d5e415e5 409 bool cc3000::is_connected() {
sinrab 0:5464d5e415e5 410 if (( _status.connected ) && ( _status.dhcp )) {
sinrab 0:5464d5e415e5 411 return 1;
sinrab 0:5464d5e415e5 412 } else {
sinrab 0:5464d5e415e5 413 return 0;
sinrab 0:5464d5e415e5 414 }
sinrab 0:5464d5e415e5 415 }
sinrab 0:5464d5e415e5 416
sinrab 0:5464d5e415e5 417 bool cc3000::is_dhcp_configured() {
sinrab 0:5464d5e415e5 418 return _status.dhcp;
sinrab 0:5464d5e415e5 419 }
sinrab 0:5464d5e415e5 420
sinrab 0:5464d5e415e5 421 bool cc3000::is_smart_confing_completed() {
sinrab 0:5464d5e415e5 422 return _status.smart_config_complete;
sinrab 0:5464d5e415e5 423 }
sinrab 0:5464d5e415e5 424
sinrab 0:5464d5e415e5 425 uint8_t cc3000::get_mac_address(uint8_t address[6]) {
sinrab 0:5464d5e415e5 426 return _nvmem.get_mac_address(address);
sinrab 0:5464d5e415e5 427 }
sinrab 0:5464d5e415e5 428
sinrab 0:5464d5e415e5 429 uint8_t cc3000::set_mac_address(uint8_t address[6]) {
sinrab 0:5464d5e415e5 430 return _nvmem.set_mac_address(address);
sinrab 0:5464d5e415e5 431 }
sinrab 0:5464d5e415e5 432
sinrab 0:5464d5e415e5 433 void cc3000::get_user_file_info(uint8_t *info_file, size_t size) {
sinrab 0:5464d5e415e5 434 _nvmem.read( NVMEM_USER_FILE_1_FILEID, size, 0, info_file);
sinrab 0:5464d5e415e5 435 }
sinrab 0:5464d5e415e5 436
sinrab 0:5464d5e415e5 437 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 438 bool cc3000::get_ip_config(tNetappIpconfigRetArgs *ip_config) {
sinrab 0:5464d5e415e5 439 if ((_status.dhcp == false) || (_status.connected == false)) {
sinrab 0:5464d5e415e5 440 return false;
sinrab 0:5464d5e415e5 441 }
sinrab 0:5464d5e415e5 442
sinrab 0:5464d5e415e5 443 _netapp.ipconfig(ip_config);
sinrab 0:5464d5e415e5 444 return true;
sinrab 0:5464d5e415e5 445 }
sinrab 0:5464d5e415e5 446 #endif
sinrab 0:5464d5e415e5 447
sinrab 0:5464d5e415e5 448 void cc3000::delete_profiles(void) {
sinrab 0:5464d5e415e5 449 _wlan.ioctl_set_connection_policy(0, 0, 0);
sinrab 0:5464d5e415e5 450 _wlan.ioctl_del_profile(255);
sinrab 0:5464d5e415e5 451
sinrab 0:5464d5e415e5 452 tUserFS user_info;
sinrab 0:5464d5e415e5 453 get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
sinrab 0:5464d5e415e5 454 user_info.FTC = 0;
sinrab 0:5464d5e415e5 455 set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
sinrab 0:5464d5e415e5 456 }
sinrab 0:5464d5e415e5 457
sinrab 0:5464d5e415e5 458 void cc3000::set_user_file_info(uint8_t *info_file, size_t size) {
sinrab 0:5464d5e415e5 459 _nvmem.write( NVMEM_USER_FILE_1_FILEID, size, 0, info_file);
sinrab 0:5464d5e415e5 460 }
sinrab 0:5464d5e415e5 461
sinrab 0:5464d5e415e5 462 uint32_t cc3000::ping(uint32_t ip, uint8_t attempts, uint16_t timeout, uint8_t size) {
sinrab 0:5464d5e415e5 463 #ifndef CC3000_TINY_DRIVER
sinrab 0:5464d5e415e5 464 uint32_t reversed_ip = (ip >> 24) | ((ip >> 8) & 0xFF00) | ((ip << 8) & 0xFF0000) | (ip << 24);
sinrab 0:5464d5e415e5 465
sinrab 0:5464d5e415e5 466 _ping_report.packets_received = 0;
sinrab 0:5464d5e415e5 467 if (_netapp.ping_send(&reversed_ip, attempts, size, timeout) == -1) {
sinrab 0:5464d5e415e5 468 DBG_CC("Failed to send ping");
sinrab 0:5464d5e415e5 469 return 0;
sinrab 0:5464d5e415e5 470 }
sinrab 0:5464d5e415e5 471 wait_ms(timeout*attempts*2);
sinrab 0:5464d5e415e5 472
sinrab 0:5464d5e415e5 473 /* known issue of cc3000 - sent number is send + received */
sinrab 0:5464d5e415e5 474 // TODO : Remove the Sent/recv'd counts until ti fix the firmware issue?
sinrab 0:5464d5e415e5 475 DBG_CC("Sent: %d",_ping_report.packets_sent);
sinrab 0:5464d5e415e5 476 DBG_CC("Received: %d",_ping_report.packets_received);
sinrab 0:5464d5e415e5 477 DBG_CC("Min time: %d",_ping_report.min_round_time);
sinrab 0:5464d5e415e5 478 DBG_CC("Max time: %d",_ping_report.max_round_time);
sinrab 0:5464d5e415e5 479 DBG_CC("Avg time: %d",_ping_report.avg_round_time);
sinrab 0:5464d5e415e5 480
sinrab 0:5464d5e415e5 481 return _ping_report.packets_received;
sinrab 0:5464d5e415e5 482 #else
sinrab 0:5464d5e415e5 483 return 0;
sinrab 0:5464d5e415e5 484 #endif
sinrab 0:5464d5e415e5 485 }
sinrab 0:5464d5e415e5 486
sinrab 0:5464d5e415e5 487 /* Conversion between uint types and C strings */
sinrab 0:5464d5e415e5 488 uint8_t* UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32)
sinrab 0:5464d5e415e5 489 {
sinrab 0:5464d5e415e5 490 *(p)++ = (uint8_t)(u32);
sinrab 0:5464d5e415e5 491 *(p)++ = (uint8_t)((u32) >> 8);
sinrab 0:5464d5e415e5 492 *(p)++ = (uint8_t)((u32) >> 16);
sinrab 0:5464d5e415e5 493 *(p)++ = (uint8_t)((u32) >> 24);
sinrab 0:5464d5e415e5 494 return p;
sinrab 0:5464d5e415e5 495 }
sinrab 0:5464d5e415e5 496
sinrab 0:5464d5e415e5 497
sinrab 0:5464d5e415e5 498 uint8_t* UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16)
sinrab 0:5464d5e415e5 499 {
sinrab 0:5464d5e415e5 500 *(p)++ = (uint8_t)(u16);
sinrab 0:5464d5e415e5 501 *(p)++ = (uint8_t)((u16) >> 8);
sinrab 0:5464d5e415e5 502 return p;
sinrab 0:5464d5e415e5 503 }
sinrab 0:5464d5e415e5 504
sinrab 0:5464d5e415e5 505
sinrab 0:5464d5e415e5 506 uint16_t STREAM_TO_UINT16_f(uint8_t *p, uint16_t offset)
sinrab 0:5464d5e415e5 507 {
sinrab 0:5464d5e415e5 508 return (uint16_t)((uint16_t)((uint16_t)
sinrab 0:5464d5e415e5 509 (*(p + offset + 1)) << 8) + (uint16_t)(*(p + offset)));
sinrab 0:5464d5e415e5 510 }
sinrab 0:5464d5e415e5 511
sinrab 0:5464d5e415e5 512
sinrab 0:5464d5e415e5 513 uint32_t STREAM_TO_UINT32_f(uint8_t *p, uint16_t offset)
sinrab 0:5464d5e415e5 514 {
sinrab 0:5464d5e415e5 515 return (uint32_t)((uint32_t)((uint32_t)
sinrab 0:5464d5e415e5 516 (*(p + offset + 3)) << 24) + (uint32_t)((uint32_t)
sinrab 0:5464d5e415e5 517 (*(p + offset + 2)) << 16) + (uint32_t)((uint32_t)
sinrab 0:5464d5e415e5 518 (*(p + offset + 1)) << 8) + (uint32_t)(*(p + offset)));
sinrab 0:5464d5e415e5 519 }
sinrab 0:5464d5e415e5 520
sinrab 0:5464d5e415e5 521 } // mbed_cc3000 namespace
sinrab 0:5464d5e415e5 522
sinrab 0:5464d5e415e5 523