rfal_picopass.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "seader_i.h"
  2. #define RFAL_PICOPASS_TXRX_FLAGS \
  3. (FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON | \
  4. FURI_HAL_NFC_LL_TXRX_FLAGS_PAR_RX_REMV | FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP)
  5. #define TAG "RFAL_PICOPASS"
  6. typedef struct {
  7. uint8_t CMD;
  8. uint8_t CSN[RFAL_PICOPASS_UID_LEN];
  9. } rfalPicoPassSelectReq;
  10. FuriHalNfcReturn rfalPicoPassPollerInitialize(void) {
  11. FuriHalNfcReturn ret;
  12. ret = furi_hal_nfc_ll_set_mode(
  13. FuriHalNfcModePollPicopass, FuriHalNfcBitrate26p48, FuriHalNfcBitrate26p48);
  14. if(ret != FuriHalNfcReturnOk) {
  15. return ret;
  16. };
  17. furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandlingNfc);
  18. furi_hal_nfc_ll_set_guard_time(FURI_HAL_NFC_LL_GT_PICOPASS);
  19. furi_hal_nfc_ll_set_fdt_listen(FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER);
  20. furi_hal_nfc_ll_set_fdt_poll(FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER);
  21. return FuriHalNfcReturnOk;
  22. }
  23. FuriHalNfcReturn rfalPicoPassPollerCheckPresence(void) {
  24. FuriHalNfcReturn ret;
  25. uint8_t txBuf[1] = {RFAL_PICOPASS_CMD_ACTALL};
  26. uint8_t rxBuf[32] = {0};
  27. uint16_t recvLen = 0;
  28. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  29. uint32_t fwt = furi_hal_nfc_ll_ms2fc(20);
  30. ret = furi_hal_nfc_ll_txrx(txBuf, 1, rxBuf, 32, &recvLen, flags, fwt);
  31. return ret;
  32. }
  33. FuriHalNfcReturn rfalPicoPassPollerIdentify(rfalPicoPassIdentifyRes* idRes) {
  34. FuriHalNfcReturn ret;
  35. uint8_t txBuf[1] = {RFAL_PICOPASS_CMD_IDENTIFY};
  36. uint16_t recvLen = 0;
  37. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  38. uint32_t fwt = furi_hal_nfc_ll_ms2fc(20);
  39. ret = furi_hal_nfc_ll_txrx(
  40. txBuf,
  41. sizeof(txBuf),
  42. (uint8_t*)idRes,
  43. sizeof(rfalPicoPassIdentifyRes),
  44. &recvLen,
  45. flags,
  46. fwt);
  47. // printf("identify rx: %d %s\n", recvLen, hex2Str(idRes->CSN, RFAL_PICOPASS_UID_LEN));
  48. return ret;
  49. }
  50. FuriHalNfcReturn rfalPicoPassPollerSelect(uint8_t* csn, rfalPicoPassSelectRes* selRes) {
  51. FuriHalNfcReturn ret;
  52. rfalPicoPassSelectReq selReq;
  53. selReq.CMD = RFAL_PICOPASS_CMD_SELECT;
  54. memcpy(selReq.CSN, csn, RFAL_PICOPASS_UID_LEN);
  55. uint16_t recvLen = 0;
  56. uint32_t flags = RFAL_PICOPASS_TXRX_FLAGS;
  57. uint32_t fwt = furi_hal_nfc_ll_ms2fc(20);
  58. ret = furi_hal_nfc_ll_txrx(
  59. (uint8_t*)&selReq,
  60. sizeof(rfalPicoPassSelectReq),
  61. (uint8_t*)selRes,
  62. sizeof(rfalPicoPassSelectRes),
  63. &recvLen,
  64. flags,
  65. fwt);
  66. // printf("select rx: %d %s\n", recvLen, hex2Str(selRes->CSN, RFAL_PICOPASS_UID_LEN));
  67. if(ret == FuriHalNfcReturnTimeout) {
  68. return FuriHalNfcReturnOk;
  69. }
  70. return ret;
  71. }