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:
45:50ab13d8f2dc
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_nvmem.h"
SolderSplashLabs 23:fed7f64dd520 43 #include "cc3000_common.h"
SolderSplashLabs 23:fed7f64dd520 44
SolderSplashLabs 23:fed7f64dd520 45 namespace mbed_cc3000 {
SolderSplashLabs 23:fed7f64dd520 46
SolderSplashLabs 23:fed7f64dd520 47 cc3000_nvmem::cc3000_nvmem(cc3000_hci &hci, cc3000_event &event, cc3000_simple_link &simple_link)
SolderSplashLabs 23:fed7f64dd520 48 : _hci(hci), _event(event), _simple_link(simple_link) {
SolderSplashLabs 23:fed7f64dd520 49
SolderSplashLabs 23:fed7f64dd520 50 }
SolderSplashLabs 23:fed7f64dd520 51
SolderSplashLabs 23:fed7f64dd520 52 cc3000_nvmem::~cc3000_nvmem() {
SolderSplashLabs 23:fed7f64dd520 53
SolderSplashLabs 23:fed7f64dd520 54 }
SolderSplashLabs 23:fed7f64dd520 55
SolderSplashLabs 23:fed7f64dd520 56 int32_t cc3000_nvmem::read(uint32_t file_id, uint32_t length, uint32_t offset, uint8_t *buff) {
SolderSplashLabs 23:fed7f64dd520 57 uint8_t ucStatus = 0xFF;
SolderSplashLabs 23:fed7f64dd520 58 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 59 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 60
SolderSplashLabs 23:fed7f64dd520 61 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 62 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 63 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 64 args = UINT32_TO_STREAM(args, file_id);
SolderSplashLabs 23:fed7f64dd520 65 args = UINT32_TO_STREAM(args, length);
SolderSplashLabs 23:fed7f64dd520 66 args = UINT32_TO_STREAM(args, offset);
SolderSplashLabs 23:fed7f64dd520 67
SolderSplashLabs 23:fed7f64dd520 68 // Initiate HCI command
SolderSplashLabs 23:fed7f64dd520 69 _hci.command_send(HCI_CMND_NVMEM_READ, ptr, NVMEM_READ_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 70 _event.simplelink_wait_event(HCI_CMND_NVMEM_READ, &ucStatus);
SolderSplashLabs 23:fed7f64dd520 71
SolderSplashLabs 23:fed7f64dd520 72 // If data is present, read it even when an error is returned.
SolderSplashLabs 23:fed7f64dd520 73 // Note: It is the users responsibility to ignore the data when an error is returned.
SolderSplashLabs 23:fed7f64dd520 74 // Wait for the data in a synchronous way.
SolderSplashLabs 23:fed7f64dd520 75 // We assume the buffer is large enough to also store nvmem parameters.
SolderSplashLabs 23:fed7f64dd520 76 _event.simplelink_wait_data(buff, 0, 0);
SolderSplashLabs 23:fed7f64dd520 77
SolderSplashLabs 23:fed7f64dd520 78 return(ucStatus);
SolderSplashLabs 23:fed7f64dd520 79 }
SolderSplashLabs 23:fed7f64dd520 80
SolderSplashLabs 23:fed7f64dd520 81 int32_t cc3000_nvmem::write(uint32_t file_id, uint32_t length, uint32_t entry_offset, uint8_t *buff) {
SolderSplashLabs 23:fed7f64dd520 82 int32_t iRes;
SolderSplashLabs 23:fed7f64dd520 83 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 84 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 85
SolderSplashLabs 23:fed7f64dd520 86 iRes = EFAIL;
SolderSplashLabs 23:fed7f64dd520 87
SolderSplashLabs 23:fed7f64dd520 88 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 89 args = (ptr + SPI_HEADER_SIZE + HCI_DATA_CMD_HEADER_SIZE);
SolderSplashLabs 23:fed7f64dd520 90
SolderSplashLabs 23:fed7f64dd520 91 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 92 args = UINT32_TO_STREAM(args, file_id);
SolderSplashLabs 23:fed7f64dd520 93 args = UINT32_TO_STREAM(args, 12);
SolderSplashLabs 23:fed7f64dd520 94 args = UINT32_TO_STREAM(args, length);
SolderSplashLabs 23:fed7f64dd520 95 args = UINT32_TO_STREAM(args, entry_offset);
SolderSplashLabs 23:fed7f64dd520 96
SolderSplashLabs 23:fed7f64dd520 97 memcpy((ptr + SPI_HEADER_SIZE + HCI_DATA_CMD_HEADER_SIZE +
SolderSplashLabs 23:fed7f64dd520 98 NVMEM_WRITE_PARAMS_LEN),buff,length);
SolderSplashLabs 23:fed7f64dd520 99
SolderSplashLabs 23:fed7f64dd520 100 // Initiate a HCI command on the data channel
SolderSplashLabs 23:fed7f64dd520 101 _hci.data_command_send(HCI_CMND_NVMEM_WRITE, ptr, NVMEM_WRITE_PARAMS_LEN, length);
SolderSplashLabs 23:fed7f64dd520 102
SolderSplashLabs 23:fed7f64dd520 103 _event.simplelink_wait_event(HCI_EVNT_NVMEM_WRITE, &iRes);
SolderSplashLabs 23:fed7f64dd520 104
SolderSplashLabs 23:fed7f64dd520 105 return(iRes);
SolderSplashLabs 23:fed7f64dd520 106 }
SolderSplashLabs 23:fed7f64dd520 107
SolderSplashLabs 23:fed7f64dd520 108 uint8_t cc3000_nvmem::set_mac_address(uint8_t *mac) {
SolderSplashLabs 23:fed7f64dd520 109 return write(NVMEM_MAC_FILEID, MAC_ADDR_LEN, 0, mac);
SolderSplashLabs 23:fed7f64dd520 110 }
SolderSplashLabs 23:fed7f64dd520 111
SolderSplashLabs 23:fed7f64dd520 112 uint8_t cc3000_nvmem::get_mac_address(uint8_t *mac) {
SolderSplashLabs 23:fed7f64dd520 113 return read(NVMEM_MAC_FILEID, MAC_ADDR_LEN, 0, mac);
SolderSplashLabs 23:fed7f64dd520 114 }
SolderSplashLabs 23:fed7f64dd520 115
SolderSplashLabs 23:fed7f64dd520 116 uint8_t cc3000_nvmem::write_patch(uint32_t file_id, uint32_t length, const uint8_t *data) {
SolderSplashLabs 23:fed7f64dd520 117 uint8_t status = 0;
SolderSplashLabs 23:fed7f64dd520 118 uint16_t offset = 0;
SolderSplashLabs 23:fed7f64dd520 119 uint8_t* spDataPtr = (uint8_t*)data;
SolderSplashLabs 23:fed7f64dd520 120
SolderSplashLabs 23:fed7f64dd520 121 while ((status == 0) && (length >= SP_PORTION_SIZE))
SolderSplashLabs 23:fed7f64dd520 122 {
SolderSplashLabs 23:fed7f64dd520 123 status = write(file_id, SP_PORTION_SIZE, offset, spDataPtr);
SolderSplashLabs 23:fed7f64dd520 124 offset += SP_PORTION_SIZE;
SolderSplashLabs 23:fed7f64dd520 125 length -= SP_PORTION_SIZE;
SolderSplashLabs 23:fed7f64dd520 126 spDataPtr += SP_PORTION_SIZE;
SolderSplashLabs 23:fed7f64dd520 127 }
SolderSplashLabs 23:fed7f64dd520 128
SolderSplashLabs 23:fed7f64dd520 129 if (status !=0)
SolderSplashLabs 23:fed7f64dd520 130 {
SolderSplashLabs 23:fed7f64dd520 131 // NVMEM error occurred
SolderSplashLabs 23:fed7f64dd520 132 return status;
SolderSplashLabs 23:fed7f64dd520 133 }
SolderSplashLabs 23:fed7f64dd520 134
SolderSplashLabs 23:fed7f64dd520 135 if (length != 0)
SolderSplashLabs 23:fed7f64dd520 136 {
SolderSplashLabs 23:fed7f64dd520 137 // If length MOD 512 is nonzero, write the remaining bytes.
SolderSplashLabs 23:fed7f64dd520 138 status = write(file_id, length, offset, spDataPtr);
SolderSplashLabs 23:fed7f64dd520 139 }
SolderSplashLabs 23:fed7f64dd520 140
SolderSplashLabs 23:fed7f64dd520 141 return status;
SolderSplashLabs 23:fed7f64dd520 142 }
SolderSplashLabs 23:fed7f64dd520 143
SolderSplashLabs 23:fed7f64dd520 144 int32_t cc3000_nvmem::create_entry(uint32_t file_id, uint32_t new_len) {
SolderSplashLabs 23:fed7f64dd520 145 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 146 uint8_t *args;
SolderSplashLabs 23:fed7f64dd520 147 uint16_t retval;
SolderSplashLabs 23:fed7f64dd520 148
SolderSplashLabs 23:fed7f64dd520 149 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 150 args = (ptr + HEADERS_SIZE_CMD);
SolderSplashLabs 23:fed7f64dd520 151
SolderSplashLabs 23:fed7f64dd520 152 // Fill in HCI packet structure
SolderSplashLabs 23:fed7f64dd520 153 args = UINT32_TO_STREAM(args, file_id);
SolderSplashLabs 23:fed7f64dd520 154 args = UINT32_TO_STREAM(args, new_len);
SolderSplashLabs 23:fed7f64dd520 155
SolderSplashLabs 23:fed7f64dd520 156 // Initiate a HCI command
SolderSplashLabs 23:fed7f64dd520 157 _hci.command_send(HCI_CMND_NVMEM_CREATE_ENTRY,ptr, NVMEM_CREATE_PARAMS_LEN);
SolderSplashLabs 23:fed7f64dd520 158
SolderSplashLabs 23:fed7f64dd520 159 _event.simplelink_wait_event(HCI_CMND_NVMEM_CREATE_ENTRY, &retval);
SolderSplashLabs 23:fed7f64dd520 160
SolderSplashLabs 23:fed7f64dd520 161 return(retval);
SolderSplashLabs 23:fed7f64dd520 162 }
SolderSplashLabs 23:fed7f64dd520 163
SolderSplashLabs 23:fed7f64dd520 164 #ifndef CC3000_TINY_DRIVER
SolderSplashLabs 23:fed7f64dd520 165 uint8_t cc3000_nvmem::read_sp_version(uint8_t* patch_ver) {
SolderSplashLabs 23:fed7f64dd520 166 uint8_t *ptr;
SolderSplashLabs 23:fed7f64dd520 167 // 1st byte is the status and the rest is the SP version
SolderSplashLabs 23:fed7f64dd520 168 uint8_t retBuf[5];
SolderSplashLabs 23:fed7f64dd520 169
SolderSplashLabs 23:fed7f64dd520 170 ptr = _simple_link.get_transmit_buffer();
SolderSplashLabs 23:fed7f64dd520 171
SolderSplashLabs 23:fed7f64dd520 172 // Initiate a HCI command, no args are required
SolderSplashLabs 23:fed7f64dd520 173 _hci.command_send(HCI_CMND_READ_SP_VERSION, ptr, 0);
SolderSplashLabs 23:fed7f64dd520 174 _event.simplelink_wait_event(HCI_CMND_READ_SP_VERSION, retBuf);
SolderSplashLabs 23:fed7f64dd520 175
SolderSplashLabs 23:fed7f64dd520 176 // package ID
SolderSplashLabs 23:fed7f64dd520 177 *patch_ver = retBuf[3];
SolderSplashLabs 23:fed7f64dd520 178 // package build number
SolderSplashLabs 23:fed7f64dd520 179 *(patch_ver+1) = retBuf[4];
SolderSplashLabs 23:fed7f64dd520 180
SolderSplashLabs 23:fed7f64dd520 181 return(retBuf[0]);
SolderSplashLabs 23:fed7f64dd520 182 }
SolderSplashLabs 23:fed7f64dd520 183
SolderSplashLabs 23:fed7f64dd520 184 #endif
SolderSplashLabs 23:fed7f64dd520 185
SolderSplashLabs 23:fed7f64dd520 186 }