Added mutex for multiple SPI devices on the same SPI bus
Fork of cc3000_hostdriver_mbedsocket by
Revision 45:50ab13d8f2dc, committed 2013-11-06
- Comitter:
- Kojto
- Date:
- Wed Nov 06 17:56:25 2013 +0100
- Parent:
- 44:960b73df5981
- Child:
- 46:ca8c234997c0
- Commit message:
- complete Ethernet interface
- code clean-up
- IRQ - faster enable/disable, a flag to process an IRQ
- EthernetInterface
- TINY_DRIVER compilation errors correction
Changed in this revision
--- a/Socket/Endpoint.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/Socket/Endpoint.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -23,7 +23,7 @@
#include "cc3000.h"
/* Copied from lwip */
-static char *inet_ntoa_r(const in_addr addr, char *buf, int buflen)
+static char *cc3000_inet_ntoa_r(const in_addr addr, char *buf, int buflen)
{
uint32_t s_addr;
char inv[3];
@@ -78,7 +78,6 @@
int Endpoint::set_address(const char* host, const int port) {
reset_address();
- int resolveRetCode;
char address[5];
char *p_address = address;
@@ -92,18 +91,23 @@
std::memset(_ipAddress,0,sizeof(_ipAddress));
if (result != 4) {
+ #ifndef CC3000_TINY_DRIVER
//Resolve DNS address or populate hard-coded IP address
uint32_t address_integer;
+ int resolveRetCode;
resolveRetCode = _cc3000_module->_socket.gethostbyname((uint8_t *)host, strlen(host) , &address_integer);
if ((resolveRetCode > -1) && (0 != address_integer)) {
_remote_host.sin_addr.s_addr = htonl(address_integer);
- inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
+ cc3000_inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
} else {
// Failed to resolve the address
DBG_SOCKET("Failed to resolve the hostname : %s",host);
return (-1);
}
+#else
+ return -1;
+#endif
} else {
std::memcpy((char*)&_remote_host.sin_addr.s_addr, p_address, 4);
}
@@ -124,7 +128,7 @@
char* Endpoint::get_address() {
if ((_ipAddress[0] == '\0') && (_remote_host.sin_addr.s_addr != 0))
- inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
+ cc3000_inet_ntoa_r(_remote_host.sin_addr, _ipAddress, sizeof(_ipAddress));
return _ipAddress;
}
--- a/Socket/Socket.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/Socket/Socket.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -37,7 +37,7 @@
DBG_SOCKET("Failed to create new socket (type: %d, protocol: %d)",type, protocol);
return -1;
}
-
+
DBG_SOCKET("Socket created (fd: %d type: %d, protocol: %d)",fd, type, protocol);
_sock_fd = fd;
@@ -50,7 +50,11 @@
}
int Socket::set_option(int level, int optname, const void *optval, socklen_t optlen) {
+#ifndef CC3000_TINY_DRIVER
return _cc3000_module->_socket.setsockopt(_sock_fd, level, optname, optval, optlen);
+#else
+ return -1;
+#endif
}
int Socket::get_option(int level, int optname, void *optval, socklen_t *optlen) {
@@ -70,9 +74,9 @@
fd_set* writeset = (write) ? (&fdSet) : (NULL);
int ret = _cc3000_module->_socket.select(_sock_fd+1, readset, writeset, NULL, timeout);
-
+
DBG_SOCKET("Select on sock_fd: %d, returns %d. fdSet: %d", _sock_fd, ret, FD_ISSET(_sock_fd, &fdSet));
-
+
// TODO
//return (ret <= 0 || !FD_ISSET(_sock_fd, &fdSet)) ? (-1) : (0);
if (FD_ISSET(_sock_fd, &fdSet)) {
--- a/cc3000.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -47,36 +47,119 @@
static uint8_t cc3000_prefix[] = {'T', 'T', 'T'};
cc3000 *cc3000::_inst;
-cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, IRQn_Type irq_port)
- : _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),
- _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event), _wlan(_simple_link, _event, _spi, _hci) {
- /* TODO - pIRQ riorities ?? */
-
+cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi)
+ : _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
+ _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
+ _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
+ _wlan(_simple_link, _event, _spi, _hci) {
_simple_link.set_tx_complete_signal(1);
- _status.dhcp = 0;
- _status.connected = 0;
- _status.socket = 0;
- _status.dhcp_configured = 0;
- _status.smart_config_complete = 0;
- _status.stop_smart_config = 0;
- _status.ok_to_shut_down = 0;
- _status.enabled = 0;
-
+ memset(&_status, 0, sizeof(_status));
_inst = this;
}
cc3000::~cc3000() {
-
}
#if (CC3000_ETH_COMPAT == 1)
+cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, const char *ssid,
+ const char *phrase, Security sec, bool smart_config)
+ : _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
+ _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
+ _nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
+ _wlan(_simple_link, _event, _spi, _hci), _sec(sec), _smart_config(smart_config) {
+ _simple_link.set_tx_complete_signal(1);
+ memset(&_status, 0, sizeof(_status));
+ strcpy((char *)_ssid, ssid);
+ strcpy((char *)_phrase, phrase);
+ _inst = this;
+}
+
// Ethernet library compatible, functions return strings
// Caches the ipconfig from the usync callback
-static char mac_addr[19];
+static char mac_addr[19]= "\0";
static char ip_addr[17] = "\0";
static char gateway[17] = "\0";
static char networkmask[17] = "\0";
+void cc3000::init() {
+ _wlan.start(0);
+
+ uint32_t subnet[4] = {0};
+ uint32_t ip[4] = {0};
+ uint32_t getway[4] = {0};
+ uint32_t dns[4] = {0};
+
+ _netapp.dhcp(ip, subnet, getway, dns);
+ _wlan.stop();
+ wait(1);
+ _wlan.start(0);
+
+ _status.enabled = 1;
+ _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
+}
+
+void cc3000::init(const char *ip, const char *mask, const char *gateway) {
+ _netapp.dhcp((uint32_t *)ip, (uint32_t *)mask, (uint32_t *)gateway, (uint32_t *)ip); //dns = ip
+ _wlan.stop();
+ wait(1);
+ _wlan.start(0);
+
+ _status.enabled = 1;
+ _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
+}
+
+int cc3000::connect(unsigned int timeout_ms) {
+ Timer t;
+ int ret = 0;
+
+ if (_smart_config == false) {
+ _wlan.ioctl_set_connection_policy(0, 0, 0);
+ } else {
+ tUserFS user_info;
+ get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
+ if (user_info.FTC == 1) {
+ _wlan.ioctl_set_connection_policy(0, 1, 1);
+ } else {
+ DBG_CC("Smart config is not set. Please run the first time configuration.");
+ return -1;
+ }
+ }
+
+ t.start();
+ while (is_connected() == false) {
+ if (strlen((const char *)_phrase) < 8) {
+ if (connect_open(_ssid)) {
+ break;
+ }
+ } else {
+#ifndef CC3000_TINY_DRIVER
+ if (connect_secure(_ssid,_phrase, _sec)) {
+ break;
+ }
+#else
+ return -1; /* secure connection not supported with TINY_DRIVER */
+#endif
+ }
+
+ if (t.read_ms() > timeout_ms) {
+ ret = -1;
+ DBG_CC("Connection to AP failed");
+ break;
+ }
+ }
+
+ while (is_dhcp_configured() == false)
+ {
+ if (t.read_ms() > timeout_ms) {
+ ret = -1;
+ DBG_CC("Connection to AP failed");
+ break;
+ }
+ }
+
+ return ret;
+}
+
char* cc3000::getMACAddress() {
return mac_addr;
}
@@ -92,34 +175,39 @@
char* cc3000::getNetworkMask() {
return networkmask;
}
+
+int cc3000::disconnect(void){
+ if (_wlan.disconnect()) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
#endif
void cc3000::usync_callback(int32_t event_type, uint8_t *data, uint8_t length) {
- if (event_type == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
- {
+ if (event_type == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE) {
DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE");
_status.smart_config_complete = 1;
_status.stop_smart_config = 1;
}
- if (event_type == HCI_EVNT_WLAN_UNSOL_CONNECT)
- {
+ if (event_type == HCI_EVNT_WLAN_UNSOL_CONNECT) {
DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_CONNECT");
_status.connected = 1;
// Connect message is always followed by a DHCP message, connection is not useable until then
_status.dhcp = 0;
}
- if (event_type == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
- {
+ if (event_type == HCI_EVNT_WLAN_UNSOL_DISCONNECT) {
DBG_CC("Callback : HCI_EVNT_WLAN_UNSOL_DISCONNECT");
_status.connected = 0;
_status.dhcp = 0;
_status.dhcp_configured = 0;
}
- if (event_type == HCI_EVNT_WLAN_UNSOL_DHCP)
- {
+ if (event_type == HCI_EVNT_WLAN_UNSOL_DHCP) {
#if (CC3000_ETH_COMPAT == 1)
_socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_IP_OFFSET]))), ip_addr, 17);
_socket.inet_ntoa_r( htonl(*((uint32_t *)(&data[NETAPP_IPCONFIG_GW_OFFSET]))), gateway, 17);
@@ -135,22 +223,19 @@
}
}
- if (event_type == HCI_EVENT_CC3000_CAN_SHUT_DOWN)
- {
+ if (event_type == HCI_EVENT_CC3000_CAN_SHUT_DOWN) {
// Note this means the modules is idle, so it could be shutdown..
//DBG_CC("Callback : HCI_EVENT_CC3000_CAN_SHUT_DOWN");
_status.ok_to_shut_down = 1;
}
- if (event_type == HCI_EVNT_WLAN_ASYNC_PING_REPORT)
- {
+ if (event_type == HCI_EVNT_WLAN_ASYNC_PING_REPORT) {
DBG_CC("Callback : HCI_EVNT_WLAN_ASYNC_PING_REPORT");
memcpy(&_ping_report, data, length);
}
if (event_type == HCI_EVNT_BSD_TCP_CLOSE_WAIT) {
- uint8_t socketnum;
- socketnum = data[0];
+ uint8_t socketnum = data[0];
DBG_CC("Callback : HCI_EVNT_BSD_TCP_CLOSE_WAIT - Socket : %d", socketnum);
if (socketnum < MAX_SOCKETS) {
_closed_sockets[socketnum] = true; /* clients socket is closed */
@@ -162,14 +247,12 @@
_status.smart_config_complete = 0;
_wlan.ioctl_set_connection_policy(0, 0, 0);
- if (_status.connected == 1)
- {
+ if (_status.connected == 1) {
disconnect();
}
//Wait until CC3000 is disconected
- while (_status.connected == 1)
- {
+ while (_status.connected == 1) {
wait_us(5);
_event.hci_unsolicited_event_handler();
}
@@ -182,8 +265,7 @@
DBG_CC("Waiting for smartconfig to be completed");
// Wait for Smart config finished
- while (_status.smart_config_complete == 0)
- {
+ while (_status.smart_config_complete == 0) {
wait_ms(100);
}
@@ -214,6 +296,9 @@
}
bool cc3000::connect_secure(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
+#ifdef CC3000_TINY_DRIVER
+ return false; /* not supported*/
+#else
uint32_t ret;
//_wlan.disconnect();
@@ -225,24 +310,20 @@
ret = false;
}
return ret;
+#endif
}
bool cc3000::connect_non_blocking(const uint8_t *ssid, const uint8_t *key, int32_t security_mode)
{
-bool ret = false;
+ bool ret = false;
- if (key == 0)
- {
- if (connect_open(ssid))
- {
+ if (key == 0) {
+ if (connect_open(ssid)) {
ret = true;
}
- }
- else
- {
+ } else {
#ifndef CC3000_TINY_DRIVER
- if (connect_secure(ssid,key,security_mode))
- {
+ if (connect_secure(ssid,key,security_mode)) {
ret = true;
}
#else
@@ -254,7 +335,7 @@
}
bool cc3000::connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode) {
- Timer t; /* TODO static? */
+ Timer t;
bool ret = true;
t.start();
@@ -274,11 +355,9 @@
}
/* timeout 10 seconds */
- if (t.read_ms() > 10000){
+ if (t.read_ms() > 10000) {
ret = false;
-
DBG_CC("Connection to AP failed");
-
break;
}
}
@@ -289,7 +368,7 @@
void cc3000::start(uint8_t patch) {
_wlan.start(patch);
_status.enabled = 1;
- _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE);
+ _wlan.set_event_mask(HCI_EVNT_WLAN_UNSOL_INIT | HCI_EVNT_WLAN_KEEPALIVE | HCI_EVNT_WLAN_ASYNC_PING_REPORT);
}
void cc3000::stop(void) {
@@ -306,10 +385,9 @@
}
bool cc3000::connect_open(const uint8_t *ssid) {
- uint32_t ret;
-
_wlan.disconnect();
wait_ms(3);
+ uint32_t ret;
#ifndef CC3000_TINY_DRIVER
ret = _wlan.connect(0,ssid, strlen((const char *)ssid), 0, 0, 0);
#else
@@ -329,13 +407,10 @@
}
bool cc3000::is_connected() {
- if (( _status.connected ) && ( _status.dhcp ))
- {
- return( 1 );
- }
- else
- {
- return( 0 );
+ if (( _status.connected ) && ( _status.dhcp )) {
+ return 1;
+ } else {
+ return 0;
}
}
@@ -371,11 +446,10 @@
#endif
void cc3000::delete_profiles(void) {
- tUserFS user_info;
-
_wlan.ioctl_set_connection_policy(0, 0, 0);
_wlan.ioctl_del_profile(255);
+ tUserFS user_info;
get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
user_info.FTC = 0;
set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
@@ -385,15 +459,8 @@
_nvmem.write( NVMEM_USER_FILE_1_FILEID, size, 0, info_file);
}
-bool cc3000::disconnect(void){
- if (_wlan.disconnect()) {
- return false;
- } else {
- return true;
- }
-}
-
uint32_t cc3000::ping(uint32_t ip, uint8_t attempts, uint16_t timeout, uint8_t size) {
+#ifndef CC3000_TINY_DRIVER
uint32_t reversed_ip = (ip >> 24) | ((ip >> 8) & 0xFF00) | ((ip << 8) & 0xFF0000) | (ip << 24);
_ping_report.packets_received = 0;
@@ -412,6 +479,9 @@
DBG_CC("Avg time: %d",_ping_report.avg_round_time);
return _ping_report.packets_received;
+#else
+ return 0;
+#endif
}
/* Conversion between uint types and C strings */
@@ -448,5 +518,5 @@
(*(p + offset + 1)) << 8) + (uint32_t)(*(p + offset)));
}
-} /* end of mbed_cc3000 namespace */
+} // mbed_cc3000 namespace
--- a/cc3000.h Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000.h Wed Nov 06 17:56:25 2013 +0100
@@ -127,6 +127,15 @@
BOOTLOADER_PATCHES = 2,
};
+/** AP security
+ */
+enum Security {
+ NONE = 0,
+ WEP = 1,
+ WPA = 2,
+ WPA2 = 3
+};
+
/** CC3000 Simple Link class which contains status of cc3000.
*/
class cc3000_simple_link {
@@ -325,7 +334,7 @@
class cc3000_event {
public:
/**
- * \brief
+ * \brief Ctor
* \param simplelink Reference to simple link object.
* \param hci Reference to hci object.
* \param spi Reference to spi object.
@@ -334,7 +343,7 @@
*/
cc3000_event(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_spi &spi, cc3000 &cc3000);
/**
- * \brief Ctor
+ * \brief Dtor
* \param none
* \return none
*/
@@ -352,7 +361,7 @@
* \param fromlen from information length (in case of data received)
* \return none
*/
- uint8_t *hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen);
+ uint8_t* hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen);
/**
* \brief Handle unsolicited events.
* \param event_hdr Event header
@@ -1072,7 +1081,7 @@
* \param simple_link Reference to the simple link object.
* \return none
*/
- cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, IRQn_Type irq_port, cc3000_event &event, cc3000_simple_link &simple_link);
+ cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, cc3000_event &event, cc3000_simple_link &simple_link);
/**
* \brief Dtor
* \param none
@@ -1166,10 +1175,9 @@
DigitalOut _wlan_en;
DigitalOut _wlan_cs;
SPI _wlan_spi;
- IRQn_Type _irq_port;
- pFunctionPointer_t _function_pointer;
cc3000_event &_event;
cc3000_simple_link &_simple_link;
+ bool _process_irq;
};
/** HCI layer
@@ -1531,9 +1539,9 @@
public:
/** status structure */
typedef struct {
+ uint8_t socket;
bool dhcp;
bool connected;
- uint8_t socket;
bool smart_config_complete;
bool stop_smart_config;
bool dhcp_configured;
@@ -1546,15 +1554,14 @@
* \param cc3000_en Enable pin
* \param cc3000_cs Chip select pin
* \param cc3000_spi SPI interface
- * \param irq_port IRQ pin's port
*/
- cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, IRQn_Type irq_port);
+ cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi);
/**
* \brief Dtor.
*/
~cc3000();
/**
- * \brief Initiate cc3000. It starts the wlan communication and deletes profiles.
+ * \brief Initiate cc3000. It starts the wlan communication.
* \param patch Patch
*/
void start(uint8_t patch);
@@ -1567,11 +1574,6 @@
*/
void restart(uint8_t patch);
/**
- * \brief Disconnect wlan device
- *
- */
- bool disconnect(void);
- /**
* \brief Callback which is called from the event class. This updates status of cc3000.
* \param event_type Type of the event
* \param data Pointer to data
@@ -1689,18 +1691,55 @@
* \param none
* \return Pointer to cc3000 object
*/
- static cc3000 *get_instance() {
+ static cc3000* get_instance() {
return _inst;
}
#if (CC3000_ETH_COMPAT == 1)
/**
+ * \brief Ctor for EthernetInterface
+ * \param cc3000_irq IRQ pin
+ * \param cc3000_en Enable pin
+ * \param cc3000_cs Chip select pin
+ * \param cc3000_spi SPI interface
+ * \param ssid SSID
+ * \param phrase Password
+ * \param sec Security of the AP
+ * \param smart_config Smart config selection
+ */
+ cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, const char *ssid, const char *phrase, Security sec, bool smart_config);
+ /**
+ * \brief Disconnect wlan device.
+ * \param none
+ * \return 0 if successful, -1 otherwise.
+ */
+ int disconnect();
+ /**
+ * \brief Initialize the interface with DHCP.
+ * \param none
+ * \return none
+ */
+ void init();
+ /**
+ * \brief Initialize the interface with a static IP address.
+ * \param ip the IP address to use.
+ * \param mask the IP address mask
+ * \param gateway the gateway to use
+ * \return none
+ */
+ void init(const char *ip, const char *mask, const char *gateway);
+ /**
+ * \brief Connect Bring the interface up.
+ * \param timeout_ms timeout in ms
+ * \return 0 if successful, -1 otherwise.
+ */
+ int connect(unsigned int timeout_ms = 20000);
+ /**
* \brief Get the MAC address of your Ethernet interface.
* \param none
* \return
* Pointer to a string containing the MAC address.
*/
char* getMACAddress();
-
/**
* \brief Get the IP address of your Ethernet interface.
* \param none
@@ -1708,7 +1747,6 @@
* Pointer to a string containing the IP address.
*/
char* getIPAddress();
-
/**
* \brief Get the Gateway address of your Ethernet interface
* \param none
@@ -1716,7 +1754,6 @@
* Pointer to a string containing the Gateway address
*/
char* getGateway();
-
/**
* \brief Get the Network mask of your Ethernet interface
* \param none
@@ -1728,21 +1765,27 @@
public:
cc3000_simple_link _simple_link;
cc3000_event _event;
-#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
- cc3000_security _security;
-#endif
cc3000_socket _socket;
cc3000_spi _spi;
cc3000_hci _hci;
cc3000_nvmem _nvmem;
cc3000_netapp _netapp;
cc3000_wlan _wlan;
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+ cc3000_security _security;
+#endif
protected:
static cc3000 *_inst;
private:
tStatus _status;
netapp_pingreport_args_t _ping_report;
bool _closed_sockets[MAX_SOCKETS];
+#if (CC3000_ETH_COMPAT == 1)
+ uint8_t _phrase[30];
+ uint8_t _ssid[30];
+ Security _sec;
+ bool _smart_config;
+#endif
};
/**
--- a/cc3000_event.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_event.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -430,9 +430,6 @@
}
_simple_link.set_data_received_flag(0);
-
- //tWlanInterruptEnable func_pointer = (tWlanInterruptEnable)_simple_link.get_func_pointer(WLAN_INTERRUPT_ENABLE);
- //func_pointer();
_spi.wlan_irq_enable();
// Since we are going to TX - we need to handle this event after the ResumeSPi since we need interrupts
@@ -485,15 +482,8 @@
case HCI_EVNT_WLAN_UNSOL_DISCONNECT:
case HCI_EVNT_WLAN_UNSOL_INIT:
case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE:
- // {
- // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
- // if( func_pointer )
- // {
- // func_pointer(event_type, 0, 0);
- // }
- _cc3000.usync_callback(event_type, 0, 0);
+ _cc3000.usync_callback(event_type, 0, 0);
break;
- // }
case HCI_EVNT_WLAN_UNSOL_DHCP:
{
uint8_t params[NETAPP_IPCONFIG_MAC_OFFSET + 1]; // extra byte is for the status
@@ -517,11 +507,8 @@
// read the status
STREAM_TO_UINT8(event_hdr, HCI_EVENT_STATUS_OFFSET, *recParams);
- // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
- // if( func_pointer )
- // {
- _cc3000.usync_callback(event_type, (uint8_t *)params, sizeof(params));
- // }
+ _cc3000.usync_callback(event_type, (uint8_t *)params, sizeof(params));
+
break;
}
case HCI_EVNT_WLAN_ASYNC_PING_REPORT:
@@ -534,20 +521,12 @@
STREAM_TO_UINT32(data, NETAPP_PING_MAX_RTT_OFFSET, params.max_round_time);
STREAM_TO_UINT32(data, NETAPP_PING_AVG_RTT_OFFSET, params.avg_round_time);
- // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
- // if (func_pointer)
- // {
- _cc3000.usync_callback(event_type, (uint8_t *)¶ms, sizeof(params));
- // }
+ _cc3000.usync_callback(event_type, (uint8_t *)¶ms, sizeof(params));
break;
}
case HCI_EVNT_BSD_TCP_CLOSE_WAIT:
{
- // tWlanCB func_pointer = (tWlanCB)_simple_link.get_func_pointer(WLAN_CB);
- // if (func_pointer)
- // {
- _cc3000.usync_callback(event_type, NULL, 0);
- // }
+ _cc3000.usync_callback(event_type, NULL, 0);
break;
}
@@ -603,8 +582,7 @@
}
void cc3000_event::set_socket_active_status(int32_t sd, int32_t status) {
- if (M_IS_VALID_SD(sd) && M_IS_VALID_STATUS(status))
- {
+ if (M_IS_VALID_SD(sd) && M_IS_VALID_STATUS(status)) {
socket_active_status &= ~(1 << sd); /* clean socket's mask */
socket_active_status |= (status << sd); /* set new socket's mask */
}
@@ -633,7 +611,7 @@
}
int32_t cc3000_event::get_socket_active_status(int32_t sd) {
- if(M_IS_VALID_SD(sd)) {
+ if (M_IS_VALID_SD(sd)) {
return (socket_active_status & (1 << sd)) ? SOCKET_STATUS_INACTIVE : SOCKET_STATUS_ACTIVE;
} else {
return SOCKET_STATUS_INACTIVE;
@@ -646,7 +624,7 @@
STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_SOCKET_OFFSET,sd);
STREAM_TO_UINT32(resp_params, BSD_RSP_PARAMS_STATUS_OFFSET,status);
- if(ERROR_SOCKET_INACTIVE == status) {
+ if (ERROR_SOCKET_INACTIVE == status) {
set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
}
}
@@ -666,4 +644,4 @@
}
-} /* end of cc3000 namespace */
+} // end of cc3000
--- a/cc3000_hci.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_hci.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -51,8 +51,8 @@
}
uint16_t cc3000_hci::command_send(uint16_t op_code, uint8_t *buffer, uint8_t length) {
- unsigned char *stream;
-
+ uint8_t *stream;
+
DBG_HCI_CMD("Command Sent : 0x%04X", op_code);
stream = (buffer + SPI_HEADER_SIZE);
@@ -67,7 +67,7 @@
uint32_t cc3000_hci::data_send(uint8_t op_code, uint8_t *args, uint16_t arg_length,
uint16_t data_length, const uint8_t *tail, uint16_t tail_length) {
- unsigned char *stream;
+ uint8_t *stream;
stream = ((args) + SPI_HEADER_SIZE);
@@ -83,7 +83,7 @@
}
void cc3000_hci::data_command_send(uint16_t op_code, uint8_t *buffer, uint8_t arg_length, uint16_t data_length) {
- unsigned char *stream = (buffer + SPI_HEADER_SIZE);
+ uint8_t *stream = (buffer + SPI_HEADER_SIZE);
UINT8_TO_STREAM(stream, HCI_TYPE_DATA);
UINT8_TO_STREAM(stream, op_code);
@@ -97,21 +97,18 @@
}
void cc3000_hci::patch_send(uint8_t op_code, uint8_t *buffer, uint8_t *patch, uint16_t data_length) {
- unsigned short usTransLength;
- unsigned char *stream = (buffer + SPI_HEADER_SIZE);
+ uint16_t usTransLength;
+ uint8_t *stream = (buffer + SPI_HEADER_SIZE);
UINT8_TO_STREAM(stream, HCI_TYPE_PATCH);
UINT8_TO_STREAM(stream, op_code);
stream = UINT16_TO_STREAM(stream, data_length + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE);
- if (data_length <= SL_PATCH_PORTION_SIZE)
- {
+ if (data_length <= SL_PATCH_PORTION_SIZE) {
UINT16_TO_STREAM(stream, data_length);
stream = UINT16_TO_STREAM(stream, data_length);
memcpy((buffer + SPI_HEADER_SIZE) + HCI_PATCH_HEADER_SIZE, patch, data_length);
// Update the opcode of the event we will be waiting for
_spi.write(buffer, data_length + HCI_PATCH_HEADER_SIZE);
- }
- else
- {
+ } else {
usTransLength = (data_length/SL_PATCH_PORTION_SIZE);
UINT16_TO_STREAM(stream, data_length + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE + usTransLength*SIMPLE_LINK_HCI_PATCH_HEADER_SIZE);
@@ -124,21 +121,16 @@
_spi.write(buffer, SL_PATCH_PORTION_SIZE + HCI_PATCH_HEADER_SIZE);
stream = (buffer + SPI_HEADER_SIZE);
- while (data_length)
- {
- if (data_length <= SL_PATCH_PORTION_SIZE)
- {
+ while (data_length) {
+ if (data_length <= SL_PATCH_PORTION_SIZE) {
usTransLength = data_length;
data_length = 0;
-
- }
- else
- {
+ } else {
usTransLength = SL_PATCH_PORTION_SIZE;
data_length -= usTransLength;
}
- *(unsigned short *)stream = usTransLength;
+ *(uint16_t *)stream = usTransLength;
memcpy(stream + SIMPLE_LINK_HCI_PATCH_HEADER_SIZE, patch, usTransLength);
patch += usTransLength;
@@ -148,4 +140,4 @@
}
}
-}
+} // mbed_cc3000 namespace
--- a/cc3000_netapp.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_netapp.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -78,7 +78,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_NETAPP_DHCP, &scRet);
- return(scRet);
+ return scRet;
}
#ifndef CC3000_TINY_DRIVER
@@ -122,7 +122,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_NETAPP_SET_TIMERS, &scRet);
- return(scRet);
+ return scRet;
}
int32_t cc3000_netapp::ping_send(uint32_t *ip, uint32_t ping_attempts, uint32_t ping_size, uint32_t ping_timeout) {
@@ -145,7 +145,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_NETAPP_PING_SEND, &scRet);
- return(scRet);
+ return scRet;
}
void cc3000_netapp::ping_report() {
@@ -176,7 +176,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_NETAPP_PING_STOP, &scRet);
- return(scRet);
+ return scRet;
}
int32_t cc3000_netapp::arp_flush() {
@@ -192,8 +192,8 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_NETAPP_ARP_FLUSH, &scRet);
- return(scRet);
+ return scRet;
}
#endif
-} /* end of cc3000 namespace */
+} // mbed_cc3000
--- a/cc3000_nvmem.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_nvmem.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -118,22 +118,19 @@
uint16_t offset = 0;
uint8_t* spDataPtr = (uint8_t*)data;
- while ((status == 0) && (length >= SP_PORTION_SIZE))
- {
+ while ((status == 0) && (length >= SP_PORTION_SIZE)) {
status = write(file_id, SP_PORTION_SIZE, offset, spDataPtr);
offset += SP_PORTION_SIZE;
length -= SP_PORTION_SIZE;
spDataPtr += SP_PORTION_SIZE;
}
- if (status !=0)
- {
+ if (status !=0) {
// NVMEM error occurred
return status;
}
- if (length != 0)
- {
+ if (length != 0) {
// If length MOD 512 is nonzero, write the remaining bytes.
status = write(file_id, length, offset, spDataPtr);
}
@@ -162,7 +159,7 @@
}
#ifndef CC3000_TINY_DRIVER
-uint8_t cc3000_nvmem::read_sp_version(uint8_t* patch_ver) {
+uint8_t cc3000_nvmem::read_sp_version(uint8_t* patch_ver) {
uint8_t *ptr;
// 1st byte is the status and the rest is the SP version
uint8_t retBuf[5];
@@ -180,7 +177,6 @@
return(retBuf[0]);
}
-
#endif
-}
+} // mbed_cc3000 namespace
--- a/cc3000_security.cpp Sun Oct 13 11:46:21 2013 +0200 +++ b/cc3000_security.cpp Wed Nov 06 17:56:25 2013 +0100 @@ -377,5 +377,5 @@ } #endif -} /* end of cc3000 namespace */ +} // mbed_cc3000 namespace
--- a/cc3000_simplelink.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_simplelink.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -68,20 +68,17 @@
case BOOTLOADER_PATCHES:
result = (void *)_fBootLoaderPatches;
break;
- // case WLAN_CB:
- // result = (void *)_fWlanCB;
- // break;
default:
result = 0;
}
return result;
}
-uint8_t *cc3000_simple_link::get_transmit_buffer() {
+uint8_t* cc3000_simple_link::get_transmit_buffer() {
return _tx_buffer;
}
-uint8_t *cc3000_simple_link::get_received_buffer() {
+uint8_t* cc3000_simple_link::get_received_buffer() {
return _rx_buffer;
}
@@ -170,8 +167,4 @@
_received_data = pointer;
}
-//void cc3000_simple_link::set_wlan_cb(tWlanCB fpointer) {
-// _fWlanCB = fpointer;
-//}
-
-}
+} // mbed_cc3000 namespace
--- a/cc3000_socket.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_socket.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -46,25 +46,21 @@
namespace mbed_cc3000 {
cc3000_socket::cc3000_socket(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_event &event)
- : _simple_link(simplelink), _hci(hci), _event(event)
-{
+ : _simple_link(simplelink), _hci(hci), _event(event) {
}
-cc3000_socket::~cc3000_socket()
-{
+cc3000_socket::~cc3000_socket() {
}
int32_t cc3000_socket::HostFlowControlConsumeBuff(int32_t sd) {
#ifndef SEND_NON_BLOCKING
/* wait in busy loop */
- do
- {
+ do {
// When the last transmission failed, return the last failure reason.
// Note that the buffer will not be allocated in this case
- if (_simple_link.get_transmit_error() != 0)
- {
+ if (_simple_link.get_transmit_error() != 0) {
errno = _simple_link.get_transmit_error();
_simple_link.set_transmit_error(0);
return errno;
@@ -72,7 +68,7 @@
if(SOCKET_STATUS_ACTIVE != _event.get_socket_active_status(sd))
return -1;
- } while(0 == _simple_link.get_number_free_buffers());
+ } while (0 == _simple_link.get_number_free_buffers());
uint16_t free_buffer = _simple_link.get_number_free_buffers();
free_buffer--;
@@ -83,24 +79,20 @@
// When the last transmission failed, return the last failure reason.
// Note that the buffer will not be allocated in this case
- if (_simple_link.get_transmit_error() != 0)
- {
+ if (_simple_link.get_transmit_error() != 0) {
errno = _simple_link.get_transmit_error();
_simple_link.set_transmit_error(0);
return errno;
}
- if(SOCKET_STATUS_ACTIVE != _event.get_socket_active_status(sd))
+ if (SOCKET_STATUS_ACTIVE != _event.get_socket_active_status(sd))
return -1;
// If there are no available buffers, return -2. It is recommended to use
// select or receive to see if there is any buffer occupied with received data
// If so, call receive() to release the buffer.
- if(0 == _simple_link.get_number_free_buffers())
- {
+ if (0 == _simple_link.get_number_free_buffers()) {
return -2;
- }
- else
- {
+ } else {
uint16_t free_buffer = _simple_link.get_number_free_buffers();
free_buffer--;
_simple_link.set_number_free_buffers(free_buffer);
@@ -133,14 +125,14 @@
_event.set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
- return(ret);
+ return ret;
}
int32_t cc3000_socket::closesocket(int32_t sd) {
int32_t ret;
uint8_t *ptr, *args;
- while(_simple_link.get_number_free_buffers() != SOCKET_MAX_FREE_BUFFERS);
+ while (_simple_link.get_number_free_buffers() != SOCKET_MAX_FREE_BUFFERS);
ret = EFAIL;
ptr = _simple_link.get_transmit_buffer();
args = (ptr + HEADERS_SIZE_CMD);
@@ -158,7 +150,7 @@
// since 'close' call may result in either OK (and then it closed) or error, mark this socket as invalid
_event.set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
- return(ret);
+ return ret;
}
int32_t cc3000_socket::accept(int32_t sd, sockaddr *addr, socklen_t *addrlen) {
@@ -187,16 +179,13 @@
ret = errno;
// if succeeded, iStatus = new socket descriptor. otherwise - error number
- if(M_IS_VALID_SD(ret))
- {
+ if(M_IS_VALID_SD(ret)) {
_event.set_socket_active_status(ret, SOCKET_STATUS_ACTIVE);
- }
- else
- {
+ } else {
_event.set_socket_active_status(sd, SOCKET_STATUS_INACTIVE);
}
- return(ret);
+ return ret;
}
int32_t cc3000_socket::bind(int32_t sd, const sockaddr *addr, int32_t addrlen) {
@@ -223,7 +212,7 @@
errno = ret;
- return(ret);
+ return ret;
}
int32_t cc3000_socket::listen(int32_t sd, int32_t backlog) {
@@ -279,12 +268,9 @@
tBsdSelectRecvParams tParams;
uint32_t is_blocking;
- if( timeout == NULL)
- {
+ if (timeout == NULL) {
is_blocking = 1; /* blocking , infinity timeout */
- }
- else
- {
+ } else {
is_blocking = 0; /* no blocking, timeout */
}
@@ -303,10 +289,8 @@
args = UINT32_TO_STREAM(args, ((writesds) ? *(uint32_t*)writesds : 0));
args = UINT32_TO_STREAM(args, ((exceptsds) ? *(uint32_t*)exceptsds : 0));
- if (timeout)
- {
- if ( 0 == timeout->tv_sec && timeout->tv_usec < SELECT_TIMEOUT_MIN_MICRO_SECONDS)
- {
+ if (timeout) {
+ if ( 0 == timeout->tv_sec && timeout->tv_usec < SELECT_TIMEOUT_MIN_MICRO_SECONDS) {
timeout->tv_usec = SELECT_TIMEOUT_MIN_MICRO_SECONDS;
}
args = UINT32_TO_STREAM(args, timeout->tv_sec);
@@ -320,30 +304,24 @@
_event.simplelink_wait_event(HCI_EVNT_SELECT, &tParams);
// Update actually read FD
- if (tParams.iStatus >= 0)
- {
- if (readsds)
- {
+ if (tParams.iStatus >= 0) {
+ if (readsds) {
memcpy(readsds, &tParams.uiRdfd, sizeof(tParams.uiRdfd));
}
- if (writesds)
- {
+ if (writesds) {
memcpy(writesds, &tParams.uiWrfd, sizeof(tParams.uiWrfd));
}
- if (exceptsds)
- {
+ if (exceptsds) {
memcpy(exceptsds, &tParams.uiExfd, sizeof(tParams.uiExfd));
}
return(tParams.iStatus);
- }
- else
- {
+ } else {
errno = tParams.iStatus;
- return(-1);
+ return -1;
}
}
@@ -365,14 +343,11 @@
// Since we are in blocking state - wait for event complete
_event.simplelink_wait_event(HCI_CMND_GETSOCKOPT, &tRetParams);
- if (((int8_t)tRetParams.iStatus) >= 0)
- {
+ if (((int8_t)tRetParams.iStatus) >= 0) {
*optlen = 4;
memcpy(optval, tRetParams.ucOptValue, 4);
return (0);
- }
- else
- {
+ } else {
errno = tRetParams.iStatus;
return errno;
}
@@ -397,8 +372,7 @@
_event.simplelink_wait_event(opcode, &tSocketReadEvent);
// In case the number of bytes is more then zero - read data
- if (tSocketReadEvent.iNumberOfBytes > 0)
- {
+ if (tSocketReadEvent.iNumberOfBytes > 0) {
// Wait for the data in a synchronous way. Here we assume that the bug is
// big enough to store also parameters of receive from too....
_event.simplelink_wait_data((uint8_t *)buf, (uint8_t *)from, (uint8_t *)fromlen);
@@ -425,8 +399,7 @@
tBsdReadReturnParams tSocketSendEvent;
// Check the bsd_arguments
- if (0 != (res = HostFlowControlConsumeBuff(sd)))
- {
+ if (0 != (res = HostFlowControlConsumeBuff(sd))) {
return res;
}
@@ -442,7 +415,7 @@
// Update the offset of data and parameters according to the command
switch(opcode)
{
- case HCI_CMND_SENDTO:
+ case HCI_CMND_SENDTO:
{
addr_offset = len + sizeof(len) + sizeof(len);
addrlen = 8;
@@ -451,7 +424,7 @@
break;
}
- case HCI_CMND_SEND:
+ case HCI_CMND_SEND:
{
tolen = 0;
to = NULL;
@@ -460,7 +433,7 @@
break;
}
- default:
+ default:
{
break;
}
@@ -472,8 +445,7 @@
args = UINT32_TO_STREAM(args, len);
args = UINT32_TO_STREAM(args, flags);
- if (opcode == HCI_CMND_SENDTO)
- {
+ if (opcode == HCI_CMND_SENDTO) {
args = UINT32_TO_STREAM(args, addr_offset);
args = UINT32_TO_STREAM(args, addrlen);
}
@@ -482,8 +454,7 @@
ARRAY_TO_STREAM(pDataPtr, ((uint8_t *)buf), len);
// In case we are using SendTo, copy the to parameters
- if (opcode == HCI_CMND_SENDTO)
- {
+ if (opcode == HCI_CMND_SENDTO) {
ARRAY_TO_STREAM(pDataPtr, ((uint8_t *)to), tolen);
}
@@ -509,8 +480,7 @@
int32_t ret;
uint8_t *pTxBuffer, *pArgs;
- if (device_service_name_length > MDNS_DEVICE_SERVICE_MAX_LENGTH)
- {
+ if (device_service_name_length > MDNS_DEVICE_SERVICE_MAX_LENGTH) {
return EFAIL;
}
@@ -540,8 +510,7 @@
errno = EFAIL;
- if (name_length > HOSTNAME_MAX_LENGTH)
- {
+ if (name_length > HOSTNAME_MAX_LENGTH) {
return errno;
}
@@ -587,12 +556,9 @@
// Since we are in blocking state - wait for event complete
_event.simplelink_wait_event(HCI_CMND_SETSOCKOPT, &ret);
- if (ret >= 0)
- {
+ if (ret >= 0) {
return (0);
- }
- else
- {
+ } else {
errno = ret;
return ret;
}
@@ -600,39 +566,39 @@
#endif
-char * cc3000_socket::inet_ntoa_r(uint32_t s_addr, char *buf, int buflen)
+char* cc3000_socket::inet_ntoa_r(uint32_t s_addr, char *buf, int buflen)
{
- char inv[3];
- char *rp;
- uint8_t *ap;
- uint8_t rem;
- uint8_t n;
- uint8_t i;
- int len = 0;
+ char inv[3];
+ char *rp;
+ uint8_t *ap;
+ uint8_t rem;
+ uint8_t n;
+ uint8_t i;
+ int len = 0;
- rp = buf;
- ap = (uint8_t *)&s_addr;
- for(n = 0; n < 4; n++) {
- i = 0;
- do {
- rem = *ap % (uint8_t)10;
- *ap /= (uint8_t)10;
- inv[i++] = '0' + rem;
- } while(*ap);
- while(i--) {
- if (len++ >= buflen) {
- return NULL;
- }
- *rp++ = inv[i];
+ rp = buf;
+ ap = (uint8_t *)&s_addr;
+ for (n = 0; n < 4; n++) {
+ i = 0;
+ do {
+ rem = *ap % (uint8_t)10;
+ *ap /= (uint8_t)10;
+ inv[i++] = '0' + rem;
+ } while(*ap);
+ while(i--) {
+ if (len++ >= buflen) {
+ return NULL;
+ }
+ *rp++ = inv[i];
+ }
+ if (len++ >= buflen) {
+ return NULL;
+ }
+ *rp++ = '.';
+ ap++;
}
- if (len++ >= buflen) {
- return NULL;
- }
- *rp++ = '.';
- ap++;
- }
- *--rp = 0;
- return buf;
+ *--rp = 0;
+ return buf;
}
-} /* end of cc3000 namespace */
+} // mbed_cc3000 namespace
--- a/cc3000_spi.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_spi.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -43,17 +43,16 @@
namespace mbed_cc3000 {
-cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, IRQn_Type irq_port, cc3000_event &event, cc3000_simple_link &simple_link)
- : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _irq_port(irq_port),
- _event(event), _simple_link(simple_link) {
- /* TODO = clear pending interrupts for PORTS. This is dependent on the used chip */
+cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, cc3000_event &event, cc3000_simple_link &simple_link)
+ : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _event(event), _simple_link(simple_link) {
_wlan_spi.format(8,1);
_wlan_spi.frequency(12000000);
- _function_pointer = _wlan_irq.fall(this, &cc3000_spi::WLAN_IRQHandler);
+ _wlan_irq.fall(this, &cc3000_spi::WLAN_IRQHandler);
_wlan_en = 0;
_wlan_cs = 1;
+ wait_ms(50); /* mbed board delay */
}
cc3000_spi::~cc3000_spi() {
@@ -62,15 +61,17 @@
void cc3000_spi::wlan_irq_enable()
{
- NVIC_EnableIRQ(_irq_port);
+ _process_irq = true;
+ //_wlan_irq.enable_irq();
- if(wlan_irq_read() == 0) {
+ if (wlan_irq_read() == 0) {
WLAN_IRQHandler();
}
}
void cc3000_spi::wlan_irq_disable() {
- NVIC_DisableIRQ(_irq_port);
+ _process_irq = false;
+ //_wlan_irq.disable_irq();
}
uint32_t cc3000_spi::wlan_irq_read() {
@@ -105,123 +106,106 @@
uint32_t cc3000_spi::write(uint8_t *buffer, uint16_t length) {
uint8_t pad = 0;
- // check the total length of the packet in order to figure out if padding is necessary
- if(!(length & 0x0001))
- {
+ // check the total length of the packet in order to figure out if padding is necessary
+ if(!(length & 0x0001)) {
pad++;
- }
- buffer[0] = WRITE;
- buffer[1] = HI(length + pad);
- buffer[2] = LO(length + pad);
- buffer[3] = 0;
- buffer[4] = 0;
-
- length += (SPI_HEADER_SIZE + pad);
+ }
+ buffer[0] = WRITE;
+ buffer[1] = HI(length + pad);
+ buffer[2] = LO(length + pad);
+ buffer[3] = 0;
+ buffer[4] = 0;
- // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
- // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
- uint8_t * transmit_buffer = _simple_link.get_transmit_buffer();
- if (transmit_buffer[CC3000_TX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
- {
- while (1);
- }
+ length += (SPI_HEADER_SIZE + pad);
- if (_spi_info.spi_state == eSPI_STATE_POWERUP)
- {
- while (_spi_info.spi_state != eSPI_STATE_INITIALIZED);
- }
+ // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
+ // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
+ uint8_t *transmit_buffer = _simple_link.get_transmit_buffer();
+ if (transmit_buffer[CC3000_TX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER) {
+ while (1);
+ }
+
+ if (_spi_info.spi_state == eSPI_STATE_POWERUP) {
+ while (_spi_info.spi_state != eSPI_STATE_INITIALIZED);
+ }
- if (_spi_info.spi_state == eSPI_STATE_INITIALIZED)
- {
- // TX/RX transaction over SPI after powerup: IRQ is low - send read buffer size command
- first_write(buffer, length);
- }
- else
- {
- // Prevent occurence of a race condition when 2 back to back packets are sent to the
- // device, so the state will move to IDLE and once again to not IDLE due to IRQ
- wlan_irq_disable();
+ if (_spi_info.spi_state == eSPI_STATE_INITIALIZED) {
+ // TX/RX transaction over SPI after powerup: IRQ is low - send read buffer size command
+ first_write(buffer, length);
+ } else {
+ // Prevent occurence of a race condition when 2 back to back packets are sent to the
+ // device, so the state will move to IDLE and once again to not IDLE due to IRQ
+ wlan_irq_disable();
- while (_spi_info.spi_state != eSPI_STATE_IDLE);
+ while (_spi_info.spi_state != eSPI_STATE_IDLE);
- _spi_info.spi_state = eSPI_STATE_WRITE_IRQ;
- //_spi_info.pTxPacket = buffer;
- _spi_info.tx_packet_length = length;
+ _spi_info.spi_state = eSPI_STATE_WRITE_IRQ;
+ //_spi_info.pTxPacket = buffer;
+ _spi_info.tx_packet_length = length;
- // Assert the CS line and wait until the IRQ line is active, then initialize the write operation
- _wlan_cs = 0;
+ // Assert the CS line and wait until the IRQ line is active, then initialize the write operation
+ _wlan_cs = 0;
- wlan_irq_enable();
- }
+ wlan_irq_enable();
+ }
- // Wait until the transaction ends
- while (_spi_info.spi_state != eSPI_STATE_IDLE);
+ // Wait until the transaction ends
+ while (_spi_info.spi_state != eSPI_STATE_IDLE);
- return 0;
+ return 0;
}
void cc3000_spi::write_synchronous(uint8_t *data, uint16_t size) {
- while(size)
- {
+ while(size) {
_wlan_spi.write(*data++);
size--;
- }
+ }
}
void cc3000_spi::read_synchronous(uint8_t *data, uint16_t size) {
- for (uint32_t i = 0; i < size; i++)
- {
- data[i] = _wlan_spi.write(0x03);;
- }
+ for (uint32_t i = 0; i < size; i++) {
+ data[i] = _wlan_spi.write(0x03);
+ }
}
uint32_t cc3000_spi::read_data_cont() {
- long data_to_recv;
- unsigned char *evnt_buff, type;
+ int32_t data_to_recv;
+ uint8_t *evnt_buff, type;
//determine the packet type
evnt_buff = _simple_link.get_received_buffer();
data_to_recv = 0;
STREAM_TO_UINT8((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_PACKET_TYPE_OFFSET, type);
- switch(type)
- {
+ switch(type) {
case HCI_TYPE_DATA:
- {
- // Read the remaining data..
- STREAM_TO_UINT16((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_DATA_LENGTH_OFFSET, data_to_recv);
- if (!((HEADERS_SIZE_EVNT + data_to_recv) & 1))
- {
- data_to_recv++;
- }
+ // Read the remaining data..
+ STREAM_TO_UINT16((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_DATA_LENGTH_OFFSET, data_to_recv);
+ if (!((HEADERS_SIZE_EVNT + data_to_recv) & 1)) {
+ data_to_recv++;
+ }
- if (data_to_recv)
- {
+ if (data_to_recv) {
read_synchronous(evnt_buff + 10, data_to_recv);
- }
+ }
break;
- }
case HCI_TYPE_EVNT:
- {
- // Calculate the rest length of the data
+ // Calculate the rest length of the data
STREAM_TO_UINT8((char *)(evnt_buff + SPI_HEADER_SIZE), HCI_EVENT_LENGTH_OFFSET, data_to_recv);
- data_to_recv -= 1;
- // Add padding byte if needed
- if ((HEADERS_SIZE_EVNT + data_to_recv) & 1)
- {
- data_to_recv++;
- }
+ data_to_recv -= 1;
+ // Add padding byte if needed
+ if ((HEADERS_SIZE_EVNT + data_to_recv) & 1) {
+ data_to_recv++;
+ }
- if (data_to_recv)
- {
+ if (data_to_recv) {
read_synchronous(evnt_buff + 10, data_to_recv);
- }
+ }
- _spi_info.spi_state = eSPI_STATE_READ_EOT;
+ _spi_info.spi_state = eSPI_STATE_READ_EOT;
break;
- }
}
- return (0);
+ return 0;
}
void cc3000_spi::set_wlan_en(uint8_t value) {
@@ -233,44 +217,39 @@
}
void cc3000_spi::WLAN_IRQHandler() {
- if (_spi_info.spi_state == eSPI_STATE_POWERUP)
- {
- // Inform HCI Layer that IRQ occured after powerup
- _spi_info.spi_state = eSPI_STATE_INITIALIZED;
- }
- else if (_spi_info.spi_state == eSPI_STATE_IDLE)
- {
- _spi_info.spi_state = eSPI_STATE_READ_IRQ;
- /* IRQ line goes low - acknowledge it */
- _wlan_cs = 0;
- read_synchronous(_simple_link.get_received_buffer(), 10);
- _spi_info.spi_state = eSPI_STATE_READ_EOT;
-
+ if (_process_irq) {
+ if (_spi_info.spi_state == eSPI_STATE_POWERUP) {
+ // Inform HCI Layer that IRQ occured after powerup
+ _spi_info.spi_state = eSPI_STATE_INITIALIZED;
+ } else if (_spi_info.spi_state == eSPI_STATE_IDLE) {
+ _spi_info.spi_state = eSPI_STATE_READ_IRQ;
+ /* IRQ line goes low - acknowledge it */
+ _wlan_cs = 0;
+ read_synchronous(_simple_link.get_received_buffer(), 10);
+ _spi_info.spi_state = eSPI_STATE_READ_EOT;
- // The header was read - continue with the payload read
- if (!read_data_cont())
- {
- // All the data was read - finalize handling by switching to the task
- // Trigger Rx processing
- wlan_irq_disable();
- _wlan_cs = 1;
- // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
- // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
- uint8_t *received_buffer = _simple_link.get_received_buffer();
- if (received_buffer[CC3000_RX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
- {
- while (1);
- }
- _spi_info.spi_state = eSPI_STATE_IDLE;
- _event.received_handler(received_buffer + SPI_HEADER_SIZE);
- }
- }
- else if (_spi_info.spi_state == eSPI_STATE_WRITE_IRQ)
- {
- write_synchronous(_simple_link.get_transmit_buffer(), _spi_info.tx_packet_length);
- _spi_info.spi_state = eSPI_STATE_IDLE;
- _wlan_cs = 1;
- }
+ // The header was read - continue with the payload read
+ if (!read_data_cont()) {
+ // All the data was read - finalize handling by switching to the task
+ // Trigger Rx processing
+ wlan_irq_disable();
+ _wlan_cs = 1;
+ // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
+ // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
+ uint8_t *received_buffer = _simple_link.get_received_buffer();
+ if (received_buffer[CC3000_RX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER) {
+ while (1);
+ }
+
+ _spi_info.spi_state = eSPI_STATE_IDLE;
+ _event.received_handler(received_buffer + SPI_HEADER_SIZE);
+ }
+ } else if (_spi_info.spi_state == eSPI_STATE_WRITE_IRQ) {
+ write_synchronous(_simple_link.get_transmit_buffer(), _spi_info.tx_packet_length);
+ _spi_info.spi_state = eSPI_STATE_IDLE;
+ _wlan_cs = 1;
+ }
+ }
}
-}
+} // namespace mbed_cc3000
--- a/cc3000_wlan.cpp Sun Oct 13 11:46:21 2013 +0200
+++ b/cc3000_wlan.cpp Wed Nov 06 17:56:25 2013 +0100
@@ -86,22 +86,13 @@
// ASIC 1273 chip enable: toggle WLAN EN line
_spi.set_wlan_en(WLAN_ENABLE);
- if (spi_irq_state)
- {
+ if (spi_irq_state) {
// wait till the IRQ line goes low
- while(_spi.wlan_irq_read() != 0)
- {
- }
- }
- else
- {
+ while(_spi.wlan_irq_read() != 0);
+ } else {
// wait till the IRQ line goes high and then low
- while(_spi.wlan_irq_read() == 0)
- {
- }
- while(_spi.wlan_irq_read() != 0)
- {
- }
+ while(_spi.wlan_irq_read() == 0);
+ while(_spi.wlan_irq_read() != 0);
}
simpleLink_init_start(patches_available_host);
@@ -113,12 +104,10 @@
void cc3000_wlan::stop() {
// ASIC 1273 chip disable
- _spi.set_wlan_en( WLAN_DISABLE );
+ _spi.set_wlan_en(WLAN_DISABLE);
- // Wait till IRQ line goes high...
- while(_spi.wlan_irq_read() == 0)
- {
- }
+ // Wait till IRQ line goes high
+ while(_spi.wlan_irq_read() == 0);
_spi.close();
}
@@ -137,7 +126,7 @@
_event.simplelink_wait_event(HCI_CMND_WLAN_DISCONNECT, &ret);
errno = ret;
- return(ret);
+ return ret;
}
@@ -163,7 +152,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SET_CONNECTION_POLICY, &ret);
- return(ret);
+ return ret;
}
@@ -185,7 +174,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_DEL_PROFILE, &ret);
- return(ret);
+ return ret;
}
int32_t cc3000_wlan::set_event_mask(uint32_t mask) {
@@ -194,22 +183,18 @@
uint8_t *args;
- if ((mask & HCI_EVNT_WLAN_TX_COMPLETE) == HCI_EVNT_WLAN_TX_COMPLETE)
- {
+ if ((mask & HCI_EVNT_WLAN_TX_COMPLETE) == HCI_EVNT_WLAN_TX_COMPLETE) {
_simple_link.set_tx_complete_signal(0);
// Since an event is a virtual event - i.e. it is not coming from CC3000
// there is no need to send anything to the device if it was an only event
- if (mask == HCI_EVNT_WLAN_TX_COMPLETE)
- {
+ if (mask == HCI_EVNT_WLAN_TX_COMPLETE) {
return 0;
}
mask &= ~HCI_EVNT_WLAN_TX_COMPLETE;
mask |= HCI_EVNT_WLAN_UNSOL_BASE;
- }
- else
- {
+ } else {
_simple_link.set_tx_complete_signal(1);
}
@@ -226,7 +211,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_EVENT_MASK, &ret);
- return(ret);
+ return ret;
}
@@ -248,7 +233,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_START, &ret);
- return(ret);
+ return ret;
}
@@ -264,7 +249,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_STOP, &ret);
- return(ret);
+ return ret;
}
int32_t cc3000_wlan::smart_config_set_prefix(uint8_t *new_prefix) {
@@ -276,10 +261,10 @@
ptr = _simple_link.get_transmit_buffer();
args = (ptr + HEADERS_SIZE_CMD);
- if (new_prefix == NULL)
+ if (new_prefix == NULL) {
return ret;
- else // with the new Smart Config, prefix must be TTT
- {
+ } else {
+ // with the new Smart Config, prefix must be TTT
*new_prefix = 'T';
*(new_prefix + 1) = 'T';
*(new_prefix + 2) = 'T';
@@ -292,7 +277,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_SIMPLE_CONFIG_SET_PREFIX, &ret);
- return(ret);
+ return ret;
}
#ifndef CC3000_TINY_DRIVER
@@ -316,19 +301,15 @@
args = UINT16_TO_STREAM(args, 0);
// padding shall be zeroed
- if(bssid)
- {
+ if (bssid) {
ARRAY_TO_STREAM(args, bssid, ETH_ALEN);
- }
- else
- {
+ } else {
ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
}
ARRAY_TO_STREAM(args, ssid, ssid_len);
- if(key_len && key)
- {
+ if (key_len && key) {
ARRAY_TO_STREAM(args, key, key_len);
}
@@ -339,7 +320,7 @@
_event.simplelink_wait_event(HCI_CMND_WLAN_CONNECT, &ret);
errno = ret;
- return(ret);
+ return ret;
}
int32_t cc3000_wlan::add_profile(uint32_t sec_type,
@@ -368,17 +349,14 @@
switch (sec_type)
{
//OPEN
- case WLAN_SEC_UNSEC:
+ case WLAN_SEC_UNSEC:
{
args = UINT32_TO_STREAM(args, 0x00000014);
args = UINT32_TO_STREAM(args, ssid_length);
args = UINT16_TO_STREAM(args, 0);
- if(b_ssid)
- {
+ if(b_ssid) {
ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
- }
- else
- {
+ } else {
ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
}
args = UINT32_TO_STREAM(args, priority);
@@ -389,17 +367,14 @@
break;
//WEP
- case WLAN_SEC_WEP:
+ case WLAN_SEC_WEP:
{
args = UINT32_TO_STREAM(args, 0x00000020);
args = UINT32_TO_STREAM(args, ssid_length);
args = UINT16_TO_STREAM(args, 0);
- if(b_ssid)
- {
+ if (b_ssid) {
ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
- }
- else
- {
+ } else {
ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
}
args = UINT32_TO_STREAM(args, priority);
@@ -408,8 +383,7 @@
args = UINT32_TO_STREAM(args, group_cipher_tx_key_index);
ARRAY_TO_STREAM(args, ssid, ssid_length);
- for(i = 0; i < 4; i++)
- {
+ for(i = 0; i < 4; i++) {
uint8_t *p = &pf_or_key[i * pairwise_cipher_or_tx_key_len];
ARRAY_TO_STREAM(args, p, pairwise_cipher_or_tx_key_len);
@@ -423,18 +397,15 @@
//WPA
//WPA2
- case WLAN_SEC_WPA:
- case WLAN_SEC_WPA2:
+ case WLAN_SEC_WPA:
+ case WLAN_SEC_WPA2:
{
args = UINT32_TO_STREAM(args, 0x00000028);
args = UINT32_TO_STREAM(args, ssid_length);
args = UINT16_TO_STREAM(args, 0);
- if(b_ssid)
- {
+ if (b_ssid) {
ARRAY_TO_STREAM(args, b_ssid, ETH_ALEN);
- }
- else
- {
+ } else {
ARRAY_TO_STREAM(args, bssid_zero, ETH_ALEN);
}
args = UINT32_TO_STREAM(args, priority);
@@ -458,7 +429,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_ADD_PROFILE, &ret);
- return(ret);
+ return ret;
}
int32_t cc3000_wlan::ioctl_get_scan_results(uint32_t scan_timeout, uint8_t *results) {
@@ -477,7 +448,7 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_GET_SCAN_RESULTS, results);
- return(0);
+ return 0;
}
int32_t cc3000_wlan::ioctl_set_scan_params(uint32_t enable,
@@ -529,11 +500,11 @@
// Wait for command complete event
_event.simplelink_wait_event(HCI_CMND_WLAN_IOCTL_STATUSGET, &ret);
- return(ret);
+ return ret;
}
#else
-int32_t cc3000_wlan::wlan_add_profile(uint32_t sec_type,
+int32_t cc3000_wlan::add_profile(uint32_t sec_type,
uint8_t *ssid,
uint32_t ssid_length,
uint8_t *b_ssid,
@@ -576,7 +547,7 @@
_event.simplelink_wait_event(HCI_CMND_WLAN_CONNECT, &ret);
errno = ret;
- return(ret);
+ return ret;
}
#endif
@@ -619,20 +590,14 @@
if (profileArray[profileArray[0] + 1] > 16)
aes_decrypt((uint8_t *)(decKeyPtr + 16), key);
- if (*(uint8_t *)(decKeyPtr +31) != 0)
- {
- if (*decKeyPtr == 31)
- {
+ if (*(uint8_t *)(decKeyPtr +31) != 0) {
+ if (*decKeyPtr == 31) {
keyLen = 31;
decKeyPtr++;
- }
- else
- {
+ } else {
keyLen = 32;
}
- }
- else
- {
+ } else {
keyLen = *decKeyPtr;
decKeyPtr++;
}
