TI's CC3100 host driver and demo. Experimental and a work in progress.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Nov 19 23:04:04 2014 +0000
Revision:
2:a3e52cf86086
Parent:
1:da33a9116bda
Added more boards!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:bbe98578d4c0 1 /*
dflet 0:bbe98578d4c0 2 * spi.c - msp430f5529 experiment board spi interface implementation
dflet 0:bbe98578d4c0 3 *
dflet 0:bbe98578d4c0 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:bbe98578d4c0 5 *
dflet 0:bbe98578d4c0 6 *
dflet 0:bbe98578d4c0 7 * Redistribution and use in source and binary forms, with or without
dflet 0:bbe98578d4c0 8 * modification, are permitted provided that the following conditions
dflet 0:bbe98578d4c0 9 * are met:
dflet 0:bbe98578d4c0 10 *
dflet 0:bbe98578d4c0 11 * Redistributions of source code must retain the above copyright
dflet 0:bbe98578d4c0 12 * notice, this list of conditions and the following disclaimer.
dflet 0:bbe98578d4c0 13 *
dflet 0:bbe98578d4c0 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:bbe98578d4c0 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:bbe98578d4c0 16 * documentation and/or other materials provided with the
dflet 0:bbe98578d4c0 17 * distribution.
dflet 0:bbe98578d4c0 18 *
dflet 0:bbe98578d4c0 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:bbe98578d4c0 20 * its contributors may be used to endorse or promote products derived
dflet 0:bbe98578d4c0 21 * from this software without specific prior written permission.
dflet 0:bbe98578d4c0 22 *
dflet 0:bbe98578d4c0 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:bbe98578d4c0 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:bbe98578d4c0 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:bbe98578d4c0 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:bbe98578d4c0 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:bbe98578d4c0 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:bbe98578d4c0 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:bbe98578d4c0 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:bbe98578d4c0 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:bbe98578d4c0 34 *
dflet 0:bbe98578d4c0 35 */
dflet 0:bbe98578d4c0 36
dflet 0:bbe98578d4c0 37 #include "cc3100_simplelink.h"
dflet 0:bbe98578d4c0 38 #include "cc3100_spi.h"
dflet 1:da33a9116bda 39 #include "BoardInit.h"
dflet 0:bbe98578d4c0 40
dflet 1:da33a9116bda 41 #if (THIS_BOARD == MBED_BOARD_LPC1768)
dflet 1:da33a9116bda 42 cc3100_spi spi_(p9, p10, p8, SPI(p5, p6, p7));//LPC1768 nHib, irq, cs, mosi, miso, sck
dflet 1:da33a9116bda 43 /* cc3100_spi spi_(p9, p10, p8, SPI(p11, p12, p13));//LPC1768 nHib, irq, cs, mosi, miso, sck. Alt spi pins */
dflet 1:da33a9116bda 44 #elif (THIS_BOARD == ST_MBED_NUCLEOF411)
dflet 1:da33a9116bda 45 cc3100_spi spi_(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF411 nHib, irq, cs, mosi, miso, sck
dflet 2:a3e52cf86086 46 #elif (THIS_BOARD == EA_MBED_LPC4088)
dflet 2:a3e52cf86086 47 cc3100_spi spi_(p9, p10, p8, SPI(p5, p6, p7));
dflet 2:a3e52cf86086 48 #elif (THIS_BOARD == ST_MBED_NUCLEOF103)
dflet 2:a3e52cf86086 49 cc3100_spi spi_(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));
dflet 1:da33a9116bda 50 #else
dflet 1:da33a9116bda 51
dflet 1:da33a9116bda 52 #endif
dflet 0:bbe98578d4c0 53
dflet 0:bbe98578d4c0 54 P_EVENT_HANDLER pIraEventHandler = 0;
dflet 0:bbe98578d4c0 55 uint8_t IntIsMasked;
dflet 1:da33a9116bda 56
dflet 0:bbe98578d4c0 57 cc3100_spi::cc3100_spi(PinName cc3100_irq, PinName cc3100_en, PinName cc3100_cs, SPI cc3100_spi)
dflet 0:bbe98578d4c0 58 : _wlan_irq(cc3100_irq), _wlan_nHIB(cc3100_en), _wlan_cs(cc3100_cs), _wlan_spi(cc3100_spi){
dflet 0:bbe98578d4c0 59
dflet 0:bbe98578d4c0 60 _wlan_spi.format(8,1);
dflet 0:bbe98578d4c0 61 _wlan_spi.frequency(12000000);
dflet 0:bbe98578d4c0 62 _wlan_irq.rise(&IntSpiGPIOHandler); //_SlDrvRxIrqHandler is triggered after IntSpiGPIOHandler
dflet 0:bbe98578d4c0 63 _wlan_nHIB = 0;
dflet 0:bbe98578d4c0 64 _wlan_cs = 1;
dflet 0:bbe98578d4c0 65 wait_ms(200);
dflet 0:bbe98578d4c0 66 }
dflet 0:bbe98578d4c0 67
dflet 0:bbe98578d4c0 68 cc3100_spi::~cc3100_spi() {
dflet 0:bbe98578d4c0 69
dflet 0:bbe98578d4c0 70 }
dflet 0:bbe98578d4c0 71 /*
dflet 0:bbe98578d4c0 72 int cc3100_spi::spi_Close(Fd_t fd)
dflet 0:bbe98578d4c0 73 {
dflet 0:bbe98578d4c0 74 // Disable WLAN Interrupt ...
dflet 0:bbe98578d4c0 75 cc3100_InterruptDisable();
dflet 0:bbe98578d4c0 76
dflet 0:bbe98578d4c0 77 return NONOS_RET_OK;
dflet 0:bbe98578d4c0 78 }
dflet 0:bbe98578d4c0 79 */
dflet 0:bbe98578d4c0 80 void cc3100_spi::cc3100_InterruptEnable()
dflet 0:bbe98578d4c0 81 {
dflet 0:bbe98578d4c0 82 __enable_irq();
dflet 0:bbe98578d4c0 83 }
dflet 0:bbe98578d4c0 84
dflet 0:bbe98578d4c0 85 void cc3100_spi::cc3100_InterruptDisable()
dflet 0:bbe98578d4c0 86 {
dflet 0:bbe98578d4c0 87 __disable_irq();
dflet 0:bbe98578d4c0 88 }
dflet 0:bbe98578d4c0 89 /*
dflet 0:bbe98578d4c0 90 void cc3100_spi::CC3100_disable()
dflet 0:bbe98578d4c0 91 {
dflet 0:bbe98578d4c0 92 _wlan_en = 0;
dflet 0:bbe98578d4c0 93 }
dflet 0:bbe98578d4c0 94 */
dflet 0:bbe98578d4c0 95 /*
dflet 0:bbe98578d4c0 96 void CC3100_enable()
dflet 0:bbe98578d4c0 97 {
dflet 0:bbe98578d4c0 98 _wlan_en = 1;
dflet 0:bbe98578d4c0 99 }
dflet 0:bbe98578d4c0 100 */
dflet 0:bbe98578d4c0 101 /*
dflet 0:bbe98578d4c0 102 Fd_t cc3100_spi::spi_Open(char *ifName, unsigned long flags)
dflet 0:bbe98578d4c0 103 {
dflet 0:bbe98578d4c0 104
dflet 0:bbe98578d4c0 105 // 50 ms delay
dflet 0:bbe98578d4c0 106 wait_ms(50);
dflet 0:bbe98578d4c0 107
dflet 0:bbe98578d4c0 108 // Enable WLAN interrupt
dflet 0:bbe98578d4c0 109 cc3100_InterruptEnable();
dflet 0:bbe98578d4c0 110
dflet 0:bbe98578d4c0 111 return NONOS_RET_OK;
dflet 0:bbe98578d4c0 112 }
dflet 0:bbe98578d4c0 113 */
dflet 0:bbe98578d4c0 114 /*
dflet 0:bbe98578d4c0 115 int cc3100_spi::spi_Write(Fd_t fd, unsigned char *pBuff, int len)
dflet 0:bbe98578d4c0 116 {
dflet 0:bbe98578d4c0 117 int len_to_return = len;
dflet 0:bbe98578d4c0 118
dflet 0:bbe98578d4c0 119 _wlan_cs = 0;
dflet 0:bbe98578d4c0 120
dflet 0:bbe98578d4c0 121 while(len)
dflet 0:bbe98578d4c0 122 {
dflet 0:bbe98578d4c0 123 _wlan_spi.write(*pBuff++);
dflet 0:bbe98578d4c0 124 len--;
dflet 0:bbe98578d4c0 125 }
dflet 0:bbe98578d4c0 126
dflet 0:bbe98578d4c0 127 _wlan_cs = 1;
dflet 0:bbe98578d4c0 128
dflet 0:bbe98578d4c0 129 return len_to_return;
dflet 0:bbe98578d4c0 130 }
dflet 0:bbe98578d4c0 131
dflet 0:bbe98578d4c0 132 int cc3100_spi::spi_Read(Fd_t fd, unsigned char *pBuff, int len)
dflet 0:bbe98578d4c0 133 {
dflet 0:bbe98578d4c0 134 int i = 0;
dflet 0:bbe98578d4c0 135
dflet 0:bbe98578d4c0 136 _wlan_cs = 0;
dflet 0:bbe98578d4c0 137
dflet 0:bbe98578d4c0 138 for (i = 0; i < len; i++)
dflet 0:bbe98578d4c0 139 {
dflet 0:bbe98578d4c0 140 pBuff[i] = _wlan_spi.write(0xFF);
dflet 0:bbe98578d4c0 141 }
dflet 0:bbe98578d4c0 142
dflet 0:bbe98578d4c0 143 _wlan_cs = 1;
dflet 0:bbe98578d4c0 144
dflet 0:bbe98578d4c0 145 return len;
dflet 0:bbe98578d4c0 146 }
dflet 0:bbe98578d4c0 147 */
dflet 0:bbe98578d4c0 148
dflet 0:bbe98578d4c0 149 void IntSpiGPIOHandler(void)
dflet 0:bbe98578d4c0 150 {
dflet 0:bbe98578d4c0 151 switch(spi_._wlan_irq){
dflet 0:bbe98578d4c0 152
dflet 0:bbe98578d4c0 153 case 1:
dflet 0:bbe98578d4c0 154 if(pIraEventHandler)
dflet 0:bbe98578d4c0 155 {
dflet 0:bbe98578d4c0 156 pIraEventHandler(0);
dflet 0:bbe98578d4c0 157 }
dflet 0:bbe98578d4c0 158 break;
dflet 0:bbe98578d4c0 159 default:
dflet 0:bbe98578d4c0 160 break;
dflet 0:bbe98578d4c0 161 }
dflet 0:bbe98578d4c0 162 }
dflet 0:bbe98578d4c0 163
dflet 0:bbe98578d4c0 164 /*!
dflet 0:bbe98578d4c0 165 \brief register an interrupt handler for the host IRQ
dflet 0:bbe98578d4c0 166
dflet 0:bbe98578d4c0 167 \param[in] InterruptHdl - pointer to interrupt handler function
dflet 0:bbe98578d4c0 168
dflet 0:bbe98578d4c0 169 \param[in] pValue - pointer to a memory strcuture that is
dflet 0:bbe98578d4c0 170 passed to the interrupt handler.
dflet 0:bbe98578d4c0 171
dflet 0:bbe98578d4c0 172 \return upon successful registration, the function shall return 0.
dflet 0:bbe98578d4c0 173 Otherwise, -1 shall be returned
dflet 0:bbe98578d4c0 174
dflet 0:bbe98578d4c0 175 \sa
dflet 0:bbe98578d4c0 176 \note If there is already registered interrupt handler, the
dflet 0:bbe98578d4c0 177 function should overwrite the old handler with the new one
dflet 0:bbe98578d4c0 178 \warning
dflet 0:bbe98578d4c0 179 */
dflet 0:bbe98578d4c0 180 int registerInterruptHandler(P_EVENT_HANDLER InterruptHdl , void* pValue)
dflet 0:bbe98578d4c0 181 {
dflet 0:bbe98578d4c0 182 // printf("Register Interrupt Handler Called\r\n");
dflet 0:bbe98578d4c0 183 pIraEventHandler = InterruptHdl;
dflet 0:bbe98578d4c0 184 return 0;
dflet 0:bbe98578d4c0 185 }
dflet 0:bbe98578d4c0 186
dflet 0:bbe98578d4c0 187 /*!
dflet 0:bbe98578d4c0 188 \brief Unmasks the Host IRQ
dflet 0:bbe98578d4c0 189
dflet 0:bbe98578d4c0 190 \param[in] none
dflet 0:bbe98578d4c0 191
dflet 0:bbe98578d4c0 192 \return none
dflet 0:bbe98578d4c0 193
dflet 0:bbe98578d4c0 194 \warning
dflet 0:bbe98578d4c0 195 */
dflet 0:bbe98578d4c0 196 void UnMaskIntHdlr()
dflet 0:bbe98578d4c0 197 {
dflet 0:bbe98578d4c0 198 IntIsMasked = FALSE;
dflet 0:bbe98578d4c0 199 }
dflet 0:bbe98578d4c0 200
dflet 0:bbe98578d4c0 201 /*!
dflet 0:bbe98578d4c0 202 \brief Masks the Host IRQ
dflet 0:bbe98578d4c0 203
dflet 0:bbe98578d4c0 204 \param[in] none
dflet 0:bbe98578d4c0 205
dflet 0:bbe98578d4c0 206 \return none
dflet 0:bbe98578d4c0 207
dflet 0:bbe98578d4c0 208 \warning
dflet 0:bbe98578d4c0 209 */
dflet 0:bbe98578d4c0 210 void MaskIntHdlr()
dflet 0:bbe98578d4c0 211 {
dflet 0:bbe98578d4c0 212 IntIsMasked = TRUE;
dflet 0:bbe98578d4c0 213 }
dflet 0:bbe98578d4c0 214
dflet 0:bbe98578d4c0 215 void CC3100_disable()
dflet 0:bbe98578d4c0 216 {
dflet 0:bbe98578d4c0 217
dflet 0:bbe98578d4c0 218 spi_._wlan_nHIB = 0;
dflet 0:bbe98578d4c0 219
dflet 0:bbe98578d4c0 220 }
dflet 0:bbe98578d4c0 221
dflet 0:bbe98578d4c0 222 void CC3100_enable()
dflet 0:bbe98578d4c0 223 {
dflet 0:bbe98578d4c0 224
dflet 0:bbe98578d4c0 225 spi_._wlan_nHIB = 1;
dflet 0:bbe98578d4c0 226
dflet 0:bbe98578d4c0 227 }
dflet 0:bbe98578d4c0 228
dflet 0:bbe98578d4c0 229 Fd_t spi_Open(char *ifName, unsigned long flags)
dflet 0:bbe98578d4c0 230 {
dflet 0:bbe98578d4c0 231
dflet 0:bbe98578d4c0 232 /* 50 ms delay */
dflet 0:bbe98578d4c0 233 wait_ms(50);
dflet 0:bbe98578d4c0 234
dflet 0:bbe98578d4c0 235 /* Enable WLAN interrupt */
dflet 0:bbe98578d4c0 236 spi_.cc3100_InterruptEnable();
dflet 0:bbe98578d4c0 237
dflet 0:bbe98578d4c0 238 return NONOS_RET_OK;
dflet 0:bbe98578d4c0 239 }
dflet 0:bbe98578d4c0 240
dflet 0:bbe98578d4c0 241 int spi_Close(Fd_t fd)
dflet 0:bbe98578d4c0 242 {
dflet 0:bbe98578d4c0 243
dflet 0:bbe98578d4c0 244 wait_ms(2);
dflet 0:bbe98578d4c0 245 /* Disable WLAN Interrupt ... */
dflet 0:bbe98578d4c0 246 spi_.cc3100_InterruptDisable();
dflet 0:bbe98578d4c0 247
dflet 0:bbe98578d4c0 248 return NONOS_RET_OK;
dflet 0:bbe98578d4c0 249 }
dflet 0:bbe98578d4c0 250
dflet 0:bbe98578d4c0 251 int spi_Write(Fd_t fd, unsigned char *pBuff, int len)
dflet 0:bbe98578d4c0 252 {
dflet 0:bbe98578d4c0 253
dflet 0:bbe98578d4c0 254 int len_to_return = len;
dflet 0:bbe98578d4c0 255
dflet 0:bbe98578d4c0 256 spi_._wlan_cs = 0;
dflet 0:bbe98578d4c0 257
dflet 0:bbe98578d4c0 258 wait_us(50);
dflet 0:bbe98578d4c0 259
dflet 0:bbe98578d4c0 260 while(len)
dflet 0:bbe98578d4c0 261 {
dflet 0:bbe98578d4c0 262 spi_._wlan_spi.write(*pBuff++);
dflet 0:bbe98578d4c0 263 len--;
dflet 0:bbe98578d4c0 264
dflet 0:bbe98578d4c0 265 }
dflet 0:bbe98578d4c0 266
dflet 0:bbe98578d4c0 267 spi_._wlan_cs = 1;
dflet 0:bbe98578d4c0 268
dflet 0:bbe98578d4c0 269 return len_to_return;
dflet 0:bbe98578d4c0 270 }
dflet 0:bbe98578d4c0 271
dflet 0:bbe98578d4c0 272 int spi_Read(Fd_t fd, unsigned char *pBuff, int len)
dflet 0:bbe98578d4c0 273 {
dflet 0:bbe98578d4c0 274
dflet 0:bbe98578d4c0 275 spi_._wlan_cs = 0;
dflet 0:bbe98578d4c0 276
dflet 0:bbe98578d4c0 277 wait_us(50);
dflet 0:bbe98578d4c0 278
dflet 0:bbe98578d4c0 279 for (int i = 0; i < len; i++){
dflet 0:bbe98578d4c0 280 pBuff[i] = spi_._wlan_spi.write(0xFF);
dflet 0:bbe98578d4c0 281
dflet 0:bbe98578d4c0 282 }
dflet 0:bbe98578d4c0 283
dflet 0:bbe98578d4c0 284 spi_._wlan_cs = 1;
dflet 0:bbe98578d4c0 285
dflet 0:bbe98578d4c0 286 return len;
dflet 0:bbe98578d4c0 287 }
dflet 0:bbe98578d4c0 288
dflet 0:bbe98578d4c0 289 //}//namespace