furi_hal_nfc.h 5.3 KB

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