furi_hal_nfc.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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 (512)
  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 void (
  68. *FuriHalNfcTxRxSniffCallback)(uint8_t* data, uint16_t bits, bool crc_dropped, void* context);
  69. typedef struct {
  70. uint8_t tx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  71. uint8_t tx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  72. uint16_t tx_bits;
  73. uint8_t rx_data[FURI_HAL_NFC_DATA_BUFF_SIZE];
  74. uint8_t rx_parity[FURI_HAL_NFC_PARITY_BUFF_SIZE];
  75. uint16_t rx_bits;
  76. FuriHalNfcTxRxType tx_rx_type;
  77. NfcaSignal* nfca_signal;
  78. FuriHalNfcTxRxSniffCallback sniff_tx;
  79. FuriHalNfcTxRxSniffCallback sniff_rx;
  80. void* sniff_context;
  81. } FuriHalNfcTxRxContext;
  82. /** Init nfc
  83. */
  84. void furi_hal_nfc_init();
  85. /** Check if nfc worker is busy
  86. *
  87. * @return true if busy
  88. */
  89. bool furi_hal_nfc_is_busy();
  90. /** NFC field on
  91. */
  92. void furi_hal_nfc_field_on();
  93. /** NFC field off
  94. */
  95. void furi_hal_nfc_field_off();
  96. /** NFC start sleep
  97. */
  98. void furi_hal_nfc_start_sleep();
  99. /** NFC stop sleep
  100. */
  101. void furi_hal_nfc_exit_sleep();
  102. /** NFC poll
  103. *
  104. * @param dev_list pointer to rfalNfcDevice buffer
  105. * @param dev_cnt pointer device count
  106. * @param timeout timeout in ms
  107. * @param deactivate deactivate flag
  108. *
  109. * @return true on success
  110. */
  111. bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout);
  112. /** Activate NFC-A tag
  113. *
  114. * @param timeout timeout in ms
  115. * @param cuid pointer to 32bit uid
  116. *
  117. * @return true on succeess
  118. */
  119. bool furi_hal_nfc_activate_nfca(uint32_t timeout, uint32_t* cuid);
  120. /** NFC listen
  121. *
  122. * @param uid pointer to uid buffer
  123. * @param uid_len uid length
  124. * @param atqa pointer to atqa
  125. * @param sak sak
  126. * @param activate_after_sak activate after sak flag
  127. * @param timeout timeout in ms
  128. *
  129. * @return true on success
  130. */
  131. bool furi_hal_nfc_listen(
  132. uint8_t* uid,
  133. uint8_t uid_len,
  134. uint8_t* atqa,
  135. uint8_t sak,
  136. bool activate_after_sak,
  137. uint32_t timeout);
  138. bool furi_hal_nfc_emulate_nfca(
  139. uint8_t* uid,
  140. uint8_t uid_len,
  141. uint8_t* atqa,
  142. uint8_t sak,
  143. FuriHalNfcEmulateCallback callback,
  144. void* context,
  145. uint32_t timeout);
  146. /** NFC data exchange
  147. *
  148. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  149. *
  150. * @return true on success
  151. */
  152. bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms);
  153. /** NFC data full exhange
  154. *
  155. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  156. *
  157. * @return true on success
  158. */
  159. bool furi_hal_nfc_tx_rx_full(FuriHalNfcTxRxContext* tx_rx);
  160. /** NFC deactivate and start sleep
  161. */
  162. void furi_hal_nfc_sleep();
  163. void furi_hal_nfc_stop();
  164. #ifdef __cplusplus
  165. }
  166. #endif