TI's CC3000 WIFI driver (2015 update)
tonyp12
Posts: 1,951
in Propeller 1
Finally got around implementing all the functions CC3000 can do.
It was a pain as it uses HCI type structure where bytes,words & long are mixed on odd boundary.
By default it uses the pins on the breakout board I sold for the Propeller Quickstart board a year back, but any cc3000 breakout board should work.
4 sockets at the same time.
Rolling buffers, you parse data at your leisure as SPI driver handles IRQ in the background.
Parse what you looking for (or to end of Rxbuffer) if parser find something else during it will fill in that data too.
Recommend you do the store-SSID-profile inside cc3000 so it will auto-connect to it when you power it up.
http://processors.wiki.ti.com/index.php/CC3000_Protocol
code snippet:
It was a pain as it uses HCI type structure where bytes,words & long are mixed on odd boundary.
By default it uses the pins on the breakout board I sold for the Propeller Quickstart board a year back, but any cc3000 breakout board should work.
4 sockets at the same time.
Rolling buffers, you parse data at your leisure as SPI driver handles IRQ in the background.
Parse what you looking for (or to end of Rxbuffer) if parser find something else during it will fill in that data too.
Recommend you do the store-SSID-profile inside cc3000 so it will auto-connect to it when you power it up.
http://processors.wiki.ti.com/index.php/CC3000_Protocol
code snippet:
{{ PUB wlan_connect(wlan_security, bssid, ssid, passphrase) hci_len := 0 hci_long(28) 'not documented yet hci_long(strsize(ssid)) hci_long(wlan_security) hci_long(strsize(ssid)+16) hci_long(strsize(passphrase)) hci_word(0) 'probably upper filler word for bssid if bssid == 0 hci_word(0) hci_long(0) else hci_byte(delimiter(bssid,0,":")) 'bbsid (Big-endian) hci_byte(delimiter(bssid,1,":")) 'a router macid filtering hci_byte(delimiter(bssid,2,":")) 'use dec, not hex values hci_byte(delimiter(bssid,3,":")) hci_byte(delimiter(bssid,4,":")) hci_byte(delimiter(bssid,5,":")) hci_copy(strsize(ssid),ssid) 'fill in ascii ssid name case wlan_security 'if wep, wpa & wpa2 1..3 : hci_copy(strsize(passphrase),passphrase) 'key index 1 (wep 5 ascii chars = 40bit key) hci_cmnd($0001) 'HCI_TYPE_CMND PUB add_profile(wlan_security, bssid, priority, ssid, passphrase) hci_len := 0 hci_long(wlan_security) '0=open, 1=wep, 2=wpa, 3=wpa2 case wlan_security 0 : hci_long(20) 'not documented yet 1 : hci_long(32) 'hci lenght probably 2,3 : hci_long(40) hci_long(strsize(ssid)) hci_word (0) 'probably upper filler word for bssid if bssid == 0 hci_word(0) hci_long(0) else hci_byte(delimiter(bssid,0,":")) 'bbsid (Big-endian) hci_byte(delimiter(bssid,1,":")) 'a router macid filtering hci_byte(delimiter(bssid,2,":")) 'use dec, not hex values hci_byte(delimiter(bssid,3,":")) hci_byte(delimiter(bssid,4,":")) hci_byte(delimiter(bssid,5,":")) hci_long(priority) '0=low to 7=highest priority if wlan_security == 0 'open hci_copy(strsize(ssid),ssid) 'for open, just fill in ascii ssid name if wlan_security == 1 'wep hci_long(strsize(ssid)+12) hci_long(32) 'Key length hci_long(0) 'Key index hci_copy(strsize(ssid),ssid) 'fill in ascii ssid name hci_copy(strsize(passphrase),passphrase) 'key index 1 (5 ascii chars = 40bit key) hci_copy(strsize(passphrase),passphrase) 'key index 2 (same key repeated 4 times) hci_copy(strsize(passphrase),passphrase) 'key index 3 hci_copy(strsize(passphrase),passphrase) 'key index 4 if wlan_security == 2 or wlan_security == 3 'wpa and wpa2 hci_long(24) 'PairwiseCipher hci_long(30) 'GroupCipher hci_long(2) 'Key management hci_long(strsize(ssid)+8) hci_long(strsize(passphrase)) hci_copy(strsize(ssid),ssid) 'fill in ascii ssid name hci_copy(strsize(passphrase),passphrase) 'fill in ascii password hci_cmnd($0005) 'HCI_TYPE_CMND PUB set_scanparam(interval) hci_len := 0 'all parameters, except the interval[ms] are saved into the CC3000 NVMEM/EEPROM hci_long(36) 'not documented hci_long(interval) 'minumum 1000[ms], 0=disable scan hci_long(20) 'MinDwellTime [ms] hci_long(100) 'MaxDwellTime [ms] hci_long(2) 'NumOfProbeRequests hci_long($7FF) 'ChannelMask $7FF= 1..11 NorthAmerica ($1FFF= 1..13 worldwide) hci_long(-120) 'RSSIThreshold hci_long(0) 'SNRThreshold hci_long(205) 'TXpower (not evaluated by CC3000 as off Service Pack 1.12) repeat 16 hci_long(2000) 'Channel 1..16 Scan Timeout[ms] each channel gets own timeout hci_cmnd($0003) PUB get_scan_results(ScanTimeout) hci_len := 0 'each entry needs to be read out separately hci_long(ScanTimeout) 'NOT supported as of CC3000 service pack 1.12/firmware 1.26 hci_cmnd($0007) 'the event_reply includes a parameter w/ remaining count of unread SSID's PUB smart_config_prefix(character) hci_len := 0 hci_byte(character) 'should always be 3 ASCII characters, set to T T T hci_byte(character) hci_byte(character) hci_cmnd($000C) PUB smart_config_start(EncryptedFlag) hci_len := 0 hci_long(EncryptedFlag) '0=No encryption 1=AES-128 hci_cmnd($000A) PUB smart_config_stop hci_len := 0 hci_cmnd($000B) PUB wlan_statusget hci_len := 0 '4 possible status in event: Disconnected, Scanning, Connecting, Connected hci_cmnd($0009) PUB wlan_set_event_mask(event_mask) hci_len := 0 hci_long(event_mask) hci_cmnd($0008) 'HCI_TYPE_CMND PUB connection_policy(open_ap, fast_connect, auto_start) hci_len := 0 hci_long(open_ap) hci_long(fast_connect) hci_long(auto_start) hci_cmnd($0004) 'HCI_TYPE_CMND PUB del_profile(index) hci_len := 0 hci_long(index) '0-6 or 255 for delete all hci_cmnd($0006) 'HCI_TYPE_CMND PUB connect(sockethandle,port,IPv4) hci_len := 0 hci_long(sockethandle) hci_long(8) 'not documented yet hci_long(8) 'Address length hci_word(2) 'AF_INET hci_byte(port>>8) 'Destination Port (Big-endian) hci_byte(port) 'Destination Port hci_byte(delimiter(IPv4,0,".")) 'Destination IPv4 (Big-endian) hci_byte(delimiter(IPv4,1,".")) hci_byte(delimiter(IPv4,2,".")) hci_byte(delimiter(IPv4,3,".")) hci_cmnd($1007) 'HCI_TYPE_CMND PUB nvmem_read(FileID, len, offset) hci_len := 0 'reply is hci_event 0x0201 hci_long(FileID) 'evet followed by HCI_DATA_NVMEM_READ (0x91) hci_long(len) hci_long(offset) 'macid is 6,6,0 hci_cmnd($0201) 'HCI_TYPE_CMND PUB nvmem_create_entry(FileID, lenght) hci_len := 0 hci_long(FileID) '12-15, mostly used to store AES-128 encryption key in file ID 12 hci_long(lenght) 'DATA_NVMEM_WRITE (0x90) to acctually write the data hci_cmnd($0203) 'HCI_TYPE_CMND PUB read_sp_version hci_len := 0 'get CC3000 service pack version (firmware version) hci_cmnd($0207) 'HCI_TYPE_CMND PUB socket(Family,Type,Protocol) hci_len := 0 hci_long (Family) 'Protocol Family: AF_INET hci_long (Type) 'Socket Type: SOCK_STREAM hci_long (Protocol) 'Protocol Type: TCP/IP hci_cmnd ($1001) PUB close_socket(sockhdl) hci_len := 0 hci_long (sockhdl) 'socket 0-3 hci_cmnd ($100B) PUB bind(sockhdl, port, IPv4) hci_len := 0 hci_long (sockhdl) 'socket 0-3 hci_long (8) 'not documented hci_long (8) 'Address length hci_word (2) 'Protocol Family AF_INET hci_byte (port>>8) '16bit big endian hci_byte (port) if IPv4 == 0 hci_long(0) '0 = ANY else hci_byte(delimiter(IPv4,0,".")) 'IPv4(Big-endian) hci_byte(delimiter(IPv4,1,".")) 'use dec, not hex values hci_byte(delimiter(IPv4,2,".")) hci_byte(delimiter(IPv4,3,".")) hci_cmnd ($1002) PUB accept(sockhdl) hci_len := 0 'only required for serving SOCK_STREAM type hci_long (sockhdl) 'socket 0-3 hci_cmnd ($1005) PUB listen(sockhdl,queue_depth) hci_len := 0 hci_long (sockhdl) 'socket 0-3 hci_long (queue_depth) 'not evaluated by CC3000 as of FW1.26, SP1.12 hci_cmnd ($1006) PUB setsockopt(sockhdl, optname, optval) hci_len := 0 hci_long(sockhdl) hci_long($ffff) 'SOL_SOCKET=0xffff hci_long(optname) '1: SOCKOPT_RECV_TIMEOUT 2: SOCKOPT_NONBLOCK hci_long(8) 'optlen is 8 hci_long(optval) 'if TIMEOUT=millisec, if NONBLOCK:0=non-blocking enabled 1= blocking hci_cmnd ($1009) PUB select(highest_socket, block, uSec, read_mask, write_mask, error_mask) 'quering the status or waiting state hci_len := 0 'there a three socket conditions hci_long(highest_socket+1) 'Ready-to-read, Ready-to-write, Error hci_long(20) 'Constant a hci_long(20) 'Constant b hci_long(20) 'Constant c hci_long(20) 'Constant d hci_long(block) '0= No, don't block hci_long(read_mask) hci_long(write_mask) hci_long(error_mask) hci_long(0) 'timeout: seconds use 0 hci_long(uSec) 'timeout: uS, minumum 5000 microseconds hci_cmnd ($1008) }}
zip
23K