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:
Thu Jul 26 09:12:27 2012 +0000
Revision:
0:480387549d89
Child:
2:913eb8fdfd9d
Initial commit

Who changed what in which revision?

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