Generic library for working with PN532-like chips

Fork of PN532 by Seeed

Committer:
r4z0r7o3
Date:
Wed Feb 04 19:04:54 2015 +0000
Revision:
10:f959b305a571
Parent:
8:7ffdaea03ff9
Try multiple known auth. keys on classic.  Also fixed all debugging messages so they all end with newlines.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 1:b8cab5222fd0 1 /**************************************************************************/
yihui 1:b8cab5222fd0 2 /*!
yihui 1:b8cab5222fd0 3 @file PN532.h
yihui 3:4189a10038e6 4 @author Adafruit Industries & Seeed Studio
yihui 3:4189a10038e6 5 @license BSD
yihui 1:b8cab5222fd0 6 */
yihui 1:b8cab5222fd0 7 /**************************************************************************/
yihui 0:9c6b9280c0e1 8
yihui 3:4189a10038e6 9 #ifndef __PN532_H__
yihui 3:4189a10038e6 10 #define __PN532_H__
yihui 0:9c6b9280c0e1 11
yihui 0:9c6b9280c0e1 12 #include <stdint.h>
yihui 0:9c6b9280c0e1 13 #include "PN532Interface.h"
yihui 0:9c6b9280c0e1 14
yihui 0:9c6b9280c0e1 15 // PN532 Commands
yihui 0:9c6b9280c0e1 16 #define PN532_COMMAND_DIAGNOSE (0x00)
yihui 0:9c6b9280c0e1 17 #define PN532_COMMAND_GETFIRMWAREVERSION (0x02)
yihui 0:9c6b9280c0e1 18 #define PN532_COMMAND_GETGENERALSTATUS (0x04)
yihui 0:9c6b9280c0e1 19 #define PN532_COMMAND_READREGISTER (0x06)
yihui 0:9c6b9280c0e1 20 #define PN532_COMMAND_WRITEREGISTER (0x08)
yihui 0:9c6b9280c0e1 21 #define PN532_COMMAND_READGPIO (0x0C)
yihui 0:9c6b9280c0e1 22 #define PN532_COMMAND_WRITEGPIO (0x0E)
yihui 0:9c6b9280c0e1 23 #define PN532_COMMAND_SETSERIALBAUDRATE (0x10)
yihui 0:9c6b9280c0e1 24 #define PN532_COMMAND_SETPARAMETERS (0x12)
yihui 0:9c6b9280c0e1 25 #define PN532_COMMAND_SAMCONFIGURATION (0x14)
yihui 0:9c6b9280c0e1 26 #define PN532_COMMAND_POWERDOWN (0x16)
yihui 0:9c6b9280c0e1 27 #define PN532_COMMAND_RFCONFIGURATION (0x32)
yihui 0:9c6b9280c0e1 28 #define PN532_COMMAND_RFREGULATIONTEST (0x58)
yihui 0:9c6b9280c0e1 29 #define PN532_COMMAND_INJUMPFORDEP (0x56)
yihui 0:9c6b9280c0e1 30 #define PN532_COMMAND_INJUMPFORPSL (0x46)
yihui 0:9c6b9280c0e1 31 #define PN532_COMMAND_INLISTPASSIVETARGET (0x4A)
yihui 0:9c6b9280c0e1 32 #define PN532_COMMAND_INATR (0x50)
yihui 0:9c6b9280c0e1 33 #define PN532_COMMAND_INPSL (0x4E)
yihui 0:9c6b9280c0e1 34 #define PN532_COMMAND_INDATAEXCHANGE (0x40)
yihui 0:9c6b9280c0e1 35 #define PN532_COMMAND_INCOMMUNICATETHRU (0x42)
yihui 0:9c6b9280c0e1 36 #define PN532_COMMAND_INDESELECT (0x44)
yihui 0:9c6b9280c0e1 37 #define PN532_COMMAND_INRELEASE (0x52)
yihui 0:9c6b9280c0e1 38 #define PN532_COMMAND_INSELECT (0x54)
yihui 0:9c6b9280c0e1 39 #define PN532_COMMAND_INAUTOPOLL (0x60)
yihui 0:9c6b9280c0e1 40 #define PN532_COMMAND_TGINITASTARGET (0x8C)
yihui 0:9c6b9280c0e1 41 #define PN532_COMMAND_TGSETGENERALBYTES (0x92)
yihui 0:9c6b9280c0e1 42 #define PN532_COMMAND_TGGETDATA (0x86)
yihui 0:9c6b9280c0e1 43 #define PN532_COMMAND_TGSETDATA (0x8E)
yihui 0:9c6b9280c0e1 44 #define PN532_COMMAND_TGSETMETADATA (0x94)
yihui 0:9c6b9280c0e1 45 #define PN532_COMMAND_TGGETINITIATORCOMMAND (0x88)
yihui 0:9c6b9280c0e1 46 #define PN532_COMMAND_TGRESPONSETOINITIATOR (0x90)
yihui 0:9c6b9280c0e1 47 #define PN532_COMMAND_TGGETTARGETSTATUS (0x8A)
yihui 0:9c6b9280c0e1 48
yihui 0:9c6b9280c0e1 49 #define PN532_RESPONSE_INDATAEXCHANGE (0x41)
yihui 0:9c6b9280c0e1 50 #define PN532_RESPONSE_INLISTPASSIVETARGET (0x4B)
yihui 0:9c6b9280c0e1 51
yihui 0:9c6b9280c0e1 52
yihui 0:9c6b9280c0e1 53 #define PN532_MIFARE_ISO14443A (0x00)
yihui 0:9c6b9280c0e1 54
yihui 0:9c6b9280c0e1 55 // Mifare Commands
yihui 0:9c6b9280c0e1 56 #define MIFARE_CMD_AUTH_A (0x60)
yihui 0:9c6b9280c0e1 57 #define MIFARE_CMD_AUTH_B (0x61)
yihui 0:9c6b9280c0e1 58 #define MIFARE_CMD_READ (0x30)
yihui 0:9c6b9280c0e1 59 #define MIFARE_CMD_WRITE (0xA0)
yihui 0:9c6b9280c0e1 60 #define MIFARE_CMD_TRANSFER (0xB0)
yihui 0:9c6b9280c0e1 61 #define MIFARE_CMD_DECREMENT (0xC0)
yihui 0:9c6b9280c0e1 62 #define MIFARE_CMD_INCREMENT (0xC1)
yihui 0:9c6b9280c0e1 63 #define MIFARE_CMD_STORE (0xC2)
icefeet 5:51f820fbd18a 64 #define MIFARE_UL_CMD_WRITE_PAGE (0xA2)
yihui 0:9c6b9280c0e1 65 // Prefixes for NDEF Records (to identify record type)
yihui 0:9c6b9280c0e1 66 #define NDEF_URIPREFIX_NONE (0x00)
yihui 0:9c6b9280c0e1 67 #define NDEF_URIPREFIX_HTTP_WWWDOT (0x01)
yihui 0:9c6b9280c0e1 68 #define NDEF_URIPREFIX_HTTPS_WWWDOT (0x02)
yihui 0:9c6b9280c0e1 69 #define NDEF_URIPREFIX_HTTP (0x03)
yihui 0:9c6b9280c0e1 70 #define NDEF_URIPREFIX_HTTPS (0x04)
yihui 0:9c6b9280c0e1 71 #define NDEF_URIPREFIX_TEL (0x05)
yihui 0:9c6b9280c0e1 72 #define NDEF_URIPREFIX_MAILTO (0x06)
yihui 0:9c6b9280c0e1 73 #define NDEF_URIPREFIX_FTP_ANONAT (0x07)
yihui 0:9c6b9280c0e1 74 #define NDEF_URIPREFIX_FTP_FTPDOT (0x08)
yihui 0:9c6b9280c0e1 75 #define NDEF_URIPREFIX_FTPS (0x09)
yihui 0:9c6b9280c0e1 76 #define NDEF_URIPREFIX_SFTP (0x0A)
yihui 0:9c6b9280c0e1 77 #define NDEF_URIPREFIX_SMB (0x0B)
yihui 0:9c6b9280c0e1 78 #define NDEF_URIPREFIX_NFS (0x0C)
yihui 0:9c6b9280c0e1 79 #define NDEF_URIPREFIX_FTP (0x0D)
yihui 0:9c6b9280c0e1 80 #define NDEF_URIPREFIX_DAV (0x0E)
yihui 0:9c6b9280c0e1 81 #define NDEF_URIPREFIX_NEWS (0x0F)
yihui 0:9c6b9280c0e1 82 #define NDEF_URIPREFIX_TELNET (0x10)
yihui 0:9c6b9280c0e1 83 #define NDEF_URIPREFIX_IMAP (0x11)
yihui 0:9c6b9280c0e1 84 #define NDEF_URIPREFIX_RTSP (0x12)
yihui 0:9c6b9280c0e1 85 #define NDEF_URIPREFIX_URN (0x13)
yihui 0:9c6b9280c0e1 86 #define NDEF_URIPREFIX_POP (0x14)
yihui 0:9c6b9280c0e1 87 #define NDEF_URIPREFIX_SIP (0x15)
yihui 0:9c6b9280c0e1 88 #define NDEF_URIPREFIX_SIPS (0x16)
yihui 0:9c6b9280c0e1 89 #define NDEF_URIPREFIX_TFTP (0x17)
yihui 0:9c6b9280c0e1 90 #define NDEF_URIPREFIX_BTSPP (0x18)
yihui 0:9c6b9280c0e1 91 #define NDEF_URIPREFIX_BTL2CAP (0x19)
yihui 0:9c6b9280c0e1 92 #define NDEF_URIPREFIX_BTGOEP (0x1A)
yihui 0:9c6b9280c0e1 93 #define NDEF_URIPREFIX_TCPOBEX (0x1B)
yihui 0:9c6b9280c0e1 94 #define NDEF_URIPREFIX_IRDAOBEX (0x1C)
yihui 0:9c6b9280c0e1 95 #define NDEF_URIPREFIX_FILE (0x1D)
yihui 0:9c6b9280c0e1 96 #define NDEF_URIPREFIX_URN_EPC_ID (0x1E)
yihui 0:9c6b9280c0e1 97 #define NDEF_URIPREFIX_URN_EPC_TAG (0x1F)
yihui 0:9c6b9280c0e1 98 #define NDEF_URIPREFIX_URN_EPC_PAT (0x20)
yihui 0:9c6b9280c0e1 99 #define NDEF_URIPREFIX_URN_EPC_RAW (0x21)
yihui 0:9c6b9280c0e1 100 #define NDEF_URIPREFIX_URN_EPC (0x22)
yihui 0:9c6b9280c0e1 101 #define NDEF_URIPREFIX_URN_NFC (0x23)
yihui 0:9c6b9280c0e1 102
yihui 0:9c6b9280c0e1 103 #define PN532_GPIO_VALIDATIONBIT (0x80)
yihui 0:9c6b9280c0e1 104 #define PN532_GPIO_P30 (0)
yihui 0:9c6b9280c0e1 105 #define PN532_GPIO_P31 (1)
yihui 0:9c6b9280c0e1 106 #define PN532_GPIO_P32 (2)
yihui 0:9c6b9280c0e1 107 #define PN532_GPIO_P33 (3)
yihui 0:9c6b9280c0e1 108 #define PN532_GPIO_P34 (4)
yihui 0:9c6b9280c0e1 109 #define PN532_GPIO_P35 (5)
yihui 0:9c6b9280c0e1 110
screamer 6:418ee8924317 111 /**
screamer 6:418ee8924317 112 * The PN532 class
screamer 6:418ee8924317 113 */
yihui 1:b8cab5222fd0 114 class PN532
yihui 1:b8cab5222fd0 115 {
yihui 0:9c6b9280c0e1 116 public:
yihui 1:b8cab5222fd0 117 PN532(PN532Interface &interface);
yihui 1:b8cab5222fd0 118
yihui 1:b8cab5222fd0 119 void begin(void);
yihui 1:b8cab5222fd0 120
yihui 1:b8cab5222fd0 121 // Generic PN532 functions
yihui 1:b8cab5222fd0 122 bool SAMConfig(void);
yihui 1:b8cab5222fd0 123 uint32_t getFirmwareVersion(void);
yihui 1:b8cab5222fd0 124 bool writeGPIO(uint8_t pinstate);
yihui 1:b8cab5222fd0 125 uint8_t readGPIO(void);
yihui 1:b8cab5222fd0 126 bool setPassiveActivationRetries(uint8_t maxRetries);
yihui 1:b8cab5222fd0 127
yihui 3:4189a10038e6 128 /**
screamer 6:418ee8924317 129 * @brief Init PN532 as a target
screamer 6:418ee8924317 130 * @param timeout max time to wait, 0 means no timeout
screamer 6:418ee8924317 131 * @return > 0 success
screamer 6:418ee8924317 132 * = 0 timeout
screamer 6:418ee8924317 133 * < 0 failed
screamer 6:418ee8924317 134 */
yihui 3:4189a10038e6 135 int8_t tgInitAsTarget(uint16_t timeout = 0);
yihui 3:4189a10038e6 136 int8_t tgInitAsTarget(const uint8_t* command, const uint8_t len, const uint16_t timeout = 0);
yihui 3:4189a10038e6 137
yihui 3:4189a10038e6 138 int16_t tgGetData(uint8_t *buf, uint8_t len);
yihui 3:4189a10038e6 139 bool tgSetData(const uint8_t *header, uint8_t hlen, const uint8_t *body = 0, uint8_t blen = 0);
yihui 3:4189a10038e6 140
yihui 3:4189a10038e6 141 int16_t inRelease(const uint8_t relevantTarget = 0);
yihui 1:b8cab5222fd0 142
yihui 1:b8cab5222fd0 143 // ISO14443A functions
yihui 1:b8cab5222fd0 144 bool inListPassiveTarget();
icefeet 5:51f820fbd18a 145 bool readPassiveTargetID(uint8_t cardbaudrate, uint8_t *uid, uint8_t *uidLength, uint16_t *atqa, uint8_t *sak, uint16_t timeout = 1000);
yihui 1:b8cab5222fd0 146 bool inDataExchange(uint8_t *send, uint8_t sendLength, uint8_t *response, uint8_t *responseLength);
yihui 0:9c6b9280c0e1 147
yihui 1:b8cab5222fd0 148 // Mifare Classic functions
yihui 1:b8cab5222fd0 149 bool mifareclassic_IsFirstBlock (uint32_t uiBlock);
yihui 1:b8cab5222fd0 150 bool mifareclassic_IsTrailerBlock (uint32_t uiBlock);
r4z0r7o3 10:f959b305a571 151 uint8_t mifareclassic_AuthenticateBlock (uint8_t *uid, uint8_t uidLen, uint32_t blockNumber, uint8_t keyNumber, const uint8_t *keyData);
yihui 1:b8cab5222fd0 152 uint8_t mifareclassic_ReadDataBlock (uint8_t blockNumber, uint8_t *data);
yihui 1:b8cab5222fd0 153 uint8_t mifareclassic_WriteDataBlock (uint8_t blockNumber, uint8_t *data);
yihui 1:b8cab5222fd0 154 uint8_t mifareclassic_FormatNDEF (void);
yihui 1:b8cab5222fd0 155 uint8_t mifareclassic_WriteNDEFURI (uint8_t sectorNumber, uint8_t uriIdentifier, const char *url);
yihui 1:b8cab5222fd0 156
yihui 1:b8cab5222fd0 157 // Mifare Ultralight functions
yihui 1:b8cab5222fd0 158 uint8_t mifareultralight_ReadPage (uint8_t page, uint8_t *buffer);
icefeet 5:51f820fbd18a 159 uint8_t mifareultralight_WritePage (uint8_t page, uint8_t *buffer);
yihui 1:b8cab5222fd0 160 // Help functions to display formatted text
yihui 1:b8cab5222fd0 161 static void PrintHex(const uint8_t *data, const uint32_t numBytes);
yihui 1:b8cab5222fd0 162 static void PrintHexChar(const uint8_t *pbtData, const uint32_t numBytes);
yihui 1:b8cab5222fd0 163
yihui 3:4189a10038e6 164 uint8_t *getBuffer(uint8_t *len) {
yihui 3:4189a10038e6 165 *len = sizeof(pn532_packetbuffer) - 4;
yihui 3:4189a10038e6 166 return pn532_packetbuffer;
yihui 3:4189a10038e6 167 };
yihui 3:4189a10038e6 168
yihui 1:b8cab5222fd0 169 private:
yihui 1:b8cab5222fd0 170 uint8_t _uid[7]; // ISO14443A uid
yihui 1:b8cab5222fd0 171 uint8_t _uidLen; // uid len
yihui 1:b8cab5222fd0 172 uint8_t _key[6]; // Mifare Classic key
yihui 1:b8cab5222fd0 173 uint8_t inListedTag; // Tg number of inlisted tag.
yihui 1:b8cab5222fd0 174
yihui 3:4189a10038e6 175 uint8_t pn532_packetbuffer[64];
yihui 3:4189a10038e6 176
yihui 1:b8cab5222fd0 177 PN532Interface *_interface;
yihui 0:9c6b9280c0e1 178 };
yihui 0:9c6b9280c0e1 179
yihui 0:9c6b9280c0e1 180 #endif