AppNearMe µNFC stack for the NXP PN532 chip License: You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Dependents:   IOT_sensor_nfc AppNearMe_MuNFC_PN532_Test p2p_nfc_test NFCMoodLamp ... more

License

You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Committer:
AppNearMe
Date:
Tue Jan 15 15:34:39 2013 +0000
Revision:
13:6f98851e025b
Parent:
11:5be631376e5b
renamed rtos.h to platform_rtos.h to prevent insludes mess

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AppNearMe 11:5be631376e5b 1 /*
AppNearMe 11:5be631376e5b 2 MuNFCMbedPlatform.cpp
AppNearMe 11:5be631376e5b 3 Copyright (c) Donatien Garnier 2012
AppNearMe 11:5be631376e5b 4 donatien.garnier@appnearme.com
AppNearMe 11:5be631376e5b 5 http://www.appnearme.com/
AppNearMe 11:5be631376e5b 6 */
AppNearMe 11:5be631376e5b 7
AppNearMe 11:5be631376e5b 8 #include "mbed.h"
AppNearMe 11:5be631376e5b 9
AppNearMe 11:5be631376e5b 10 #include "MuNFCConfig.h"
AppNearMe 11:5be631376e5b 11 #include "munfc/nfc_config.h"
AppNearMe 11:5be631376e5b 12
AppNearMe 11:5be631376e5b 13 #if MUNFC_RTOS
AppNearMe 11:5be631376e5b 14 #include "rtos/rtos.h"
AppNearMe 11:5be631376e5b 15 #endif
AppNearMe 11:5be631376e5b 16
AppNearMe 11:5be631376e5b 17 InterruptIn* nfc_irq_pin_isr;
AppNearMe 11:5be631376e5b 18 DigitalOut* nfc_cs_pin;
AppNearMe 11:5be631376e5b 19 SPI* nfc_spi;
AppNearMe 11:5be631376e5b 20
AppNearMe 11:5be631376e5b 21 extern "C"
AppNearMe 11:5be631376e5b 22 {
AppNearMe 11:5be631376e5b 23 #if NFC_CONTROLLER == PN512
AppNearMe 11:5be631376e5b 24 #include "munfc/platform/pn512_platform.h"
AppNearMe 11:5be631376e5b 25 #elif NFC_CONTROLLER == PN532
AppNearMe 11:5be631376e5b 26 #include "munfc/platform/pn532_platform.h"
AppNearMe 11:5be631376e5b 27 #endif
AppNearMe 13:6f98851e025b 28 #include "munfc/platform/platform_rtos.h"
AppNearMe 11:5be631376e5b 29
AppNearMe 11:5be631376e5b 30 #if NFC_CONTROLLER == PN512
AppNearMe 11:5be631376e5b 31 void pn512_io_init()
AppNearMe 11:5be631376e5b 32 {
AppNearMe 11:5be631376e5b 33 nfc_irq_pin_isr->rise(pn512_irq);
AppNearMe 11:5be631376e5b 34 *nfc_cs_pin = 1;
AppNearMe 11:5be631376e5b 35 }
AppNearMe 11:5be631376e5b 36
AppNearMe 11:5be631376e5b 37 /*
AppNearMe 11:5be631376e5b 38 * Get the IRQ pin's state
AppNearMe 11:5be631376e5b 39 */
AppNearMe 11:5be631376e5b 40 bool pn512_irq_pin_get()
AppNearMe 11:5be631376e5b 41 {
AppNearMe 11:5be631376e5b 42 //return (nfc_irq_pin_int->read() ? true : false);
AppNearMe 11:5be631376e5b 43 return (nfc_irq_pin_isr->read() ? true : false);
AppNearMe 11:5be631376e5b 44 }
AppNearMe 11:5be631376e5b 45
AppNearMe 11:5be631376e5b 46 /*
AppNearMe 11:5be631376e5b 47 * Set the CS pin to 0 (active low)
AppNearMe 11:5be631376e5b 48 */
AppNearMe 11:5be631376e5b 49 void pn512_cs_set()
AppNearMe 11:5be631376e5b 50 {
AppNearMe 11:5be631376e5b 51 *nfc_cs_pin = 0;
AppNearMe 11:5be631376e5b 52 }
AppNearMe 11:5be631376e5b 53
AppNearMe 11:5be631376e5b 54 /*
AppNearMe 11:5be631376e5b 55 * Set the CS pin to 1 (active high)
AppNearMe 11:5be631376e5b 56 */
AppNearMe 11:5be631376e5b 57 void pn512_cs_clear()
AppNearMe 11:5be631376e5b 58 {
AppNearMe 11:5be631376e5b 59 *nfc_cs_pin = 1;
AppNearMe 11:5be631376e5b 60 }
AppNearMe 11:5be631376e5b 61
AppNearMe 11:5be631376e5b 62 /*
AppNearMe 11:5be631376e5b 63 * You MUST call pn512_irq() on each raising front of IRQ pin
AppNearMe 11:5be631376e5b 64 */
AppNearMe 11:5be631376e5b 65 #endif
AppNearMe 11:5be631376e5b 66
AppNearMe 11:5be631376e5b 67 #if NFC_CONTROLLER == PN532
AppNearMe 11:5be631376e5b 68 /*
AppNearMe 11:5be631376e5b 69 * Init
AppNearMe 11:5be631376e5b 70 */
AppNearMe 11:5be631376e5b 71 void pn532_io_init(void)
AppNearMe 11:5be631376e5b 72 {
AppNearMe 11:5be631376e5b 73 nfc_irq_pin_isr->mode(PullUp);
AppNearMe 11:5be631376e5b 74 nfc_irq_pin_isr->fall(pn532_irq);
AppNearMe 11:5be631376e5b 75 *nfc_cs_pin = 1;
AppNearMe 11:5be631376e5b 76 }
AppNearMe 11:5be631376e5b 77
AppNearMe 11:5be631376e5b 78 /*
AppNearMe 11:5be631376e5b 79 * Get the IRQ pin's state
AppNearMe 11:5be631376e5b 80 */
AppNearMe 11:5be631376e5b 81 bool pn532_irq_pin_get(void)
AppNearMe 11:5be631376e5b 82 {
AppNearMe 11:5be631376e5b 83 return (nfc_irq_pin_isr->read() ? false : true);
AppNearMe 11:5be631376e5b 84 }
AppNearMe 11:5be631376e5b 85
AppNearMe 11:5be631376e5b 86 /*
AppNearMe 11:5be631376e5b 87 * Set the CS pin to 0 (active low)
AppNearMe 11:5be631376e5b 88 */
AppNearMe 11:5be631376e5b 89 void pn532_cs_set(void)
AppNearMe 11:5be631376e5b 90 {
AppNearMe 11:5be631376e5b 91 *nfc_cs_pin = 0;
AppNearMe 11:5be631376e5b 92 }
AppNearMe 11:5be631376e5b 93
AppNearMe 11:5be631376e5b 94 /*
AppNearMe 11:5be631376e5b 95 * Set the CS pin to 1 (active high)
AppNearMe 11:5be631376e5b 96 */
AppNearMe 11:5be631376e5b 97 void pn532_cs_clear(void)
AppNearMe 11:5be631376e5b 98 {
AppNearMe 11:5be631376e5b 99 *nfc_cs_pin = 1;
AppNearMe 11:5be631376e5b 100 }
AppNearMe 11:5be631376e5b 101
AppNearMe 11:5be631376e5b 102 /*
AppNearMe 11:5be631376e5b 103 * You MUST call pn532_irq() on each falling front of IRQ pin
AppNearMe 11:5be631376e5b 104 */
AppNearMe 11:5be631376e5b 105 #endif
AppNearMe 11:5be631376e5b 106
AppNearMe 11:5be631376e5b 107 #if MUNFC_RTOS
AppNearMe 11:5be631376e5b 108 struct rtos_semaphore //To be defined by impl
AppNearMe 11:5be631376e5b 109 {
AppNearMe 11:5be631376e5b 110 Semaphore* s;
AppNearMe 11:5be631376e5b 111 };
AppNearMe 11:5be631376e5b 112
AppNearMe 11:5be631376e5b 113 struct rtos_semaphore* rtos_semaphore_new() //Should return NULL if fails
AppNearMe 11:5be631376e5b 114 {
AppNearMe 11:5be631376e5b 115 struct rtos_semaphore* pSem;
AppNearMe 11:5be631376e5b 116 pSem = new struct rtos_semaphore;
AppNearMe 11:5be631376e5b 117 pSem->s = new Semaphore(1);
AppNearMe 11:5be631376e5b 118 pSem->s->wait(osWaitForever);
AppNearMe 11:5be631376e5b 119 return pSem;
AppNearMe 11:5be631376e5b 120 }
AppNearMe 11:5be631376e5b 121
AppNearMe 11:5be631376e5b 122 int rtos_semaphore_produce(struct rtos_semaphore* pSem)
AppNearMe 11:5be631376e5b 123 {
AppNearMe 11:5be631376e5b 124 pSem->s->release();
AppNearMe 11:5be631376e5b 125 return OK;
AppNearMe 11:5be631376e5b 126 }
AppNearMe 11:5be631376e5b 127
AppNearMe 11:5be631376e5b 128 int rtos_semaphore_consume(struct rtos_semaphore* pSem, int timeout)
AppNearMe 11:5be631376e5b 129 {
AppNearMe 11:5be631376e5b 130 int resid;
AppNearMe 11:5be631376e5b 131 if(timeout == -1)
AppNearMe 11:5be631376e5b 132 {
AppNearMe 11:5be631376e5b 133 resid = pSem->s->wait(osWaitForever);
AppNearMe 11:5be631376e5b 134 }
AppNearMe 11:5be631376e5b 135 else
AppNearMe 11:5be631376e5b 136 {
AppNearMe 11:5be631376e5b 137 resid = pSem->s->wait(timeout);
AppNearMe 11:5be631376e5b 138 }
AppNearMe 11:5be631376e5b 139 if(resid>0)
AppNearMe 11:5be631376e5b 140 {
AppNearMe 11:5be631376e5b 141 while( pSem->s->wait(0) > 0 );
AppNearMe 11:5be631376e5b 142 return OK;
AppNearMe 11:5be631376e5b 143 }
AppNearMe 11:5be631376e5b 144 else
AppNearMe 11:5be631376e5b 145 {
AppNearMe 11:5be631376e5b 146 return ERR_TIMEOUT;
AppNearMe 11:5be631376e5b 147 }
AppNearMe 11:5be631376e5b 148 }
AppNearMe 11:5be631376e5b 149 #else
AppNearMe 11:5be631376e5b 150 struct rtos_semaphore //To be defined by impl
AppNearMe 11:5be631376e5b 151 {
AppNearMe 11:5be631376e5b 152 volatile int p;
AppNearMe 11:5be631376e5b 153 };
AppNearMe 11:5be631376e5b 154
AppNearMe 11:5be631376e5b 155 struct rtos_semaphore* rtos_semaphore_new() //Should return NULL if fails
AppNearMe 11:5be631376e5b 156 {
AppNearMe 11:5be631376e5b 157 struct rtos_semaphore* pSem;
AppNearMe 11:5be631376e5b 158 pSem = new struct rtos_semaphore;
AppNearMe 11:5be631376e5b 159 pSem->p = 1;
AppNearMe 11:5be631376e5b 160 return pSem;
AppNearMe 11:5be631376e5b 161 }
AppNearMe 11:5be631376e5b 162
AppNearMe 11:5be631376e5b 163 //Will only be called from ISR
AppNearMe 11:5be631376e5b 164 int rtos_semaphore_produce(struct rtos_semaphore* pSem)
AppNearMe 11:5be631376e5b 165 {
AppNearMe 11:5be631376e5b 166 pSem->p++;
AppNearMe 11:5be631376e5b 167 return OK;
AppNearMe 11:5be631376e5b 168 }
AppNearMe 11:5be631376e5b 169
AppNearMe 11:5be631376e5b 170 void ___voidf(void)
AppNearMe 11:5be631376e5b 171 {
AppNearMe 11:5be631376e5b 172
AppNearMe 11:5be631376e5b 173 }
AppNearMe 11:5be631376e5b 174
AppNearMe 11:5be631376e5b 175 int rtos_semaphore_consume(struct rtos_semaphore* pSem, int timeout)
AppNearMe 11:5be631376e5b 176 {
AppNearMe 11:5be631376e5b 177 if(timeout == -1)
AppNearMe 11:5be631376e5b 178 {
AppNearMe 11:5be631376e5b 179 while(!pSem->p)
AppNearMe 11:5be631376e5b 180 {
AppNearMe 11:5be631376e5b 181 __WFI();
AppNearMe 11:5be631376e5b 182 }
AppNearMe 11:5be631376e5b 183 pSem->p--;
AppNearMe 11:5be631376e5b 184 }
AppNearMe 11:5be631376e5b 185 else if(timeout == 0)
AppNearMe 11:5be631376e5b 186 {
AppNearMe 11:5be631376e5b 187 if(pSem->p)
AppNearMe 11:5be631376e5b 188 {
AppNearMe 11:5be631376e5b 189 pSem->p--;
AppNearMe 11:5be631376e5b 190 }
AppNearMe 11:5be631376e5b 191 else
AppNearMe 11:5be631376e5b 192 {
AppNearMe 11:5be631376e5b 193 return ERR_TIMEOUT;
AppNearMe 11:5be631376e5b 194 }
AppNearMe 11:5be631376e5b 195 }
AppNearMe 11:5be631376e5b 196 else
AppNearMe 11:5be631376e5b 197 {
AppNearMe 11:5be631376e5b 198 Timer t;
AppNearMe 11:5be631376e5b 199 t.start();
AppNearMe 11:5be631376e5b 200 Ticker t_isr;
AppNearMe 11:5be631376e5b 201 t_isr.attach_us(&___voidf, 1000); //Just to generate an interrupt periodically
AppNearMe 11:5be631376e5b 202 while(!pSem->p)
AppNearMe 11:5be631376e5b 203 {
AppNearMe 11:5be631376e5b 204 __WFI();
AppNearMe 11:5be631376e5b 205 if(t.read_ms()>=timeout)
AppNearMe 11:5be631376e5b 206 {
AppNearMe 11:5be631376e5b 207 return ERR_TIMEOUT;
AppNearMe 11:5be631376e5b 208 }
AppNearMe 11:5be631376e5b 209 }
AppNearMe 11:5be631376e5b 210 pSem->p--;
AppNearMe 11:5be631376e5b 211 }
AppNearMe 11:5be631376e5b 212 return OK;
AppNearMe 11:5be631376e5b 213 }
AppNearMe 11:5be631376e5b 214 #endif
AppNearMe 11:5be631376e5b 215
AppNearMe 11:5be631376e5b 216
AppNearMe 11:5be631376e5b 217 //These functions must be implemented for each platform
AppNearMe 11:5be631376e5b 218
AppNearMe 11:5be631376e5b 219 #if NFC_CONTROLLER == PN512
AppNearMe 11:5be631376e5b 220 /*
AppNearMe 11:5be631376e5b 221 * Initialize SPI
AppNearMe 11:5be631376e5b 222 */
AppNearMe 11:5be631376e5b 223 int pn512_spi_init()
AppNearMe 11:5be631376e5b 224 {
AppNearMe 11:5be631376e5b 225 nfc_spi->format(8, 3);
AppNearMe 11:5be631376e5b 226 nfc_spi->frequency(10000000); //To change to 10000000
AppNearMe 11:5be631376e5b 227 return 0;
AppNearMe 11:5be631376e5b 228 }
AppNearMe 11:5be631376e5b 229 #endif
AppNearMe 11:5be631376e5b 230
AppNearMe 11:5be631376e5b 231 #if NFC_CONTROLLER == PN532
AppNearMe 11:5be631376e5b 232 /*
AppNearMe 11:5be631376e5b 233 * Initialize SPI
AppNearMe 11:5be631376e5b 234 */
AppNearMe 11:5be631376e5b 235 int pn532_spi_init()
AppNearMe 11:5be631376e5b 236 {
AppNearMe 11:5be631376e5b 237 nfc_spi->format(8, 0);
AppNearMe 11:5be631376e5b 238 nfc_spi->frequency(5000000);
AppNearMe 11:5be631376e5b 239 return 0;
AppNearMe 11:5be631376e5b 240 }
AppNearMe 11:5be631376e5b 241 #endif
AppNearMe 11:5be631376e5b 242
AppNearMe 11:5be631376e5b 243 #define reverse(x) ( (x & 0x01) << 7 \
AppNearMe 11:5be631376e5b 244 | (x & 0x02) << 5 \
AppNearMe 11:5be631376e5b 245 | (x & 0x04) << 3 \
AppNearMe 11:5be631376e5b 246 | (x & 0x08) << 1 \
AppNearMe 11:5be631376e5b 247 | (x & 0x10) >> 1 \
AppNearMe 11:5be631376e5b 248 | (x & 0x20) >> 3 \
AppNearMe 11:5be631376e5b 249 | (x & 0x40) >> 5 \
AppNearMe 11:5be631376e5b 250 | (x & 0x80) >> 7 )
AppNearMe 11:5be631376e5b 251
AppNearMe 11:5be631376e5b 252 /*
AppNearMe 11:5be631376e5b 253 * After skipping outSkip bytes, write outLen bytes
AppNearMe 11:5be631376e5b 254 * After skipping inSkip bytes, read inLen bytes
AppNearMe 11:5be631376e5b 255 * This will generate MAX(outSkip + outLen, inSkip + inLen) transfers on the SPI bus
AppNearMe 11:5be631376e5b 256 */
AppNearMe 11:5be631376e5b 257 int spi_transfer(uint8_t* outBuf, size_t outLen, size_t outSkip, uint8_t* inBuf,
AppNearMe 11:5be631376e5b 258 size_t inLen, size_t inSkip)
AppNearMe 11:5be631376e5b 259 {
AppNearMe 11:5be631376e5b 260 int len;
AppNearMe 11:5be631376e5b 261 int writeb;
AppNearMe 11:5be631376e5b 262 int readb;
AppNearMe 11:5be631376e5b 263 int outPos;
AppNearMe 11:5be631376e5b 264 int inPos;
AppNearMe 11:5be631376e5b 265
AppNearMe 11:5be631376e5b 266 outPos = inPos = 0;
AppNearMe 11:5be631376e5b 267
AppNearMe 11:5be631376e5b 268 len =
AppNearMe 11:5be631376e5b 269 (outSkip + outLen) > (inSkip + inLen) ? (outSkip + outLen) :
AppNearMe 11:5be631376e5b 270 (inSkip + inLen);
AppNearMe 11:5be631376e5b 271
AppNearMe 11:5be631376e5b 272 while (len--)
AppNearMe 11:5be631376e5b 273 {
AppNearMe 11:5be631376e5b 274 if (outSkip)
AppNearMe 11:5be631376e5b 275 {
AppNearMe 11:5be631376e5b 276 writeb = 0x00;
AppNearMe 11:5be631376e5b 277 outSkip--;
AppNearMe 11:5be631376e5b 278 }
AppNearMe 11:5be631376e5b 279 else if (outPos < outLen)
AppNearMe 11:5be631376e5b 280 {
AppNearMe 11:5be631376e5b 281 writeb = outBuf[outPos];
AppNearMe 11:5be631376e5b 282 outPos++;
AppNearMe 11:5be631376e5b 283 }
AppNearMe 11:5be631376e5b 284 else
AppNearMe 11:5be631376e5b 285 {
AppNearMe 11:5be631376e5b 286 writeb = 0x00;
AppNearMe 11:5be631376e5b 287 }
AppNearMe 11:5be631376e5b 288
AppNearMe 11:5be631376e5b 289 #if NFC_CONTROLLER == PN532
AppNearMe 11:5be631376e5b 290 writeb = reverse(writeb);
AppNearMe 11:5be631376e5b 291 #endif
AppNearMe 11:5be631376e5b 292
AppNearMe 11:5be631376e5b 293 readb = nfc_spi->write(writeb);
AppNearMe 11:5be631376e5b 294
AppNearMe 11:5be631376e5b 295 #if NFC_CONTROLLER == PN532
AppNearMe 11:5be631376e5b 296 readb = reverse(readb);
AppNearMe 11:5be631376e5b 297 #endif
AppNearMe 11:5be631376e5b 298
AppNearMe 11:5be631376e5b 299 if (inSkip)
AppNearMe 11:5be631376e5b 300 {
AppNearMe 11:5be631376e5b 301 inSkip--;
AppNearMe 11:5be631376e5b 302 }
AppNearMe 11:5be631376e5b 303 else if (inPos < inLen)
AppNearMe 11:5be631376e5b 304 {
AppNearMe 11:5be631376e5b 305 inBuf[inPos] = readb;
AppNearMe 11:5be631376e5b 306 inPos++;
AppNearMe 11:5be631376e5b 307 }
AppNearMe 11:5be631376e5b 308 }
AppNearMe 11:5be631376e5b 309 return 0;
AppNearMe 11:5be631376e5b 310 }
AppNearMe 11:5be631376e5b 311
AppNearMe 11:5be631376e5b 312 /*
AppNearMe 11:5be631376e5b 313 * Write outLen bytes
AppNearMe 11:5be631376e5b 314 */
AppNearMe 11:5be631376e5b 315 int spi_write(uint8_t* outBuf, size_t outLen)
AppNearMe 11:5be631376e5b 316 {
AppNearMe 11:5be631376e5b 317 return spi_transfer(outBuf, outLen, 0, (uint8_t*) NULL, 0, 0);
AppNearMe 11:5be631376e5b 318 }
AppNearMe 11:5be631376e5b 319
AppNearMe 11:5be631376e5b 320 /*
AppNearMe 11:5be631376e5b 321 * Read inLen bytes
AppNearMe 11:5be631376e5b 322 */
AppNearMe 11:5be631376e5b 323 int spi_read(uint8_t* inBuf, size_t inLen)
AppNearMe 11:5be631376e5b 324 {
AppNearMe 11:5be631376e5b 325 return spi_transfer((uint8_t*) NULL, 0, 0, inBuf, inLen, 0);
AppNearMe 11:5be631376e5b 326 }
AppNearMe 11:5be631376e5b 327
AppNearMe 11:5be631376e5b 328 /*
AppNearMe 11:5be631376e5b 329 * Skip len bytes
AppNearMe 11:5be631376e5b 330 */
AppNearMe 11:5be631376e5b 331 int spi_skip(size_t len)
AppNearMe 11:5be631376e5b 332 {
AppNearMe 11:5be631376e5b 333 return spi_transfer((uint8_t*) NULL, 0, len, (uint8_t*) NULL, 0, len);
AppNearMe 11:5be631376e5b 334 }
AppNearMe 11:5be631376e5b 335
AppNearMe 11:5be631376e5b 336 }
AppNearMe 11:5be631376e5b 337