Added mutex for multiple SPI devices on the same SPI bus
Fork of cc3000_hostdriver_mbedsocket by
Diff: cc3000.h
- Revision:
- 23:fed7f64dd520
- Parent:
- 21:fb34ac8d9af5
- Child:
- 24:ba3fa29197ac
--- a/cc3000.h Thu Oct 03 20:22:45 2013 +0000
+++ b/cc3000.h Thu Oct 03 21:00:00 2013 +0000
@@ -1,719 +1,754 @@
-/*****************************************************************************
-*
-* C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
-* Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
-* provided help.
-*
-* This version of "host driver" uses CC3000 Host Driver Implementation. Thus
-* read the following copyright:
-*
-* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions
-* are met:
-*
-* Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-*
-* Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in the
-* documentation and/or other materials provided with the
-* distribution.
-*
-* Neither the name of Texas Instruments Incorporated nor the names of
-* its contributors may be used to endorse or promote products derived
-* from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-*****************************************************************************/
-#ifndef CC3000_H
-#define CC3000_H
-
-#include "mbed.h"
-#include "cc3000_common.h"
-#include "cc3000_spi.h"
-#include "cc3000_simplelink.h"
-#include "cc3000_netapp.h"
-#include "cc3000_nvmem.h"
-#include "cc3000_socket.h"
-
-#define MAX_SOCKETS 4
-
-/** Enable debug messages
- */
-#define CC3000_DEBUG 1
-
-#if CC3000_DEBUG == 1
-
- // DBG_SOCKET, mbed socket specific debug messages
- #define DBG_SOCKET(x, ...) std::printf("[CC3000 : SOCKET] "x"\r\n", ##__VA_ARGS__);
-
- // DBG_HCI, prints a message for every recieved HCI event, quite a lot of debug
- #define DBG_HCI(x, ...) std::printf("[CC3000 : HCI RX] "x"\r\n", ##__VA_ARGS__);
-
- // DBG_HCI_CMD, Prints commands that are sent
- #define DBG_HCI_CMD(x, ...) std::printf("[CC3000 : HCI TX] "x"\r\n", ##__VA_ARGS__);
-
- // DBG_CC, General cc3000 debug messages
- #define DBG_CC(x, ...) std::printf("[CC3000] "x"\r\n", ##__VA_ARGS__);
-#else
- #define DBG_SOCKET(x, ...)
- #define DBG_HCI(x, ...)
- #define DBG_HCI_CMD(x, ...)
- #define DBG_CC(x, ...)
-#endif
-
-namespace mbed_cc3000 {
-
-/** User info structure
- */
-typedef struct {
- uint8_t FTC; // First time config performed
- uint8_t PP_version[2]; // Patch Programmer version
- uint8_t SERV_PACK[2]; // Service Pack Version
- uint8_t DRV_VER[3]; // Driver Version
- uint8_t FW_VER[3]; // Firmware Version
- uint8_t validCIK; // CIK[] is valid (Client Interface Key)
- uint8_t CIK[40];
-} tUserFS;
-
-/** Function pointers which are not yet implemented
- */
-enum FunctionNumber {
- FW_PATCHES = 0,
- DRIVER_PATCHES = 1,
- BOOTLOADER_PATCHES = 2,
-};
-
-/** CC3000 Simple Link class which contains status of cc3000.
- */
-class cc3000_simple_link {
-public:
- /** ctor - sets magic number in the buffers (overflow mark).
- */
- cc3000_simple_link();
- /** dtor
- */
- ~cc3000_simple_link();
- /** Returns data received flag.
- * \return
- * if data have been received.
- */
- uint8_t get_data_received_flag();
- /** Set data received flag.
- * \param value The value to be set.
- */
- void set_data_received_flag(uint8_t value);
- /** Returns if tx was completed.
- * \return
- * true if tx was completed,
- * false otherwise.
- */
- bool get_tx_complete_signal();
- /**
- */
- void set_tx_complete_signal(bool value);
- /**
- */
- uint8_t *get_received_buffer();
- /**
- */
- void set_received_buffer(uint8_t value);
- /**
- */
- uint8_t *get_transmit_buffer();
- /**
- */
- void set_transmit_buffer(uint8_t value);
- /**
- */
- uint16_t get_number_free_buffers();
- /**
- */
- void set_number_free_buffers(uint16_t value);
- /**
- */
- uint16_t get_buffer_length();
- /**
- */
- void set_buffer_length(uint16_t value);
- /**
- */
- uint16_t get_pending_data();
- /**
- */
- void set_pending_data(uint16_t value);
- /**
- */
- uint16_t get_op_code();
- /**
- */
- void set_op_code(uint16_t code);
- /**
- */
- uint16_t get_released_packets();
- /**
- */
- void set_number_of_released_packets(uint16_t value);
- /**
- */
- uint16_t get_sent_packets();
- /**
- */
- void set_sent_packets(uint16_t value);
-
- int32_t get_transmit_error();
- void set_transmit_error(int32_t value);
-
- uint16_t get_buffer_size(void);
- void set_buffer_size(uint16_t value);
-
- void *get_func_pointer(FunctionNumber function);
-
- uint8_t *get_received_data(void);
- void set_received_data(uint8_t *pointer);
-
-private:
- uint8_t _data_received_flag;
- bool _tx_complete_signal;
- uint16_t _rx_event_opcode;
- uint16_t _free_buffers;
- uint16_t _buffer_length;
- uint16_t _buffer_size;
- uint16_t _rx_data_pending;
- uint16_t _sent_packets;
- uint16_t _released_packets;
- int32_t _transmit_data_error;
- uint8_t *_received_data;
- uint8_t _rx_buffer[CC3000_RX_BUFFER_SIZE];
- uint8_t _tx_buffer[CC3000_TX_BUFFER_SIZE];
-private:
- int8_t *(* _fFWPatches)(uint32_t *length);
- int8_t *(* _fDriverPatches)(uint32_t *length);
- int8_t *(* _fBootLoaderPatches)(uint32_t *length);
-};
-
-/** Forward declaration classes
- */
-class cc3000_hci;
-class cc3000_nvmem;
-class cc3000_spi;
-class cc3000;
-
-/**
- */
-class cc3000_event {
-public:
- cc3000_event(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_spi &spi, cc3000 &cc3000);
- ~cc3000_event();
-
- void hci_unsol_handle_patch_request(uint8_t *event_hdr);
- uint8_t *hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen);
- int32_t hci_unsol_event_handler(uint8_t *event_hdr);
- int32_t hci_unsolicited_event_handler(void);
- int32_t get_socket_active_status(int32_t sd);
- void set_socket_active_status(int32_t sd, int32_t status);
- int32_t hci_event_unsol_flowcontrol_handler(uint8_t *event);
- void update_socket_active_status(uint8_t *resp_params);
- void simplelink_wait_event(uint16_t op_code, void *ret_param);
- void simplelink_wait_data(uint8_t *buffer, uint8_t *from, uint8_t *fromlen);
-
- void received_handler(uint8_t *buffer);
- private:
- uint32_t socket_active_status;
- cc3000_simple_link &_simple_link;
- cc3000_hci &_hci;
- cc3000_spi &_spi;
- cc3000 &_cc3000;
-};
-
-class cc3000_netapp {
-public:
- cc3000_netapp(cc3000_simple_link &simple_link, cc3000_nvmem &nvmem, cc3000_hci &hci, cc3000_event &event);
- ~cc3000_netapp();
- int32_t config_mac_adrress(uint8_t *mac);
- int32_t dhcp(uint32_t *ip, uint32_t *subnet_mask,uint32_t *default_gateway, uint32_t *dns_server);
-#ifndef CC3000_TINY_DRIVER
- void ipconfig(tNetappIpconfigRetArgs *ipconfig);
- int32_t timeout_values(uint32_t *dhcp, uint32_t *arp,uint32_t *keep_alive, uint32_t *inactivity);
- int32_t ping_send(uint32_t *ip, uint32_t ping_attempts, uint32_t ping_size, uint32_t ping_timeout);
- void ping_report();
- int32_t ping_stop();
- int32_t arp_flush();
-#endif
-private:
- cc3000_simple_link &_simple_link;
- cc3000_nvmem &_nvmem;
- cc3000_hci &_hci;
- cc3000_event &_event;
-};
-
-#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
-class cc3000_security {
-public:
- void expandKey(uint8_t *expanded_key, uint8_t *key);
- uint8_t galois_mul2(uint8_t value);
- void aes_encr(uint8_t *state, uint8_t *expanded_key);
- void aes_decr(uint8_t *state, uint8_t *expanded_key);
- void aes_encrypt(uint8_t *state, uint8_t *key);
- void aes_decrypt(uint8_t *state, uint8_t *key);
- int32_t aes_read_key(uint8_t *key);
- int32_t aes_write_key(uint8_t *key);
-private:
- uint8_t _expanded_key[176];
-};
-#endif
-
-class cc3000_socket {
-public:
- cc3000_socket(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_event &event);
- ~cc3000_socket();
- int32_t socket(int32_t domain, int32_t type, int32_t protocol);
- int32_t accept(int32_t sd, sockaddr *addr, socklen_t *addrlen);
- int32_t bind(int32_t sd, const sockaddr *addr, int32_t addrlen);
- int32_t HostFlowControlConsumeBuff(int32_t sd);
- int32_t closesocket(int32_t sd);
- int32_t listen(int32_t sd, int32_t backlog);
- int32_t connect(int32_t sd, const sockaddr *addr, int32_t addrlen);
- int32_t select(int32_t nfds, fd_set *readsds, fd_set *writesds, fd_set *exceptsds, struct timeval *timeout);
- int32_t getsockopt (int32_t sd, int32_t level, int32_t optname, void *optval, socklen_t *optlen);
- int32_t simple_link_recv(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen, int32_t opcode);
- int32_t simple_link_send(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, int32_t tolen, int32_t opcode);
- int32_t recv(int32_t sd, void *buf, int32_t len, int32_t flags);
- int32_t recvfrom(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen);
- int32_t send(int32_t sd, const void *buf, int32_t len, int32_t flags);
- int32_t sendto(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, socklen_t tolen);
- int32_t mdns_advertiser(uint16_t mdns_enabled, uint8_t * device_service_name, uint16_t device_service_name_length);
-#ifndef CC3000_TINY_DRIVER
- int32_t gethostbyname(uint8_t *hostname, uint16_t name_length, uint32_t *out_ip_addr);
- int32_t setsockopt(int32_t sd, int32_t level, int32_t optname, const void *optval, socklen_t optlen);
-#endif
-private:
- cc3000_simple_link &_simple_link;
- cc3000_hci &_hci;
- cc3000_event &_event;
-};
-
-/** SPI communication class
- */
-class cc3000_spi {
-public:
- /** ctor
- */
- 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);
- /** dtor
- */
- ~cc3000_spi();
- /** Close SPI - disables IRQ and set received buffer to 0
- * \param none
- * \return none
- */
- void close();
- /**
- * \param none
- * \return none
- */
- void open();
- /**
- * \param buffer
- * \param length
- * \return none
- */
- uint32_t first_write(uint8_t *buffer, uint16_t length);
- /**
- */
- uint32_t write(uint8_t *buffer, uint16_t length);
- /**
- */
- void write_synchronous(uint8_t *data, uint16_t size);
- /**
- */
- void read_synchronous(uint8_t *data, uint16_t size);
- /**
- */
- uint32_t read_data_cont();
- /**
- */
- void wlan_irq_enable();
- /**
- */
- void wlan_irq_disable();
- /**
- */
- void wlan_irq_set(uint8_t value);
- /**
- */
- uint32_t wlan_irq_read();
- /**
- */
- void WLAN_IRQHandler();
- /**
- */
- void write_wlan_en(uint8_t value);
-private:
- tSpiInfo _spi_info;
- InterruptIn _wlan_irq;
- 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;
-};
-
-class cc3000_hci {
-public:
- cc3000_hci(cc3000_spi &spi);
- ~cc3000_hci();
- uint16_t command_send(uint16_t op_code, uint8_t *buffer, uint8_t length);
- uint32_t 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);
- void data_command_send(uint16_t op_code, uint8_t *buffer, uint8_t arg_length,
- uint16_t data_length);
- void patch_send(uint8_t op_code, uint8_t *buffer, uint8_t *patch, uint16_t data_length);
-private:
- cc3000_spi &_spi;
-};
-
-class cc3000_nvmem {
-public:
- cc3000_nvmem(cc3000_hci &hci, cc3000_event &_event,cc3000_simple_link &simple_link);
- ~cc3000_nvmem();
- int32_t read(uint32_t file_id, uint32_t length, uint32_t offset, uint8_t *buff);
- int32_t write(uint32_t file_id, uint32_t length, uint32_t entry_offset, uint8_t *buff);
- uint8_t set_mac_address(uint8_t *mac);
- uint8_t get_mac_address(uint8_t *mac);
- uint8_t write_patch(uint32_t file_id, uint32_t length, const uint8_t *data);
- int32_t create_entry(uint32_t file_id, uint32_t new_len);
-#ifndef CC3000_TINY_DRIVER
- uint8_t read_sp_version(uint8_t* patch_ver);
-#endif
-private:
- cc3000_hci &_hci;
- cc3000_event &_event;
- cc3000_simple_link &_simple_link;
-};
-
-class cc3000_wlan {
-public:
- cc3000_wlan(cc3000_simple_link &simple_link, cc3000_event &event, cc3000_spi &spi, cc3000_hci &hci);
- ~cc3000_wlan();
- /** Send SIMPLE LINK START to cc3000
- * \param patches_available_host Flag to indicate if patches are available
- * \return none
- */
- void simpleLink_init_start(uint16_t patches_available_host);
- /** Start wlan device. Blocking call until init is completed
- * \param patches_available_host Flag to indicate if patches are available
- * \return none
- */
- void start(uint16_t patches_available_host);
- /** Stop wlan device
- * \param none
- * \return none
- */
- void stop(void);
-#ifndef CC3000_TINY_DRIVER
- int32_t connect(uint32_t sec_type, const uint8_t *ssid, int32_t ssid_length, uint8_t *b_ssid, uint8_t *key, int32_t key_len);
- int32_t add_profile(uint32_t sec_type, uint8_t* ssid, uint32_t ssid_length, uint8_t *b_ssid, uint32_t priority, uint32_t pairwise_cipher_or_tx_key_len, uint32_t group_cipher_tx_key_index,
- uint32_t key_mgmt, uint8_t* pf_or_key, uint32_t pass_phrase_length);
- int32_t ioctl_get_scan_results(uint32_t scan_timeout, uint8_t *results);
- int32_t ioctl_set_scan_params(uint32_t enable, uint32_t min_dwell_time, uint32_t max_dwell_time, uint32_t num_probe_requests,
- uint32_t channel_mask, int32_t rssi_threshold, uint32_t snr_threshold, uint32_t default_tx_power, uint32_t *interval_list);
- int32_t ioctl_statusget(void);
-#else
- int32_t connect(const uint8_t *ssid, int32_t ssid_length);
- int32_t add_profile(uint32_t sec_type, uint8_t *ssid, uint32_t ssid_length, uint8_t *b_ssid, uint32_t priority,
- uint32_t pairwise_cipher_or_tx_key_len, uint32_t group_cipher_tx_key_index, uint32_t key_mgmt,
- uint8_t* pf_or_key, uint32_t pass_phrase_length);
-#endif
-#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
- int32_t smart_config_process(void);
-#endif
- int32_t disconnect();
- int32_t ioctl_set_connection_policy(uint32_t should_connect_to_open_ap, uint32_t use_fast_connect, uint32_t use_profiles);
- int32_t ioctl_del_profile(uint32_t index);
- int32_t set_event_mask(uint32_t mask);
- int32_t smart_config_start(uint32_t encrypted_flag);
- int32_t smart_config_stop(void);
- int32_t smart_config_set_prefix(uint8_t *new_prefix);
-private:
- cc3000_simple_link &_simple_link;
- cc3000_event &_event;
- cc3000_spi &_spi;
- cc3000_hci &_hci;
-};
-
-/** Client TCP/UDP class - TODO - not complete client
- */
-class cc3000_client {
-public:
- /**
- */
- cc3000_client(cc3000 &cc3000_ref);
- /**
- */
- cc3000_client(cc3000 &cc3000_ref, int16_t socket);
- /**
- */
- bool connected(void);
- /**
- */
- int16_t write(const void *buffer, uint16_t length, uint32_t flags);
- /**
- */
- int16_t read(void *buffer, uint16_t length, uint32_t flags);
- /**
- */
- void close(void);
-
-private:
- int16_t _current_socket;
- cc3000 &_cc3000;
-};
-
-/** Server TCP/UDP
- */
-class cc3000_server {
-public:
- /** ctor (server was not created successfully)
- */
- cc3000_server(cc3000 &cc3000_ref, sockaddr socket_add);
- /** ctor
- */
- cc3000_server(cc3000 &cc3000_ref, sockaddr socket_add, int16_t socket);
- /** Blocking accept
- */
- int32_t accept(void);
- /**
- */
- int32_t receive(void *buffer, uint16_t length, uint32_t flags);
- /**
- */
- int32_t send(void *buffer, uint16_t length, uint32_t flags);
- /**
- */
- void bind(void);
- /**
- */
- void listen(uint32_t backlog);
- /**
- */
- void close(void);
-private:
- int16_t _current_socket;
- sockaddr _socket_address;
- cc3000 &_cc3000;
-};
-
-/** The main class of entire cc3000 implementation
- */
-class cc3000 {
-public:
- typedef struct {
- bool dhcp;
- bool connected;
- uint8_t socket;
- bool smart_config_complete;
- bool stop_smart_config;
- bool dhcp_configured;
- bool ok_to_shut_down;
- } tStatus;
- /** ctor for cc3000 class.
- * \param cc3000_irq IRQ pin
- * \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);
- /** dtor
- */
- ~cc3000();
- /** Initiate cc3000. It starts the wlan communication and deletes profiles.
- * \param patch Patch
- */
- void start(uint8_t patch);
- /** Stops the wlan communication.
- */
- void stop();
- /** Restarts the wlan communication.
- */
- void restart(uint8_t patch);
- /** Disconnect wlan device
- *
- */
- bool disconnect(void);
- /** 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
- * \param length Length of data
- * \return none
- */
- void usync_callback(int32_t event_type, uint8_t *data, uint8_t length);
- /** Connect to SSID (open/secured) with timeout (10ms).
- * \param ssid SSID name
- * \param key Security key (if key = 0, open connection)
- * \param security_mode Security mode
- * \return true if connection was established, false otherwise.
- */
- bool connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode);
- /** Connect to SSID which is secured
- * \param ssid SSID name
- * \param key Security key
- * \param security_mode Security mode
- * \return true if connection was established, false otherwise.
- */
- bool connect_secure(const uint8_t *ssid, const uint8_t *key, int32_t security_mode);
- /** Connect to SSID which is open (no security)
- * \param ssid SSID name
- * \return true if connection was established, false otherwise.
- */
- bool connect_open(const uint8_t *ssid);
- /** Status of the cc3000 connection.
- * \return true if it's connected, false otherwise.
- */
- bool is_connected();
- /** Status of DHCP.
- * \param none
- * \return true if DCHP is configured, false otherwise.
- */
- bool is_dhcp_configured();
- /** Status of smart confing completation.
- * \param none
- * \return smart config was set, false otherwise.
- */
- bool is_smart_confing_completed();
- /** Return the cc3000's mac address.
- * \param address Retreived mac address.
- * \return none
- */
- void get_mac_address(uint8_t address[6]);
- /** Set the cc3000's mac address
- * \param address Mac address to be set
- * \return none
- */
- void set_mac_address(uint8_t address[6]);
- /** Get user file info
- * \param info_file Pointer where info will be stored
- * \param size Available size
- * \return none
- */
- void get_user_file_info(uint8_t *info_file, size_t size);
- /** Set user filo info
- * \param info_file Pointer to user's info
- * \return none
- */
- void set_user_file_info(uint8_t *info_file, size_t size);
- /** Start smart config
- * \param smart_config_key Pointer to smart config key
- * \return none
- */
- void start_smart_config(const uint8_t *smart_config_key); /* TODO enable AES ? */
-#ifndef CC3000_TINY_DRIVER
- /** Return ip configuration
- * \param ip_config Pointer to ipconfig data
- * \return true if it's connected and info was retrieved, false otherwise.
- */
- bool get_ip_config(tNetappIpconfigRetArgs *ip_config);
-#endif
- /** Creates tcp client
- * \param ip_address Client's IP address
- * \param port Client's PORT
- * \return client with socket != -1
- */
- cc3000_client create_tcp_client(uint32_t ip_address, uint16_t port);
- /** Creates tcp server
- * \param ip_address Server's IP address
- * \param port Server's PORT
- * \return server with socket != -1
- */
- cc3000_server create_tcp_server(uint32_t ip_address, uint16_t port);
- /** Creates udp client
- * \param ip_address Server's IP address
- * \param port Server's PORT
- * \return client with socket != -1
- */
- cc3000_client create_udp_client(uint32_t ip_address, uint16_t port);
- /** Delete all stored profiles
- * \param none
- * \return none
- */
- void delete_profiles(void);
- /**
- *
- */
- uint32_t ping(uint32_t ip, uint8_t attempts, uint16_t timeout, uint8_t size);
-
- static cc3000 *get_instance() {
- return _inst;
- }
-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;
-protected:
- static cc3000 *_inst;
-private:
- tStatus _status;
- netapp_pingreport_args_t _ping_report;
- bool _closed_sockets[MAX_SOCKETS];
-};
-
-/**
-* Copy 32 bit to stream while converting to little endian format.
-* @param p pointer to the new stream
-* @param u32 pointer to the 32 bit
-* @return pointer to the new stream
-*/
-uint8_t *UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32);
-
-/**
-* Copy 16 bit to stream while converting to little endian format.
-* @param p pointer to the new stream
-* @param u32 pointer to the 16 bit
-* @return pointer to the new stream
-*/
-uint8_t *UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16);
-
-/**
-* Copy received stream to 16 bit in little endian format.
-* @param p pointer to the stream
-* @param offset offset in the stream
-* @return pointer to the new 16 bit
-*/
-uint16_t STREAM_TO_UINT16_f(uint8_t* p, uint16_t offset);
-
-/**
-* Copy received stream to 32 bit in little endian format.
-* @param p pointer to the stream
-* @param offset offset in the stream
-* @return pointer to the new 32 bit
-*/
-uint32_t STREAM_TO_UINT32_f(uint8_t* p, uint16_t offset);
-
-} /* end of mbed_cc3000 namespace */
-
-
-#endif
+/*****************************************************************************
+*
+* C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
+* Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
+* provided help.
+*
+* This version of "host driver" uses CC3000 Host Driver Implementation. Thus
+* read the following copyright:
+*
+* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*
+* Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the
+* distribution.
+*
+* Neither the name of Texas Instruments Incorporated nor the names of
+* its contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+#ifndef CC3000_H
+#define CC3000_H
+
+#include "mbed.h"
+#include "cc3000_common.h"
+#include "cc3000_spi.h"
+#include "cc3000_simplelink.h"
+#include "cc3000_netapp.h"
+#include "cc3000_nvmem.h"
+#include "cc3000_socket.h"
+
+#define MAX_SOCKETS 4
+
+/** Enable debug messages, comment out the ones you don't want
+ */
+#define CC3000_DEBUG_SOCKET
+#define CC3000_DEBUG_HCI_TX
+#define CC3000_DEBUG_HCI_RX
+#define CC3000_DEBUG
+
+// Add color too the debug messages, requires a VT100 terminal like putty, comment out to remove
+#define VT100_COLOUR
+
+#ifdef CC3000_DEBUG_SOCKET
+
+ #ifdef VT100_COLOUR
+ #define DBG_SOCKET(x, ...) std::printf("\x1b[2;32;40m[CC3000 : SOCKET] "x"\x1b[0;37;40m\r\n", ##__VA_ARGS__);
+ #else
+ #define DBG_SOCKET(x, ...) std::printf("[CC3000 : SOCKET] "x"\r\n", ##__VA_ARGS__);
+ #endif
+
+#else
+ #define DBG_SOCKET(x, ...)
+#endif
+
+#ifdef CC3000_DEBUG_HCI_TX
+
+ #ifdef VT100_COLOUR
+ #define DBG_HCI(x, ...) std::printf("\x1b[2;35;40m[CC3000 : HCI RX] "x"\x1b[0;37;40m\r\n", ##__VA_ARGS__);
+ #else
+ #define DBG_HCI(x, ...) std::printf("[CC3000 : HCI RX] "x"\r\n", ##__VA_ARGS__);
+ #endif
+
+#else
+ #define DBG_HCI(x, ...)
+#endif
+
+#ifdef CC3000_DEBUG_HCI_RX
+
+ #ifdef VT100_COLOUR
+ #define DBG_HCI_CMD(x, ...) std::printf("\x1b[2;36;40m[CC3000 : HCI TX] "x"\x1b[0;37;40m\r\n", ##__VA_ARGS__);
+ #else
+ #define DBG_HCI_CMD(x, ...) std::printf("[CC3000 : HCI TX] "x"\r\n", ##__VA_ARGS__);
+ #endif
+
+#else
+ #define DBG_HCI_CMD(x, ...)
+#endif
+
+
+#ifdef CC3000_DEBUG
+
+ #ifdef VT100_COLOUR
+ #define DBG_CC(x, ...) std::printf("\x1b[2;32;40m[CC3000] "x"\x1b[0;37;40m\r\n", ##__VA_ARGS__);
+ #else
+ #define DBG_CC(x, ...) std::printf("[CC3000] "x"\r\n", ##__VA_ARGS__);
+ #endif
+
+#else
+ #define DBG_HCI_CMD(x, ...)
+#endif
+
+namespace mbed_cc3000 {
+
+/** User info structure
+ */
+typedef struct {
+ uint8_t FTC; // First time config performed
+ uint8_t PP_version[2]; // Patch Programmer version
+ uint8_t SERV_PACK[2]; // Service Pack Version
+ uint8_t DRV_VER[3]; // Driver Version
+ uint8_t FW_VER[3]; // Firmware Version
+ uint8_t validCIK; // CIK[] is valid (Client Interface Key)
+ uint8_t CIK[40];
+} tUserFS;
+
+/** Function pointers which are not yet implemented
+ */
+enum FunctionNumber {
+ FW_PATCHES = 0,
+ DRIVER_PATCHES = 1,
+ BOOTLOADER_PATCHES = 2,
+};
+
+/** CC3000 Simple Link class which contains status of cc3000.
+ */
+class cc3000_simple_link {
+public:
+ /** ctor - sets magic number in the buffers (overflow mark).
+ */
+ cc3000_simple_link();
+ /** dtor
+ */
+ ~cc3000_simple_link();
+ /** Returns data received flag.
+ * \return
+ * if data have been received.
+ */
+ uint8_t get_data_received_flag();
+ /** Set data received flag.
+ * \param value The value to be set.
+ */
+ void set_data_received_flag(uint8_t value);
+ /** Returns if tx was completed.
+ * \return
+ * true if tx was completed,
+ * false otherwise.
+ */
+ bool get_tx_complete_signal();
+ /**
+ */
+ void set_tx_complete_signal(bool value);
+ /**
+ */
+ uint8_t *get_received_buffer();
+ /**
+ */
+ void set_received_buffer(uint8_t value);
+ /**
+ */
+ uint8_t *get_transmit_buffer();
+ /**
+ */
+ void set_transmit_buffer(uint8_t value);
+ /**
+ */
+ uint16_t get_number_free_buffers();
+ /**
+ */
+ void set_number_free_buffers(uint16_t value);
+ /**
+ */
+ uint16_t get_buffer_length();
+ /**
+ */
+ void set_buffer_length(uint16_t value);
+ /**
+ */
+ uint16_t get_pending_data();
+ /**
+ */
+ void set_pending_data(uint16_t value);
+ /**
+ */
+ uint16_t get_op_code();
+ /**
+ */
+ void set_op_code(uint16_t code);
+ /**
+ */
+ uint16_t get_released_packets();
+ /**
+ */
+ void set_number_of_released_packets(uint16_t value);
+ /**
+ */
+ uint16_t get_sent_packets();
+ /**
+ */
+ void set_sent_packets(uint16_t value);
+
+ int32_t get_transmit_error();
+ void set_transmit_error(int32_t value);
+
+ uint16_t get_buffer_size(void);
+ void set_buffer_size(uint16_t value);
+
+ void *get_func_pointer(FunctionNumber function);
+
+ uint8_t *get_received_data(void);
+ void set_received_data(uint8_t *pointer);
+
+private:
+ uint8_t _data_received_flag;
+ bool _tx_complete_signal;
+ uint16_t _rx_event_opcode;
+ uint16_t _free_buffers;
+ uint16_t _buffer_length;
+ uint16_t _buffer_size;
+ uint16_t _rx_data_pending;
+ uint16_t _sent_packets;
+ uint16_t _released_packets;
+ int32_t _transmit_data_error;
+ uint8_t *_received_data;
+ uint8_t _rx_buffer[CC3000_RX_BUFFER_SIZE];
+ uint8_t _tx_buffer[CC3000_TX_BUFFER_SIZE];
+private:
+ int8_t *(* _fFWPatches)(uint32_t *length);
+ int8_t *(* _fDriverPatches)(uint32_t *length);
+ int8_t *(* _fBootLoaderPatches)(uint32_t *length);
+};
+
+/** Forward declaration classes
+ */
+class cc3000_hci;
+class cc3000_nvmem;
+class cc3000_spi;
+class cc3000;
+
+/**
+ */
+class cc3000_event {
+public:
+ cc3000_event(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_spi &spi, cc3000 &cc3000);
+ ~cc3000_event();
+
+ void hci_unsol_handle_patch_request(uint8_t *event_hdr);
+ uint8_t *hci_event_handler(void *ret_param, uint8_t *from, uint8_t *fromlen);
+ int32_t hci_unsol_event_handler(uint8_t *event_hdr);
+ int32_t hci_unsolicited_event_handler(void);
+ int32_t get_socket_active_status(int32_t sd);
+ void set_socket_active_status(int32_t sd, int32_t status);
+ int32_t hci_event_unsol_flowcontrol_handler(uint8_t *event);
+ void update_socket_active_status(uint8_t *resp_params);
+ void simplelink_wait_event(uint16_t op_code, void *ret_param);
+ void simplelink_wait_data(uint8_t *buffer, uint8_t *from, uint8_t *fromlen);
+
+ void received_handler(uint8_t *buffer);
+ private:
+ uint32_t socket_active_status;
+ cc3000_simple_link &_simple_link;
+ cc3000_hci &_hci;
+ cc3000_spi &_spi;
+ cc3000 &_cc3000;
+};
+
+class cc3000_netapp {
+public:
+ cc3000_netapp(cc3000_simple_link &simple_link, cc3000_nvmem &nvmem, cc3000_hci &hci, cc3000_event &event);
+ ~cc3000_netapp();
+ int32_t config_mac_adrress(uint8_t *mac);
+ int32_t dhcp(uint32_t *ip, uint32_t *subnet_mask,uint32_t *default_gateway, uint32_t *dns_server);
+#ifndef CC3000_TINY_DRIVER
+ void ipconfig(tNetappIpconfigRetArgs *ipconfig);
+ int32_t timeout_values(uint32_t *dhcp, uint32_t *arp,uint32_t *keep_alive, uint32_t *inactivity);
+ int32_t ping_send(uint32_t *ip, uint32_t ping_attempts, uint32_t ping_size, uint32_t ping_timeout);
+ void ping_report();
+ int32_t ping_stop();
+ int32_t arp_flush();
+#endif
+private:
+ cc3000_simple_link &_simple_link;
+ cc3000_nvmem &_nvmem;
+ cc3000_hci &_hci;
+ cc3000_event &_event;
+};
+
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+class cc3000_security {
+public:
+ void expandKey(uint8_t *expanded_key, uint8_t *key);
+ uint8_t galois_mul2(uint8_t value);
+ void aes_encr(uint8_t *state, uint8_t *expanded_key);
+ void aes_decr(uint8_t *state, uint8_t *expanded_key);
+ void aes_encrypt(uint8_t *state, uint8_t *key);
+ void aes_decrypt(uint8_t *state, uint8_t *key);
+ int32_t aes_read_key(uint8_t *key);
+ int32_t aes_write_key(uint8_t *key);
+private:
+ uint8_t _expanded_key[176];
+};
+#endif
+
+class cc3000_socket {
+public:
+ cc3000_socket(cc3000_simple_link &simplelink, cc3000_hci &hci, cc3000_event &event);
+ ~cc3000_socket();
+ int32_t socket(int32_t domain, int32_t type, int32_t protocol);
+ int32_t accept(int32_t sd, sockaddr *addr, socklen_t *addrlen);
+ int32_t bind(int32_t sd, const sockaddr *addr, int32_t addrlen);
+ int32_t HostFlowControlConsumeBuff(int32_t sd);
+ int32_t closesocket(int32_t sd);
+ int32_t listen(int32_t sd, int32_t backlog);
+ int32_t connect(int32_t sd, const sockaddr *addr, int32_t addrlen);
+ int32_t select(int32_t nfds, fd_set *readsds, fd_set *writesds, fd_set *exceptsds, struct timeval *timeout);
+ int32_t getsockopt (int32_t sd, int32_t level, int32_t optname, void *optval, socklen_t *optlen);
+ int32_t simple_link_recv(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen, int32_t opcode);
+ int32_t simple_link_send(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, int32_t tolen, int32_t opcode);
+ int32_t recv(int32_t sd, void *buf, int32_t len, int32_t flags);
+ int32_t recvfrom(int32_t sd, void *buf, int32_t len, int32_t flags, sockaddr *from, socklen_t *fromlen);
+ int32_t send(int32_t sd, const void *buf, int32_t len, int32_t flags);
+ int32_t sendto(int32_t sd, const void *buf, int32_t len, int32_t flags, const sockaddr *to, socklen_t tolen);
+ int32_t mdns_advertiser(uint16_t mdns_enabled, uint8_t * device_service_name, uint16_t device_service_name_length);
+#ifndef CC3000_TINY_DRIVER
+ int32_t gethostbyname(uint8_t *hostname, uint16_t name_length, uint32_t *out_ip_addr);
+ int32_t setsockopt(int32_t sd, int32_t level, int32_t optname, const void *optval, socklen_t optlen);
+#endif
+private:
+ cc3000_simple_link &_simple_link;
+ cc3000_hci &_hci;
+ cc3000_event &_event;
+};
+
+/** SPI communication class
+ */
+class cc3000_spi {
+public:
+ /** ctor
+ */
+ 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);
+ /** dtor
+ */
+ ~cc3000_spi();
+ /** Close SPI - disables IRQ and set received buffer to 0
+ * \param none
+ * \return none
+ */
+ void close();
+ /**
+ * \param none
+ * \return none
+ */
+ void open();
+ /**
+ * \param buffer
+ * \param length
+ * \return none
+ */
+ uint32_t first_write(uint8_t *buffer, uint16_t length);
+ /**
+ */
+ uint32_t write(uint8_t *buffer, uint16_t length);
+ /**
+ */
+ void write_synchronous(uint8_t *data, uint16_t size);
+ /**
+ */
+ void read_synchronous(uint8_t *data, uint16_t size);
+ /**
+ */
+ uint32_t read_data_cont();
+ /**
+ */
+ void wlan_irq_enable();
+ /**
+ */
+ void wlan_irq_disable();
+ /**
+ */
+ void wlan_irq_set(uint8_t value);
+ /**
+ */
+ uint32_t wlan_irq_read();
+ /**
+ */
+ void WLAN_IRQHandler();
+ /**
+ */
+ void write_wlan_en(uint8_t value);
+private:
+ tSpiInfo _spi_info;
+ InterruptIn _wlan_irq;
+ 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;
+};
+
+class cc3000_hci {
+public:
+ cc3000_hci(cc3000_spi &spi);
+ ~cc3000_hci();
+ uint16_t command_send(uint16_t op_code, uint8_t *buffer, uint8_t length);
+ uint32_t 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);
+ void data_command_send(uint16_t op_code, uint8_t *buffer, uint8_t arg_length,
+ uint16_t data_length);
+ void patch_send(uint8_t op_code, uint8_t *buffer, uint8_t *patch, uint16_t data_length);
+private:
+ cc3000_spi &_spi;
+};
+
+class cc3000_nvmem {
+public:
+ cc3000_nvmem(cc3000_hci &hci, cc3000_event &_event,cc3000_simple_link &simple_link);
+ ~cc3000_nvmem();
+ int32_t read(uint32_t file_id, uint32_t length, uint32_t offset, uint8_t *buff);
+ int32_t write(uint32_t file_id, uint32_t length, uint32_t entry_offset, uint8_t *buff);
+ uint8_t set_mac_address(uint8_t *mac);
+ uint8_t get_mac_address(uint8_t *mac);
+ uint8_t write_patch(uint32_t file_id, uint32_t length, const uint8_t *data);
+ int32_t create_entry(uint32_t file_id, uint32_t new_len);
+#ifndef CC3000_TINY_DRIVER
+ uint8_t read_sp_version(uint8_t* patch_ver);
+#endif
+private:
+ cc3000_hci &_hci;
+ cc3000_event &_event;
+ cc3000_simple_link &_simple_link;
+};
+
+class cc3000_wlan {
+public:
+ cc3000_wlan(cc3000_simple_link &simple_link, cc3000_event &event, cc3000_spi &spi, cc3000_hci &hci);
+ ~cc3000_wlan();
+ /** Send SIMPLE LINK START to cc3000
+ * \param patches_available_host Flag to indicate if patches are available
+ * \return none
+ */
+ void simpleLink_init_start(uint16_t patches_available_host);
+ /** Start wlan device. Blocking call until init is completed
+ * \param patches_available_host Flag to indicate if patches are available
+ * \return none
+ */
+ void start(uint16_t patches_available_host);
+ /** Stop wlan device
+ * \param none
+ * \return none
+ */
+ void stop(void);
+#ifndef CC3000_TINY_DRIVER
+ int32_t connect(uint32_t sec_type, const uint8_t *ssid, int32_t ssid_length, uint8_t *b_ssid, uint8_t *key, int32_t key_len);
+ int32_t add_profile(uint32_t sec_type, uint8_t* ssid, uint32_t ssid_length, uint8_t *b_ssid, uint32_t priority, uint32_t pairwise_cipher_or_tx_key_len, uint32_t group_cipher_tx_key_index,
+ uint32_t key_mgmt, uint8_t* pf_or_key, uint32_t pass_phrase_length);
+ int32_t ioctl_get_scan_results(uint32_t scan_timeout, uint8_t *results);
+ int32_t ioctl_set_scan_params(uint32_t enable, uint32_t min_dwell_time, uint32_t max_dwell_time, uint32_t num_probe_requests,
+ uint32_t channel_mask, int32_t rssi_threshold, uint32_t snr_threshold, uint32_t default_tx_power, uint32_t *interval_list);
+ int32_t ioctl_statusget(void);
+#else
+ int32_t connect(const uint8_t *ssid, int32_t ssid_length);
+ int32_t add_profile(uint32_t sec_type, uint8_t *ssid, uint32_t ssid_length, uint8_t *b_ssid, uint32_t priority,
+ uint32_t pairwise_cipher_or_tx_key_len, uint32_t group_cipher_tx_key_index, uint32_t key_mgmt,
+ uint8_t* pf_or_key, uint32_t pass_phrase_length);
+#endif
+#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
+ int32_t smart_config_process(void);
+#endif
+ int32_t disconnect();
+ int32_t ioctl_set_connection_policy(uint32_t should_connect_to_open_ap, uint32_t use_fast_connect, uint32_t use_profiles);
+ int32_t ioctl_del_profile(uint32_t index);
+ int32_t set_event_mask(uint32_t mask);
+ int32_t smart_config_start(uint32_t encrypted_flag);
+ int32_t smart_config_stop(void);
+ int32_t smart_config_set_prefix(uint8_t *new_prefix);
+private:
+ cc3000_simple_link &_simple_link;
+ cc3000_event &_event;
+ cc3000_spi &_spi;
+ cc3000_hci &_hci;
+};
+
+/** Client TCP/UDP class - TODO - not complete client
+ */
+class cc3000_client {
+public:
+ /**
+ */
+ cc3000_client(cc3000 &cc3000_ref);
+ /**
+ */
+ cc3000_client(cc3000 &cc3000_ref, int16_t socket);
+ /**
+ */
+ bool connected(void);
+ /**
+ */
+ int16_t write(const void *buffer, uint16_t length, uint32_t flags);
+ /**
+ */
+ int16_t read(void *buffer, uint16_t length, uint32_t flags);
+ /**
+ */
+ void close(void);
+
+private:
+ int16_t _current_socket;
+ cc3000 &_cc3000;
+};
+
+/** Server TCP/UDP
+ */
+class cc3000_server {
+public:
+ /** ctor (server was not created successfully)
+ */
+ cc3000_server(cc3000 &cc3000_ref, sockaddr socket_add);
+ /** ctor
+ */
+ cc3000_server(cc3000 &cc3000_ref, sockaddr socket_add, int16_t socket);
+ /** Blocking accept
+ */
+ int32_t accept(void);
+ /**
+ */
+ int32_t receive(void *buffer, uint16_t length, uint32_t flags);
+ /**
+ */
+ int32_t send(void *buffer, uint16_t length, uint32_t flags);
+ /**
+ */
+ void bind(void);
+ /**
+ */
+ void listen(uint32_t backlog);
+ /**
+ */
+ void close(void);
+private:
+ int16_t _current_socket;
+ sockaddr _socket_address;
+ cc3000 &_cc3000;
+};
+
+/** The main class of entire cc3000 implementation
+ */
+class cc3000 {
+public:
+ typedef struct {
+ bool dhcp;
+ bool connected;
+ uint8_t socket;
+ bool smart_config_complete;
+ bool stop_smart_config;
+ bool dhcp_configured;
+ bool ok_to_shut_down;
+ } tStatus;
+ /** ctor for cc3000 class.
+ * \param cc3000_irq IRQ pin
+ * \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);
+ /** dtor
+ */
+ ~cc3000();
+ /** Initiate cc3000. It starts the wlan communication and deletes profiles.
+ * \param patch Patch
+ */
+ void start(uint8_t patch);
+ /** Stops the wlan communication.
+ */
+ void stop();
+ /** Restarts the wlan communication.
+ */
+ void restart(uint8_t patch);
+ /** Disconnect wlan device
+ *
+ */
+ bool disconnect(void);
+ /** 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
+ * \param length Length of data
+ * \return none
+ */
+ void usync_callback(int32_t event_type, uint8_t *data, uint8_t length);
+ /** Connect to SSID (open/secured) with timeout (10ms).
+ * \param ssid SSID name
+ * \param key Security key (if key = 0, open connection)
+ * \param security_mode Security mode
+ * \return true if connection was established, false otherwise.
+ */
+ bool connect_to_AP(const uint8_t *ssid, const uint8_t *key, int32_t security_mode);
+ /** Connect to SSID which is secured
+ * \param ssid SSID name
+ * \param key Security key
+ * \param security_mode Security mode
+ * \return true if connection was established, false otherwise.
+ */
+ bool connect_secure(const uint8_t *ssid, const uint8_t *key, int32_t security_mode);
+ /** Connect to SSID which is open (no security)
+ * \param ssid SSID name
+ * \return true if connection was established, false otherwise.
+ */
+ bool connect_open(const uint8_t *ssid);
+ /** Status of the cc3000 connection.
+ * \return true if it's connected, false otherwise.
+ */
+ bool is_connected();
+ /** Status of DHCP.
+ * \param none
+ * \return true if DCHP is configured, false otherwise.
+ */
+ bool is_dhcp_configured();
+ /** Status of smart confing completation.
+ * \param none
+ * \return smart config was set, false otherwise.
+ */
+ bool is_smart_confing_completed();
+ /** Return the cc3000's mac address.
+ * \param address Retreived mac address.
+ * \return
+ */
+ uint8_t get_mac_address(uint8_t address[6]);
+ /** Set the cc3000's mac address
+ * \param address Mac address to be set
+ * \return
+ */
+ uint8_t set_mac_address(uint8_t address[6]);
+ /** Get user file info
+ * \param info_file Pointer where info will be stored
+ * \param size Available size
+ * \return none
+ */
+ void get_user_file_info(uint8_t *info_file, size_t size);
+ /** Set user filo info
+ * \param info_file Pointer to user's info
+ * \return none
+ */
+ void set_user_file_info(uint8_t *info_file, size_t size);
+ /** Start smart config
+ * \param smart_config_key Pointer to smart config key
+ * \return none
+ */
+ void start_smart_config(const uint8_t *smart_config_key); /* TODO enable AES ? */
+#ifndef CC3000_TINY_DRIVER
+ /** Return ip configuration
+ * \param ip_config Pointer to ipconfig data
+ * \return true if it's connected and info was retrieved, false otherwise.
+ */
+ bool get_ip_config(tNetappIpconfigRetArgs *ip_config);
+#endif
+ /** Creates tcp client
+ * \param ip_address Client's IP address
+ * \param port Client's PORT
+ * \return client with socket != -1
+ */
+ cc3000_client create_tcp_client(uint32_t ip_address, uint16_t port);
+ /** Creates tcp server
+ * \param ip_address Server's IP address
+ * \param port Server's PORT
+ * \return server with socket != -1
+ */
+ cc3000_server create_tcp_server(uint32_t ip_address, uint16_t port);
+ /** Creates udp client
+ * \param ip_address Server's IP address
+ * \param port Server's PORT
+ * \return client with socket != -1
+ */
+ cc3000_client create_udp_client(uint32_t ip_address, uint16_t port);
+ /** Delete all stored profiles
+ * \param none
+ * \return none
+ */
+ void delete_profiles(void);
+ /**
+ *
+ */
+ uint32_t ping(uint32_t ip, uint8_t attempts, uint16_t timeout, uint8_t size);
+
+ static cc3000 *get_instance() {
+ return _inst;
+ }
+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;
+protected:
+ static cc3000 *_inst;
+private:
+ tStatus _status;
+ netapp_pingreport_args_t _ping_report;
+ bool _closed_sockets[MAX_SOCKETS];
+};
+
+/**
+* Copy 32 bit to stream while converting to little endian format.
+* @param p pointer to the new stream
+* @param u32 pointer to the 32 bit
+* @return pointer to the new stream
+*/
+uint8_t *UINT32_TO_STREAM_f (uint8_t *p, uint32_t u32);
+
+/**
+* Copy 16 bit to stream while converting to little endian format.
+* @param p pointer to the new stream
+* @param u32 pointer to the 16 bit
+* @return pointer to the new stream
+*/
+uint8_t *UINT16_TO_STREAM_f (uint8_t *p, uint16_t u16);
+
+/**
+* Copy received stream to 16 bit in little endian format.
+* @param p pointer to the stream
+* @param offset offset in the stream
+* @return pointer to the new 16 bit
+*/
+uint16_t STREAM_TO_UINT16_f(uint8_t* p, uint16_t offset);
+
+/**
+* Copy received stream to 32 bit in little endian format.
+* @param p pointer to the stream
+* @param offset offset in the stream
+* @return pointer to the new 32 bit
+*/
+uint32_t STREAM_TO_UINT32_f(uint8_t* p, uint16_t offset);
+
+} /* end of mbed_cc3000 namespace */
+
+
+#endif
