furi_hal_nfc.h 5.6 KB

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