furi_hal_nfc.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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 (256)
  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_PAR_RX_REMV | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO)
  19. #define FURI_HAL_NFC_TX_DEFAULT_RX_NO_CRC \
  20. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_AUTO | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  21. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_REMV | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO)
  22. #define FURI_HAL_NFC_TXRX_WITH_PAR \
  23. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  24. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_AUTO)
  25. #define FURI_HAL_NFC_TXRX_RAW \
  26. ((uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | \
  27. (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_NONE)
  28. typedef enum {
  29. FuriHalNfcTxRxTypeDefault,
  30. FuriHalNfcTxRxTypeRxNoCrc,
  31. FuriHalNfcTxRxTypeRxKeepPar,
  32. FuriHalNfcTxRxTypeRaw,
  33. } FuriHalNfcTxRxType;
  34. typedef bool (*FuriHalNfcEmulateCallback)(
  35. uint8_t* buff_rx,
  36. uint16_t buff_rx_len,
  37. uint8_t* buff_tx,
  38. uint16_t* buff_tx_len,
  39. uint32_t* flags,
  40. void* context);
  41. typedef enum {
  42. FuriHalNfcTypeA,
  43. FuriHalNfcTypeB,
  44. FuriHalNfcTypeF,
  45. FuriHalNfcTypeV,
  46. } FuriHalNfcType;
  47. typedef enum {
  48. FuriHalNfcInterfaceRf,
  49. FuriHalNfcInterfaceIsoDep,
  50. FuriHalNfcInterfaceNfcDep,
  51. } FuriHalNfcInterface;
  52. typedef struct {
  53. FuriHalNfcType type;
  54. FuriHalNfcInterface interface;
  55. uint8_t uid_len;
  56. uint8_t uid[10];
  57. uint32_t cuid;
  58. uint8_t atqa[2];
  59. uint8_t sak;
  60. } FuriHalNfcDevData;
  61. typedef struct {
  62. uint8_t tx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  63. uint8_t tx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  64. uint16_t tx_bits;
  65. uint8_t rx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  66. uint8_t rx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  67. uint16_t rx_bits;
  68. FuriHalNfcTxRxType tx_rx_type;
  69. } FuriHalNfcTxRxContext;
  70. /** Init nfc
  71. */
  72. void furi_hal_nfc_init();
  73. /** Check if nfc worker is busy
  74. *
  75. * @return true if busy
  76. */
  77. bool furi_hal_nfc_is_busy();
  78. /** NFC field on
  79. */
  80. void furi_hal_nfc_field_on();
  81. /** NFC field off
  82. */
  83. void furi_hal_nfc_field_off();
  84. /** NFC start sleep
  85. */
  86. void furi_hal_nfc_start_sleep();
  87. /** NFC stop sleep
  88. */
  89. void furi_hal_nfc_exit_sleep();
  90. /** NFC poll
  91. *
  92. * @param dev_list pointer to rfalNfcDevice buffer
  93. * @param dev_cnt pointer device count
  94. * @param timeout timeout in ms
  95. * @param deactivate deactivate flag
  96. *
  97. * @return true on success
  98. */
  99. bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout);
  100. /** Activate NFC-A tag
  101. *
  102. * @param timeout timeout in ms
  103. * @param cuid pointer to 32bit uid
  104. *
  105. * @return true on succeess
  106. */
  107. bool furi_hal_nfc_activate_nfca(uint32_t timeout, uint32_t* cuid);
  108. /** NFC listen
  109. *
  110. * @param uid pointer to uid buffer
  111. * @param uid_len uid length
  112. * @param atqa pointer to atqa
  113. * @param sak sak
  114. * @param activate_after_sak activate after sak flag
  115. * @param timeout timeout in ms
  116. *
  117. * @return true on success
  118. */
  119. bool furi_hal_nfc_listen(
  120. uint8_t* uid,
  121. uint8_t uid_len,
  122. uint8_t* atqa,
  123. uint8_t sak,
  124. bool activate_after_sak,
  125. uint32_t timeout);
  126. bool furi_hal_nfc_emulate_nfca(
  127. uint8_t* uid,
  128. uint8_t uid_len,
  129. uint8_t* atqa,
  130. uint8_t sak,
  131. FuriHalNfcEmulateCallback callback,
  132. void* context,
  133. uint32_t timeout);
  134. /** NFC data exchange
  135. *
  136. * @param tx_buff transmit buffer
  137. * @param tx_len transmit buffer length
  138. * @param rx_buff receive buffer
  139. * @param rx_len receive buffer length
  140. * @param deactivate deactivate flag
  141. *
  142. * @return ST ReturnCode
  143. */
  144. ReturnCode furi_hal_nfc_data_exchange(
  145. uint8_t* tx_buff,
  146. uint16_t tx_len,
  147. uint8_t** rx_buff,
  148. uint16_t** rx_len,
  149. bool deactivate);
  150. /** NFC data exchange
  151. *
  152. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  153. *
  154. * @return true on success
  155. */
  156. bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms);
  157. /** NFC data full exhange
  158. *
  159. * @param tx_buff transmit buffer
  160. * @param tx_len transmit buffer length
  161. * @param rx_buff receive buffer
  162. * @param rx_cap receive buffer capacity
  163. * @param rx_len receive buffer length
  164. *
  165. * @return ST ReturnCode
  166. */
  167. ReturnCode furi_hal_nfc_exchange_full(
  168. uint8_t* tx_buff,
  169. uint16_t tx_len,
  170. uint8_t* rx_buff,
  171. uint16_t rx_cap,
  172. uint16_t* rx_len);
  173. /** NFC deactivate and start sleep
  174. */
  175. void furi_hal_nfc_sleep();
  176. void furi_hal_nfc_stop();
  177. #ifdef __cplusplus
  178. }
  179. #endif