9#include "mfrc522_drv.h"
10#include "spi_interface.h"
11#include "gpio_interface.h"
14#ifndef MFRC522_SPICLOCK
15#define MFRC522_SPICLOCK (4000000u)
27: _spi(spi), _reset(reset) {
28 _reset.gpioMode(GPIO::OUTPUT | GPIO::INIT_HIGH);
29 _spi.setSpeed(MFRC522_SPICLOCK);
30 _spi.generateCS(
false);
61 for(
size_t i=0; i < count; ++i) buf[i+1] = values[i];
64 _spi.spiTx(buf, count+1);
75 buf_tx[0] = 0x80 | reg;
78 _spi.spiTx(buf_tx, 1);
79 _spi.spiRx(0, buf_rx, 1);
94 if (count == 0)
return;
96 uint8_t address = 0x80 | reg;
101 _spi.spiTx(&address, 1);
104 uint8_t mask = (0xFF << rxAlign) & 0xFF;
106 _spi.spiRx(address, buf_rx, 1);
107 uint8_t value = buf_rx[0];
109 values[0] = (values[0] & ~mask) | (value & mask);
112 while (index < count) {
113 _spi.spiRx(address, buf_rx, 1);
114 values[index] = buf_rx[0];
117 _spi.spiRx(0, buf_rx, 1);
118 values[index] = buf_rx[0];
165 const uint32_t deadline = task::millis() + 89;
178 }
while (
static_cast<uint32_t
> (task::millis()) < deadline);
181 return STATUS_TIMEOUT;
193 bool hardReset =
false;
196 _reset.gpioMode(GPIO::INPUT);
198 if (_reset.gpioRead() == LOW) {
199 _reset.gpioMode(GPIO::OUTPUT);
200 _reset.gpioWrite(LOW);
202 _reset.gpioWrite(HIGH);
252 if ((value & 0x03) != 0x03) {
299 uint8_t ZEROES[25] = {0x00};
315 for (uint8_t i = 0; i < 0xFF; i++) {
342 const uint8_t *reference;
345 reference = FM17522_firmware_reference;
348 reference = MFRC522_firmware_referenceV0_0;
351 reference = MFRC522_firmware_referenceV1_0;
354 reference = MFRC522_firmware_referenceV2_0;
361 for (uint8_t i = 0; i < 64; i++) {
362 if (result[i] != reference[i]) {
384void mfrc522_drv::PCD_SoftPowerDown() {
390void mfrc522_drv::PCD_SoftPowerUp() {
395 const uint32_t timeout = (uint32_t) task::millis() + 500;
397 while (task::millis() <= timeout) {
399 if (!(val & (1 << 4))) {
416mfrc522_drv::StatusCode
425 uint8_t waitIRq = 0x30;
426 return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign,
436mfrc522_drv::StatusCode
448 uint8_t txLastBits = validBits ? *validBits : 0;
450 (rxAlign << 4) + txLastBits;
458 if (command == PCD_Transceive) {
470 const uint32_t deadline = task::millis() + 36;
471 bool completed =
false;
481 return STATUS_TIMEOUT;
484 }
while (
static_cast<uint32_t
> (task::millis()) < deadline);
488 return STATUS_TIMEOUT;
494 if (errorRegValue & 0x13) {
498 uint8_t _validBits = 0;
501 if (backData && backLen) {
504 return STATUS_NO_ROOM;
511 *validBits = _validBits;
516 if (errorRegValue & 0x08) {
517 return STATUS_COLLISION;
521 if (backData && backLen && checkCRC) {
523 if (*backLen == 1 && _validBits == 4) {
524 return STATUS_MIFARE_NACK;
527 if (*backLen < 2 || _validBits != 0) {
528 return STATUS_CRC_WRONG;
531 uint8_t controlBuffer[2];
532 mfrc522_drv::StatusCode status =
PCD_CalculateCRC(&backData[0], *backLen - 2, &controlBuffer[0]);
533 if (status != STATUS_OK) {
536 if ((backData[*backLen - 2] != controlBuffer[0]) || (backData[*backLen - 1] != controlBuffer[1])) {
537 return STATUS_CRC_WRONG;
550mfrc522_drv::StatusCode
563mfrc522_drv::StatusCode
576mfrc522_drv::StatusCode
582 mfrc522_drv::StatusCode status;
584 if (bufferATQA ==
nullptr || *bufferSize < 2) {
585 return STATUS_NO_ROOM;
590 if (status != STATUS_OK) {
593 if (*bufferSize != 2 || validBits != 0) {
623 uint8_t cascadeLevel = 1;
624 mfrc522_drv::StatusCode result;
629 int8_t currentLevelKnownBits;
634 uint8_t *responseBuffer;
635 uint8_t responseLength;
660 if (validBits > 80) {
661 return STATUS_INVALID;
669 while (!uidComplete) {
671 switch (cascadeLevel) {
673 buffer[0] = PICC_CMD_SEL_CL1;
675 useCascadeTag = validBits && uid->size > 4;
679 buffer[0] = PICC_CMD_SEL_CL2;
681 useCascadeTag = validBits && uid->size > 7;
685 buffer[0] = PICC_CMD_SEL_CL3;
687 useCascadeTag =
false;
691 return STATUS_INTERNAL_ERROR;
696 currentLevelKnownBits = validBits - (8 * uidIndex);
697 if (currentLevelKnownBits < 0) {
698 currentLevelKnownBits = 0;
703 buffer[index++] = PICC_CMD_CT;
705 uint8_t uint8_tsToCopy = currentLevelKnownBits / 8 + (currentLevelKnownBits % 8 ? 1
707 if (uint8_tsToCopy) {
708 uint8_t maxBytes = useCascadeTag ? 3
710 if (uint8_tsToCopy > maxBytes) {
711 uint8_tsToCopy = maxBytes;
713 for (count = 0; count < uint8_tsToCopy; count++) {
714 buffer[index++] = uid->uidByte[uidIndex + count];
719 currentLevelKnownBits += 8;
724 while (!selectDone) {
726 if (currentLevelKnownBits >= 32) {
730 buffer[6] = buffer[2] ^ buffer[3] ^ buffer[4] ^ buffer[5];
733 if (result != STATUS_OK) {
739 responseBuffer = &buffer[6];
743 txLastBits = currentLevelKnownBits % 8;
744 count = currentLevelKnownBits / 8;
746 buffer[1] = (index << 4) + txLastBits;
747 bufferUsed = index + (txLastBits ? 1 : 0);
749 responseBuffer = &buffer[index];
750 responseLength =
sizeof(buffer) - index;
754 rxAlign = txLastBits;
759 result =
PCD_TransceiveData(buffer, bufferUsed, responseBuffer, &responseLength, &txLastBits, rxAlign);
760 if (result == STATUS_COLLISION) {
763 if (valueOfCollReg & 0x20) {
764 return STATUS_COLLISION;
766 uint8_t collisionPos = valueOfCollReg & 0x1F;
767 if (collisionPos == 0) {
770 if (collisionPos <= currentLevelKnownBits) {
771 return STATUS_INTERNAL_ERROR;
774 currentLevelKnownBits = collisionPos;
775 count = currentLevelKnownBits % 8;
776 checkBit = (currentLevelKnownBits - 1) % 8;
777 index = 1 + (currentLevelKnownBits / 8) + (count ? 1 : 0);
778 buffer[index] |= (1 << checkBit);
779 }
else if (result != STATUS_OK) {
782 if (currentLevelKnownBits >= 32) {
787 currentLevelKnownBits = 32;
796 index = (buffer[2] == PICC_CMD_CT) ? 3 : 2;
797 uint8_tsToCopy = (buffer[2] == PICC_CMD_CT) ? 3 : 4;
798 for (count = 0; count < uint8_tsToCopy; count++) {
799 uid->uidByte[uidIndex + count] = buffer[index++];
803 if (responseLength != 3 || txLastBits != 0) {
808 if (result != STATUS_OK) {
811 if ((buffer[2] != responseBuffer[1]) || (buffer[3] != responseBuffer[2])) {
812 return STATUS_CRC_WRONG;
814 if (responseBuffer[0] & 0x04) {
818 uid->sak = responseBuffer[0];
823 uid->size = 3 * cascadeLevel + 1;
834 mfrc522_drv::StatusCode result;
838 buffer[0] = PICC_CMD_HLTA;
842 if (result != STATUS_OK) {
852 if (result == STATUS_TIMEOUT) {
855 if (result == STATUS_OK) {
877mfrc522_drv::StatusCode
883 uint8_t waitIRq = 0x10;
886 uint8_t sendData[12];
887 sendData[0] = command;
888 sendData[1] = blockAddr;
889 for (uint8_t i = 0; i < MF_KEY_SIZE; i++) {
890 sendData[2 + i] = key->keyByte[i];
896 for (uint8_t i = 0; i < 4; i++) {
897 sendData[8 + i] = uid->uidByte[i + uid->size - 4];
935 mfrc522_drv::StatusCode result;
938 if (buffer ==
nullptr || *bufferSize < 18) {
939 return STATUS_NO_ROOM;
943 buffer[0] = PICC_CMD_MF_READ;
944 buffer[1] = blockAddr;
947 if (result != STATUS_OK) {
971 mfrc522_drv::StatusCode result;
974 if (buffer ==
nullptr || bufferSize < 16) {
975 return STATUS_INVALID;
980 uint8_t cmdBuffer[2];
981 cmdBuffer[0] = PICC_CMD_MF_WRITE;
982 cmdBuffer[1] = blockAddr;
984 if (result != STATUS_OK) {
990 if (result != STATUS_OK) {
1006 mfrc522_drv::StatusCode result;
1009 if (buffer ==
nullptr || bufferSize < 4) {
1010 return STATUS_INVALID;
1014 uint8_t cmdBuffer[6];
1015 cmdBuffer[0] = PICC_CMD_UL_WRITE;
1016 cmdBuffer[1] = page;
1017 memcpy(&cmdBuffer[2], buffer, 4);
1021 if (result != STATUS_OK) {
1079 mfrc522_drv::StatusCode result;
1080 uint8_t cmdBuffer[2];
1083 cmdBuffer[0] = command;
1084 cmdBuffer[1] = blockAddr;
1086 if (result != STATUS_OK) {
1092 if (result != STATUS_OK) {
1108 mfrc522_drv::StatusCode result;
1109 uint8_t cmdBuffer[2];
1112 cmdBuffer[0] = PICC_CMD_MF_TRANSFER;
1113 cmdBuffer[1] = blockAddr;
1115 if (result != STATUS_OK) {
1133 mfrc522_drv::StatusCode status;
1135 uint8_t size =
sizeof(buffer);
1139 if (status == STATUS_OK) {
1141 *value = (int32_t(buffer[3]) << 24) | (int32_t(buffer[2]) << 16) | (int32_t(buffer[1]) << 8) |
1162 buffer[0] = buffer[8] = (value & 0xFF);
1163 buffer[1] = buffer[9] = (value & 0xFF00) >> 8;
1164 buffer[2] = buffer[10] = (value & 0xFF0000) >> 16;
1165 buffer[3] = buffer[11] = (value & 0xFF000000) >> 24;
1167 buffer[4] = ~buffer[0];
1168 buffer[5] = ~buffer[1];
1169 buffer[6] = ~buffer[2];
1170 buffer[7] = ~buffer[3];
1172 buffer[12] = buffer[14] = blockAddr;
1173 buffer[13] = buffer[15] = ~blockAddr;
1193 mfrc522_drv::StatusCode result;
1194 uint8_t cmdBuffer[18];
1196 cmdBuffer[0] = 0x1B;
1198 for (uint8_t i = 0; i < 4; i++)
1199 cmdBuffer[i + 1] = passWord[i];
1203 if (result != STATUS_OK) {
1208 uint8_t waitIRq = 0x30;
1210 uint8_t validBits = 0;
1211 uint8_t rxlength = 5;
1214 pACK[0] = cmdBuffer[0];
1215 pACK[1] = cmdBuffer[1];
1217 if (result != STATUS_OK) {
1240 mfrc522_drv::StatusCode result;
1241 uint8_t cmdBuffer[18];
1244 if (sendData ==
nullptr || sendLen > 16) {
1245 return STATUS_INVALID;
1249 memcpy(cmdBuffer, sendData, sendLen);
1251 if (result != STATUS_OK) {
1257 uint8_t waitIRq = 0x30;
1258 uint8_t cmdBufferSize =
sizeof(cmdBuffer);
1259 uint8_t validBits = 0;
1262 if (acceptTimeout && result == STATUS_TIMEOUT) {
1265 if (result != STATUS_OK) {
1269 if (cmdBufferSize != 1 || validBits != 4) {
1270 return STATUS_ERROR;
1272 if (cmdBuffer[0] != MF_ACK) {
1273 return STATUS_MIFARE_NACK;
1287 return (
"Success.");
1289 return (
"Error in communication.");
1290 case STATUS_COLLISION:
1291 return (
"Collision detected.");
1292 case STATUS_TIMEOUT:
1293 return (
"Timeout in communication.");
1294 case STATUS_NO_ROOM:
1295 return (
"A buffer is not big enough.");
1296 case STATUS_INTERNAL_ERROR:
1297 return (
"Internal error in the code. Should not happen.");
1298 case STATUS_INVALID:
1299 return (
"Invalid argument.");
1300 case STATUS_CRC_WRONG:
1301 return (
"The CRC_A does not match.");
1302 case STATUS_MIFARE_NACK:
1303 return (
"A MIFARE PICC responded with NAK.");
1305 return (
"Unknown error");
1323 return PICC_TYPE_NOT_COMPLETE;
1325 return PICC_TYPE_MIFARE_MINI;
1327 return PICC_TYPE_MIFARE_1K;
1329 return PICC_TYPE_MIFARE_4K;
1331 return PICC_TYPE_MIFARE_UL;
1334 return PICC_TYPE_MIFARE_PLUS;
1336 return PICC_TYPE_TNP3XXX;
1338 return PICC_TYPE_ISO_14443_4;
1340 return PICC_TYPE_ISO_18092;
1342 return PICC_TYPE_UNKNOWN;
1354 case PICC_TYPE_ISO_14443_4:
1355 return (
"PICC compliant with ISO/IEC 14443-4");
1356 case PICC_TYPE_ISO_18092:
1357 return (
"PICC compliant with ISO/IEC 18092 (NFC)");
1358 case PICC_TYPE_MIFARE_MINI:
1359 return (
"MIFARE Mini, 320 uint8_ts");
1360 case PICC_TYPE_MIFARE_1K:
1361 return (
"MIFARE 1KB");
1362 case PICC_TYPE_MIFARE_4K:
1363 return (
"MIFARE 4KB");
1364 case PICC_TYPE_MIFARE_UL:
1365 return (
"MIFARE Ultralight or Ultralight C");
1366 case PICC_TYPE_MIFARE_PLUS:
1367 return (
"MIFARE Plus");
1368 case PICC_TYPE_MIFARE_DESFIRE:
1369 return (
"MIFARE DESFire");
1370 case PICC_TYPE_TNP3XXX:
1371 return (
"MIFARE TNP3XXX");
1372 case PICC_TYPE_NOT_COMPLETE:
1373 return (
"SAK indicates UID is not complete.");
1374 case PICC_TYPE_UNKNOWN:
1376 return (
"Unknown type");
1387 printf(
"Firmware Version: 0x");
1392 printf(
" = (clone)\n");
1395 printf((
" = v0.0\n"));
1398 printf((
" = v1.0\n"));
1401 printf((
" = v2.0\n"));
1404 printf(
" = counterfeit chip\n");
1407 printf(
" = (unknown)\n");
1410 if ((v == 0x00) || (v == 0xFF))
1411 printf(
"WARNING: Communication failure, is the MFRC522 properly connected?\n");
1429 case PICC_TYPE_MIFARE_MINI:
1430 case PICC_TYPE_MIFARE_1K:
1431 case PICC_TYPE_MIFARE_4K:
1433 for (uint8_t i = 0; i < 6; i++) {
1434 key.keyByte[i] = 0xFF;
1439 case PICC_TYPE_MIFARE_UL:
1443 case PICC_TYPE_ISO_14443_4:
1444 case PICC_TYPE_MIFARE_DESFIRE:
1445 case PICC_TYPE_ISO_18092:
1446 case PICC_TYPE_MIFARE_PLUS:
1447 case PICC_TYPE_TNP3XXX:
1448 printf(
"Dumping memory contents not implemented for that PICC type.\n");
1451 case PICC_TYPE_UNKNOWN:
1452 case PICC_TYPE_NOT_COMPLETE:
1466 printf(
"Card UID:");
1467 for (uint8_t i = 0; i < uid->size; i++) {
1468 if (uid->uidByte[i] < 0x10)
1472 printf(
"%x", uid->uidByte[i]);
1477 printf(
"Card SAK: ");
1478 if (uid->sak < 0x10)
1480 printf(
"%x\n", uid->sak);
1484 printf(
"PICC type: ");
1498 uint8_t no_of_sectors = 0;
1500 case PICC_TYPE_MIFARE_MINI:
1505 case PICC_TYPE_MIFARE_1K:
1510 case PICC_TYPE_MIFARE_4K:
1520 if (no_of_sectors) {
1521 printf(
"Sector Block 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 AccessBits\n");
1522 for (int8_t i = no_of_sectors - 1; i >= 0; i--) {
1540 mfrc522_drv::StatusCode status;
1542 uint8_t no_of_blocks;
1543 bool isSectorTrailer;
1554 uint8_t c1_, c2_, c3_;
1563 firstBlock = sector * no_of_blocks;
1564 }
else if (sector < 40) {
1566 firstBlock = 128 + (sector - 32) * no_of_blocks;
1572 uint8_t uint8_tCount;
1575 isSectorTrailer =
true;
1576 invertedError =
false;
1577 for (int8_t blockOffset = no_of_blocks - 1; blockOffset >= 0; blockOffset--) {
1578 blockAddr = firstBlock + blockOffset;
1580 if (isSectorTrailer) {
1585 printf(
"%d", sector);
1594 if (blockAddr < 100)
1599 printf(
"%d", blockAddr);
1602 if (isSectorTrailer) {
1604 if (status != STATUS_OK) {
1605 printf(
"PCD_Authenticate() failed: ");
1612 uint8_tCount =
sizeof(buffer);
1613 status =
MIFARE_Read(blockAddr, buffer, &uint8_tCount);
1614 if (status != STATUS_OK) {
1615 printf(
"MIFARE_Read() failed: ");
1621 for (uint8_t index = 0; index < 16; index++) {
1622 if (buffer[index] < 0x10)
1626 printf(
"%x", buffer[index]);
1627 if ((index % 4) == 3) {
1632 if (isSectorTrailer) {
1633 c1 = buffer[7] >> 4;
1634 c2 = buffer[8] & 0xF;
1635 c3 = buffer[8] >> 4;
1636 c1_ = buffer[6] & 0xF;
1637 c2_ = buffer[6] >> 4;
1638 c3_ = buffer[7] & 0xF;
1639 invertedError = (c1 != (~c1_ & 0xF)) || (c2 != (~c2_ & 0xF)) || (c3 != (~c3_ & 0xF));
1640 g[0] = ((c1 & 1) << 2) | ((c2 & 1) << 1) | ((c3 & 1) << 0);
1641 g[1] = ((c1 & 2) << 1) | ((c2 & 2) << 0) | ((c3 & 2) >> 1);
1642 g[2] = ((c1 & 4) << 0) | ((c2 & 4) >> 1) | ((c3 & 4) >> 2);
1643 g[3] = ((c1 & 8) >> 1) | ((c2 & 8) >> 2) | ((c3 & 8) >> 3);
1644 isSectorTrailer =
false;
1648 if (no_of_blocks == 4) {
1649 group = blockOffset;
1650 firstInGroup =
true;
1652 group = blockOffset / 5;
1653 firstInGroup = (group == 3) || (group != (blockOffset + 1) / 5);
1659 printf(
"%d", (g[group] >> 2) & 1);
1661 printf(
"%d", (g[group] >> 1) & 1);
1663 printf(
"%d", (g[group] >> 0) & 1);
1665 if (invertedError) {
1666 printf(
" Inverted access bits did not match! ");
1670 if (group != 3 && (g[group] == 1 || g[group] == 6)) {
1671 int32_t value = (int32_t(buffer[3]) << 24) | (int32_t(buffer[2]) << 16) | (int32_t(buffer[1]) << 8) |
1673 printf(
" Value=0x");
1674 printf(
"%lx", value);
1676 printf(
"%x", buffer[12]);
1687 mfrc522_drv::StatusCode status;
1688 uint8_t uint8_tCount;
1692 printf(
"Page 0 1 2 3");
1694 for (uint8_t page = 0; page < 16; page += 4) {
1696 uint8_tCount =
sizeof(buffer);
1697 status =
MIFARE_Read(page, buffer, &uint8_tCount);
1698 if (status != STATUS_OK) {
1699 printf(
"MIFARE_Read() failed: ");
1704 for (uint8_t offset = 0; offset < 4; offset++) {
1712 for (uint8_t index = 0; index < 4; index++) {
1713 i = 4 * offset + index;
1714 if (buffer[i] < 0x10)
1718 printf(
"%02x", buffer[i]);
1729 uint8_t *accessBitBuffer,
1735 uint8_t c1 = ((g3 & 4) << 1) | ((g2 & 4) << 0) | ((g1 & 4) >> 1) | ((g0 & 4) >> 2);
1736 uint8_t c2 = ((g3 & 2) << 2) | ((g2 & 2) << 1) | ((g1 & 2) << 0) | ((g0 & 2) >> 1);
1737 uint8_t c3 = ((g3 & 1) << 3) | ((g2 & 1) << 2) | ((g1 & 1) << 1) | ((g0 & 1) << 0);
1739 accessBitBuffer[0] = (~c2 & 0xF) << 4 | (~c1 & 0xF);
1740 accessBitBuffer[1] = c1 << 4 | (~c3 & 0xF);
1741 accessBitBuffer[2] = c3 << 4 | c2;
1768 uint8_t validBits = 7;
1770 uint8_t response[32];
1771 uint8_t received =
sizeof(response);
1772 mfrc522_drv::StatusCode status =
PCD_TransceiveData(&cmd, (uint8_t) 1, response, &received, &validBits, (uint8_t) 0,
1774 if (status != STATUS_OK) {
1777 "Card did not respond to 0x40 after HALT command. Are you sure it is a UID changeable one?");
1778 printf(
"Error name: ");
1784 if (received != 1 || response[0] != 0x0A) {
1786 printf(
"Got bad response on backdoor 0x40 command: ");
1787 printf(
"%x", response[0]);
1789 printf(
"%d", validBits);
1790 printf(
" valid bits)\r\n");
1797 status =
PCD_TransceiveData(&cmd, (uint8_t) 1, response, &received, &validBits, (uint8_t) 0,
false);
1798 if (status != STATUS_OK) {
1800 printf(
"Error in communication at command 0x43, after successfully executing 0x40\n");
1801 printf(
"Error name: ");
1806 if (received != 1 || response[0] != 0x0A) {
1808 printf(
"Got bad response on backdoor 0x43 command: ");
1809 printf(
"%x", response[0]);
1811 printf(
"%d", validBits);
1812 printf(
" valid bits)\r\n");
1832 if (!newUid || !uidSize || uidSize > 15) {
1834 printf(
"New UID buffer empty, size 0, or size > 15 given\n");
1840 MIFARE_Key key = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
1841 mfrc522_drv::StatusCode status =
PCD_Authenticate(mfrc522_drv::PICC_CMD_MF_AUTH_KEY_A, (uint8_t) 1, &key, &uid);
1842 if (status != STATUS_OK) {
1844 if (status == STATUS_TIMEOUT) {
1853 printf(
"No card was previously selected, and none are available. Failed to set UID.\n");
1857 status =
PCD_Authenticate(mfrc522_drv::PICC_CMD_MF_AUTH_KEY_A, (uint8_t) 1, &key, &uid);
1858 if (status != STATUS_OK) {
1861 printf(
"Failed to authenticate to card for reading, could not set UID: \n");
1868 printf(
"PCD_Authenticate() failed: ");
1876 uint8_t block0_buffer[18];
1877 uint8_t uint8_tCount =
sizeof(block0_buffer);
1878 status =
MIFARE_Read((uint8_t) 0, block0_buffer, &uint8_tCount);
1879 if (status != STATUS_OK) {
1881 printf(
"MIFARE_Read() failed: ");
1883 printf(
"Are you sure your KEY A for sector 0 is 0xFFFFFFFFFFFF?\n");
1890 for (uint8_t i = 0; i < uidSize; i++) {
1891 block0_buffer[i] = newUid[i];
1896 block0_buffer[uidSize] = bcc;
1904 printf(
"Activating the UID backdoor failed.\n");
1910 status =
MIFARE_Write((uint8_t) 0, block0_buffer, (uint8_t) 16);
1911 if (status != STATUS_OK) {
1913 printf(
"MIFARE_Write() failed: \n");
1920 uint8_t atqa_answer[2];
1921 uint8_t atqa_size = 2;
1933 uint8_t block0_buffer[] = {0x01, 0x02, 0x03, 0x04, 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1937 mfrc522_drv::StatusCode status =
MIFARE_Write((uint8_t) 0, block0_buffer, (uint8_t) 16);
1938 if (status != STATUS_OK) {
1940 printf(
"MIFARE_Write() failed: \n");
1959 uint8_t bufferATQA[2];
1960 uint8_t bufferSize =
sizeof(bufferATQA);
1968 mfrc522_drv::StatusCode result =
PICC_RequestA(bufferATQA, &bufferSize);
1969 return (result == STATUS_OK || result == STATUS_COLLISION);
1981 mfrc522_drv::StatusCode result =
PICC_Select(&uid);
1982 return (result == STATUS_OK);
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)