cc3000 hostdriver with the mbed socket interface

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Committer:
SolderSplashLabs
Date:
Thu Oct 03 21:00:00 2013 +0000
Revision:
23:fed7f64dd520
Parent:
0:615c697c33b0
Child:
33:9e23b24fb4f3
Added separate debug messages and VT100 formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SolderSplashLabs 23:fed7f64dd520 1 /*****************************************************************************
SolderSplashLabs 23:fed7f64dd520 2 *
SolderSplashLabs 23:fed7f64dd520 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
SolderSplashLabs 23:fed7f64dd520 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
SolderSplashLabs 23:fed7f64dd520 5 * provided help.
SolderSplashLabs 23:fed7f64dd520 6 *
SolderSplashLabs 23:fed7f64dd520 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
SolderSplashLabs 23:fed7f64dd520 8 * read the following copyright:
SolderSplashLabs 23:fed7f64dd520 9 *
SolderSplashLabs 23:fed7f64dd520 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
SolderSplashLabs 23:fed7f64dd520 11 *
SolderSplashLabs 23:fed7f64dd520 12 * Redistribution and use in source and binary forms, with or without
SolderSplashLabs 23:fed7f64dd520 13 * modification, are permitted provided that the following conditions
SolderSplashLabs 23:fed7f64dd520 14 * are met:
SolderSplashLabs 23:fed7f64dd520 15 *
SolderSplashLabs 23:fed7f64dd520 16 * Redistributions of source code must retain the above copyright
SolderSplashLabs 23:fed7f64dd520 17 * notice, this list of conditions and the following disclaimer.
SolderSplashLabs 23:fed7f64dd520 18 *
SolderSplashLabs 23:fed7f64dd520 19 * Redistributions in binary form must reproduce the above copyright
SolderSplashLabs 23:fed7f64dd520 20 * notice, this list of conditions and the following disclaimer in the
SolderSplashLabs 23:fed7f64dd520 21 * documentation and/or other materials provided with the
SolderSplashLabs 23:fed7f64dd520 22 * distribution.
SolderSplashLabs 23:fed7f64dd520 23 *
SolderSplashLabs 23:fed7f64dd520 24 * Neither the name of Texas Instruments Incorporated nor the names of
SolderSplashLabs 23:fed7f64dd520 25 * its contributors may be used to endorse or promote products derived
SolderSplashLabs 23:fed7f64dd520 26 * from this software without specific prior written permission.
SolderSplashLabs 23:fed7f64dd520 27 *
SolderSplashLabs 23:fed7f64dd520 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
SolderSplashLabs 23:fed7f64dd520 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
SolderSplashLabs 23:fed7f64dd520 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
SolderSplashLabs 23:fed7f64dd520 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SolderSplashLabs 23:fed7f64dd520 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
SolderSplashLabs 23:fed7f64dd520 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
SolderSplashLabs 23:fed7f64dd520 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
SolderSplashLabs 23:fed7f64dd520 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SolderSplashLabs 23:fed7f64dd520 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
SolderSplashLabs 23:fed7f64dd520 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SolderSplashLabs 23:fed7f64dd520 39 *
SolderSplashLabs 23:fed7f64dd520 40 *****************************************************************************/
SolderSplashLabs 23:fed7f64dd520 41 #include "cc3000.h"
SolderSplashLabs 23:fed7f64dd520 42 #include "cc3000_spi.h"
SolderSplashLabs 23:fed7f64dd520 43
SolderSplashLabs 23:fed7f64dd520 44 namespace mbed_cc3000 {
SolderSplashLabs 23:fed7f64dd520 45
SolderSplashLabs 23:fed7f64dd520 46 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)
SolderSplashLabs 23:fed7f64dd520 47 : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _irq_port(irq_port),
SolderSplashLabs 23:fed7f64dd520 48 _event(event), _simple_link(simple_link) {
SolderSplashLabs 23:fed7f64dd520 49 /* TODO = clear pending interrupts for PORTS. This is dependent on the used chip */
SolderSplashLabs 23:fed7f64dd520 50
SolderSplashLabs 23:fed7f64dd520 51 _wlan_spi.format(8,1);
SolderSplashLabs 23:fed7f64dd520 52 _wlan_spi.frequency(12000000);
SolderSplashLabs 23:fed7f64dd520 53 _function_pointer = _wlan_irq.fall(this, &cc3000_spi::WLAN_IRQHandler);
SolderSplashLabs 23:fed7f64dd520 54
SolderSplashLabs 23:fed7f64dd520 55 _wlan_en = 0;
SolderSplashLabs 23:fed7f64dd520 56 _wlan_cs = 1;
SolderSplashLabs 23:fed7f64dd520 57 }
SolderSplashLabs 23:fed7f64dd520 58
SolderSplashLabs 23:fed7f64dd520 59 cc3000_spi::~cc3000_spi() {
SolderSplashLabs 23:fed7f64dd520 60
SolderSplashLabs 23:fed7f64dd520 61 }
SolderSplashLabs 23:fed7f64dd520 62
SolderSplashLabs 23:fed7f64dd520 63 void cc3000_spi::wlan_irq_enable()
SolderSplashLabs 23:fed7f64dd520 64 {
SolderSplashLabs 23:fed7f64dd520 65 NVIC_EnableIRQ(_irq_port);
SolderSplashLabs 23:fed7f64dd520 66 }
SolderSplashLabs 23:fed7f64dd520 67
SolderSplashLabs 23:fed7f64dd520 68 void cc3000_spi::wlan_irq_disable() {
SolderSplashLabs 23:fed7f64dd520 69 NVIC_DisableIRQ(_irq_port);
SolderSplashLabs 23:fed7f64dd520 70 }
SolderSplashLabs 23:fed7f64dd520 71
SolderSplashLabs 23:fed7f64dd520 72 void cc3000_spi::wlan_irq_set(uint8_t value) {
SolderSplashLabs 23:fed7f64dd520 73 if (value)
SolderSplashLabs 23:fed7f64dd520 74 {
SolderSplashLabs 23:fed7f64dd520 75 _wlan_en = 1;
SolderSplashLabs 23:fed7f64dd520 76 }
SolderSplashLabs 23:fed7f64dd520 77 else
SolderSplashLabs 23:fed7f64dd520 78 {
SolderSplashLabs 23:fed7f64dd520 79 _wlan_en = 0;
SolderSplashLabs 23:fed7f64dd520 80 }
SolderSplashLabs 23:fed7f64dd520 81 }
SolderSplashLabs 23:fed7f64dd520 82
SolderSplashLabs 23:fed7f64dd520 83 uint32_t cc3000_spi::wlan_irq_read() {
SolderSplashLabs 23:fed7f64dd520 84 return _wlan_irq.read();
SolderSplashLabs 23:fed7f64dd520 85 }
SolderSplashLabs 23:fed7f64dd520 86
SolderSplashLabs 23:fed7f64dd520 87 void cc3000_spi::close() {
SolderSplashLabs 23:fed7f64dd520 88 if (_simple_link.get_received_buffer() != 0)
SolderSplashLabs 23:fed7f64dd520 89 {
SolderSplashLabs 23:fed7f64dd520 90 _simple_link.set_received_buffer(0);
SolderSplashLabs 23:fed7f64dd520 91 }
SolderSplashLabs 23:fed7f64dd520 92 wlan_irq_disable();
SolderSplashLabs 23:fed7f64dd520 93 }
SolderSplashLabs 23:fed7f64dd520 94
SolderSplashLabs 23:fed7f64dd520 95 // void cc3000_spi::SpiReceiveHandler() {
SolderSplashLabs 23:fed7f64dd520 96 // _simple_link.usEventOrDataReceived = 1;
SolderSplashLabs 23:fed7f64dd520 97 // //_simple_link.pucReceivedData = (unsigned char *)pvBuffer;
SolderSplashLabs 23:fed7f64dd520 98
SolderSplashLabs 23:fed7f64dd520 99 // hci_unsolicited_event_handler();
SolderSplashLabs 23:fed7f64dd520 100 // }
SolderSplashLabs 23:fed7f64dd520 101
SolderSplashLabs 23:fed7f64dd520 102
SolderSplashLabs 23:fed7f64dd520 103 /* TODO
SolderSplashLabs 23:fed7f64dd520 104 pRxPacket, pTxPacket do we need to hold this pointer ?
SolderSplashLabs 23:fed7f64dd520 105 SPIRxHandler - remove?
SolderSplashLabs 23:fed7f64dd520 106 */
SolderSplashLabs 23:fed7f64dd520 107 void cc3000_spi::open() {
SolderSplashLabs 23:fed7f64dd520 108 _spi_info.spi_state = eSPI_STATE_POWERUP;
SolderSplashLabs 23:fed7f64dd520 109 //_spi_info.SPIRxHandler = pfRxHandler;
SolderSplashLabs 23:fed7f64dd520 110 _spi_info.tx_packet_length = 0;
SolderSplashLabs 23:fed7f64dd520 111 _spi_info.rx_packet_length = 0;
SolderSplashLabs 23:fed7f64dd520 112 //_rx_buffer[CC3000_RX_BUFFER_SIZE - 1] = CC3000_BUFFER_MAGIC_NUMBER;
SolderSplashLabs 23:fed7f64dd520 113 //_tx_buffer[CC3000_TX_BUFFER_SIZE - 1] = CC3000_BUFFER_MAGIC_NUMBER;
SolderSplashLabs 23:fed7f64dd520 114 wlan_irq_enable();
SolderSplashLabs 23:fed7f64dd520 115 }
SolderSplashLabs 23:fed7f64dd520 116
SolderSplashLabs 23:fed7f64dd520 117 uint32_t cc3000_spi::first_write(uint8_t *buffer, uint16_t length) {
SolderSplashLabs 23:fed7f64dd520 118 _wlan_cs = 0;
SolderSplashLabs 23:fed7f64dd520 119 wait_us(50);
SolderSplashLabs 23:fed7f64dd520 120
SolderSplashLabs 23:fed7f64dd520 121 /* first 4 bytes of the data */
SolderSplashLabs 23:fed7f64dd520 122 write_synchronous(buffer, 4);
SolderSplashLabs 23:fed7f64dd520 123 wait_us(50);
SolderSplashLabs 23:fed7f64dd520 124 write_synchronous(buffer + 4, length - 4);
SolderSplashLabs 23:fed7f64dd520 125 _spi_info.spi_state = eSPI_STATE_IDLE;
SolderSplashLabs 23:fed7f64dd520 126 _wlan_cs = 1;
SolderSplashLabs 23:fed7f64dd520 127
SolderSplashLabs 23:fed7f64dd520 128 return 0;
SolderSplashLabs 23:fed7f64dd520 129 }
SolderSplashLabs 23:fed7f64dd520 130
SolderSplashLabs 23:fed7f64dd520 131
SolderSplashLabs 23:fed7f64dd520 132 uint32_t cc3000_spi::write(uint8_t *buffer, uint16_t length) {
SolderSplashLabs 23:fed7f64dd520 133 uint8_t pad = 0;
SolderSplashLabs 23:fed7f64dd520 134 // check the total length of the packet in order to figure out if padding is necessary
SolderSplashLabs 23:fed7f64dd520 135 if(!(length & 0x0001))
SolderSplashLabs 23:fed7f64dd520 136 {
SolderSplashLabs 23:fed7f64dd520 137 pad++;
SolderSplashLabs 23:fed7f64dd520 138 }
SolderSplashLabs 23:fed7f64dd520 139 buffer[0] = WRITE;
SolderSplashLabs 23:fed7f64dd520 140 buffer[1] = HI(length + pad);
SolderSplashLabs 23:fed7f64dd520 141 buffer[2] = LO(length + pad);
SolderSplashLabs 23:fed7f64dd520 142 buffer[3] = 0;
SolderSplashLabs 23:fed7f64dd520 143 buffer[4] = 0;
SolderSplashLabs 23:fed7f64dd520 144
SolderSplashLabs 23:fed7f64dd520 145 length += (SPI_HEADER_SIZE + pad);
SolderSplashLabs 23:fed7f64dd520 146
SolderSplashLabs 23:fed7f64dd520 147 // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
SolderSplashLabs 23:fed7f64dd520 148 // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
SolderSplashLabs 23:fed7f64dd520 149 uint8_t * transmit_buffer = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 150 if (transmit_buffer[CC3000_TX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
SolderSplashLabs 23:fed7f64dd520 151 {
SolderSplashLabs 23:fed7f64dd520 152 while (1);
SolderSplashLabs 23:fed7f64dd520 153 }
SolderSplashLabs 23:fed7f64dd520 154
SolderSplashLabs 23:fed7f64dd520 155 if (_spi_info.spi_state == eSPI_STATE_POWERUP)
SolderSplashLabs 23:fed7f64dd520 156 {
SolderSplashLabs 23:fed7f64dd520 157 while (_spi_info.spi_state != eSPI_STATE_INITIALIZED);
SolderSplashLabs 23:fed7f64dd520 158 }
SolderSplashLabs 23:fed7f64dd520 159
SolderSplashLabs 23:fed7f64dd520 160 if (_spi_info.spi_state == eSPI_STATE_INITIALIZED)
SolderSplashLabs 23:fed7f64dd520 161 {
SolderSplashLabs 23:fed7f64dd520 162 // TX/RX transaction over SPI after powerup: IRQ is low - send read buffer size command
SolderSplashLabs 23:fed7f64dd520 163 first_write(buffer, length);
SolderSplashLabs 23:fed7f64dd520 164 }
SolderSplashLabs 23:fed7f64dd520 165 else
SolderSplashLabs 23:fed7f64dd520 166 {
SolderSplashLabs 23:fed7f64dd520 167 // Prevent occurence of a race condition when 2 back to back packets are sent to the
SolderSplashLabs 23:fed7f64dd520 168 // device, so the state will move to IDLE and once again to not IDLE due to IRQ
SolderSplashLabs 23:fed7f64dd520 169 wlan_irq_disable();
SolderSplashLabs 23:fed7f64dd520 170
SolderSplashLabs 23:fed7f64dd520 171 while (_spi_info.spi_state != eSPI_STATE_IDLE);
SolderSplashLabs 23:fed7f64dd520 172
SolderSplashLabs 23:fed7f64dd520 173 _spi_info.spi_state = eSPI_STATE_WRITE_IRQ;
SolderSplashLabs 23:fed7f64dd520 174 //_spi_info.pTxPacket = buffer;
SolderSplashLabs 23:fed7f64dd520 175 _spi_info.tx_packet_length = length;
SolderSplashLabs 23:fed7f64dd520 176
SolderSplashLabs 23:fed7f64dd520 177 // Assert the CS line and wait until the IRQ line is active, then initialize the write operation
SolderSplashLabs 23:fed7f64dd520 178 _wlan_cs = 0;
SolderSplashLabs 23:fed7f64dd520 179
SolderSplashLabs 23:fed7f64dd520 180 wlan_irq_enable();
SolderSplashLabs 23:fed7f64dd520 181 }
SolderSplashLabs 23:fed7f64dd520 182
SolderSplashLabs 23:fed7f64dd520 183 // Wait until the transaction ends
SolderSplashLabs 23:fed7f64dd520 184 while (_spi_info.spi_state != eSPI_STATE_IDLE);
SolderSplashLabs 23:fed7f64dd520 185
SolderSplashLabs 23:fed7f64dd520 186 return 0;
SolderSplashLabs 23:fed7f64dd520 187 }
SolderSplashLabs 23:fed7f64dd520 188
SolderSplashLabs 23:fed7f64dd520 189 void cc3000_spi::write_synchronous(uint8_t *data, uint16_t size) {
SolderSplashLabs 23:fed7f64dd520 190 while(size)
SolderSplashLabs 23:fed7f64dd520 191 {
SolderSplashLabs 23:fed7f64dd520 192 _wlan_spi.write(*data++);
SolderSplashLabs 23:fed7f64dd520 193 size--;
SolderSplashLabs 23:fed7f64dd520 194 }
SolderSplashLabs 23:fed7f64dd520 195 }
SolderSplashLabs 23:fed7f64dd520 196
SolderSplashLabs 23:fed7f64dd520 197 void cc3000_spi::read_synchronous(uint8_t *data, uint16_t size) {
SolderSplashLabs 23:fed7f64dd520 198 for (uint32_t i = 0; i < size; i++)
SolderSplashLabs 23:fed7f64dd520 199 {
SolderSplashLabs 23:fed7f64dd520 200 data[i] = _wlan_spi.write(0x03);;
SolderSplashLabs 23:fed7f64dd520 201 }
SolderSplashLabs 23:fed7f64dd520 202 }
SolderSplashLabs 23:fed7f64dd520 203
SolderSplashLabs 23:fed7f64dd520 204 uint32_t cc3000_spi::read_data_cont() {
SolderSplashLabs 23:fed7f64dd520 205 long data_to_recv;
SolderSplashLabs 23:fed7f64dd520 206 unsigned char *evnt_buff, type;
SolderSplashLabs 23:fed7f64dd520 207
SolderSplashLabs 23:fed7f64dd520 208 //determine the packet type
SolderSplashLabs 23:fed7f64dd520 209 evnt_buff = _simple_link.get_received_buffer();
SolderSplashLabs 23:fed7f64dd520 210 data_to_recv = 0;
SolderSplashLabs 23:fed7f64dd520 211 STREAM_TO_UINT8((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_PACKET_TYPE_OFFSET, type);
SolderSplashLabs 23:fed7f64dd520 212
SolderSplashLabs 23:fed7f64dd520 213 switch(type)
SolderSplashLabs 23:fed7f64dd520 214 {
SolderSplashLabs 23:fed7f64dd520 215 case HCI_TYPE_DATA:
SolderSplashLabs 23:fed7f64dd520 216 {
SolderSplashLabs 23:fed7f64dd520 217 // Read the remaining data..
SolderSplashLabs 23:fed7f64dd520 218 STREAM_TO_UINT16((uint8_t *)(evnt_buff + SPI_HEADER_SIZE), HCI_DATA_LENGTH_OFFSET, data_to_recv);
SolderSplashLabs 23:fed7f64dd520 219 if (!((HEADERS_SIZE_EVNT + data_to_recv) & 1))
SolderSplashLabs 23:fed7f64dd520 220 {
SolderSplashLabs 23:fed7f64dd520 221 data_to_recv++;
SolderSplashLabs 23:fed7f64dd520 222 }
SolderSplashLabs 23:fed7f64dd520 223
SolderSplashLabs 23:fed7f64dd520 224 if (data_to_recv)
SolderSplashLabs 23:fed7f64dd520 225 {
SolderSplashLabs 23:fed7f64dd520 226 read_synchronous(evnt_buff + 10, data_to_recv);
SolderSplashLabs 23:fed7f64dd520 227 }
SolderSplashLabs 23:fed7f64dd520 228 break;
SolderSplashLabs 23:fed7f64dd520 229 }
SolderSplashLabs 23:fed7f64dd520 230 case HCI_TYPE_EVNT:
SolderSplashLabs 23:fed7f64dd520 231 {
SolderSplashLabs 23:fed7f64dd520 232 // Calculate the rest length of the data
SolderSplashLabs 23:fed7f64dd520 233 STREAM_TO_UINT8((char *)(evnt_buff + SPI_HEADER_SIZE), HCI_EVENT_LENGTH_OFFSET, data_to_recv);
SolderSplashLabs 23:fed7f64dd520 234 data_to_recv -= 1;
SolderSplashLabs 23:fed7f64dd520 235 // Add padding byte if needed
SolderSplashLabs 23:fed7f64dd520 236 if ((HEADERS_SIZE_EVNT + data_to_recv) & 1)
SolderSplashLabs 23:fed7f64dd520 237 {
SolderSplashLabs 23:fed7f64dd520 238 data_to_recv++;
SolderSplashLabs 23:fed7f64dd520 239 }
SolderSplashLabs 23:fed7f64dd520 240
SolderSplashLabs 23:fed7f64dd520 241 if (data_to_recv)
SolderSplashLabs 23:fed7f64dd520 242 {
SolderSplashLabs 23:fed7f64dd520 243 read_synchronous(evnt_buff + 10, data_to_recv);
SolderSplashLabs 23:fed7f64dd520 244 }
SolderSplashLabs 23:fed7f64dd520 245
SolderSplashLabs 23:fed7f64dd520 246 _spi_info.spi_state = eSPI_STATE_READ_EOT;
SolderSplashLabs 23:fed7f64dd520 247 break;
SolderSplashLabs 23:fed7f64dd520 248 }
SolderSplashLabs 23:fed7f64dd520 249 }
SolderSplashLabs 23:fed7f64dd520 250 return (0);
SolderSplashLabs 23:fed7f64dd520 251 }
SolderSplashLabs 23:fed7f64dd520 252
SolderSplashLabs 23:fed7f64dd520 253 void cc3000_spi::write_wlan_en(uint8_t value) {
SolderSplashLabs 23:fed7f64dd520 254 if (value) {
SolderSplashLabs 23:fed7f64dd520 255 _wlan_en = 1;
SolderSplashLabs 23:fed7f64dd520 256 } else {
SolderSplashLabs 23:fed7f64dd520 257 _wlan_en = 0;
SolderSplashLabs 23:fed7f64dd520 258 }
SolderSplashLabs 23:fed7f64dd520 259 }
SolderSplashLabs 23:fed7f64dd520 260
SolderSplashLabs 23:fed7f64dd520 261 void cc3000_spi::WLAN_IRQHandler() {
SolderSplashLabs 23:fed7f64dd520 262 if (_spi_info.spi_state == eSPI_STATE_POWERUP)
SolderSplashLabs 23:fed7f64dd520 263 {
SolderSplashLabs 23:fed7f64dd520 264 // Inform HCI Layer that IRQ occured after powerup
SolderSplashLabs 23:fed7f64dd520 265 _spi_info.spi_state = eSPI_STATE_INITIALIZED;
SolderSplashLabs 23:fed7f64dd520 266 }
SolderSplashLabs 23:fed7f64dd520 267 else if (_spi_info.spi_state == eSPI_STATE_IDLE)
SolderSplashLabs 23:fed7f64dd520 268 {
SolderSplashLabs 23:fed7f64dd520 269 _spi_info.spi_state = eSPI_STATE_READ_IRQ;
SolderSplashLabs 23:fed7f64dd520 270 /* IRQ line goes low - acknowledge it */
SolderSplashLabs 23:fed7f64dd520 271 _wlan_cs = 0;
SolderSplashLabs 23:fed7f64dd520 272 read_synchronous(_simple_link.get_received_buffer(), 10);
SolderSplashLabs 23:fed7f64dd520 273 _spi_info.spi_state = eSPI_STATE_READ_EOT;
SolderSplashLabs 23:fed7f64dd520 274
SolderSplashLabs 23:fed7f64dd520 275
SolderSplashLabs 23:fed7f64dd520 276 // The header was read - continue with the payload read
SolderSplashLabs 23:fed7f64dd520 277 if (!read_data_cont())
SolderSplashLabs 23:fed7f64dd520 278 {
SolderSplashLabs 23:fed7f64dd520 279 // All the data was read - finalize handling by switching to the task
SolderSplashLabs 23:fed7f64dd520 280 // Trigger Rx processing
SolderSplashLabs 23:fed7f64dd520 281 wlan_irq_disable();
SolderSplashLabs 23:fed7f64dd520 282 _wlan_cs = 1;
SolderSplashLabs 23:fed7f64dd520 283 // The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
SolderSplashLabs 23:fed7f64dd520 284 // If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
SolderSplashLabs 23:fed7f64dd520 285 uint8_t *received_buffer = _simple_link.get_received_buffer();
SolderSplashLabs 23:fed7f64dd520 286 if (received_buffer[CC3000_RX_BUFFER_SIZE - 1] != CC3000_BUFFER_MAGIC_NUMBER)
SolderSplashLabs 23:fed7f64dd520 287 {
SolderSplashLabs 23:fed7f64dd520 288 while (1);
SolderSplashLabs 23:fed7f64dd520 289 }
SolderSplashLabs 23:fed7f64dd520 290 _spi_info.spi_state = eSPI_STATE_IDLE;
SolderSplashLabs 23:fed7f64dd520 291 _event.received_handler(received_buffer + SPI_HEADER_SIZE);
SolderSplashLabs 23:fed7f64dd520 292 }
SolderSplashLabs 23:fed7f64dd520 293 }
SolderSplashLabs 23:fed7f64dd520 294 else if (_spi_info.spi_state == eSPI_STATE_WRITE_IRQ)
SolderSplashLabs 23:fed7f64dd520 295 {
SolderSplashLabs 23:fed7f64dd520 296 write_synchronous(_simple_link.get_transmit_buffer(), _spi_info.tx_packet_length);
SolderSplashLabs 23:fed7f64dd520 297 _spi_info.spi_state = eSPI_STATE_IDLE;
SolderSplashLabs 23:fed7f64dd520 298 _wlan_cs = 1;
SolderSplashLabs 23:fed7f64dd520 299 }
SolderSplashLabs 23:fed7f64dd520 300 }
SolderSplashLabs 23:fed7f64dd520 301
SolderSplashLabs 23:fed7f64dd520 302 }