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 Aug 07 21:55:12 2012 +0000
Revision:
3:0b949b2d3b55
Parent:
2:913eb8fdfd9d
Child:
6:15b1c45d50d4
Versioning -> Hg

Who changed what in which revision?

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