15#include "spi_interface.h"
16#include "gpio_interface.h"
24const uint8_t MFRC522_firmware_referenceV0_0[] = {
25 0x00, 0x87, 0x98, 0x0f, 0x49, 0xFF, 0x07, 0x19,
26 0xBF, 0x22, 0x30, 0x49, 0x59, 0x63, 0xAD, 0xCA,
27 0x7F, 0xE3, 0x4E, 0x03, 0x5C, 0x4E, 0x49, 0x50,
28 0x47, 0x9A, 0x37, 0x61, 0xE7, 0xE2, 0xC6, 0x2E,
29 0x75, 0x5A, 0xED, 0x04, 0x3D, 0x02, 0x4B, 0x78,
30 0x32, 0xFF, 0x58, 0x3B, 0x7C, 0xE9, 0x00, 0x94,
31 0xB4, 0x4A, 0x59, 0x5B, 0xFD, 0xC9, 0x29, 0xDF,
32 0x35, 0x96, 0x98, 0x9E, 0x4F, 0x30, 0x32, 0x8D
36const uint8_t MFRC522_firmware_referenceV1_0[] = {
37 0x00, 0xC6, 0x37, 0xD5, 0x32, 0xB7, 0x57, 0x5C,
38 0xC2, 0xD8, 0x7C, 0x4D, 0xD9, 0x70, 0xC7, 0x73,
39 0x10, 0xE6, 0xD2, 0xAA, 0x5E, 0xA1, 0x3E, 0x5A,
40 0x14, 0xAF, 0x30, 0x61, 0xC9, 0x70, 0xDB, 0x2E,
41 0x64, 0x22, 0x72, 0xB5, 0xBD, 0x65, 0xF4, 0xEC,
42 0x22, 0xBC, 0xD3, 0x72, 0x35, 0xCD, 0xAA, 0x41,
43 0x1F, 0xA7, 0xF3, 0x53, 0x14, 0xDE, 0x7E, 0x02,
44 0xD9, 0x0F, 0xB5, 0x5E, 0x25, 0x1D, 0x29, 0x79
48const uint8_t MFRC522_firmware_referenceV2_0[] = {
49 0x00, 0xEB, 0x66, 0xBA, 0x57, 0xBF, 0x23, 0x95,
50 0xD0, 0xE3, 0x0D, 0x3D, 0x27, 0x89, 0x5C, 0xDE,
51 0x9D, 0x3B, 0xA7, 0x00, 0x21, 0x5B, 0x89, 0x82,
52 0x51, 0x3A, 0xEB, 0x02, 0x0C, 0xA5, 0x00, 0x49,
53 0x7C, 0x84, 0x4D, 0xB3, 0xCC, 0xD2, 0x1B, 0x81,
54 0x5D, 0x48, 0x76, 0xD5, 0x71, 0x61, 0x21, 0xA9,
55 0x86, 0x96, 0x83, 0x38, 0xCF, 0x9D, 0x5B, 0x6D,
56 0xDC, 0x15, 0xBA, 0x3E, 0x7D, 0x95, 0x3B, 0x2F
60const uint8_t FM17522_firmware_reference[] = {
61 0x00, 0xD6, 0x78, 0x8C, 0xE2, 0xAA, 0x0C, 0x18,
62 0x2A, 0xB8, 0x7A, 0x7F, 0xD3, 0x6A, 0xCF, 0x0B,
63 0xB1, 0x37, 0x63, 0x4B, 0x69, 0xAE, 0x91, 0xC7,
64 0xC3, 0x97, 0xAE, 0x77, 0xF4, 0x37, 0xD7, 0x9B,
65 0x7C, 0xF5, 0x3C, 0x11, 0x8F, 0x15, 0xC3, 0xD7,
66 0xC1, 0x5B, 0x00, 0x2A, 0xD0, 0x75, 0xDE, 0x9E,
67 0x51, 0x64, 0xAB, 0x3E, 0xE9, 0x15, 0xB5, 0xAB,
68 0x56, 0x9A, 0x98, 0x82, 0x26, 0xEA, 0x2A, 0x62
74 static constexpr uint8_t FIFO_SIZE = 64;
78 enum PCD_Register : uint8_t {
81 CommandReg = 0x01 << 1,
82 ComIEnReg = 0x02 << 1,
83 DivIEnReg = 0x03 << 1,
84 ComIrqReg = 0x04 << 1,
85 DivIrqReg = 0x05 << 1,
87 Status1Reg = 0x07 << 1,
88 Status2Reg = 0x08 << 1,
89 FIFODataReg = 0x09 << 1,
90 FIFOLevelReg = 0x0A << 1,
91 WaterLevelReg = 0x0B << 1,
92 ControlReg = 0x0C << 1,
93 BitFramingReg = 0x0D << 1,
100 TxModeReg = 0x12 << 1,
101 RxModeReg = 0x13 << 1,
102 TxControlReg = 0x14 << 1,
103 TxASKReg = 0x15 << 1,
104 TxSelReg = 0x16 << 1,
105 RxSelReg = 0x17 << 1,
106 RxThresholdReg = 0x18 << 1,
107 DemodReg = 0x19 << 1,
113 SerialSpeedReg = 0x1F << 1,
117 CRCResultRegH = 0x21 << 1,
118 CRCResultRegL = 0x22 << 1,
120 ModWidthReg = 0x24 << 1,
122 RFCfgReg = 0x26 << 1,
124 CWGsPReg = 0x28 << 1,
125 ModGsPReg = 0x29 << 1,
126 TModeReg = 0x2A << 1,
127 TPrescalerReg = 0x2B << 1,
128 TReloadRegH = 0x2C << 1,
129 TReloadRegL = 0x2D << 1,
130 TCounterValueRegH = 0x2E << 1,
131 TCounterValueRegL = 0x2F << 1,
135 TestSel1Reg = 0x31 << 1,
136 TestSel2Reg = 0x32 << 1,
137 TestPinEnReg = 0x33 << 1,
138 TestPinValueReg = 0x34 << 1,
139 TestBusReg = 0x35 << 1,
140 AutoTestReg = 0x36 << 1,
141 VersionReg = 0x37 << 1,
142 AnalogTestReg = 0x38 << 1,
143 TestDAC1Reg = 0x39 << 1,
144 TestDAC2Reg = 0x3A << 1,
145 TestADCReg = 0x3B << 1
153 enum PCD_Command : uint8_t {
156 PCD_GenerateRandomID = 0x02,
159 PCD_NoCmdChange = 0x07,
161 PCD_Transceive = 0x0C,
162 PCD_MFAuthent = 0x0E,
168 enum PCD_RxGain : uint8_t {
169 RxGain_18dB = 0x00 << 4,
170 RxGain_23dB = 0x01 << 4,
171 RxGain_18dB_2 = 0x02 << 4,
172 RxGain_23dB_2 = 0x03 << 4,
173 RxGain_33dB = 0x04 << 4,
174 RxGain_38dB = 0x05 << 4,
175 RxGain_43dB = 0x06 << 4,
176 RxGain_48dB = 0x07 << 4,
177 RxGain_min = 0x00 << 4,
178 RxGain_avg = 0x04 << 4,
179 RxGain_max = 0x07 << 4
183 enum PICC_Command : uint8_t {
185 PICC_CMD_REQA = 0x26,
186 PICC_CMD_WUPA = 0x52,
188 PICC_CMD_SEL_CL1 = 0x93,
189 PICC_CMD_SEL_CL2 = 0x95,
190 PICC_CMD_SEL_CL3 = 0x97,
191 PICC_CMD_HLTA = 0x50,
192 PICC_CMD_RATS = 0xE0,
196 PICC_CMD_MF_AUTH_KEY_A = 0x60,
197 PICC_CMD_MF_AUTH_KEY_B = 0x61,
198 PICC_CMD_MF_READ = 0x30,
199 PICC_CMD_MF_WRITE = 0xA0,
200 PICC_CMD_MF_DECREMENT = 0xC0,
201 PICC_CMD_MF_INCREMENT = 0xC1,
202 PICC_CMD_MF_RESTORE = 0xC2,
203 PICC_CMD_MF_TRANSFER = 0xB0,
206 PICC_CMD_UL_WRITE = 0xA2
217 enum PICC_Type : uint8_t {
219 PICC_TYPE_ISO_14443_4,
221 PICC_TYPE_MIFARE_MINI,
225 PICC_TYPE_MIFARE_PLUS,
226 PICC_TYPE_MIFARE_DESFIRE,
228 PICC_TYPE_NOT_COMPLETE = 0xff
233 enum StatusCode : uint8_t {
239 STATUS_INTERNAL_ERROR,
242 STATUS_MIFARE_NACK = 0xff
254 uint8_t keyByte[MF_KEY_SIZE];
275 void PCD_ReadRegister(PCD_Register reg, uint8_t count, uint8_t *values, uint8_t rxAlign = 0);
281 StatusCode
PCD_CalculateCRC(uint8_t *data, uint8_t length, uint8_t *result);
288 void PCD_Init(uint8_t resetPowerDownPin);
290 void PCD_Init(uint8_t chipSelectPin, uint8_t resetPowerDownPin);
307 void PCD_SoftPowerDown();
309 void PCD_SoftPowerUp();
315 PCD_TransceiveData(uint8_t *sendData, uint8_t sendLen, uint8_t *backData, uint8_t *backLen,
316 uint8_t *validBits =
nullptr,
317 uint8_t rxAlign = 0,
bool checkCRC =
false);
321 uint8_t *backData =
nullptr,
322 uint8_t *backLen =
nullptr, uint8_t *validBits =
nullptr, uint8_t rxAlign = 0,
323 bool checkCRC =
false);
325 StatusCode
PICC_RequestA(uint8_t *bufferATQA, uint8_t *bufferSize);
327 StatusCode
PICC_WakeupA(uint8_t *bufferATQA, uint8_t *bufferSize);
329 StatusCode
PICC_REQA_or_WUPA(uint8_t command, uint8_t *bufferATQA, uint8_t *bufferSize);
342 StatusCode
MIFARE_Read(uint8_t blockAddr, uint8_t *buffer, uint8_t *bufferSize);
344 StatusCode
MIFARE_Write(uint8_t blockAddr, uint8_t *buffer, uint8_t bufferSize);
391 void MIFARE_SetAccessBits(uint8_t *accessBitBuffer, uint8_t g0, uint8_t g1, uint8_t g2, uint8_t g3);
395 bool MIFARE_SetUid(uint8_t *newUid, uint8_t uidSize,
bool logErrors);
void PICC_DumpDetailsToSerial(Uid *uid)
StatusCode MIFARE_TwoStepHelper(uint8_t command, uint8_t blockAddr, int32_t data)
void PICC_DumpToSerial(Uid *uid)
static const char * PICC_GetTypeName(PICC_Type type)
StatusCode PCD_CommunicateWithPICC(uint8_t command, uint8_t waitIRq, uint8_t *sendData, uint8_t sendLen, uint8_t *backData=nullptr, uint8_t *backLen=nullptr, uint8_t *validBits=nullptr, uint8_t rxAlign=0, bool checkCRC=false)
void PCD_WriteRegister(PCD_Register reg, uint8_t value)
StatusCode MIFARE_SetValue(uint8_t blockAddr, int32_t value)
StatusCode MIFARE_Restore(uint8_t blockAddr)
StatusCode MIFARE_Decrement(uint8_t blockAddr, int32_t delta)
StatusCode MIFARE_Ultralight_Write(uint8_t page, uint8_t *buffer, uint8_t bufferSize)
void PCD_DumpVersionToSerial()
StatusCode MIFARE_GetValue(uint8_t blockAddr, int32_t *value)
StatusCode PCD_CalculateCRC(uint8_t *data, uint8_t length, uint8_t *result)
virtual bool PICC_IsNewCardPresent()
bool PCD_PerformSelfTest()
void MIFARE_SetAccessBits(uint8_t *accessBitBuffer, uint8_t g0, uint8_t g1, uint8_t g2, uint8_t g3)
void PCD_SetRegisterBitMask(PCD_Register reg, uint8_t mask)
static PICC_Type PICC_GetType(uint8_t sak)
StatusCode PCD_NTAG216_AUTH(uint8_t *passWord, uint8_t pACK[])
virtual StatusCode PICC_Select(Uid *uid, uint8_t validBits=0)
uint8_t PCD_ReadRegister(PCD_Register reg)
StatusCode PCD_TransceiveData(uint8_t *sendData, uint8_t sendLen, uint8_t *backData, uint8_t *backLen, uint8_t *validBits=nullptr, uint8_t rxAlign=0, bool checkCRC=false)
StatusCode PCD_MIFARE_Transceive(uint8_t *sendData, uint8_t sendLen, bool acceptTimeout=false)
void PCD_ClearRegisterBitMask(PCD_Register reg, uint8_t mask)
StatusCode PICC_RequestA(uint8_t *bufferATQA, uint8_t *bufferSize)
StatusCode MIFARE_Read(uint8_t blockAddr, uint8_t *buffer, uint8_t *bufferSize)
void PCD_SetAntennaGain(uint8_t mask)
static const char * GetStatusCodeName(StatusCode code)
StatusCode MIFARE_Increment(uint8_t blockAddr, int32_t delta)
virtual bool PICC_ReadCardSerial()
mfrc522_drv(spi_interface &spi, gpio_interface &reset)
void PICC_DumpMifareClassicToSerial(Uid *uid, PICC_Type piccType, MIFARE_Key *key)
uint8_t PCD_GetAntennaGain()
StatusCode MIFARE_Transfer(uint8_t blockAddr)
void PICC_DumpMifareClassicSectorToSerial(Uid *uid, MIFARE_Key *key, uint8_t sector)
StatusCode PCD_Authenticate(uint8_t command, uint8_t blockAddr, MIFARE_Key *key, Uid *uid)
void PICC_DumpMifareUltralightToSerial()
StatusCode PICC_REQA_or_WUPA(uint8_t command, uint8_t *bufferATQA, uint8_t *bufferSize)
bool MIFARE_OpenUidBackdoor(bool logErrors)
bool MIFARE_SetUid(uint8_t *newUid, uint8_t uidSize, bool logErrors)
bool MIFARE_UnbrickUidSector(bool logErrors)
StatusCode PICC_WakeupA(uint8_t *bufferATQA, uint8_t *bufferSize)
StatusCode MIFARE_Write(uint8_t blockAddr, uint8_t *buffer, uint8_t bufferSize)