furi_hal_nfc.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. /**
  2. * @file furi_hal_nfc.h
  3. * NFC HAL API
  4. */
  5. #pragma once
  6. #include <st_errno.h>
  7. #include <stdbool.h>
  8. #include <stdint.h>
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. #include <rfal_nfc.h>
  13. #include <lib/nfc/protocols/nfca.h>
  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. /** Deinit nfc
  86. */
  87. void furi_hal_nfc_deinit();
  88. /** Check if nfc worker is busy
  89. *
  90. * @return true if busy
  91. */
  92. bool furi_hal_nfc_is_busy();
  93. /** Check if nfc is initialized
  94. *
  95. * @return true if initialized
  96. */
  97. bool furi_hal_nfc_is_init();
  98. /** NFC field on
  99. */
  100. void furi_hal_nfc_field_on();
  101. /** NFC field off
  102. */
  103. void furi_hal_nfc_field_off();
  104. /** NFC start sleep
  105. */
  106. void furi_hal_nfc_start_sleep();
  107. void furi_hal_nfc_stop_cmd();
  108. /** NFC stop sleep
  109. */
  110. void furi_hal_nfc_exit_sleep();
  111. /** NFC poll
  112. *
  113. * @param dev_list pointer to rfalNfcDevice buffer
  114. * @param dev_cnt pointer device count
  115. * @param timeout timeout in ms
  116. * @param deactivate deactivate flag
  117. *
  118. * @return true on success
  119. */
  120. bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout);
  121. /** Activate NFC-A tag
  122. *
  123. * @param timeout timeout in ms
  124. * @param cuid pointer to 32bit uid
  125. *
  126. * @return true on succeess
  127. */
  128. bool furi_hal_nfc_activate_nfca(uint32_t timeout, uint32_t* cuid);
  129. /** NFC listen
  130. *
  131. * @param uid pointer to uid buffer
  132. * @param uid_len uid length
  133. * @param atqa pointer to atqa
  134. * @param sak sak
  135. * @param activate_after_sak activate after sak flag
  136. * @param timeout timeout in ms
  137. *
  138. * @return true on success
  139. */
  140. bool furi_hal_nfc_listen(
  141. uint8_t* uid,
  142. uint8_t uid_len,
  143. uint8_t* atqa,
  144. uint8_t sak,
  145. bool activate_after_sak,
  146. uint32_t timeout);
  147. /** Start Target Listen mode
  148. * @note RFAL free implementation
  149. *
  150. * @param nfc_data FuriHalNfcDevData instance
  151. */
  152. void furi_hal_nfc_listen_start(FuriHalNfcDevData* nfc_data);
  153. /** Read data in Target Listen mode
  154. * @note Must be called only after furi_hal_nfc_listen_start()
  155. *
  156. * @param tx_rx FuriHalNfcTxRxContext instance
  157. * @param timeout_ms timeout im ms
  158. *
  159. * @return true on not empty receive
  160. */
  161. bool furi_hal_nfc_listen_rx(FuriHalNfcTxRxContext* tx_rx, uint32_t timeout_ms);
  162. /** Set Target in Sleep state */
  163. void furi_hal_nfc_listen_sleep();
  164. /** Emulate NFC-A Target
  165. * @note RFAL based implementation
  166. *
  167. * @param uid NFC-A UID
  168. * @param uid_len NFC-A UID length
  169. * @param atqa NFC-A ATQA
  170. * @param sak NFC-A SAK
  171. * @param callback FuriHalNfcEmulateCallback instance
  172. * @param context pointer to context for callback
  173. * @param timeout timeout in ms
  174. *
  175. * @return true on success
  176. */
  177. bool furi_hal_nfc_emulate_nfca(
  178. uint8_t* uid,
  179. uint8_t uid_len,
  180. uint8_t* atqa,
  181. uint8_t sak,
  182. FuriHalNfcEmulateCallback callback,
  183. void* context,
  184. uint32_t timeout);
  185. /** NFC data exchange
  186. *
  187. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  188. *
  189. * @return true on success
  190. */
  191. bool furi_hal_nfc_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_t timeout_ms);
  192. /** NFC data full exhange
  193. *
  194. * @param tx_rx_ctx FuriHalNfcTxRxContext instance
  195. *
  196. * @return true on success
  197. */
  198. bool furi_hal_nfc_tx_rx_full(FuriHalNfcTxRxContext* tx_rx);
  199. /** NFC deactivate and start sleep
  200. */
  201. void furi_hal_nfc_sleep();
  202. void furi_hal_nfc_stop();
  203. /* Low level transport API, use it to implement your own transport layers */
  204. #define furi_hal_nfc_ll_ms2fc rfalConvMsTo1fc
  205. #define FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL RFAL_TXRX_FLAGS_CRC_TX_MANUAL
  206. #define FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON RFAL_TXRX_FLAGS_AGC_ON
  207. #define FURI_HAL_NFC_LL_TXRX_FLAGS_PAR_RX_REMV RFAL_TXRX_FLAGS_PAR_RX_REMV
  208. #define FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP RFAL_TXRX_FLAGS_CRC_RX_KEEP
  209. typedef enum {
  210. FuriHalNfcReturnOk = 0, /*!< no error occurred */
  211. FuriHalNfcReturnNomem = 1, /*!< not enough memory to perform the requested operation */
  212. FuriHalNfcReturnBusy = 2, /*!< device or resource busy */
  213. FuriHalNfcReturnIo = 3, /*!< generic IO error */
  214. FuriHalNfcReturnTimeout = 4, /*!< error due to timeout */
  215. FuriHalNfcReturnRequest =
  216. 5, /*!< invalid request or requested function can't be executed at the moment */
  217. FuriHalNfcReturnNomsg = 6, /*!< No message of desired type */
  218. FuriHalNfcReturnParam = 7, /*!< Parameter error */
  219. FuriHalNfcReturnSystem = 8, /*!< System error */
  220. FuriHalNfcReturnFraming = 9, /*!< Framing error */
  221. FuriHalNfcReturnOverrun = 10, /*!< lost one or more received bytes */
  222. FuriHalNfcReturnProto = 11, /*!< protocol error */
  223. FuriHalNfcReturnInternal = 12, /*!< Internal Error */
  224. FuriHalNfcReturnAgain = 13, /*!< Call again */
  225. FuriHalNfcReturnMemCorrupt = 14, /*!< memory corruption */
  226. FuriHalNfcReturnNotImplemented = 15, /*!< not implemented */
  227. FuriHalNfcReturnPcCorrupt =
  228. 16, /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */
  229. FuriHalNfcReturnSend = 17, /*!< error sending*/
  230. FuriHalNfcReturnIgnore = 18, /*!< indicates error detected but to be ignored */
  231. FuriHalNfcReturnSemantic = 19, /*!< indicates error in state machine (unexpected cmd) */
  232. FuriHalNfcReturnSyntax = 20, /*!< indicates error in state machine (unknown cmd) */
  233. FuriHalNfcReturnCrc = 21, /*!< crc error */
  234. FuriHalNfcReturnNotfound = 22, /*!< transponder not found */
  235. FuriHalNfcReturnNotunique =
  236. 23, /*!< transponder not unique - more than one transponder in field */
  237. FuriHalNfcReturnNotsupp = 24, /*!< requested operation not supported */
  238. FuriHalNfcReturnWrite = 25, /*!< write error */
  239. FuriHalNfcReturnFifo = 26, /*!< fifo over or underflow error */
  240. FuriHalNfcReturnPar = 27, /*!< parity error */
  241. FuriHalNfcReturnDone = 28, /*!< transfer has already finished */
  242. FuriHalNfcReturnRfCollision =
  243. 29, /*!< collision error (Bit Collision or during RF Collision avoidance ) */
  244. FuriHalNfcReturnHwOverrun = 30, /*!< lost one or more received bytes */
  245. FuriHalNfcReturnReleaseReq = 31, /*!< device requested release */
  246. FuriHalNfcReturnSleepReq = 32, /*!< device requested sleep */
  247. FuriHalNfcReturnWrongState = 33, /*!< incorrent state for requested operation */
  248. FuriHalNfcReturnMaxReruns = 34, /*!< blocking procedure reached maximum runs */
  249. FuriHalNfcReturnDisabled = 35, /*!< operation aborted due to disabled configuration */
  250. FuriHalNfcReturnHwMismatch = 36, /*!< expected hw do not match */
  251. FuriHalNfcReturnLinkLoss =
  252. 37, /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */
  253. FuriHalNfcReturnInvalidHandle = 38, /*!< invalid or not initalized device handle */
  254. FuriHalNfcReturnIncompleteByte = 40, /*!< Incomplete byte rcvd */
  255. FuriHalNfcReturnIncompleteByte01 = 41, /*!< Incomplete byte rcvd - 1 bit */
  256. FuriHalNfcReturnIncompleteByte02 = 42, /*!< Incomplete byte rcvd - 2 bit */
  257. FuriHalNfcReturnIncompleteByte03 = 43, /*!< Incomplete byte rcvd - 3 bit */
  258. FuriHalNfcReturnIncompleteByte04 = 44, /*!< Incomplete byte rcvd - 4 bit */
  259. FuriHalNfcReturnIncompleteByte05 = 45, /*!< Incomplete byte rcvd - 5 bit */
  260. FuriHalNfcReturnIncompleteByte06 = 46, /*!< Incomplete byte rcvd - 6 bit */
  261. FuriHalNfcReturnIncompleteByte07 = 47, /*!< Incomplete byte rcvd - 7 bit */
  262. } FuriHalNfcReturn;
  263. typedef enum {
  264. FuriHalNfcModeNone = 0, /*!< No mode selected/defined */
  265. FuriHalNfcModePollNfca = 1, /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD) */
  266. FuriHalNfcModePollNfcaT1t = 2, /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD) */
  267. FuriHalNfcModePollNfcb = 3, /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD) */
  268. FuriHalNfcModePollBPrime = 4, /*!< Mode to perform as B' Calypso (Innovatron) (PCD) */
  269. FuriHalNfcModePollBCts = 5, /*!< Mode to perform as CTS Poller (PCD) */
  270. FuriHalNfcModePollNfcf = 6, /*!< Mode to perform as NFCF (FeliCa) Poller (PCD) */
  271. FuriHalNfcModePollNfcv = 7, /*!< Mode to perform as NFCV (ISO15963) Poller (PCD) */
  272. FuriHalNfcModePollPicopass = 8, /*!< Mode to perform as PicoPass / iClass Poller (PCD) */
  273. FuriHalNfcModePollActiveP2p = 9, /*!< Mode to perform as Active P2P (ISO18092) Initiator */
  274. FuriHalNfcModeListenNfca = 10, /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC) */
  275. FuriHalNfcModeListenNfcb = 11, /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC) */
  276. FuriHalNfcModeListenNfcf = 12, /*!< Mode to perform as NFCA (ISO15963) Listener (PICC) */
  277. FuriHalNfcModeListenActiveP2p = 13 /*!< Mode to perform as Active P2P (ISO18092) Target */
  278. } FuriHalNfcMode;
  279. typedef enum {
  280. FuriHalNfcBitrate106 = 0, /*!< Bit Rate 106 kbit/s (fc/128) */
  281. FuriHalNfcBitrate212 = 1, /*!< Bit Rate 212 kbit/s (fc/64) */
  282. FuriHalNfcBitrate424 = 2, /*!< Bit Rate 424 kbit/s (fc/32) */
  283. FuriHalNfcBitrate848 = 3, /*!< Bit Rate 848 kbit/s (fc/16) */
  284. FuriHalNfcBitrate1695 = 4, /*!< Bit Rate 1695 kbit/s (fc/8) */
  285. FuriHalNfcBitrate3390 = 5, /*!< Bit Rate 3390 kbit/s (fc/4) */
  286. FuriHalNfcBitrate6780 = 6, /*!< Bit Rate 6780 kbit/s (fc/2) */
  287. FuriHalNfcBitrate13560 = 7, /*!< Bit Rate 13560 kbit/s (fc) */
  288. FuriHalNfcBitrate52p97 = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */
  289. FuriHalNfcBitrate26p48 =
  290. 0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */
  291. FuriHalNfcBitrate1p66 = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */
  292. FuriHalNfcBitrateKeep = 0xFF /*!< Value indicating to keep the same previous bit rate */
  293. } FuriHalNfcBitrate;
  294. FuriHalNfcReturn
  295. furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate txBR, FuriHalNfcBitrate rxBR);
  296. #define FURI_HAL_NFC_LL_GT_NFCA furi_hal_nfc_ll_ms2fc(5U) /*!< GTA Digital 2.0 6.10.4.1 & B.2 */
  297. #define FURI_HAL_NFC_LL_GT_NFCB furi_hal_nfc_ll_ms2fc(5U) /*!< GTB Digital 2.0 7.9.4.1 & B.3 */
  298. #define FURI_HAL_NFC_LL_GT_NFCF furi_hal_nfc_ll_ms2fc(20U) /*!< GTF Digital 2.0 8.7.4.1 & B.4 */
  299. #define FURI_HAL_NFC_LL_GT_NFCV furi_hal_nfc_ll_ms2fc(5U) /*!< GTV Digital 2.0 9.7.5.1 & B.5 */
  300. #define FURI_HAL_NFC_LL_GT_PICOPASS furi_hal_nfc_ll_ms2fc(1U) /*!< GT Picopass */
  301. #define FURI_HAL_NFC_LL_GT_AP2P furi_hal_nfc_ll_ms2fc(5U) /*!< TIRFG Ecma 340 11.1.1 */
  302. #define FURI_HAL_NFC_LL_GT_AP2P_ADJUSTED \
  303. furi_hal_nfc_ll_ms2fc( \
  304. 5U + \
  305. 25U) /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2) */
  306. void furi_hal_nfc_ll_set_guard_time(uint32_t cycles);
  307. typedef enum {
  308. FuriHalNfcErrorHandlingNone = 0, /*!< No special error handling will be performed */
  309. FuriHalNfcErrorHandlingNfc = 1, /*!< Error handling set to perform as NFC compliant device */
  310. FuriHalNfcErrorHandlingEmvco =
  311. 2 /*!< Error handling set to perform as EMVCo compliant device */
  312. } FuriHalNfcErrorHandling;
  313. void furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandling eHandling);
  314. /* RFAL Frame Delay Time (FDT) Listen default values */
  315. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER \
  316. 1172U /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1 6.10 ; EMV CCP Spec Book D v2.01 4.8.1.3 */
  317. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_POLLER \
  318. 1008U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
  319. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_POLLER \
  320. 2672U /*!< TR0F,LISTEN,MIN Digital 1.1 8.7.1.1 & A.4 */
  321. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCV_POLLER \
  322. 4310U /*!< FDTV,LISTEN,MIN t1 min Digital 2.1 B.5 ; ISO15693-3 2009 9.1 */
  323. #define FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER \
  324. 3400U /*!< ISO15693 t1 min - observed adjustment */
  325. #define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_POLLER \
  326. 64U /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance */
  327. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_LISTENER 1172U /*!< FDTA,LISTEN,MIN Digital 1.1 6.10 */
  328. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_LISTENER \
  329. 1024U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
  330. #define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_LISTENER \
  331. 2688U /*!< TR0F,LISTEN,MIN Digital 2.1 8.7.1.1 & B.4 */
  332. #define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_LISTENER \
  333. 64U /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance */
  334. void furi_hal_nfc_ll_set_fdt_listen(uint32_t cycles);
  335. /* RFAL Frame Delay Time (FDT) Poll default values */
  336. #define FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER \
  337. 6780U /*!< FDTA,POLL,MIN Digital 1.1 6.10.3.1 & A.2 */
  338. #define FURI_HAL_NFC_LL_FDT_POLL_NFCA_T1T_POLLER \
  339. 384U /*!< RRDDT1T,MIN,B1 Digital 1.1 10.7.1 & A.5 */
  340. #define FURI_HAL_NFC_LL_FDT_POLL_NFCB_POLLER \
  341. 6780U /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 ; EMVCo 3.0 FDTB,PCD,MIN Table A.5 */
  342. #define FURI_HAL_NFC_LL_FDT_POLL_NFCF_POLLER 6800U /*!< FDTF,POLL,MIN Digital 2.1 8.7.3 & B.4 */
  343. #define FURI_HAL_NFC_LL_FDT_POLL_NFCV_POLLER 4192U /*!< FDTV,POLL Digital 2.1 9.7.3.1 & B.5 */
  344. #define FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER 1790U /*!< FDT Max */
  345. #define FURI_HAL_NFC_LL_FDT_POLL_AP2P_POLLER \
  346. 0U /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance */
  347. void furi_hal_nfc_ll_set_fdt_poll(uint32_t FDTPoll);
  348. void furi_hal_nfc_ll_txrx_on();
  349. void furi_hal_nfc_ll_txrx_off();
  350. // TODO rework all pollers with furi_hal_nfc_ll_txrx_bits
  351. FuriHalNfcReturn furi_hal_nfc_ll_txrx(
  352. uint8_t* txBuf,
  353. uint16_t txBufLen,
  354. uint8_t* rxBuf,
  355. uint16_t rxBufLen,
  356. uint16_t* actLen,
  357. uint32_t flags,
  358. uint32_t fwt);
  359. FuriHalNfcReturn furi_hal_nfc_ll_txrx_bits(
  360. uint8_t* txBuf,
  361. uint16_t txBufLen,
  362. uint8_t* rxBuf,
  363. uint16_t rxBufLen,
  364. uint16_t* actLen,
  365. uint32_t flags,
  366. uint32_t fwt);
  367. void furi_hal_nfc_ll_poll();
  368. #ifdef __cplusplus
  369. }
  370. #endif