rfal_picopass.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "rfal_picopass.h"
  2. #include "utils.h"
  3. typedef struct {
  4. uint8_t CMD;
  5. uint8_t CSN[RFAL_PICOPASS_UID_LEN];
  6. } rfalPicoPassSelectReq;
  7. typedef struct {
  8. uint8_t CMD;
  9. uint8_t null[4];
  10. uint8_t mac[4];
  11. } rfalPicoPassCheckReq;
  12. ReturnCode rfalPicoPassPollerInitialize(void) {
  13. ReturnCode ret;
  14. EXIT_ON_ERR(ret, rfalSetMode(RFAL_MODE_POLL_PICOPASS, RFAL_BR_26p48, RFAL_BR_26p48));
  15. rfalSetErrorHandling(RFAL_ERRORHANDLING_NFC);
  16. rfalSetGT(RFAL_GT_PICOPASS);
  17. rfalSetFDTListen(RFAL_FDT_LISTEN_PICOPASS_POLLER);
  18. rfalSetFDTPoll(RFAL_FDT_POLL_PICOPASS_POLLER);
  19. return ERR_NONE;
  20. }
  21. ReturnCode rfalPicoPassPollerCheckPresence(void) {
  22. ReturnCode ret;
  23. uint8_t txBuf[1] = {RFAL_PICOPASS_CMD_ACTALL};
  24. uint8_t rxBuf[32] = {0};
  25. uint16_t recvLen = 0;
  26. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  27. uint32_t fwt = rfalConvMsTo1fc(20);
  28. ret = rfalTransceiveBlockingTxRx(txBuf, 1, rxBuf, 32, &recvLen, flags, fwt);
  29. return ret;
  30. }
  31. ReturnCode rfalPicoPassPollerIdentify(rfalPicoPassIdentifyRes* idRes) {
  32. ReturnCode ret;
  33. uint8_t txBuf[1] = {RFAL_PICOPASS_CMD_IDENTIFY};
  34. uint16_t recvLen = 0;
  35. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  36. uint32_t fwt = rfalConvMsTo1fc(20);
  37. ret = rfalTransceiveBlockingTxRx(
  38. txBuf,
  39. sizeof(txBuf),
  40. (uint8_t*)idRes,
  41. sizeof(rfalPicoPassIdentifyRes),
  42. &recvLen,
  43. flags,
  44. fwt);
  45. // printf("identify rx: %d %s\n", recvLen, hex2Str(idRes->CSN, RFAL_PICOPASS_UID_LEN));
  46. return ret;
  47. }
  48. ReturnCode rfalPicoPassPollerSelect(uint8_t* csn, rfalPicoPassSelectRes* selRes) {
  49. ReturnCode ret;
  50. rfalPicoPassSelectReq selReq;
  51. selReq.CMD = RFAL_PICOPASS_CMD_SELECT;
  52. ST_MEMCPY(selReq.CSN, csn, RFAL_PICOPASS_UID_LEN);
  53. uint16_t recvLen = 0;
  54. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  55. uint32_t fwt = rfalConvMsTo1fc(20);
  56. ret = rfalTransceiveBlockingTxRx(
  57. (uint8_t*)&selReq,
  58. sizeof(rfalPicoPassSelectReq),
  59. (uint8_t*)selRes,
  60. sizeof(rfalPicoPassSelectRes),
  61. &recvLen,
  62. flags,
  63. fwt);
  64. // printf("select rx: %d %s\n", recvLen, hex2Str(selRes->CSN, RFAL_PICOPASS_UID_LEN));
  65. if(ret == ERR_TIMEOUT) {
  66. return ERR_NONE;
  67. }
  68. return ret;
  69. }
  70. ReturnCode rfalPicoPassPollerReadCheck(rfalPicoPassReadCheckRes* rcRes) {
  71. ReturnCode ret;
  72. uint8_t txBuf[2] = {RFAL_PICOPASS_CMD_READCHECK, 0x02};
  73. uint16_t recvLen = 0;
  74. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  75. uint32_t fwt = rfalConvMsTo1fc(20);
  76. ret = rfalTransceiveBlockingTxRx(
  77. txBuf,
  78. sizeof(txBuf),
  79. (uint8_t*)rcRes,
  80. sizeof(rfalPicoPassReadCheckRes),
  81. &recvLen,
  82. flags,
  83. fwt);
  84. // printf("readcheck rx: %d %s\n", recvLen, hex2Str(rcRes->CCNR, 8));
  85. if(ret == ERR_CRC) {
  86. return ERR_NONE;
  87. }
  88. return ret;
  89. }
  90. ReturnCode rfalPicoPassPollerCheck(uint8_t* mac, rfalPicoPassCheckRes* chkRes) {
  91. ReturnCode ret;
  92. rfalPicoPassCheckReq chkReq;
  93. chkReq.CMD = RFAL_PICOPASS_CMD_CHECK;
  94. ST_MEMCPY(chkReq.mac, mac, 4);
  95. ST_MEMSET(chkReq.null, 0, 4);
  96. uint16_t recvLen = 0;
  97. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  98. uint32_t fwt = rfalConvMsTo1fc(20);
  99. // printf("check tx: %s\n", hex2Str((uint8_t *)&chkReq, sizeof(rfalPicoPassCheckReq)));
  100. ret = rfalTransceiveBlockingTxRx(
  101. (uint8_t*)&chkReq,
  102. sizeof(rfalPicoPassCheckReq),
  103. (uint8_t*)chkRes,
  104. sizeof(rfalPicoPassCheckRes),
  105. &recvLen,
  106. flags,
  107. fwt);
  108. // printf("check rx: %d %s\n", recvLen, hex2Str(chkRes->mac, 4));
  109. if(ret == ERR_CRC) {
  110. return ERR_NONE;
  111. }
  112. return ret;
  113. }
  114. ReturnCode rfalPicoPassPollerReadBlock(uint8_t blockNum, rfalPicoPassReadBlockRes* readRes) {
  115. ReturnCode ret;
  116. uint8_t txBuf[4] = {RFAL_PICOPASS_CMD_READ, 0, 0, 0};
  117. txBuf[1] = blockNum;
  118. uint16_t crc = rfalCrcCalculateCcitt(0xE012, txBuf + 1, 1);
  119. memcpy(txBuf + 2, &crc, sizeof(uint16_t));
  120. uint16_t recvLen = 0;
  121. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  122. uint32_t fwt = rfalConvMsTo1fc(20);
  123. ret = rfalTransceiveBlockingTxRx(
  124. txBuf,
  125. sizeof(txBuf),
  126. (uint8_t*)readRes,
  127. sizeof(rfalPicoPassReadBlockRes),
  128. &recvLen,
  129. flags,
  130. fwt);
  131. return ret;
  132. }