Kojto CC3000 Hostdriver With Mbed Socket interface

Dependents:   WiFiDip-KitchenSink WiFiDip-UsbKitchenSink WiFiDipCortexSensor WifiDipCortex-UDPDemo

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Committer:
SolderSplashLabs
Date:
Sat Oct 12 20:46:19 2013 +0000
Revision:
37:03ac37ab34eb
Parent:
36:1d374a7f0c0d
Child:
40:acb9324640c4
Added mbed ethernet library compatability, get ip, gateway and sub mask functions. Added enabled flag so we know when the module is enabled. Smart config tweaks

Who changed what in which revision?

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