furi_hal_nfc.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. * @file furi_hal_nfc.h
  3. * NFC HAL API
  4. */
  5. #pragma once
  6. #include <rfal_nfc.h>
  7. #include <st_errno.h>
  8. #include <stdbool.h>
  9. #include <stdint.h>
  10. #ifdef __cplusplus
  11. extern "C" {
  12. #endif
  13. #define FURI_HAL_NFC_UID_MAX_LEN 10
  14. #define FURI_HAL_NFC_DATA_BUFF_SIZE (64)
  15. #define FURI_HAL_NFC_PARITY_BUFF_SIZE (FURI_HAL_NFC_DATA_BUFF_SIZE / 8)
  16. #define FURI_HAL_NFC_TXRX_DEFAULT \
  17. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_AUTO | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_REMV | \
  18. (uint32_t)RFAL_TXRX_FLAGS_NFCIP1_OFF | (uint32_t)RFAL_TXRX_FLAGS_AGC_ON | \
  19. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_REMV | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO | \
  20. (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO)
  21. #define FURI_HAL_NFC_TX_DEFAULT_RX_NO_CRC \
  22. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_AUTO | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  23. (uint32_t)RFAL_TXRX_FLAGS_NFCIP1_OFF | (uint32_t)RFAL_TXRX_FLAGS_AGC_ON | \
  24. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_REMV | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO | \
  25. (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO)
  26. #define FURI_HAL_NFC_TXRX_WITH_PAR \
  27. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  28. (uint32_t)RFAL_TXRX_FLAGS_NFCIP1_OFF | (uint32_t)RFAL_TXRX_FLAGS_AGC_ON | \
  29. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO | \
  30. (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO)
  31. #define FURI_HAL_NFC_TXRX_RAW \
  32. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  33. (uint32_t)RFAL_TXRX_FLAGS_NFCIP1_OFF | (uint32_t)RFAL_TXRX_FLAGS_AGC_ON | \
  34. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_NONE | \
  35. (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO)
  36. typedef bool (*FuriHalNfcEmulateCallback)(
  37. uint8_t* buff_rx,
  38. uint16_t buff_rx_len,
  39. uint8_t* buff_tx,
  40. uint16_t* buff_tx_len,
  41. uint32_t* flags,
  42. void* context);
  43. typedef struct {
  44. uint8_t tx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  45. uint8_t tx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  46. uint16_t tx_bits;
  47. uint8_t rx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  48. uint8_t rx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  49. uint16_t rx_bits;
  50. uint32_t tx_rx_type;
  51. } FuriHalNfcTxRxContext;
  52. /** Init nfc
  53. */
  54. void furi_hal_nfc_init();
  55. /** Check if nfc worker is busy
  56. *
  57. * @return true if busy
  58. */
  59. bool furi_hal_nfc_is_busy();
  60. /** NFC field on
  61. */
  62. void furi_hal_nfc_field_on();
  63. /** NFC field off
  64. */
  65. void furi_hal_nfc_field_off();
  66. /** NFC start sleep
  67. */
  68. void furi_hal_nfc_start_sleep();
  69. /** NFC stop sleep
  70. */
  71. void furi_hal_nfc_exit_sleep();
  72. /** NFC poll
  73. *
  74. * @param dev_list pointer to rfalNfcDevice buffer
  75. * @param dev_cnt pointer device count
  76. * @param timeout timeout in ms
  77. * @param deactivate deactivate flag
  78. *
  79. * @return true on success
  80. */
  81. bool furi_hal_nfc_detect(
  82. rfalNfcDevice** dev_list,
  83. uint8_t* dev_cnt,
  84. uint32_t timeout,
  85. bool deactivate);
  86. /** Activate NFC-A tag
  87. *
  88. * @param timeout timeout in ms
  89. * @param cuid pointer to 32bit uid
  90. *
  91. * @return true on succeess
  92. */
  93. bool furi_hal_nfc_activate_nfca(uint32_t timeout, uint32_t* cuid);
  94. /** NFC listen
  95. *
  96. * @param uid pointer to uid buffer
  97. * @param uid_len uid length
  98. * @param atqa pointer to atqa
  99. * @param sak sak
  100. * @param activate_after_sak activate after sak flag
  101. * @param timeout timeout in ms
  102. *
  103. * @return true on success
  104. */
  105. bool furi_hal_nfc_listen(
  106. uint8_t* uid,
  107. uint8_t uid_len,
  108. uint8_t* atqa,
  109. uint8_t sak,
  110. bool activate_after_sak,
  111. uint32_t timeout);
  112. bool furi_hal_nfc_emulate_nfca(
  113. uint8_t* uid,
  114. uint8_t uid_len,
  115. uint8_t* atqa,
  116. uint8_t sak,
  117. FuriHalNfcEmulateCallback callback,
  118. void* context,
  119. uint32_t timeout);
  120. /** Get first command from reader after activation in emulation mode
  121. *
  122. * @param rx_buff pointer to receive buffer
  123. * @param rx_len receive buffer length
  124. *
  125. * @return true on success
  126. */
  127. bool furi_hal_nfc_get_first_frame(uint8_t** rx_buff, uint16_t** rx_len);
  128. /** NFC data exchange
  129. *
  130. * @param tx_buff transmit buffer
  131. * @param tx_len transmit buffer length
  132. * @param rx_buff receive buffer
  133. * @param rx_len receive buffer length
  134. * @param deactivate deactivate flag
  135. *
  136. * @return ST ReturnCode
  137. */
  138. ReturnCode furi_hal_nfc_data_exchange(
  139. uint8_t* tx_buff,
  140. uint16_t tx_len,
  141. uint8_t** rx_buff,
  142. uint16_t** rx_len,
  143. bool deactivate);
  144. /** NFC data exchange
  145. *
  146. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  147. *
  148. * @return true on success
  149. */
  150. bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx_ctx);
  151. /** NFC deactivate and start sleep
  152. */
  153. void furi_hal_nfc_deactivate();
  154. void furi_hal_nfc_stop();
  155. #ifdef __cplusplus
  156. }
  157. #endif