rfal_nfc.c 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926
  1. /**
  2. ******************************************************************************
  3. *
  4. * COPYRIGHT(c) 2020 STMicroelectronics
  5. *
  6. * Redistribution and use in source and binary forms, with or without modification,
  7. * are permitted provided that the following conditions are met:
  8. * 1. Redistributions of source code must retain the above copyright notice,
  9. * this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright notice,
  11. * this list of conditions and the following disclaimer in the documentation
  12. * and/or other materials provided with the distribution.
  13. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  14. * may be used to endorse or promote products derived from this software
  15. * without specific prior written permission.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  21. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  26. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. *
  28. ******************************************************************************
  29. */
  30. /*! \file rfal_nfc.c
  31. *
  32. * \author Gustavo Patricio
  33. *
  34. * \brief RFAL NFC device
  35. *
  36. * This module provides the required features to behave as an NFC Poller
  37. * or Listener device. It grants an easy to use interface for the following
  38. * activities: Technology Detection, Collision Resollution, Activation,
  39. * Data Exchange, and Deactivation
  40. *
  41. * This layer is influenced by (but not fully aligned with) the NFC Forum
  42. * specifications, in particular: Activity 2.0 and NCI 2.0
  43. *
  44. */
  45. /*
  46. ******************************************************************************
  47. * INCLUDES
  48. ******************************************************************************
  49. */
  50. #include "rfal_nfc.h"
  51. #include "utils.h"
  52. #include "rfal_analogConfig.h"
  53. /*
  54. ******************************************************************************
  55. * GLOBAL DEFINES
  56. ******************************************************************************
  57. */
  58. #define RFAL_NFC_MAX_DEVICES 5U /* Max number of devices supported */
  59. /*
  60. ******************************************************************************
  61. * GLOBAL MACROS
  62. ******************************************************************************
  63. */
  64. #define rfalNfcNfcNotify( st ) if( gNfcDev.disc.notifyCb != NULL ) gNfcDev.disc.notifyCb( st )
  65. /*
  66. ******************************************************************************
  67. * GLOBAL TYPES
  68. ******************************************************************************
  69. */
  70. /*! Buffer union, only one interface is used at a time */
  71. typedef union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one interface at a time */
  72. rfalIsoDepBufFormat isoDepBuf; /*!< ISO-DEP buffer format (with header/prologue) */
  73. rfalNfcDepBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */
  74. }rfalNfcTmpBuffer;
  75. typedef struct{
  76. rfalNfcState state; /* Main state */
  77. uint16_t techsFound; /* Technologies found bitmask */
  78. uint16_t techs2do; /* Technologies still to be performed */
  79. rfalBitRate ap2pBR; /* Bit rate to poll for AP2P */
  80. uint8_t selDevIdx; /* Selected device index */
  81. rfalNfcDevice *activeDev; /* Active device pointer */
  82. rfalNfcDiscoverParam disc; /* Discovery parameters */
  83. rfalNfcDevice devList[RFAL_NFC_MAX_DEVICES]; /*!< Location of device list */
  84. uint8_t devCnt; /* Decices found counter */
  85. uint32_t discTmr; /* Discovery Total duration timer */
  86. ReturnCode dataExErr; /* Last Data Exchange error */
  87. bool discRestart; /* Restart discover after deactivation flag */
  88. bool isRxChaining; /* Flag indicating Other device is chaining */
  89. uint32_t lmMask; /* Listen Mode mask */
  90. bool isTechInit; /* Flag indicating technology has been set */
  91. bool isOperOngoing; /* Flag indicating opration is ongoing */
  92. rfalNfcBuffer txBuf; /* Tx buffer for Data Exchange */
  93. rfalNfcBuffer rxBuf; /* Rx buffer for Data Exchange */
  94. uint16_t rxLen; /* Length of received data on Data Exchange */
  95. #if RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP
  96. rfalNfcTmpBuffer tmpBuf; /* Tmp buffer for Data Exchange */
  97. #endif /* RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP */
  98. }rfalNfc;
  99. /*
  100. ******************************************************************************
  101. * LOCAL VARIABLES
  102. ******************************************************************************
  103. */
  104. #ifdef RFAL_TEST_MODE
  105. rfalNfc gNfcDev;
  106. #else /* RFAL_TEST_MODE */
  107. static rfalNfc gNfcDev;
  108. #endif /* RFAL_TEST_MODE */
  109. /*
  110. ******************************************************************************
  111. * LOCAL FUNCTION PROTOTYPES
  112. ******************************************************************************
  113. */
  114. static ReturnCode rfalNfcPollTechDetetection( void );
  115. static ReturnCode rfalNfcPollCollResolution( void );
  116. static ReturnCode rfalNfcPollActivation( uint8_t devIt );
  117. static ReturnCode rfalNfcDeactivation( void );
  118. #if RFAL_FEATURE_NFC_DEP
  119. static ReturnCode rfalNfcNfcDepActivate( rfalNfcDevice *device, rfalNfcDepCommMode commMode, const uint8_t *atrReq, uint16_t atrReqLen );
  120. #endif /* RFAL_FEATURE_NFC_DEP */
  121. #if RFAL_FEATURE_LISTEN_MODE
  122. static ReturnCode rfalNfcListenActivation( void );
  123. #endif /* RFAL_FEATURE_LISTEN_MODE*/
  124. /*******************************************************************************/
  125. ReturnCode rfalNfcInitialize( void )
  126. {
  127. ReturnCode err;
  128. gNfcDev.state = RFAL_NFC_STATE_NOTINIT;
  129. rfalAnalogConfigInitialize(); /* Initialize RFAL's Analog Configs */
  130. EXIT_ON_ERR( err, rfalInitialize() ); /* Initialize RFAL */
  131. gNfcDev.state = RFAL_NFC_STATE_IDLE; /* Go to initialized */
  132. return ERR_NONE;
  133. }
  134. /*******************************************************************************/
  135. ReturnCode rfalNfcDiscover( const rfalNfcDiscoverParam *disParams )
  136. {
  137. /* Check if initialization has been performed */
  138. if( gNfcDev.state != RFAL_NFC_STATE_IDLE )
  139. {
  140. return ERR_WRONG_STATE;
  141. }
  142. /* Check valid parameters */
  143. if( (disParams == NULL) || (disParams->devLimit > RFAL_NFC_MAX_DEVICES) || (disParams->devLimit == 0U) ||
  144. ( (disParams->maxBR > RFAL_BR_1695) && (disParams->maxBR != RFAL_BR_KEEP) ) ||
  145. ( ((disParams->techs2Find & RFAL_NFC_POLL_TECH_F) != 0U) && (disParams->nfcfBR != RFAL_BR_212) && (disParams->nfcfBR != RFAL_BR_424) ) ||
  146. ( (((disParams->techs2Find & RFAL_NFC_POLL_TECH_AP2P) != 0U) && (disParams->ap2pBR > RFAL_BR_424)) || (disParams->GBLen > RFAL_NFCDEP_GB_MAX_LEN) ) )
  147. {
  148. return ERR_PARAM;
  149. }
  150. if( (((disParams->techs2Find & RFAL_NFC_POLL_TECH_A) != 0U) && !((bool)RFAL_FEATURE_NFCA)) ||
  151. (((disParams->techs2Find & RFAL_NFC_POLL_TECH_B) != 0U) && !((bool)RFAL_FEATURE_NFCB)) ||
  152. (((disParams->techs2Find & RFAL_NFC_POLL_TECH_F) != 0U) && !((bool)RFAL_FEATURE_NFCF)) ||
  153. (((disParams->techs2Find & RFAL_NFC_POLL_TECH_V) != 0U) && !((bool)RFAL_FEATURE_NFCV)) ||
  154. (((disParams->techs2Find & RFAL_NFC_POLL_TECH_ST25TB) != 0U) && !((bool)RFAL_FEATURE_ST25TB)) ||
  155. (((disParams->techs2Find & RFAL_NFC_POLL_TECH_AP2P) != 0U) && !((bool)RFAL_FEATURE_NFC_DEP)) ||
  156. (((disParams->techs2Find & RFAL_NFC_LISTEN_TECH_A) != 0U) && !((bool)RFAL_FEATURE_NFCA)) ||
  157. (((disParams->techs2Find & RFAL_NFC_LISTEN_TECH_B) != 0U) && !((bool)RFAL_FEATURE_NFCB)) ||
  158. (((disParams->techs2Find & RFAL_NFC_LISTEN_TECH_F) != 0U) && !((bool)RFAL_FEATURE_NFCF)) ||
  159. (((disParams->techs2Find & RFAL_NFC_LISTEN_TECH_AP2P) != 0U) && !((bool)RFAL_FEATURE_NFC_DEP)) )
  160. {
  161. return ERR_DISABLED; /* PRQA S 2880 # MISRA 2.1 - Unreachable code due to configuration option being set/unset */
  162. }
  163. /* Initialize context for discovery */
  164. gNfcDev.activeDev = NULL;
  165. gNfcDev.techsFound = RFAL_NFC_TECH_NONE;
  166. gNfcDev.devCnt = 0;
  167. gNfcDev.discRestart = true;
  168. gNfcDev.isTechInit = false;
  169. gNfcDev.disc = *disParams;
  170. /* Calculate Listen Mask */
  171. gNfcDev.lmMask = 0U;
  172. gNfcDev.lmMask |= (((gNfcDev.disc.techs2Find & RFAL_NFC_LISTEN_TECH_A) != 0U) ? RFAL_LM_MASK_NFCA : 0U);
  173. gNfcDev.lmMask |= (((gNfcDev.disc.techs2Find & RFAL_NFC_LISTEN_TECH_B) != 0U) ? RFAL_LM_MASK_NFCB : 0U);
  174. gNfcDev.lmMask |= (((gNfcDev.disc.techs2Find & RFAL_NFC_LISTEN_TECH_F) != 0U) ? RFAL_LM_MASK_NFCF : 0U);
  175. gNfcDev.lmMask |= (((gNfcDev.disc.techs2Find & RFAL_NFC_LISTEN_TECH_AP2P) != 0U) ? RFAL_LM_MASK_ACTIVE_P2P : 0U);
  176. #if !RFAL_FEATURE_LISTEN_MODE
  177. /* Check if Listen Mode is supported/Enabled */
  178. if( gNfcDev.lmMask != 0U )
  179. {
  180. return ERR_DISABLED;
  181. }
  182. #endif
  183. gNfcDev.state = RFAL_NFC_STATE_START_DISCOVERY;
  184. return ERR_NONE;
  185. }
  186. /*******************************************************************************/
  187. ReturnCode rfalNfcDeactivate( bool discovery )
  188. {
  189. /* Check for valid state */
  190. if( gNfcDev.state <= RFAL_NFC_STATE_IDLE )
  191. {
  192. return ERR_WRONG_STATE;
  193. }
  194. /* Check if discovery is to continue afterwards */
  195. if( (discovery == true) && (gNfcDev.disc.techs2Find != RFAL_NFC_TECH_NONE) )
  196. {
  197. /* If so let the state machine continue*/
  198. gNfcDev.discRestart = discovery;
  199. gNfcDev.state = RFAL_NFC_STATE_DEACTIVATION;
  200. }
  201. else
  202. {
  203. /* Otherwise deactivate immediately and go to IDLE */
  204. rfalNfcDeactivation();
  205. gNfcDev.state = RFAL_NFC_STATE_IDLE;
  206. }
  207. return ERR_NONE;
  208. }
  209. /*******************************************************************************/
  210. ReturnCode rfalNfcSelect( uint8_t devIdx )
  211. {
  212. /* Check for valid state */
  213. if( gNfcDev.state != RFAL_NFC_STATE_POLL_SELECT )
  214. {
  215. return ERR_WRONG_STATE;
  216. }
  217. gNfcDev.selDevIdx = devIdx;
  218. gNfcDev.state = RFAL_NFC_STATE_POLL_ACTIVATION;
  219. return ERR_NONE;
  220. }
  221. /*******************************************************************************/
  222. rfalNfcState rfalNfcGetState( void )
  223. {
  224. return gNfcDev.state;
  225. }
  226. /*******************************************************************************/
  227. ReturnCode rfalNfcGetDevicesFound( rfalNfcDevice **devList, uint8_t *devCnt )
  228. {
  229. /* Check for valid state */
  230. if( gNfcDev.state < RFAL_NFC_STATE_POLL_SELECT )
  231. {
  232. return ERR_WRONG_STATE;
  233. }
  234. /* Check valid parameters */
  235. if( (devList == NULL) || (devCnt == NULL) )
  236. {
  237. return ERR_PARAM;
  238. }
  239. *devCnt = gNfcDev.devCnt;
  240. *devList = gNfcDev.devList;
  241. return ERR_NONE;
  242. }
  243. /*******************************************************************************/
  244. ReturnCode rfalNfcGetActiveDevice( rfalNfcDevice **dev )
  245. {
  246. /* Check for valid state */
  247. if( gNfcDev.state < RFAL_NFC_STATE_ACTIVATED )
  248. {
  249. return ERR_WRONG_STATE;
  250. }
  251. /* Check valid parameter */
  252. if( dev == NULL )
  253. {
  254. return ERR_PARAM;
  255. }
  256. /* Check for valid state */
  257. if( (gNfcDev.devCnt == 0U) || (gNfcDev.activeDev == NULL) )
  258. {
  259. return ERR_REQUEST;
  260. }
  261. *dev = gNfcDev.activeDev;
  262. return ERR_NONE;
  263. }
  264. /*******************************************************************************/
  265. void rfalNfcWorker( void )
  266. {
  267. ReturnCode err;
  268. rfalWorker(); /* Execute RFAL process */
  269. switch( gNfcDev.state )
  270. {
  271. /*******************************************************************************/
  272. case RFAL_NFC_STATE_NOTINIT:
  273. case RFAL_NFC_STATE_IDLE:
  274. break;
  275. /*******************************************************************************/
  276. case RFAL_NFC_STATE_START_DISCOVERY:
  277. /* Initialize context for discovery cycle */
  278. gNfcDev.devCnt = 0;
  279. gNfcDev.selDevIdx = 0;
  280. gNfcDev.techsFound = RFAL_NFC_TECH_NONE;
  281. gNfcDev.techs2do = gNfcDev.disc.techs2Find;
  282. gNfcDev.state = RFAL_NFC_STATE_POLL_TECHDETECT;
  283. #if RFAL_FEATURE_WAKEUP_MODE
  284. /* Check if Low power Wake-Up is to be performed */
  285. if( gNfcDev.disc.wakeupEnabled )
  286. {
  287. /* Initialize Low power Wake-up mode and wait */
  288. err = rfalWakeUpModeStart( (gNfcDev.disc.wakeupConfigDefault ? NULL : &gNfcDev.disc.wakeupConfig) );
  289. if( err == ERR_NONE )
  290. {
  291. gNfcDev.state = RFAL_NFC_STATE_WAKEUP_MODE;
  292. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller that WU was started */
  293. }
  294. }
  295. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  296. break;
  297. /*******************************************************************************/
  298. case RFAL_NFC_STATE_WAKEUP_MODE:
  299. #if RFAL_FEATURE_WAKEUP_MODE
  300. /* Check if the Wake-up mode has woke */
  301. if( rfalWakeUpModeHasWoke() )
  302. {
  303. rfalWakeUpModeStop(); /* Disable Wake-up mode */
  304. gNfcDev.state = RFAL_NFC_STATE_POLL_TECHDETECT; /* Go to Technology detection */
  305. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller that WU has woke */
  306. }
  307. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  308. break;
  309. /*******************************************************************************/
  310. case RFAL_NFC_STATE_POLL_TECHDETECT:
  311. /* Start total duration timer */
  312. platformTimerDestroy( gNfcDev.discTmr );
  313. gNfcDev.discTmr = (uint32_t)platformTimerCreate( gNfcDev.disc.totalDuration );
  314. err = rfalNfcPollTechDetetection(); /* Perform Technology Detection */
  315. if( err != ERR_BUSY ) /* Wait until all technologies are performed */
  316. {
  317. if( ( err != ERR_NONE) || (gNfcDev.techsFound == RFAL_NFC_TECH_NONE) )/* Check if any error occurred or no techs were found */
  318. {
  319. rfalFieldOff();
  320. gNfcDev.state = RFAL_NFC_STATE_LISTEN_TECHDETECT; /* Nothing found as poller, go to listener */
  321. break;
  322. }
  323. gNfcDev.techs2do = gNfcDev.techsFound; /* Store the found technologies for collision resolution */
  324. gNfcDev.state = RFAL_NFC_STATE_POLL_COLAVOIDANCE; /* One or more devices found, go to Collision Avoidance */
  325. }
  326. break;
  327. /*******************************************************************************/
  328. case RFAL_NFC_STATE_POLL_COLAVOIDANCE:
  329. err = rfalNfcPollCollResolution(); /* Resolve any eventual collision */
  330. if( err != ERR_BUSY ) /* Wait until all technologies are performed */
  331. {
  332. if( (err != ERR_NONE) || (gNfcDev.devCnt == 0U) ) /* Check if any error occurred or no devices were found */
  333. {
  334. gNfcDev.state = RFAL_NFC_STATE_DEACTIVATION;
  335. break; /* Unable to retrieve any device, restart loop */
  336. }
  337. /* Check if more than one device has been found */
  338. if( gNfcDev.devCnt > 1U )
  339. {
  340. /* If more than one device was found inform upper layer to choose which one to activate */
  341. if( gNfcDev.disc.notifyCb != NULL )
  342. {
  343. gNfcDev.state = RFAL_NFC_STATE_POLL_SELECT;
  344. gNfcDev.disc.notifyCb( gNfcDev.state );
  345. break;
  346. }
  347. }
  348. /* If only one device or no callback has been set, activate the first device found */
  349. gNfcDev.selDevIdx = 0U;
  350. gNfcDev.state = RFAL_NFC_STATE_POLL_ACTIVATION;
  351. }
  352. break;
  353. /*******************************************************************************/
  354. case RFAL_NFC_STATE_POLL_ACTIVATION:
  355. err = rfalNfcPollActivation( gNfcDev.selDevIdx );
  356. if( err != ERR_BUSY ) /* Wait until all Activation is complete */
  357. {
  358. if( err != ERR_NONE ) /* Activation failed selected device */
  359. {
  360. gNfcDev.state = RFAL_NFC_STATE_DEACTIVATION; /* If Activation failed, restart loop */
  361. break;
  362. }
  363. gNfcDev.state = RFAL_NFC_STATE_ACTIVATED; /* Device has been properly activated */
  364. rfalNfcNfcNotify( gNfcDev.state ); /* Inform upper layer that a device has been activated */
  365. }
  366. break;
  367. /*******************************************************************************/
  368. case RFAL_NFC_STATE_DATAEXCHANGE:
  369. rfalNfcDataExchangeGetStatus(); /* Run the internal state machine */
  370. if( gNfcDev.dataExErr != ERR_BUSY ) /* If Dataexchange has terminated */
  371. {
  372. gNfcDev.state = RFAL_NFC_STATE_DATAEXCHANGE_DONE; /* Go to done state */
  373. rfalNfcNfcNotify( gNfcDev.state ); /* And notify caller */
  374. }
  375. if( gNfcDev.dataExErr == ERR_SLEEP_REQ ) /* Check if Listen mode has to go to Sleep */
  376. {
  377. gNfcDev.state = RFAL_NFC_STATE_LISTEN_SLEEP; /* Go to Listen Sleep state */
  378. rfalNfcNfcNotify( gNfcDev.state ); /* And notify caller */
  379. }
  380. break;
  381. /*******************************************************************************/
  382. case RFAL_NFC_STATE_DEACTIVATION:
  383. rfalNfcDeactivation(); /* Deactivate current device */
  384. gNfcDev.state = ((gNfcDev.discRestart) ? RFAL_NFC_STATE_START_DISCOVERY : RFAL_NFC_STATE_IDLE);
  385. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller */
  386. break;
  387. /*******************************************************************************/
  388. case RFAL_NFC_STATE_LISTEN_TECHDETECT:
  389. if( platformTimerIsExpired( gNfcDev.discTmr ) )
  390. {
  391. #if RFAL_FEATURE_LISTEN_MODE
  392. rfalListenStop();
  393. #else
  394. rfalFieldOff();
  395. #endif /* RFAL_FEATURE_LISTEN_MODE */
  396. gNfcDev.state = RFAL_NFC_STATE_START_DISCOVERY; /* Restart the discovery loop */
  397. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller */
  398. break;
  399. }
  400. #if RFAL_FEATURE_LISTEN_MODE
  401. if( gNfcDev.lmMask != 0U ) /* Check if configured to perform Listen mode */
  402. {
  403. err = rfalListenStart( gNfcDev.lmMask, &gNfcDev.disc.lmConfigPA, NULL, &gNfcDev.disc.lmConfigPF, (uint8_t*)&gNfcDev.rxBuf.rfBuf, (uint16_t)rfalConvBytesToBits(sizeof(gNfcDev.rxBuf.rfBuf)), &gNfcDev.rxLen );
  404. if( err == ERR_NONE )
  405. {
  406. gNfcDev.state = RFAL_NFC_STATE_LISTEN_COLAVOIDANCE; /* Wait for listen mode to be activated */
  407. }
  408. }
  409. break;
  410. /*******************************************************************************/
  411. case RFAL_NFC_STATE_LISTEN_COLAVOIDANCE:
  412. if( platformTimerIsExpired( gNfcDev.discTmr ) ) /* Check if the total duration has been reached */
  413. {
  414. rfalListenStop();
  415. gNfcDev.state = RFAL_NFC_STATE_START_DISCOVERY; /* Restart the discovery loop */
  416. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller */
  417. break;
  418. }
  419. /* Check for external field */
  420. if( rfalListenGetState( NULL, NULL ) >= RFAL_LM_STATE_IDLE )
  421. {
  422. gNfcDev.state = RFAL_NFC_STATE_LISTEN_ACTIVATION; /* Wait for listen mode to be activated */
  423. }
  424. break;
  425. /*******************************************************************************/
  426. case RFAL_NFC_STATE_LISTEN_ACTIVATION:
  427. case RFAL_NFC_STATE_LISTEN_SLEEP:
  428. err = rfalNfcListenActivation();
  429. if( err != ERR_BUSY )
  430. {
  431. if( err == ERR_NONE )
  432. {
  433. gNfcDev.activeDev = gNfcDev.devList; /* Assign the active device to be used further on */
  434. gNfcDev.devCnt++;
  435. gNfcDev.state = RFAL_NFC_STATE_ACTIVATED; /* Device has been properly activated */
  436. rfalNfcNfcNotify( gNfcDev.state ); /* Inform upper layer that a device has been activated */
  437. }
  438. else
  439. {
  440. rfalListenStop();
  441. gNfcDev.state = RFAL_NFC_STATE_START_DISCOVERY; /* Restart the discovery loop */
  442. rfalNfcNfcNotify( gNfcDev.state ); /* Notify caller */
  443. }
  444. }
  445. #endif /* RFAL_FEATURE_LISTEN_MODE */
  446. break;
  447. /*******************************************************************************/
  448. case RFAL_NFC_STATE_ACTIVATED:
  449. case RFAL_NFC_STATE_POLL_SELECT:
  450. case RFAL_NFC_STATE_DATAEXCHANGE_DONE:
  451. default:
  452. return;
  453. }
  454. }
  455. /*******************************************************************************/
  456. ReturnCode rfalNfcDataExchangeStart( uint8_t *txData, uint16_t txDataLen, uint8_t **rxData, uint16_t **rvdLen, uint32_t fwt )
  457. {
  458. ReturnCode err;
  459. rfalTransceiveContext ctx;
  460. /*******************************************************************************/
  461. /* The Data Exchange is divided in two different moments, the trigger/Start of *
  462. * the transfer followed by the check until its completion */
  463. if( (gNfcDev.state >= RFAL_NFC_STATE_ACTIVATED) && (gNfcDev.activeDev != NULL) )
  464. {
  465. /*******************************************************************************/
  466. /* In Listen mode is the Poller that initiates the communicatation */
  467. /* Assign output parameters and rfalNfcDataExchangeGetStatus will return */
  468. /* incoming data from Poller/Initiator */
  469. if( (gNfcDev.state == RFAL_NFC_STATE_ACTIVATED) && rfalNfcIsRemDevPoller( gNfcDev.activeDev->type ) )
  470. {
  471. if( txDataLen > 0U )
  472. {
  473. return ERR_WRONG_STATE;
  474. }
  475. *rvdLen = (uint16_t*)&gNfcDev.rxLen;
  476. *rxData = (uint8_t*)( (gNfcDev.activeDev->rfInterface == RFAL_NFC_INTERFACE_ISODEP) ? gNfcDev.rxBuf.isoDepBuf.apdu :
  477. ((gNfcDev.activeDev->rfInterface == RFAL_NFC_INTERFACE_NFCDEP) ? gNfcDev.rxBuf.nfcDepBuf.pdu : gNfcDev.rxBuf.rfBuf));
  478. return ERR_NONE;
  479. }
  480. /*******************************************************************************/
  481. switch( gNfcDev.activeDev->rfInterface ) /* Check which RF interface shall be used/has been activated */
  482. {
  483. /*******************************************************************************/
  484. case RFAL_NFC_INTERFACE_RF:
  485. rfalCreateByteFlagsTxRxContext( ctx, (uint8_t*)txData, txDataLen, gNfcDev.rxBuf.rfBuf, sizeof(gNfcDev.rxBuf.rfBuf), &gNfcDev.rxLen, RFAL_TXRX_FLAGS_DEFAULT, fwt );
  486. *rxData = (uint8_t*)gNfcDev.rxBuf.rfBuf;
  487. *rvdLen = (uint16_t*)&gNfcDev.rxLen;
  488. err = rfalStartTransceive( &ctx );
  489. break;
  490. #if RFAL_FEATURE_ISO_DEP
  491. /*******************************************************************************/
  492. case RFAL_NFC_INTERFACE_ISODEP:
  493. {
  494. rfalIsoDepApduTxRxParam isoDepTxRx;
  495. if( txDataLen > sizeof(gNfcDev.txBuf.isoDepBuf.apdu) )
  496. {
  497. return ERR_NOMEM;
  498. }
  499. if( txDataLen > 0U )
  500. {
  501. ST_MEMCPY( (uint8_t*)gNfcDev.txBuf.isoDepBuf.apdu, txData, txDataLen );
  502. }
  503. isoDepTxRx.DID = RFAL_ISODEP_NO_DID;
  504. isoDepTxRx.ourFSx = RFAL_ISODEP_FSX_KEEP;
  505. isoDepTxRx.FSx = gNfcDev.activeDev->proto.isoDep.info.FSx;
  506. isoDepTxRx.dFWT = gNfcDev.activeDev->proto.isoDep.info.dFWT;
  507. isoDepTxRx.FWT = gNfcDev.activeDev->proto.isoDep.info.FWT;
  508. isoDepTxRx.txBuf = &gNfcDev.txBuf.isoDepBuf;
  509. isoDepTxRx.txBufLen = txDataLen;
  510. isoDepTxRx.rxBuf = &gNfcDev.rxBuf.isoDepBuf;
  511. isoDepTxRx.rxLen = &gNfcDev.rxLen;
  512. isoDepTxRx.tmpBuf = &gNfcDev.tmpBuf.isoDepBuf;
  513. *rxData = (uint8_t*)gNfcDev.rxBuf.isoDepBuf.apdu;
  514. *rvdLen = (uint16_t*)&gNfcDev.rxLen;
  515. /*******************************************************************************/
  516. /* Trigger a RFAL ISO-DEP Transceive */
  517. err = rfalIsoDepStartApduTransceive( isoDepTxRx );
  518. break;
  519. }
  520. #endif /* RFAL_FEATURE_ISO_DEP */
  521. #if RFAL_FEATURE_NFC_DEP
  522. /*******************************************************************************/
  523. case RFAL_NFC_INTERFACE_NFCDEP:
  524. {
  525. rfalNfcDepPduTxRxParam nfcDepTxRx;
  526. if( txDataLen > sizeof(gNfcDev.txBuf.nfcDepBuf.pdu) )
  527. {
  528. return ERR_NOMEM;
  529. }
  530. if( txDataLen > 0U)
  531. {
  532. ST_MEMCPY( (uint8_t*)gNfcDev.txBuf.nfcDepBuf.pdu, txData, txDataLen );
  533. }
  534. nfcDepTxRx.DID = RFAL_NFCDEP_DID_KEEP;
  535. nfcDepTxRx.FSx = rfalNfcIsRemDevListener(gNfcDev.activeDev->type) ?
  536. rfalNfcDepLR2FS( (uint8_t)rfalNfcDepPP2LR( gNfcDev.activeDev->proto.nfcDep.activation.Target.ATR_RES.PPt ) ) :
  537. rfalNfcDepLR2FS( (uint8_t)rfalNfcDepPP2LR( gNfcDev.activeDev->proto.nfcDep.activation.Initiator.ATR_REQ.PPi ) );
  538. nfcDepTxRx.dFWT = gNfcDev.activeDev->proto.nfcDep.info.dFWT;
  539. nfcDepTxRx.FWT = gNfcDev.activeDev->proto.nfcDep.info.FWT;
  540. nfcDepTxRx.txBuf = &gNfcDev.txBuf.nfcDepBuf;
  541. nfcDepTxRx.txBufLen = txDataLen;
  542. nfcDepTxRx.rxBuf = &gNfcDev.rxBuf.nfcDepBuf;
  543. nfcDepTxRx.rxLen = &gNfcDev.rxLen;
  544. nfcDepTxRx.tmpBuf = &gNfcDev.tmpBuf.nfcDepBuf;
  545. *rxData = (uint8_t*)gNfcDev.rxBuf.nfcDepBuf.pdu;
  546. *rvdLen = (uint16_t*)&gNfcDev.rxLen;
  547. /*******************************************************************************/
  548. /* Trigger a RFAL NFC-DEP Transceive */
  549. err = rfalNfcDepStartPduTransceive( nfcDepTxRx );
  550. break;
  551. }
  552. #endif /* RFAL_FEATURE_NFC_DEP */
  553. /*******************************************************************************/
  554. default:
  555. err = ERR_PARAM;
  556. break;
  557. }
  558. /* If a transceive has succesfully started flag Data Exchange as ongoing */
  559. if( err == ERR_NONE )
  560. {
  561. gNfcDev.dataExErr = ERR_BUSY;
  562. gNfcDev.state = RFAL_NFC_STATE_DATAEXCHANGE;
  563. }
  564. return err;
  565. }
  566. return ERR_WRONG_STATE;
  567. }
  568. /*******************************************************************************/
  569. ReturnCode rfalNfcDataExchangeGetStatus( void )
  570. {
  571. /*******************************************************************************/
  572. /* Check if it's the first frame received in Listen mode */
  573. if( gNfcDev.state == RFAL_NFC_STATE_ACTIVATED )
  574. {
  575. /* Continue data exchange as normal */
  576. gNfcDev.dataExErr = ERR_BUSY;
  577. gNfcDev.state = RFAL_NFC_STATE_DATAEXCHANGE;
  578. /* Check if we performing in T3T CE */
  579. if( (gNfcDev.activeDev->type == RFAL_NFC_POLL_TYPE_NFCF) && (gNfcDev.activeDev->rfInterface == RFAL_NFC_INTERFACE_RF) )
  580. {
  581. /* The first frame has been retrieved by rfalListenMode, flag data immediately */
  582. /* Can only call rfalGetTransceiveStatus() after starting a transceive with rfalStartTransceive */
  583. gNfcDev.dataExErr = ERR_NONE;
  584. }
  585. }
  586. /*******************************************************************************/
  587. /* Check if we are in we have been placed to sleep, and return last error */
  588. if( gNfcDev.state == RFAL_NFC_STATE_LISTEN_SLEEP )
  589. {
  590. return gNfcDev.dataExErr; /* ERR_SLEEP_REQ */
  591. }
  592. /*******************************************************************************/
  593. /* Check if Data exchange has been started */
  594. if( (gNfcDev.state != RFAL_NFC_STATE_DATAEXCHANGE) && (gNfcDev.state != RFAL_NFC_STATE_DATAEXCHANGE_DONE) )
  595. {
  596. return ERR_WRONG_STATE;
  597. }
  598. /* Check if Data exchange is still ongoing */
  599. if( gNfcDev.dataExErr == ERR_BUSY )
  600. {
  601. switch( gNfcDev.activeDev->rfInterface )
  602. {
  603. /*******************************************************************************/
  604. case RFAL_NFC_INTERFACE_RF:
  605. gNfcDev.dataExErr = rfalGetTransceiveStatus();
  606. break;
  607. #if RFAL_FEATURE_ISO_DEP
  608. /*******************************************************************************/
  609. case RFAL_NFC_INTERFACE_ISODEP:
  610. gNfcDev.dataExErr = rfalIsoDepGetApduTransceiveStatus();
  611. break;
  612. #endif /* RFAL_FEATURE_ISO_DEP */
  613. /*******************************************************************************/
  614. #if RFAL_FEATURE_NFC_DEP
  615. case RFAL_NFC_INTERFACE_NFCDEP:
  616. gNfcDev.dataExErr = rfalNfcDepGetPduTransceiveStatus();
  617. break;
  618. #endif /* RFAL_FEATURE_NFC_DEP */
  619. /*******************************************************************************/
  620. default:
  621. gNfcDev.dataExErr = ERR_PARAM;
  622. break;
  623. }
  624. #if RFAL_FEATURE_LISTEN_MODE
  625. /*******************************************************************************/
  626. /* If a Sleep request has been received (Listen Mode) go to sleep immediately */
  627. if( gNfcDev.dataExErr == ERR_SLEEP_REQ )
  628. {
  629. EXIT_ON_ERR( gNfcDev.dataExErr, rfalListenSleepStart( RFAL_LM_STATE_SLEEP_A, gNfcDev.rxBuf.rfBuf, sizeof(gNfcDev.rxBuf.rfBuf), &gNfcDev.rxLen ) );
  630. /* If set Sleep was succesfull keep restore the Sleep request signal */
  631. gNfcDev.dataExErr = ERR_SLEEP_REQ;
  632. }
  633. #endif /* RFAL_FEATURE_LISTEN_MODE */
  634. }
  635. return gNfcDev.dataExErr;
  636. }
  637. /*!
  638. ******************************************************************************
  639. * \brief Poller Technology Detection
  640. *
  641. * This method implements the Technology Detection / Poll for different
  642. * device technologies.
  643. *
  644. * \return ERR_NONE : Operation completed with no error
  645. * \return ERR_BUSY : Operation ongoing
  646. * \return ERR_XXXX : Error occurred
  647. *
  648. ******************************************************************************
  649. */
  650. static ReturnCode rfalNfcPollTechDetetection( void )
  651. {
  652. ReturnCode err;
  653. err = ERR_NONE;
  654. /* Supress warning when specific RFAL features have been disabled */
  655. NO_WARNING(err);
  656. /*******************************************************************************/
  657. /* AP2P Technology Detection */
  658. /*******************************************************************************/
  659. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_AP2P) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_AP2P) != 0U) )
  660. {
  661. #if RFAL_FEATURE_NFC_DEP
  662. if( !gNfcDev.isTechInit )
  663. {
  664. EXIT_ON_ERR( err, rfalSetMode( RFAL_MODE_POLL_ACTIVE_P2P, gNfcDev.disc.ap2pBR, gNfcDev.disc.ap2pBR ) );
  665. rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC );
  666. rfalSetFDTListen( RFAL_FDT_LISTEN_AP2P_POLLER );
  667. rfalSetFDTPoll( RFAL_TIMING_NONE );
  668. rfalSetGT( RFAL_GT_AP2P_ADJUSTED );
  669. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Turns the Field On and starts GT timer */
  670. gNfcDev.isTechInit = true;
  671. }
  672. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  673. {
  674. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_AP2P;
  675. err = rfalNfcNfcDepActivate( gNfcDev.devList, RFAL_NFCDEP_COMM_ACTIVE, NULL, 0 );/* Poll for NFC-A devices */
  676. if( err == ERR_NONE )
  677. {
  678. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_AP2P;
  679. gNfcDev.devList->type = RFAL_NFC_LISTEN_TYPE_AP2P;
  680. gNfcDev.devList->rfInterface = RFAL_NFC_INTERFACE_NFCDEP;
  681. gNfcDev.devCnt++;
  682. return ERR_NONE;
  683. }
  684. gNfcDev.isTechInit = false;
  685. rfalFieldOff();
  686. }
  687. return ERR_BUSY;
  688. #endif /* RFAL_FEATURE_NFC_DEP */
  689. }
  690. /*******************************************************************************/
  691. /* Passive NFC-A Technology Detection */
  692. /*******************************************************************************/
  693. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_A) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_A) != 0U) )
  694. {
  695. #if RFAL_FEATURE_NFCA
  696. rfalNfcaSensRes sensRes;
  697. if( !gNfcDev.isTechInit )
  698. {
  699. EXIT_ON_ERR( err, rfalNfcaPollerInitialize() ); /* Initialize RFAL for NFC-A */
  700. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Turns the Field On and starts GT timer */
  701. gNfcDev.isTechInit = true;
  702. }
  703. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  704. {
  705. err = rfalNfcaPollerTechnologyDetection( gNfcDev.disc.compMode, &sensRes );/* Poll for NFC-A devices */
  706. if( err == ERR_NONE )
  707. {
  708. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_A;
  709. }
  710. gNfcDev.isTechInit = false;
  711. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_A;
  712. }
  713. return ERR_BUSY;
  714. #endif /* RFAL_FEATURE_NFCA */
  715. }
  716. /*******************************************************************************/
  717. /* Passive NFC-B Technology Detection */
  718. /*******************************************************************************/
  719. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_B) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_B) != 0U) )
  720. {
  721. #if RFAL_FEATURE_NFCB
  722. rfalNfcbSensbRes sensbRes;
  723. uint8_t sensbResLen;
  724. if( !gNfcDev.isTechInit )
  725. {
  726. EXIT_ON_ERR( err, rfalNfcbPollerInitialize() ); /* Initialize RFAL for NFC-B */
  727. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* As field is already On only starts GT timer */
  728. gNfcDev.isTechInit = true;
  729. }
  730. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  731. {
  732. err = rfalNfcbPollerTechnologyDetection( gNfcDev.disc.compMode, &sensbRes, &sensbResLen ); /* Poll for NFC-B devices */
  733. if( err == ERR_NONE )
  734. {
  735. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_B;
  736. }
  737. gNfcDev.isTechInit = false;
  738. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_B;
  739. }
  740. return ERR_BUSY;
  741. #endif /* RFAL_FEATURE_NFCB */
  742. }
  743. /*******************************************************************************/
  744. /* Passive NFC-F Technology Detection */
  745. /*******************************************************************************/
  746. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_F) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_F) != 0U) )
  747. {
  748. #if RFAL_FEATURE_NFCF
  749. if( !gNfcDev.isTechInit )
  750. {
  751. EXIT_ON_ERR( err, rfalNfcfPollerInitialize( gNfcDev.disc.nfcfBR ) ); /* Initialize RFAL for NFC-F */
  752. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* As field is already On only starts GT timer */
  753. gNfcDev.isTechInit = true;
  754. }
  755. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  756. {
  757. err = rfalNfcfPollerCheckPresence(); /* Poll for NFC-F devices */
  758. if( err == ERR_NONE )
  759. {
  760. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_F;
  761. }
  762. gNfcDev.isTechInit = false;
  763. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_F;
  764. }
  765. return ERR_BUSY;
  766. #endif /* RFAL_FEATURE_NFCF */
  767. }
  768. /*******************************************************************************/
  769. /* Passive NFC-V Technology Detection */
  770. /*******************************************************************************/
  771. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_V) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_V) != 0U) )
  772. {
  773. #if RFAL_FEATURE_NFCV
  774. rfalNfcvInventoryRes invRes;
  775. if( !gNfcDev.isTechInit )
  776. {
  777. EXIT_ON_ERR( err, rfalNfcvPollerInitialize() ); /* Initialize RFAL for NFC-V */
  778. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* As field is already On only starts GT timer */
  779. gNfcDev.isTechInit = true;
  780. }
  781. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  782. {
  783. err = rfalNfcvPollerCheckPresence( &invRes ); /* Poll for NFC-V devices */
  784. if( err == ERR_NONE )
  785. {
  786. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_V;
  787. }
  788. gNfcDev.isTechInit = false;
  789. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_V;
  790. }
  791. return ERR_BUSY;
  792. #endif /* RFAL_FEATURE_NFCV */
  793. }
  794. /*******************************************************************************/
  795. /* Passive Proprietary Technology ST25TB */
  796. /*******************************************************************************/
  797. if( ((gNfcDev.disc.techs2Find & RFAL_NFC_POLL_TECH_ST25TB) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_ST25TB) != 0U) )
  798. {
  799. #if RFAL_FEATURE_ST25TB
  800. if( !gNfcDev.isTechInit )
  801. {
  802. EXIT_ON_ERR( err, rfalSt25tbPollerInitialize() ); /* Initialize RFAL for NFC-V */
  803. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* As field is already On only starts GT timer */
  804. gNfcDev.isTechInit = true;
  805. }
  806. if( rfalIsGTExpired() ) /* Wait until Guard Time is fulfilled */
  807. {
  808. err = rfalSt25tbPollerCheckPresence( NULL ); /* Poll for ST25TB devices */
  809. if( err == ERR_NONE )
  810. {
  811. gNfcDev.techsFound |= RFAL_NFC_POLL_TECH_ST25TB;
  812. }
  813. gNfcDev.isTechInit = false;
  814. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_ST25TB;
  815. }
  816. return ERR_BUSY;
  817. #endif /* RFAL_FEATURE_ST25TB */
  818. }
  819. return ERR_NONE;
  820. }
  821. /*!
  822. ******************************************************************************
  823. * \brief Poller Collision Resolution
  824. *
  825. * This method implements the Collision Resolution on all technologies that
  826. * have been detected before.
  827. *
  828. * \return ERR_NONE : Operation completed with no error
  829. * \return ERR_BUSY : Operation ongoing
  830. * \return ERR_XXXX : Error occurred
  831. *
  832. ******************************************************************************
  833. */
  834. static ReturnCode rfalNfcPollCollResolution( void )
  835. {
  836. uint8_t i;
  837. static uint8_t devCnt;
  838. ReturnCode err;
  839. err = ERR_NONE;
  840. i = 0;
  841. /* Supress warning when specific RFAL features have been disabled */
  842. NO_WARNING(err);
  843. NO_WARNING(devCnt);
  844. NO_WARNING(i);
  845. /* Check if device limit has been reached */
  846. if( gNfcDev.devCnt >= gNfcDev.disc.devLimit )
  847. {
  848. return ERR_NONE;
  849. }
  850. /*******************************************************************************/
  851. /* NFC-A Collision Resolution */
  852. /*******************************************************************************/
  853. #if RFAL_FEATURE_NFCA
  854. if( ((gNfcDev.techsFound & RFAL_NFC_POLL_TECH_A) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_A) != 0U) ) /* If a NFC-A device was found/detected, perform Collision Resolution */
  855. {
  856. static rfalNfcaListenDevice nfcaDevList[RFAL_NFC_MAX_DEVICES];
  857. if( !gNfcDev.isTechInit )
  858. {
  859. EXIT_ON_ERR( err, rfalNfcaPollerInitialize() ); /* Initialize RFAL for NFC-A */
  860. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Turns the Field On and starts GT timer */
  861. gNfcDev.isTechInit = true; /* Technology has been initialized */
  862. gNfcDev.isOperOngoing = false; /* No operation currently ongoing */
  863. }
  864. if( !rfalIsGTExpired() )
  865. {
  866. return ERR_BUSY;
  867. }
  868. if( !gNfcDev.isOperOngoing )
  869. {
  870. EXIT_ON_ERR( err, rfalNfcaPollerStartFullCollisionResolution( gNfcDev.disc.compMode, (gNfcDev.disc.devLimit - gNfcDev.devCnt), nfcaDevList, &devCnt ) );
  871. gNfcDev.isOperOngoing = true;
  872. return ERR_BUSY;
  873. }
  874. err = rfalNfcaPollerGetFullCollisionResolutionStatus();
  875. if( err != ERR_BUSY )
  876. {
  877. gNfcDev.isTechInit = false;
  878. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_A;
  879. if( (err == ERR_NONE) && (devCnt != 0U) )
  880. {
  881. for( i=0; i<devCnt; i++ ) /* Copy devices found form local Nfca list into global device list */
  882. {
  883. gNfcDev.devList[gNfcDev.devCnt].type = RFAL_NFC_LISTEN_TYPE_NFCA;
  884. gNfcDev.devList[gNfcDev.devCnt].dev.nfca = nfcaDevList[i];
  885. gNfcDev.devCnt++;
  886. }
  887. }
  888. }
  889. return ERR_BUSY;
  890. }
  891. #endif /* RFAL_FEATURE_NFCA */
  892. /*******************************************************************************/
  893. /* NFC-B Collision Resolution */
  894. /*******************************************************************************/
  895. #if RFAL_FEATURE_NFCB
  896. if( ((gNfcDev.techsFound & RFAL_NFC_POLL_TECH_B) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_B) != 0U) ) /* If a NFC-B device was found/detected, perform Collision Resolution */
  897. {
  898. rfalNfcbListenDevice nfcbDevList[RFAL_NFC_MAX_DEVICES];
  899. if( !gNfcDev.isTechInit )
  900. {
  901. EXIT_ON_ERR( err, rfalNfcbPollerInitialize()); /* Initialize RFAL for NFC-B */
  902. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Ensure GT again as other technologies have also been polled */
  903. gNfcDev.isTechInit = true;
  904. }
  905. if( !rfalIsGTExpired() )
  906. {
  907. return ERR_BUSY;
  908. }
  909. devCnt = 0;
  910. gNfcDev.isTechInit = false;
  911. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_B;
  912. err = rfalNfcbPollerCollisionResolution( gNfcDev.disc.compMode, (gNfcDev.disc.devLimit - gNfcDev.devCnt), nfcbDevList, &devCnt );
  913. if( (err == ERR_NONE) && (devCnt != 0U) )
  914. {
  915. for( i=0; i<devCnt; i++ ) /* Copy devices found form local Nfcb list into global device list */
  916. {
  917. gNfcDev.devList[gNfcDev.devCnt].type = RFAL_NFC_LISTEN_TYPE_NFCB;
  918. gNfcDev.devList[gNfcDev.devCnt].dev.nfcb = nfcbDevList[i];
  919. gNfcDev.devCnt++;
  920. }
  921. }
  922. return ERR_BUSY;
  923. }
  924. #endif /* RFAL_FEATURE_NFCB*/
  925. /*******************************************************************************/
  926. /* NFC-F Collision Resolution */
  927. /*******************************************************************************/
  928. #if RFAL_FEATURE_NFCF
  929. if( ((gNfcDev.techsFound & RFAL_NFC_POLL_TECH_F) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_F) != 0U) ) /* If a NFC-F device was found/detected, perform Collision Resolution */
  930. {
  931. rfalNfcfListenDevice nfcfDevList[RFAL_NFC_MAX_DEVICES];
  932. if( !gNfcDev.isTechInit )
  933. {
  934. EXIT_ON_ERR( err, rfalNfcfPollerInitialize( gNfcDev.disc.nfcfBR )); /* Initialize RFAL for NFC-F */
  935. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Ensure GT again as other technologies have also been polled */
  936. gNfcDev.isTechInit = true;
  937. }
  938. if( !rfalIsGTExpired() )
  939. {
  940. return ERR_BUSY;
  941. }
  942. devCnt = 0;
  943. gNfcDev.isTechInit = false;
  944. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_F;
  945. err = rfalNfcfPollerCollisionResolution( gNfcDev.disc.compMode, (gNfcDev.disc.devLimit - gNfcDev.devCnt), nfcfDevList, &devCnt );
  946. if( (err == ERR_NONE) && (devCnt != 0U) )
  947. {
  948. for( i=0; i<devCnt; i++ ) /* Copy devices found form local Nfcf list into global device list */
  949. {
  950. gNfcDev.devList[gNfcDev.devCnt].type = RFAL_NFC_LISTEN_TYPE_NFCF;
  951. gNfcDev.devList[gNfcDev.devCnt].dev.nfcf = nfcfDevList[i];
  952. gNfcDev.devCnt++;
  953. }
  954. }
  955. return ERR_BUSY;
  956. }
  957. #endif /* RFAL_FEATURE_NFCF */
  958. /*******************************************************************************/
  959. /* NFC-V Collision Resolution */
  960. /*******************************************************************************/
  961. #if RFAL_FEATURE_NFCV
  962. if( ((gNfcDev.techsFound & RFAL_NFC_POLL_TECH_V) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_V) != 0U) ) /* If a NFC-V device was found/detected, perform Collision Resolution */
  963. {
  964. rfalNfcvListenDevice nfcvDevList[RFAL_NFC_MAX_DEVICES];
  965. if( !gNfcDev.isTechInit )
  966. {
  967. EXIT_ON_ERR( err, rfalNfcvPollerInitialize()); /* Initialize RFAL for NFC-V */
  968. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Ensure GT again as other technologies have also been polled */
  969. gNfcDev.isTechInit = true;
  970. }
  971. if( !rfalIsGTExpired() )
  972. {
  973. return ERR_BUSY;
  974. }
  975. devCnt = 0;
  976. gNfcDev.isTechInit = false;
  977. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_V;
  978. err = rfalNfcvPollerCollisionResolution( RFAL_COMPLIANCE_MODE_NFC, (gNfcDev.disc.devLimit - gNfcDev.devCnt), nfcvDevList, &devCnt );
  979. if( (err == ERR_NONE) && (devCnt != 0U) )
  980. {
  981. for( i=0; i<devCnt; i++ ) /* Copy devices found form local Nfcf list into global device list */
  982. {
  983. gNfcDev.devList[gNfcDev.devCnt].type = RFAL_NFC_LISTEN_TYPE_NFCV;
  984. gNfcDev.devList[gNfcDev.devCnt].dev.nfcv = nfcvDevList[i];
  985. gNfcDev.devCnt++;
  986. }
  987. }
  988. return ERR_BUSY;
  989. }
  990. #endif /* RFAL_FEATURE_NFCV */
  991. /*******************************************************************************/
  992. /* ST25TB Collision Resolution */
  993. /*******************************************************************************/
  994. #if RFAL_FEATURE_ST25TB
  995. if( ((gNfcDev.techsFound & RFAL_NFC_POLL_TECH_ST25TB) != 0U) && ((gNfcDev.techs2do & RFAL_NFC_POLL_TECH_ST25TB) != 0U) ) /* If a ST25TB device was found/detected, perform Collision Resolution */
  996. {
  997. rfalSt25tbListenDevice st25tbDevList[RFAL_NFC_MAX_DEVICES];
  998. if( !gNfcDev.isTechInit )
  999. {
  1000. EXIT_ON_ERR( err, rfalSt25tbPollerInitialize() ); /* Initialize RFAL for ST25TB */
  1001. EXIT_ON_ERR( err, rfalFieldOnAndStartGT() ); /* Ensure GT again as other technologies have also been polled */
  1002. gNfcDev.isTechInit = true;
  1003. }
  1004. if( !rfalIsGTExpired() )
  1005. {
  1006. return ERR_BUSY;
  1007. }
  1008. devCnt = 0;
  1009. gNfcDev.isTechInit = false;
  1010. gNfcDev.techs2do &= ~RFAL_NFC_POLL_TECH_ST25TB;
  1011. err = rfalSt25tbPollerCollisionResolution( (gNfcDev.disc.devLimit - gNfcDev.devCnt), st25tbDevList, &devCnt );
  1012. if( (err == ERR_NONE) && (devCnt != 0U) )
  1013. {
  1014. for( i=0; i<devCnt; i++ ) /* Copy devices found form local Nfcf list into global device list */
  1015. {
  1016. gNfcDev.devList[gNfcDev.devCnt].type = RFAL_NFC_LISTEN_TYPE_ST25TB;
  1017. gNfcDev.devList[gNfcDev.devCnt].dev.st25tb = st25tbDevList[i];
  1018. gNfcDev.devCnt++;
  1019. }
  1020. }
  1021. return ERR_BUSY;
  1022. }
  1023. #endif /* RFAL_FEATURE_ST25TB */
  1024. return ERR_NONE; /* All technologies have been performed */
  1025. }
  1026. /*!
  1027. ******************************************************************************
  1028. * \brief Poller Activation
  1029. *
  1030. * This method Activates a given device according to it's type and
  1031. * protocols supported
  1032. *
  1033. * \param[in] devIt : device's position on the list to be activated
  1034. *
  1035. * \return ERR_NONE : Operation completed with no error
  1036. * \return ERR_BUSY : Operation ongoing
  1037. * \return ERR_XXXX : Error occurred
  1038. *
  1039. ******************************************************************************
  1040. */
  1041. static ReturnCode rfalNfcPollActivation( uint8_t devIt )
  1042. {
  1043. ReturnCode err;
  1044. err = ERR_NONE;
  1045. /* Supress warning when specific RFAL features have been disabled */
  1046. NO_WARNING(err);
  1047. if( devIt > gNfcDev.devCnt )
  1048. {
  1049. return ERR_WRONG_STATE;
  1050. }
  1051. switch( gNfcDev.devList[devIt].type )
  1052. {
  1053. /*******************************************************************************/
  1054. /* AP2P Activation */
  1055. /*******************************************************************************/
  1056. #if RFAL_FEATURE_NFC_DEP
  1057. case RFAL_NFC_LISTEN_TYPE_AP2P:
  1058. /* Activation has already been perfomed (ATR_REQ) */
  1059. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].proto.nfcDep.activation.Target.ATR_RES.NFCID3;
  1060. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
  1061. break;
  1062. #endif /* RFAL_FEATURE_NFC_DEP */
  1063. /*******************************************************************************/
  1064. /* Passive NFC-A Activation */
  1065. /*******************************************************************************/
  1066. #if RFAL_FEATURE_NFCA
  1067. case RFAL_NFC_LISTEN_TYPE_NFCA:
  1068. if( !gNfcDev.isTechInit )
  1069. {
  1070. rfalNfcaPollerInitialize();
  1071. gNfcDev.isTechInit = true;
  1072. gNfcDev.isOperOngoing = false;
  1073. return ERR_BUSY;
  1074. }
  1075. if( gNfcDev.devList[devIt].dev.nfca.isSleep ) /* Check if desired device is in Sleep */
  1076. {
  1077. rfalNfcaSensRes sensRes;
  1078. rfalNfcaSelRes selRes;
  1079. if( !gNfcDev.isOperOngoing )
  1080. {
  1081. /* Wake up all cards */
  1082. EXIT_ON_ERR( err, rfalNfcaPollerCheckPresence( RFAL_14443A_SHORTFRAME_CMD_WUPA, &sensRes ) );
  1083. gNfcDev.isOperOngoing = true;
  1084. }
  1085. else
  1086. {
  1087. /* Select specific device */
  1088. EXIT_ON_ERR( err, rfalNfcaPollerSelect( gNfcDev.devList[devIt].dev.nfca.nfcId1, gNfcDev.devList[devIt].dev.nfca.nfcId1Len, &selRes ) );
  1089. gNfcDev.devList[devIt].dev.nfca.isSleep = false;
  1090. gNfcDev.isOperOngoing = false;
  1091. }
  1092. return ERR_BUSY;
  1093. }
  1094. /* Set NFCID */
  1095. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.nfca.nfcId1;
  1096. gNfcDev.devList[devIt].nfcidLen = gNfcDev.devList[devIt].dev.nfca.nfcId1Len;
  1097. /*******************************************************************************/
  1098. /* Perform protocol specific activation */
  1099. switch( gNfcDev.devList[devIt].dev.nfca.type )
  1100. {
  1101. /*******************************************************************************/
  1102. case RFAL_NFCA_T1T:
  1103. /* No further activation needed for T1T (RID already performed) */
  1104. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.nfca.ridRes.uid;
  1105. gNfcDev.devList[devIt].nfcidLen = RFAL_T1T_UID_LEN;
  1106. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF;
  1107. break;
  1108. case RFAL_NFCA_T2T:
  1109. /* No further activation needed for a T2T */
  1110. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF;
  1111. break;
  1112. /*******************************************************************************/
  1113. case RFAL_NFCA_T4T: /* Device supports ISO-DEP */
  1114. #if RFAL_FEATURE_ISO_DEP && RFAL_FEATURE_ISO_DEP_POLL
  1115. if( !gNfcDev.isOperOngoing )
  1116. {
  1117. /* Perform ISO-DEP (ISO14443-4) activation: RATS and PPS if supported */
  1118. rfalIsoDepInitialize();
  1119. EXIT_ON_ERR( err, rfalIsoDepPollAStartActivation( (rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, gNfcDev.disc.maxBR, &gNfcDev.devList[devIt].proto.isoDep ) );
  1120. gNfcDev.isOperOngoing = true;
  1121. return ERR_BUSY;
  1122. }
  1123. err = rfalIsoDepPollAGetActivationStatus();
  1124. if( err != ERR_NONE )
  1125. {
  1126. return err;
  1127. }
  1128. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_ISODEP; /* NFC-A T4T device activated */
  1129. #else
  1130. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* No ISO-DEP supported activate using RF interface */
  1131. #endif /* RFAL_FEATURE_ISO_DEP_POLL */
  1132. break;
  1133. /*******************************************************************************/
  1134. case RFAL_NFCA_T4T_NFCDEP: /* Device supports both T4T and NFC-DEP */
  1135. case RFAL_NFCA_NFCDEP: /* Device supports NFC-DEP */
  1136. #if RFAL_FEATURE_NFC_DEP
  1137. /* Perform NFC-DEP (P2P) activation: ATR and PSL if supported */
  1138. EXIT_ON_ERR( err, rfalNfcNfcDepActivate( &gNfcDev.devList[devIt], RFAL_NFCDEP_COMM_PASSIVE, NULL, 0 ) );
  1139. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].proto.nfcDep.activation.Target.ATR_RES.NFCID3;
  1140. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
  1141. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_NFCDEP; /* NFC-A P2P device activated */
  1142. #else
  1143. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* No NFC-DEP supported activate using RF interface */
  1144. #endif /* RFAL_FEATURE_NFC_DEP */
  1145. break;
  1146. /*******************************************************************************/
  1147. default:
  1148. return ERR_WRONG_STATE;
  1149. }
  1150. break;
  1151. #endif /* RFAL_FEATURE_NFCA */
  1152. /*******************************************************************************/
  1153. /* Passive NFC-B Activation */
  1154. /*******************************************************************************/
  1155. #if RFAL_FEATURE_NFCB
  1156. case RFAL_NFC_LISTEN_TYPE_NFCB:
  1157. if( !gNfcDev.isTechInit )
  1158. {
  1159. rfalNfcbPollerInitialize();
  1160. gNfcDev.isTechInit = true;
  1161. gNfcDev.isOperOngoing = false;
  1162. return ERR_BUSY;
  1163. }
  1164. if( gNfcDev.devList[devIt].dev.nfcb.isSleep ) /* Check if desired device is in Sleep */
  1165. {
  1166. rfalNfcbSensbRes sensbRes;
  1167. uint8_t sensbResLen;
  1168. /* Wake up all cards. SENSB_RES may return collision but the NFCID0 is available to explicitly select NFC-B card via ATTRIB; so error will be ignored here */
  1169. rfalNfcbPollerCheckPresence( RFAL_NFCB_SENS_CMD_ALLB_REQ, RFAL_NFCB_SLOT_NUM_1, &sensbRes, &sensbResLen );
  1170. }
  1171. /* Set NFCID */
  1172. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.nfcb.sensbRes.nfcid0;
  1173. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCB_NFCID0_LEN;
  1174. #if RFAL_FEATURE_ISO_DEP && RFAL_FEATURE_ISO_DEP_POLL
  1175. /* Check if device supports ISO-DEP (ISO14443-4) */
  1176. if( (gNfcDev.devList[devIt].dev.nfcb.sensbRes.protInfo.FsciProType & RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK) != 0U )
  1177. {
  1178. if( !gNfcDev.isOperOngoing )
  1179. {
  1180. rfalIsoDepInitialize();
  1181. /* Perform ISO-DEP (ISO14443-4) activation: ATTRIB */
  1182. EXIT_ON_ERR( err, rfalIsoDepPollBStartActivation( (rfalIsoDepFSxI)RFAL_ISODEP_FSDI_DEFAULT, RFAL_ISODEP_NO_DID, gNfcDev.disc.maxBR, 0x00, &gNfcDev.devList[devIt].dev.nfcb, NULL, 0, &gNfcDev.devList[devIt].proto.isoDep ) );
  1183. gNfcDev.isOperOngoing = true;
  1184. return ERR_BUSY;
  1185. }
  1186. err = rfalIsoDepPollBGetActivationStatus();
  1187. if( err != ERR_NONE )
  1188. {
  1189. return err;
  1190. }
  1191. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_ISODEP; /* NFC-B T4T device activated */
  1192. break;
  1193. }
  1194. #endif /* RFAL_FEATURE_ISO_DEP_POLL */
  1195. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* NFC-B device activated */
  1196. break;
  1197. #endif /* RFAL_FEATURE_NFCB */
  1198. /*******************************************************************************/
  1199. /* Passive NFC-F Activation */
  1200. /*******************************************************************************/
  1201. #if RFAL_FEATURE_NFCF
  1202. case RFAL_NFC_LISTEN_TYPE_NFCF:
  1203. rfalNfcfPollerInitialize( gNfcDev.disc.nfcfBR );
  1204. #if RFAL_FEATURE_NFC_DEP
  1205. if( rfalNfcfIsNfcDepSupported( &gNfcDev.devList[devIt].dev.nfcf ) )
  1206. {
  1207. /* Perform NFC-DEP (P2P) activation: ATR and PSL if supported */
  1208. EXIT_ON_ERR( err, rfalNfcNfcDepActivate( &gNfcDev.devList[devIt], RFAL_NFCDEP_COMM_PASSIVE, NULL, 0 ) );
  1209. /* Set NFCID */
  1210. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].proto.nfcDep.activation.Target.ATR_RES.NFCID3;
  1211. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
  1212. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_NFCDEP; /* NFC-F P2P device activated */
  1213. break;
  1214. }
  1215. #endif /* RFAL_FEATURE_NFC_DEP */
  1216. /* Set NFCID */
  1217. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.nfcf.sensfRes.NFCID2;
  1218. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCF_NFCID2_LEN;
  1219. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* NFC-F T3T device activated */
  1220. break;
  1221. #endif /* RFAL_FEATURE_NFCF */
  1222. /*******************************************************************************/
  1223. /* Passive NFC-V Activation */
  1224. /*******************************************************************************/
  1225. #if RFAL_FEATURE_NFCV
  1226. case RFAL_NFC_LISTEN_TYPE_NFCV:
  1227. rfalNfcvPollerInitialize();
  1228. /* No specific activation needed for a T5T */
  1229. /* Set NFCID */
  1230. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.nfcv.InvRes.UID;
  1231. gNfcDev.devList[devIt].nfcidLen = RFAL_NFCV_UID_LEN;
  1232. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* NFC-V T5T device activated */
  1233. break;
  1234. #endif /* RFAL_FEATURE_NFCV */
  1235. /*******************************************************************************/
  1236. /* Passive ST25TB Activation */
  1237. /*******************************************************************************/
  1238. #if RFAL_FEATURE_ST25TB
  1239. case RFAL_NFC_LISTEN_TYPE_ST25TB:
  1240. rfalSt25tbPollerInitialize();
  1241. /* No specific activation needed for a ST25TB */
  1242. /* Set NFCID */
  1243. gNfcDev.devList[devIt].nfcid = gNfcDev.devList[devIt].dev.st25tb.UID;
  1244. gNfcDev.devList[devIt].nfcidLen = RFAL_ST25TB_UID_LEN;
  1245. gNfcDev.devList[devIt].rfInterface = RFAL_NFC_INTERFACE_RF; /* ST25TB device activated */
  1246. break;
  1247. #endif /* RFAL_FEATURE_ST25TB */
  1248. /*******************************************************************************/
  1249. default:
  1250. return ERR_WRONG_STATE;
  1251. }
  1252. gNfcDev.activeDev = &gNfcDev.devList[devIt]; /* Assign active device to be used further on */
  1253. return ERR_NONE;
  1254. }
  1255. /*!
  1256. ******************************************************************************
  1257. * \brief Listener Activation
  1258. *
  1259. * This method handles the listen mode Activation according to the different
  1260. * protocols the Reader/Initiator performs
  1261. *
  1262. * \return ERR_NONE : Operation completed with no error
  1263. * \return ERR_BUSY : Operation ongoing
  1264. * \return ERR_PROTO : Unexpected frame received
  1265. * \return ERR_XXXX : Error occurred
  1266. *
  1267. ******************************************************************************
  1268. */
  1269. #if RFAL_FEATURE_LISTEN_MODE
  1270. static ReturnCode rfalNfcListenActivation( void )
  1271. {
  1272. bool isDataRcvd;
  1273. ReturnCode ret;
  1274. rfalLmState lmSt;
  1275. rfalBitRate bitRate;
  1276. #if RFAL_FEATURE_NFC_DEP
  1277. uint8_t hdrLen;
  1278. /* Set the header length in NFC-A */
  1279. hdrLen = (RFAL_NFCDEP_SB_LEN + RFAL_NFCDEP_LEN_LEN);
  1280. #endif /* RFAL_FEATURE_NFC_DEP */
  1281. lmSt = rfalListenGetState( &isDataRcvd, &bitRate );
  1282. switch(lmSt)
  1283. {
  1284. #if RFAL_FEATURE_NFCA
  1285. /*******************************************************************************/
  1286. case RFAL_LM_STATE_ACTIVE_A: /* NFC-A CE activation */
  1287. case RFAL_LM_STATE_ACTIVE_Ax:
  1288. if( isDataRcvd ) /* Check if Reader/Initator has sent some data */
  1289. {
  1290. /* Check if received data is a Sleep request */
  1291. if( rfalNfcaListenerIsSleepReq( gNfcDev.rxBuf.rfBuf, rfalConvBitsToBytes(gNfcDev.rxLen)) ) /* Check if received data is a SLP_REQ */
  1292. {
  1293. /* Set the Listen Mode in Sleep state */
  1294. EXIT_ON_ERR( ret, rfalListenSleepStart( RFAL_LM_STATE_SLEEP_A, gNfcDev.rxBuf.rfBuf, sizeof(gNfcDev.rxBuf.rfBuf), &gNfcDev.rxLen ) );
  1295. }
  1296. #if RFAL_FEATURE_ISO_DEP && RFAL_FEATURE_ISO_DEP_LISTEN
  1297. /* Check if received data is a valid RATS */
  1298. else if( rfalIsoDepIsRats( gNfcDev.rxBuf.rfBuf, (uint8_t)rfalConvBitsToBytes(gNfcDev.rxLen) ) )
  1299. {
  1300. rfalIsoDepAtsParam atsParam;
  1301. rfalIsoDepListenActvParam rxParam;
  1302. /* Set ATS parameters */
  1303. atsParam.fsci = (uint8_t)RFAL_ISODEP_DEFAULT_FSCI;
  1304. atsParam.fwi = RFAL_ISODEP_DEFAULT_FWI;
  1305. atsParam.sfgi = RFAL_ISODEP_DEFAULT_SFGI;
  1306. atsParam.didSupport = false;
  1307. atsParam.ta = RFAL_ISODEP_ATS_TA_SAME_D;
  1308. atsParam.hb = NULL;
  1309. atsParam.hbLen = 0;
  1310. /* Set Rx parameters */
  1311. rxParam.rxBuf = (rfalIsoDepBufFormat*) &gNfcDev.rxBuf.isoDepBuf; /* PRQA S 0310 # MISRA 11.3 - Intentional safe cast to avoiding large buffer duplication */
  1312. rxParam.rxLen = &gNfcDev.rxLen;
  1313. rxParam.isoDepDev = &gNfcDev.devList->proto.isoDep;
  1314. rxParam.isRxChaining = &gNfcDev.isRxChaining;
  1315. rfalListenSetState( RFAL_LM_STATE_CARDEMU_4A ); /* Set next state CE T4T */
  1316. rfalIsoDepInitialize(); /* Initialize ISO-DEP layer to handle ISO14443-a activation / RATS */
  1317. /* Set ISO-DEP layer to digest RATS and handle activation */
  1318. EXIT_ON_ERR( ret, rfalIsoDepListenStartActivation( &atsParam, NULL, gNfcDev.rxBuf.rfBuf, gNfcDev.rxLen, rxParam ) );
  1319. }
  1320. #endif /* RFAL_FEATURE_ISO_DEP_LISTEN */
  1321. #if RFAL_FEATURE_NFC_DEP
  1322. /* Check if received data is a valid ATR_REQ */
  1323. else if( rfalNfcDepIsAtrReq( &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen), gNfcDev.devList->nfcid ) )
  1324. {
  1325. gNfcDev.devList->type = RFAL_NFC_POLL_TYPE_NFCA;
  1326. EXIT_ON_ERR( ret, rfalNfcNfcDepActivate( gNfcDev.devList, RFAL_NFCDEP_COMM_PASSIVE, &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen) ) );
  1327. }
  1328. #endif /* RFAL_FEATURE_NFC_DEP */
  1329. else
  1330. {
  1331. return ERR_PROTO;
  1332. }
  1333. }
  1334. return ERR_BUSY;
  1335. #endif /* RFAL_FEATURE_NFCA */
  1336. #if RFAL_FEATURE_ISO_DEP && RFAL_FEATURE_ISO_DEP_LISTEN
  1337. /*******************************************************************************/
  1338. case RFAL_LM_STATE_CARDEMU_4A: /* T4T ISO-DEP activation */
  1339. ret = rfalIsoDepListenGetActivationStatus();
  1340. if( ret == ERR_NONE )
  1341. {
  1342. gNfcDev.devList->type = RFAL_NFC_POLL_TYPE_NFCA;
  1343. gNfcDev.devList->rfInterface = RFAL_NFC_INTERFACE_ISODEP;
  1344. gNfcDev.devList->nfcid = NULL;
  1345. gNfcDev.devList->nfcidLen = 0;
  1346. }
  1347. return ret;
  1348. #endif /* RFAL_FEATURE_ISO_DEP_LISTEN */
  1349. /*******************************************************************************/
  1350. case RFAL_LM_STATE_READY_F: /* NFC-F CE activation */
  1351. if( isDataRcvd ) /* Wait for the first received data */
  1352. {
  1353. #if RFAL_FEATURE_NFC_DEP
  1354. /* Set the header length in NFC-F */
  1355. hdrLen = RFAL_NFCDEP_LEN_LEN;
  1356. if( rfalNfcDepIsAtrReq( &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen), gNfcDev.devList->nfcid ) )
  1357. {
  1358. gNfcDev.devList->type = RFAL_NFC_POLL_TYPE_NFCF;
  1359. EXIT_ON_ERR( ret, rfalNfcNfcDepActivate( gNfcDev.devList, RFAL_NFCDEP_COMM_PASSIVE, &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen) ) );
  1360. }
  1361. else
  1362. #endif /* RFAL_FEATURE_NFC_DEP */
  1363. {
  1364. rfalListenSetState( RFAL_LM_STATE_CARDEMU_3 ); /* First data already received - set T3T CE */
  1365. }
  1366. }
  1367. return ERR_BUSY;
  1368. /*******************************************************************************/
  1369. case RFAL_LM_STATE_CARDEMU_3: /* T3T activated */
  1370. gNfcDev.devList->type = RFAL_NFC_POLL_TYPE_NFCF;
  1371. gNfcDev.devList->rfInterface = RFAL_NFC_INTERFACE_RF;
  1372. gNfcDev.devList->nfcid = NULL;
  1373. gNfcDev.devList->nfcidLen = 0;
  1374. return ERR_NONE;
  1375. #if RFAL_FEATURE_NFC_DEP
  1376. /*******************************************************************************/
  1377. case RFAL_LM_STATE_TARGET_A: /* NFC-DEP activation */
  1378. case RFAL_LM_STATE_TARGET_F:
  1379. ret = rfalNfcDepListenGetActivationStatus();
  1380. if( ret == ERR_NONE )
  1381. {
  1382. gNfcDev.devList->rfInterface = RFAL_NFC_INTERFACE_NFCDEP;
  1383. gNfcDev.devList->nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
  1384. }
  1385. return ret;
  1386. #endif /* RFAL_FEATURE_NFC_DEP */
  1387. /*******************************************************************************/
  1388. case RFAL_LM_STATE_IDLE: /* AP2P activation */
  1389. if( isDataRcvd ) /* Check if Reader/Initator has sent some data */
  1390. {
  1391. if( (gNfcDev.lmMask & RFAL_LM_MASK_ACTIVE_P2P) != 0U ) /* Check if AP2P is enabled */
  1392. {
  1393. #if RFAL_FEATURE_NFC_DEP
  1394. /* Calculate the header length in NFC-A or NFC-F mode*/
  1395. hdrLen = ( (bitRate == RFAL_BR_106) ? (RFAL_NFCDEP_SB_LEN + RFAL_NFCDEP_LEN_LEN) : RFAL_NFCDEP_LEN_LEN );
  1396. if( rfalNfcDepIsAtrReq( &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen), NULL) )
  1397. {
  1398. gNfcDev.devList->type = RFAL_NFC_POLL_TYPE_AP2P;
  1399. rfalSetMode( (RFAL_MODE_LISTEN_ACTIVE_P2P), bitRate, bitRate );
  1400. EXIT_ON_ERR( ret, rfalNfcNfcDepActivate( gNfcDev.devList, RFAL_NFCDEP_COMM_ACTIVE, &gNfcDev.rxBuf.rfBuf[hdrLen], (rfalConvBitsToBytes(gNfcDev.rxLen) - hdrLen) ) );
  1401. }
  1402. else
  1403. #endif /* RFAL_FEATURE_NFC_DEP */
  1404. {
  1405. return ERR_PROTO;
  1406. }
  1407. }
  1408. }
  1409. return ERR_BUSY;
  1410. /*******************************************************************************/
  1411. case RFAL_LM_STATE_READY_A:
  1412. case RFAL_LM_STATE_READY_Ax:
  1413. case RFAL_LM_STATE_SLEEP_A:
  1414. case RFAL_LM_STATE_SLEEP_AF:
  1415. return ERR_BUSY;
  1416. /*******************************************************************************/
  1417. case RFAL_LM_STATE_POWER_OFF:
  1418. return ERR_LINK_LOSS;
  1419. default: /* Wait for activation */
  1420. break;
  1421. }
  1422. return ERR_INTERNAL;
  1423. }
  1424. #endif /* RFAL_FEATURE_LISTEN_MODE */
  1425. /*!
  1426. ******************************************************************************
  1427. * \brief Poller NFC DEP Activate
  1428. *
  1429. * This method performs NFC-DEP Activation
  1430. *
  1431. * \param[in] device : device info
  1432. * \param[in] commMode : communication mode (Passive/Active)
  1433. * \param[in] atrReq : received ATR_REQ
  1434. * \param[in] atrReqLen : received ATR_REQ size
  1435. *
  1436. * \return ERR_NONE : Operation completed with no error
  1437. * \return ERR_BUSY : Operation ongoing
  1438. * \return ERR_XXXX : Error occurred
  1439. *
  1440. ******************************************************************************
  1441. */
  1442. #if RFAL_FEATURE_NFC_DEP
  1443. static ReturnCode rfalNfcNfcDepActivate( rfalNfcDevice *device, rfalNfcDepCommMode commMode, const uint8_t *atrReq, uint16_t atrReqLen )
  1444. {
  1445. rfalNfcDepAtrParam initParam;
  1446. /* Supress warnings if Listen mode is disabled */
  1447. NO_WARNING(atrReq);
  1448. NO_WARNING(atrReqLen);
  1449. /* If we are in Poll mode */
  1450. if( rfalNfcIsRemDevListener( device->type ) )
  1451. {
  1452. /*******************************************************************************/
  1453. /* If Passive F use the NFCID2 retrieved from SENSF */
  1454. if( device->type == RFAL_NFC_LISTEN_TYPE_NFCF )
  1455. {
  1456. initParam.nfcid = device->dev.nfcf.sensfRes.NFCID2;
  1457. initParam.nfcidLen = RFAL_NFCF_NFCID2_LEN;
  1458. }
  1459. else
  1460. {
  1461. initParam.nfcid = gNfcDev.disc.nfcid3;
  1462. initParam.nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
  1463. }
  1464. initParam.BS = RFAL_NFCDEP_Bx_NO_HIGH_BR;
  1465. initParam.BR = RFAL_NFCDEP_Bx_NO_HIGH_BR;
  1466. initParam.DID = RFAL_NFCDEP_DID_NO;
  1467. initParam.NAD = RFAL_NFCDEP_NAD_NO;
  1468. initParam.LR = RFAL_NFCDEP_LR_254;
  1469. initParam.GB = gNfcDev.disc.GB;
  1470. initParam.GBLen = gNfcDev.disc.GBLen;
  1471. initParam.commMode = commMode;
  1472. initParam.operParam = (RFAL_NFCDEP_OPER_FULL_MI_EN | RFAL_NFCDEP_OPER_EMPTY_DEP_DIS | RFAL_NFCDEP_OPER_ATN_EN | RFAL_NFCDEP_OPER_RTOX_REQ_EN);
  1473. rfalNfcDepInitialize();
  1474. /* Perform NFC-DEP (P2P) activation: ATR and PSL if supported */
  1475. return rfalNfcDepInitiatorHandleActivation( &initParam, gNfcDev.disc.maxBR, &device->proto.nfcDep );
  1476. }
  1477. /* If we are in Listen mode */
  1478. #if RFAL_FEATURE_LISTEN_MODE
  1479. else if( rfalNfcIsRemDevPoller( device->type ) )
  1480. {
  1481. rfalNfcDepListenActvParam actvParams;
  1482. rfalNfcDepTargetParam targetParam;
  1483. ST_MEMCPY(targetParam.nfcid3, (uint8_t*)gNfcDev.disc.nfcid3, RFAL_NFCDEP_NFCID3_LEN);
  1484. targetParam.bst = RFAL_NFCDEP_Bx_NO_HIGH_BR;
  1485. targetParam.brt = RFAL_NFCDEP_Bx_NO_HIGH_BR;
  1486. targetParam.to = RFAL_NFCDEP_WT_TRG_MAX_L13; /* [LLCP] 1.3 6.2.1 */
  1487. targetParam.ppt = rfalNfcDepLR2PP(RFAL_NFCDEP_LR_254);
  1488. if( gNfcDev.disc.GBLen >= RFAL_NFCDEP_GB_MAX_LEN )
  1489. {
  1490. return ERR_PARAM;
  1491. }
  1492. targetParam.GBtLen = gNfcDev.disc.GBLen;
  1493. if( gNfcDev.disc.GBLen > 0U )
  1494. {
  1495. ST_MEMCPY(targetParam.GBt, gNfcDev.disc.GB, gNfcDev.disc.GBLen);
  1496. }
  1497. targetParam.operParam = (RFAL_NFCDEP_OPER_FULL_MI_EN | RFAL_NFCDEP_OPER_EMPTY_DEP_DIS | RFAL_NFCDEP_OPER_ATN_EN | RFAL_NFCDEP_OPER_RTOX_REQ_EN);
  1498. targetParam.commMode = commMode;
  1499. /* Set activation buffer (including header) for NFC-DEP */
  1500. actvParams.rxBuf = (rfalNfcDepBufFormat*) &gNfcDev.rxBuf.nfcDepBuf; /* PRQA S 0310 # MISRA 11.3 - Intentional safe cast to avoiding large buffer duplication */
  1501. actvParams.rxLen = &gNfcDev.rxLen;
  1502. actvParams.isRxChaining = &gNfcDev.isRxChaining;
  1503. actvParams.nfcDepDev = &gNfcDev.devList->proto.nfcDep;
  1504. rfalListenSetState( ((device->type == RFAL_NFC_POLL_TYPE_NFCA) ? RFAL_LM_STATE_TARGET_A : RFAL_LM_STATE_TARGET_F) );
  1505. rfalNfcDepInitialize();
  1506. /* Perform NFC-DEP (P2P) activation: send ATR_RES and handle activation */
  1507. return rfalNfcDepListenStartActivation( &targetParam, atrReq, atrReqLen, actvParams );
  1508. }
  1509. #endif /* RFAL_FEATURE_LISTEN_MODE */
  1510. else
  1511. {
  1512. return ERR_INTERNAL;
  1513. }
  1514. }
  1515. #endif /* RFAL_FEATURE_NFC_DEP */
  1516. /*!
  1517. ******************************************************************************
  1518. * \brief Poller NFC Deactivate
  1519. *
  1520. * This method Deactivates the device if a deactivation procedure exists
  1521. *
  1522. * \return ERR_NONE : Operation completed with no error
  1523. * \return ERR_BUSY : Operation ongoing
  1524. * \return ERR_XXXX : Error occurred
  1525. *
  1526. ******************************************************************************
  1527. */
  1528. static ReturnCode rfalNfcDeactivation( void )
  1529. {
  1530. /* Check if a device has been activated */
  1531. if( gNfcDev.activeDev != NULL )
  1532. {
  1533. if( rfalNfcIsRemDevListener( gNfcDev.activeDev->type ) ) /* Listen mode no additional deactivation to be performed*/
  1534. {
  1535. #ifndef RFAL_NFC_SKIP_DEACT
  1536. switch( gNfcDev.activeDev->rfInterface )
  1537. {
  1538. /*******************************************************************************/
  1539. case RFAL_NFC_INTERFACE_RF:
  1540. break; /* No specific deactivation to be performed */
  1541. /*******************************************************************************/
  1542. #if RFAL_FEATURE_ISO_DEP && RFAL_FEATURE_ISO_DEP_POLL
  1543. case RFAL_NFC_INTERFACE_ISODEP:
  1544. rfalIsoDepDeselect(); /* Send a Deselect to device */
  1545. break;
  1546. #endif /* RFAL_FEATURE_ISO_DEP_POLL */
  1547. /*******************************************************************************/
  1548. #if RFAL_FEATURE_NFC_DEP
  1549. case RFAL_NFC_INTERFACE_NFCDEP:
  1550. switch ( gNfcDev.activeDev->type )
  1551. {
  1552. case RFAL_NFC_LISTEN_TYPE_AP2P:
  1553. rfalNfcDepRLS(); /* Send a Release to device */
  1554. break;
  1555. default:
  1556. rfalNfcDepDSL(); /* Send a Deselect to device */
  1557. break;
  1558. }
  1559. break;
  1560. #endif /* RFAL_FEATURE_NFC_DEP */
  1561. default:
  1562. return ERR_REQUEST;
  1563. }
  1564. #endif /* RFAL_NFC_SKIP_DEACT */
  1565. }
  1566. }
  1567. #if RFAL_FEATURE_WAKEUP_MODE
  1568. rfalWakeUpModeStop();
  1569. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  1570. #if RFAL_FEATURE_LISTEN_MODE
  1571. rfalListenStop();
  1572. #else
  1573. rfalFieldOff();
  1574. #endif
  1575. gNfcDev.activeDev = NULL;
  1576. return ERR_NONE;
  1577. }