rfal_nfc.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /******************************************************************************
  2. * \attention
  3. *
  4. * <h2><center>&copy; COPYRIGHT 2020 STMicroelectronics</center></h2>
  5. *
  6. * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
  7. * You may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at:
  9. *
  10. * www.st.com/myliberty
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
  15. * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. *
  20. ******************************************************************************/
  21. /*
  22. * PROJECT: ST25R391x firmware
  23. * Revision:
  24. * LANGUAGE: ISO C99
  25. */
  26. /*! \file rfal_nfc.h
  27. *
  28. * \brief RFAL NFC device
  29. *
  30. * This module provides the required features to behave as an NFC Poller
  31. * or Listener device. It grants an easy to use interface for the following
  32. * activities: Technology Detection, Collision Resolution, Activation,
  33. * Data Exchange, and Deactivation
  34. *
  35. * This layer is influenced by (but not fully aligned with) the NFC Forum
  36. * specifications, in particular: Activity 2.0 and NCI 2.0
  37. *
  38. *
  39. *
  40. * \addtogroup RFAL
  41. * @{
  42. *
  43. * \addtogroup RFAL-HL
  44. * \brief RFAL Higher Layer
  45. * @{
  46. *
  47. * \addtogroup NFC
  48. * \brief RFAL NFC Device
  49. * @{
  50. *
  51. */
  52. #ifndef RFAL_NFC_H
  53. #define RFAL_NFC_H
  54. /*
  55. ******************************************************************************
  56. * INCLUDES
  57. ******************************************************************************
  58. */
  59. #include "platform.h"
  60. #include "st_errno.h"
  61. #include "rfal_rf.h"
  62. #include "rfal_nfca.h"
  63. #include "rfal_nfcb.h"
  64. #include "rfal_nfcf.h"
  65. #include "rfal_nfcv.h"
  66. #include "rfal_st25tb.h"
  67. #include "rfal_nfcDep.h"
  68. #include "rfal_isoDep.h"
  69. /*
  70. ******************************************************************************
  71. * GLOBAL DEFINES
  72. ******************************************************************************
  73. */
  74. #define RFAL_NFC_TECH_NONE 0x0000U /*!< No technology */
  75. #define RFAL_NFC_POLL_TECH_A 0x0001U /*!< NFC-A technology Flag */
  76. #define RFAL_NFC_POLL_TECH_B 0x0002U /*!< NFC-B technology Flag */
  77. #define RFAL_NFC_POLL_TECH_F 0x0004U /*!< NFC-F technology Flag */
  78. #define RFAL_NFC_POLL_TECH_V 0x0008U /*!< NFC-V technology Flag */
  79. #define RFAL_NFC_POLL_TECH_AP2P 0x0010U /*!< AP2P technology Flag */
  80. #define RFAL_NFC_POLL_TECH_ST25TB 0x0020U /*!< ST25TB technology Flag */
  81. #define RFAL_NFC_LISTEN_TECH_A 0x1000U /*!< NFC-V technology Flag */
  82. #define RFAL_NFC_LISTEN_TECH_B 0x2000U /*!< NFC-V technology Flag */
  83. #define RFAL_NFC_LISTEN_TECH_F 0x4000U /*!< NFC-V technology Flag */
  84. #define RFAL_NFC_LISTEN_TECH_AP2P 0x8000U /*!< NFC-V technology Flag */
  85. /*
  86. ******************************************************************************
  87. * GLOBAL MACROS
  88. ******************************************************************************
  89. */
  90. /*! Checks if a device is currently activated */
  91. #define rfalNfcIsDevActivated( st ) ( ((st)>= RFAL_NFC_STATE_ACTIVATED) && ((st)<RFAL_NFC_STATE_DEACTIVATION) )
  92. /*! Checks if a device is in discovery */
  93. #define rfalNfcIsInDiscovery( st ) ( ((st)>= RFAL_NFC_STATE_START_DISCOVERY) && ((st)<RFAL_NFC_STATE_ACTIVATED) )
  94. /*! Checks if remote device is in Poll mode */
  95. #define rfalNfcIsRemDevPoller( tp ) ( ((tp)>= RFAL_NFC_POLL_TYPE_NFCA) && ((tp)<=RFAL_NFC_POLL_TYPE_AP2P ) )
  96. /*! Checks if remote device is in Listen mode */
  97. #define rfalNfcIsRemDevListener( tp ) ( ((int16_t)(tp)>= (int16_t)RFAL_NFC_LISTEN_TYPE_NFCA) && ((tp)<=RFAL_NFC_LISTEN_TYPE_AP2P) )
  98. /*
  99. ******************************************************************************
  100. * GLOBAL ENUMS
  101. ******************************************************************************
  102. */
  103. /*
  104. ******************************************************************************
  105. * GLOBAL TYPES
  106. ******************************************************************************
  107. */
  108. /*! Main state */
  109. typedef enum{
  110. RFAL_NFC_STATE_NOTINIT = 0, /*!< Not Initialized state */
  111. RFAL_NFC_STATE_IDLE = 1, /*!< Initialize state */
  112. RFAL_NFC_STATE_START_DISCOVERY = 2, /*!< Start Discovery loop state */
  113. RFAL_NFC_STATE_WAKEUP_MODE = 3, /*!< Wake-Up state */
  114. RFAL_NFC_STATE_POLL_TECHDETECT = 10, /*!< Technology Detection state */
  115. RFAL_NFC_STATE_POLL_COLAVOIDANCE = 11, /*!< Collision Avoidance state */
  116. RFAL_NFC_STATE_POLL_SELECT = 12, /*!< Wait for Selection state */
  117. RFAL_NFC_STATE_POLL_ACTIVATION = 13, /*!< Activation state */
  118. RFAL_NFC_STATE_LISTEN_TECHDETECT = 20, /*!< Listen Tech Detect */
  119. RFAL_NFC_STATE_LISTEN_COLAVOIDANCE = 21, /*!< Listen Collision Avoidance */
  120. RFAL_NFC_STATE_LISTEN_ACTIVATION = 22, /*!< Listen Activation state */
  121. RFAL_NFC_STATE_LISTEN_SLEEP = 23, /*!< Listen Sleep state */
  122. RFAL_NFC_STATE_ACTIVATED = 30, /*!< Activated state */
  123. RFAL_NFC_STATE_DATAEXCHANGE = 31, /*!< Data Exchange Start state */
  124. RFAL_NFC_STATE_DATAEXCHANGE_DONE = 33, /*!< Data Exchange terminated */
  125. RFAL_NFC_STATE_DEACTIVATION = 34 /*!< Deactivation state */
  126. }rfalNfcState;
  127. /*! Device type */
  128. typedef enum{
  129. RFAL_NFC_LISTEN_TYPE_NFCA = 0, /*!< NFC-A Listener device type */
  130. RFAL_NFC_LISTEN_TYPE_NFCB = 1, /*!< NFC-B Listener device type */
  131. RFAL_NFC_LISTEN_TYPE_NFCF = 2, /*!< NFC-F Listener device type */
  132. RFAL_NFC_LISTEN_TYPE_NFCV = 3, /*!< NFC-V Listener device type */
  133. RFAL_NFC_LISTEN_TYPE_ST25TB = 4, /*!< ST25TB Listener device type */
  134. RFAL_NFC_LISTEN_TYPE_AP2P = 5, /*!< AP2P Listener device type */
  135. RFAL_NFC_POLL_TYPE_NFCA = 10, /*!< NFC-A Poller device type */
  136. RFAL_NFC_POLL_TYPE_NFCB = 11, /*!< NFC-B Poller device type */
  137. RFAL_NFC_POLL_TYPE_NFCF = 12, /*!< NFC-F Poller device type */
  138. RFAL_NFC_POLL_TYPE_NFCV = 13, /*!< NFC-V Poller device type */
  139. RFAL_NFC_POLL_TYPE_AP2P = 15 /*!< AP2P Poller device type */
  140. }rfalNfcDevType;
  141. /*! Device interface */
  142. typedef enum{
  143. RFAL_NFC_INTERFACE_RF = 0, /*!< RF Frame interface */
  144. RFAL_NFC_INTERFACE_ISODEP = 1, /*!< ISO-DEP interface */
  145. RFAL_NFC_INTERFACE_NFCDEP = 2 /*!< NFC-DEP interface */
  146. }rfalNfcRfInterface;
  147. /*! Device struct containing all its details */
  148. typedef struct{
  149. rfalNfcDevType type; /*!< Device's type */
  150. union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one technology at a time */
  151. rfalNfcaListenDevice nfca; /*!< NFC-A Listen Device instance */
  152. rfalNfcbListenDevice nfcb; /*!< NFC-B Listen Device instance */
  153. rfalNfcfListenDevice nfcf; /*!< NFC-F Listen Device instance */
  154. rfalNfcvListenDevice nfcv; /*!< NFC-V Listen Device instance */
  155. rfalSt25tbListenDevice st25tb; /*!< ST25TB Listen Device instance*/
  156. }dev; /*!< Device's instance */
  157. uint8_t *nfcid; /*!< Device's NFCID */
  158. uint8_t nfcidLen; /*!< Device's NFCID length */
  159. rfalNfcRfInterface rfInterface; /*!< Device's interface */
  160. union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one protocol at a time */
  161. rfalIsoDepDevice isoDep; /*!< ISO-DEP instance */
  162. rfalNfcDepDevice nfcDep; /*!< NFC-DEP instance */
  163. }proto; /*!< Device's protocol */
  164. }rfalNfcDevice;
  165. /*! Discovery parameters */
  166. typedef struct{
  167. rfalComplianceMode compMode; /*!< Compliancy mode to be used */
  168. uint16_t techs2Find; /*!< Technologies to search for */
  169. uint16_t totalDuration; /*!< Duration of a whole Poll + Listen cycle */
  170. uint8_t devLimit; /*!< Max number of devices */
  171. rfalBitRate maxBR; /*!< Max Bit rate to be used for communications */
  172. rfalBitRate nfcfBR; /*!< Bit rate to poll for NFC-F */
  173. uint8_t nfcid3[RFAL_NFCDEP_NFCID3_LEN]; /*!< NFCID3 to be used on the ATR_REQ/ATR_RES */
  174. uint8_t GB[RFAL_NFCDEP_GB_MAX_LEN]; /*!< General bytes to be used on the ATR-REQ */
  175. uint8_t GBLen; /*!< Length of the General Bytes */
  176. rfalBitRate ap2pBR; /*!< Bit rate to poll for AP2P */
  177. rfalLmConfPA lmConfigPA; /*!< Configuration for Passive Listen mode NFC-A */
  178. rfalLmConfPF lmConfigPF; /*!< Configuration for Passive Listen mode NFC-A */
  179. void (*notifyCb)( rfalNfcState st ); /*!< Callback to Notify upper layer */
  180. bool wakeupEnabled; /*!< Enable Wake-Up mode before polling */
  181. bool wakeupConfigDefault; /*!< Wake-Up mode default configuration */
  182. rfalWakeUpConfig wakeupConfig; /*!< Wake-Up mode configuration */
  183. }rfalNfcDiscoverParam;
  184. /*! Buffer union, only one interface is used at a time */
  185. typedef union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one interface at a time */
  186. uint8_t rfBuf[RFAL_FEATURE_NFC_RF_BUF_LEN]; /*!< RF buffer */
  187. rfalIsoDepApduBufFormat isoDepBuf; /*!< ISO-DEP buffer format (with header/prologue) */
  188. rfalNfcDepPduBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */
  189. }rfalNfcBuffer;
  190. /*******************************************************************************/
  191. /*
  192. ******************************************************************************
  193. * GLOBAL FUNCTION PROTOTYPES
  194. ******************************************************************************
  195. */
  196. /*!
  197. *****************************************************************************
  198. * \brief RFAL NFC Worker
  199. *
  200. * It runs the internal state machine and runs the RFAL RF worker.
  201. *****************************************************************************
  202. */
  203. void rfalNfcWorker( void );
  204. /*!
  205. *****************************************************************************
  206. * \brief RFAL NFC Initialize
  207. *
  208. * It initializes this module and its dependencies
  209. *
  210. * \return ERR_WRONG_STATE : Incorrect state for this operation
  211. * \return ERR_IO : Generic internal error
  212. * \return ERR_NONE : No error
  213. *****************************************************************************
  214. */
  215. ReturnCode rfalNfcInitialize( void );
  216. /*!
  217. *****************************************************************************
  218. * \brief RFAL NFC Discovery
  219. *
  220. * It set the device in Discovery state.
  221. * In discovery it will Poll and/or Listen for the technologies configured,
  222. * and perform Wake-up mode if configured to do so.
  223. *
  224. * The device list passed on disParams must not be empty.
  225. * The number of devices on the list is indicated by the devLimit and shall
  226. * be at >= 1.
  227. *
  228. * \param[in] disParams : discovery configuration parameters
  229. *
  230. * \return ERR_WRONG_STATE : Incorrect state for this operation
  231. * \return ERR_PARAM : Invalid parameters
  232. * \return ERR_NONE : No error
  233. *****************************************************************************
  234. */
  235. ReturnCode rfalNfcDiscover( const rfalNfcDiscoverParam *disParams );
  236. /*!
  237. *****************************************************************************
  238. * \brief RFAL NFC Get State
  239. *
  240. * It returns the current state
  241. *
  242. * \return rfalNfcState : the current state
  243. *****************************************************************************
  244. */
  245. rfalNfcState rfalNfcGetState( void );
  246. /*!
  247. *****************************************************************************
  248. * \brief RFAL NFC Get Devices Found
  249. *
  250. * It returns the location of the device list and the number of
  251. * devices found.
  252. *
  253. * \param[out] devList : device list location
  254. * \param[out] devCnt : number of devices found
  255. *
  256. * \return ERR_WRONG_STATE : Incorrect state for this operation
  257. * Discovery still ongoing
  258. * \return ERR_PARAM : Invalid parameters
  259. * \return ERR_NONE : No error
  260. *****************************************************************************
  261. */
  262. ReturnCode rfalNfcGetDevicesFound( rfalNfcDevice **devList, uint8_t *devCnt );
  263. /*!
  264. *****************************************************************************
  265. * \brief RFAL NFC Get Active Device
  266. *
  267. * It returns the location of the device current Active device
  268. *
  269. * \param[out] dev : device info location
  270. *
  271. * \return ERR_WRONG_STATE : Incorrect state for this operation
  272. * No device activated
  273. * \return ERR_PARAM : Invalid parameters
  274. * \return ERR_NONE : No error
  275. *****************************************************************************
  276. */
  277. ReturnCode rfalNfcGetActiveDevice( rfalNfcDevice **dev );
  278. /*!
  279. *****************************************************************************
  280. * \brief RFAL NFC Select Device
  281. *
  282. * It selects the device to be activated.
  283. * It shall be called when more than one device has been identified to
  284. * indiacte which device shall be actived
  285. *
  286. * \param[in] devIdx : device index to be activated
  287. *
  288. * \return ERR_WRONG_STATE : Incorrect state for this operation
  289. * Not in select state
  290. * \return ERR_PARAM : Invalid parameters
  291. * \return ERR_NONE : No error
  292. *****************************************************************************
  293. */
  294. ReturnCode rfalNfcSelect( uint8_t devIdx );
  295. /*!
  296. *****************************************************************************
  297. * \brief RFAL NFC Start Data Exchange
  298. *
  299. * After a device has been activated, it starts a data exchange.
  300. * It handles automatically which interface/protocol to be used and acts accordingly.
  301. *
  302. * In Listen mode the first frame/data shall be sent by the Reader/Initiator
  303. * therefore this method must be called first with txDataLen set to zero
  304. * to retrieve the rxData and rcvLen locations.
  305. *
  306. *
  307. * \param[in] txData : data to be transmitted
  308. * \param[in] txDataLen : size of the data to be transmitted
  309. * \param[out] rxData : location of the received data after operation is completed
  310. * \param[out] rvdLen : location of thelength of the received data
  311. * \param[in] fwt : FWT to be used in case of RF interface.
  312. * If ISO-DEP or NFC-DEP interface is used, this will be ignored
  313. *
  314. * \return ERR_WRONG_STATE : Incorrect state for this operation
  315. * \return ERR_PARAM : Invalid parameters
  316. * \return ERR_NONE : No error
  317. *****************************************************************************
  318. */
  319. ReturnCode rfalNfcDataExchangeStart( uint8_t *txData, uint16_t txDataLen, uint8_t **rxData, uint16_t **rvdLen, uint32_t fwt );
  320. /*!
  321. *****************************************************************************
  322. * \brief RFAL NFC Get Data Exchange Status
  323. *
  324. * Gets current Data Exchange status
  325. *
  326. * \return ERR_NONE : Transceive done with no error
  327. * \return ERR_BUSY : Transceive ongoing
  328. * \return ERR_AGAIN : received one chaining block, copy received data
  329. * and continue to call this method to retrieve the
  330. * remaining blocks
  331. * \return ERR_XXXX : Error occurred
  332. * \return ERR_TIMEOUT : No response
  333. * \return ERR_FRAMING : Framing error detected
  334. * \return ERR_PAR : Parity error detected
  335. * \return ERR_CRC : CRC error detected
  336. * \return ERR_LINK_LOSS : Link Loss - External Field is Off
  337. * \return ERR_RF_COLLISION : Collision detected
  338. * \return ERR_IO : Internal error
  339. *****************************************************************************
  340. */
  341. ReturnCode rfalNfcDataExchangeGetStatus( void );
  342. /*!
  343. *****************************************************************************
  344. * \brief RFAL NFC Deactivate
  345. *
  346. * It triggers the deactivation procedure to terminate communications with
  347. * remote device. At the end the field will be turned off.
  348. *
  349. * \param[in] discovery : TRUE if after deactivation go back into discovery
  350. * : FALSE if after deactivation remain in idle
  351. *
  352. * \return ERR_WRONG_STATE : Incorrect state for this operation
  353. * \return ERR_NONE : No error
  354. *****************************************************************************
  355. */
  356. ReturnCode rfalNfcDeactivate( bool discovery );
  357. #endif /* RFAL_NFC_H */
  358. /**
  359. * @}
  360. *
  361. * @}
  362. *
  363. * @}
  364. */