rfal_rfst25r3916.c 212 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744
  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: ST25R3916 firmware
  23. * Revision:
  24. * LANGUAGE: ISO C99
  25. */
  26. /*! \file
  27. *
  28. * \author Gustavo Patricio
  29. *
  30. * \brief RF Abstraction Layer (RFAL)
  31. *
  32. * RFAL implementation for ST25R3916
  33. */
  34. /*
  35. ******************************************************************************
  36. * INCLUDES
  37. ******************************************************************************
  38. */
  39. #include "rfal_chip.h"
  40. #include "utils.h"
  41. #include "st25r3916.h"
  42. #include "st25r3916_com.h"
  43. #include "st25r3916_irq.h"
  44. #include "rfal_analogConfig.h"
  45. #include "rfal_iso15693_2.h"
  46. #include "rfal_crc.h"
  47. /*
  48. ******************************************************************************
  49. * ENABLE SWITCHS
  50. ******************************************************************************
  51. */
  52. #ifndef RFAL_FEATURE_LISTEN_MODE
  53. #define RFAL_FEATURE_LISTEN_MODE false /* Listen Mode configuration missing. Disabled by default */
  54. #endif /* RFAL_FEATURE_LISTEN_MODE */
  55. #ifndef RFAL_FEATURE_WAKEUP_MODE
  56. #define RFAL_FEATURE_WAKEUP_MODE false /* Wake-Up mode configuration missing. Disabled by default */
  57. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  58. #ifndef RFAL_FEATURE_LOWPOWER_MODE
  59. #define RFAL_FEATURE_LOWPOWER_MODE false /* Low Power mode configuration missing. Disabled by default */
  60. #endif /* RFAL_FEATURE_LOWPOWER_MODE */
  61. /*
  62. ******************************************************************************
  63. * GLOBAL TYPES
  64. ******************************************************************************
  65. */
  66. /*! Struct that holds all involved on a Transceive including the context passed by the caller */
  67. typedef struct{
  68. rfalTransceiveState state; /*!< Current transceive state */
  69. rfalTransceiveState lastState; /*!< Last transceive state (debug purposes) */
  70. ReturnCode status; /*!< Current status/error of the transceive */
  71. rfalTransceiveContext ctx; /*!< The transceive context given by the caller */
  72. } rfalTxRx;
  73. /*! Struct that holds all context for the Listen Mode */
  74. typedef struct{
  75. rfalLmState state; /*!< Current Listen Mode state */
  76. uint32_t mdMask; /*!< Listen Mode mask used */
  77. uint32_t mdReg; /*!< Listen Mode register value used */
  78. uint32_t mdIrqs; /*!< Listen Mode IRQs used */
  79. rfalBitRate brDetected; /*!< Last bit rate detected */
  80. uint8_t* rxBuf; /*!< Location to store incoming data in Listen Mode */
  81. uint16_t rxBufLen; /*!< Length of rxBuf */
  82. uint16_t* rxLen; /*!< Pointer to write the data length placed into rxBuf */
  83. bool dataFlag; /*!< Listen Mode current Data Flag */
  84. bool iniFlag; /*!< Listen Mode initialized Flag (FeliCa slots) */
  85. } rfalLm;
  86. /*! Struct that holds all context for the Wake-Up Mode */
  87. typedef struct{
  88. rfalWumState state; /*!< Current Wake-Up Mode state */
  89. rfalWakeUpConfig cfg; /*!< Current Wake-Up Mode context */
  90. } rfalWum;
  91. /*! Struct that holds all context for the Low Power Mode */
  92. typedef struct{
  93. bool isRunning;
  94. } rfalLpm;
  95. /*! Struct that holds the timings GT and FDTs */
  96. typedef struct{
  97. uint32_t GT; /*!< GT in 1/fc */
  98. uint32_t FDTListen; /*!< FDTListen in 1/fc */
  99. uint32_t FDTPoll; /*!< FDTPoll in 1/fc */
  100. uint8_t nTRFW; /*!< n*TRFW used during RF CA */
  101. } rfalTimings;
  102. /*! Struct that holds the software timers */
  103. typedef struct{
  104. uint32_t GT; /*!< RFAL's GT timer */
  105. uint32_t RXE; /*!< Timer between RXS and RXE */
  106. uint32_t txRx; /*!< Transceive sanity timer */
  107. } rfalTimers;
  108. /*! Struct that holds the RFAL's callbacks */
  109. typedef struct{
  110. rfalPreTxRxCallback preTxRx; /*!< RFAL's Pre TxRx callback */
  111. rfalPostTxRxCallback postTxRx; /*!< RFAL's Post TxRx callback */
  112. } rfalCallbacks;
  113. /*! Struct that holds counters to control the FIFO on Tx and Rx */
  114. typedef struct{
  115. uint16_t expWL; /*!< The amount of bytes expected to be Tx when a WL interrupt occours */
  116. uint16_t bytesTotal; /*!< Total bytes to be transmitted OR the total bytes received */
  117. uint16_t bytesWritten;/*!< Amount of bytes already written on FIFO (Tx) OR read (RX) from FIFO and written on rxBuffer*/
  118. uint8_t status[ST25R3916_FIFO_STATUS_LEN]; /*!< FIFO Status Registers */
  119. } rfalFIFO;
  120. /*! Struct that holds RFAL's configuration settings */
  121. typedef struct{
  122. uint8_t obsvModeTx; /*!< RFAL's config of the ST25R3916's observation mode while Tx */
  123. uint8_t obsvModeRx; /*!< RFAL's config of the ST25R3916's observation mode while Rx */
  124. rfalEHandling eHandling; /*!< RFAL's error handling config/mode */
  125. } rfalConfigs;
  126. /*! Struct that holds NFC-F data - Used only inside rfalFelicaPoll() (static to avoid adding it into stack) */
  127. typedef struct{
  128. rfalFeliCaPollRes pollResponses[RFAL_FELICA_POLL_MAX_SLOTS]; /* FeliCa Poll response container for 16 slots */
  129. } rfalNfcfWorkingData;
  130. /*! Struct that holds NFC-V current context
  131. *
  132. * This buffer has to be big enough for coping with maximum response size (hamming coded)
  133. * - inventory requests responses: 14*2+2 bytes
  134. * - read single block responses: (32+4)*2+2 bytes
  135. * - read multiple block could be very long... -> not supported
  136. * - current implementation expects it be written in one bulk into FIFO
  137. * - needs to be above FIFO water level of ST25R3916 (200)
  138. * - the coding function needs to be able to
  139. * put more than FIFO water level bytes into it (n*64+1)>200 */
  140. typedef struct{
  141. uint8_t codingBuffer[((2 + 255 + 3)*2)]; /*!< Coding buffer, length MUST be above 257: [257; ...] */
  142. uint16_t nfcvOffset; /*!< Offset needed for ISO15693 coding function */
  143. rfalTransceiveContext origCtx; /*!< context provided by user */
  144. uint16_t ignoreBits; /*!< Number of bits at the beginning of a frame to be ignored when decoding */
  145. } rfalNfcvWorkingData;
  146. /*! RFAL instance */
  147. typedef struct{
  148. rfalState state; /*!< RFAL's current state */
  149. rfalMode mode; /*!< RFAL's current mode */
  150. rfalBitRate txBR; /*!< RFAL's current Tx Bit Rate */
  151. rfalBitRate rxBR; /*!< RFAL's current Rx Bit Rate */
  152. bool field; /*!< Current field state (On / Off) */
  153. rfalConfigs conf; /*!< RFAL's configuration settings */
  154. rfalTimings timings; /*!< RFAL's timing setting */
  155. rfalTxRx TxRx; /*!< RFAL's transceive management */
  156. rfalFIFO fifo; /*!< RFAL's FIFO management */
  157. rfalTimers tmr; /*!< RFAL's Software timers */
  158. rfalCallbacks callbacks; /*!< RFAL's callbacks */
  159. #if RFAL_FEATURE_LISTEN_MODE
  160. rfalLm Lm; /*!< RFAL's listen mode management */
  161. #endif /* RFAL_FEATURE_LISTEN_MODE */
  162. #if RFAL_FEATURE_WAKEUP_MODE
  163. rfalWum wum; /*!< RFAL's Wake-up mode management */
  164. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  165. #if RFAL_FEATURE_LOWPOWER_MODE
  166. rfalLpm lpm; /*!< RFAL's Low power mode management */
  167. #endif /* RFAL_FEATURE_LOWPOWER_MODE */
  168. #if RFAL_FEATURE_NFCF
  169. rfalNfcfWorkingData nfcfData; /*!< RFAL's working data when supporting NFC-F */
  170. #endif /* RFAL_FEATURE_NFCF */
  171. #if RFAL_FEATURE_NFCV
  172. rfalNfcvWorkingData nfcvData; /*!< RFAL's working data when performing NFC-V */
  173. #endif /* RFAL_FEATURE_NFCV */
  174. } rfal;
  175. /*! Felica's command set */
  176. typedef enum
  177. {
  178. FELICA_CMD_POLLING = 0x00, /*!< Felica Poll/REQC command (aka SENSF_REQ) to identify a card */
  179. FELICA_CMD_POLLING_RES = 0x01, /*!< Felica Poll/REQC command (aka SENSF_RES) response */
  180. FELICA_CMD_REQUEST_SERVICE = 0x02, /*!< verify the existence of Area and Service */
  181. FELICA_CMD_REQUEST_RESPONSE = 0x04, /*!< verify the existence of a card */
  182. FELICA_CMD_READ_WITHOUT_ENCRYPTION = 0x06, /*!< read Block Data from a Service that requires no authentication */
  183. FELICA_CMD_WRITE_WITHOUT_ENCRYPTION = 0x08, /*!< write Block Data to a Service that requires no authentication */
  184. FELICA_CMD_REQUEST_SYSTEM_CODE = 0x0C, /*!< acquire the System Code registered to a card */
  185. FELICA_CMD_AUTHENTICATION1 = 0x10, /*!< authenticate a card */
  186. FELICA_CMD_AUTHENTICATION2 = 0x12, /*!< allow a card to authenticate a Reader/Writer */
  187. FELICA_CMD_READ = 0x14, /*!< read Block Data from a Service that requires authentication */
  188. FELICA_CMD_WRITE = 0x16, /*!< write Block Data to a Service that requires authentication */
  189. }t_rfalFeliCaCmd;
  190. /*! Union representing all PTMem sections */
  191. typedef union{ /* PRQA S 0750 # MISRA 19.2 - Both members are of the same type, just different names. Thus no problem can occur. */
  192. uint8_t PTMem_A[ST25R3916_PTM_A_LEN]; /*!< PT_Memory area allocated for NFC-A configuration */
  193. uint8_t PTMem_F[ST25R3916_PTM_F_LEN]; /*!< PT_Memory area allocated for NFC-F configuration */
  194. uint8_t TSN[ST25R3916_PTM_TSN_LEN]; /*!< PT_Memory area allocated for TSN - Random numbers */
  195. }t_rfalPTMem;
  196. /*
  197. ******************************************************************************
  198. * GLOBAL DEFINES
  199. ******************************************************************************
  200. */
  201. #define RFAL_FIFO_IN_WL 200U /*!< Number of bytes in the FIFO when WL interrupt occurs while Tx */
  202. #define RFAL_FIFO_OUT_WL (ST25R3916_FIFO_DEPTH - RFAL_FIFO_IN_WL) /*!< Number of bytes sent/out of the FIFO when WL interrupt occurs while Tx */
  203. #define RFAL_FIFO_STATUS_REG1 0U /*!< Location of FIFO status register 1 in local copy */
  204. #define RFAL_FIFO_STATUS_REG2 1U /*!< Location of FIFO status register 2 in local copy */
  205. #define RFAL_FIFO_STATUS_INVALID 0xFFU /*!< Value indicating that the local FIFO status in invalid|cleared */
  206. #define RFAL_ST25R3916_GPT_MAX_1FC rfalConv8fcTo1fc( 0xFFFFU ) /*!< Max GPT steps in 1fc (0xFFFF steps of 8/fc => 0xFFFF * 590ns = 38,7ms) */
  207. #define RFAL_ST25R3916_NRT_MAX_1FC rfalConv4096fcTo1fc( 0xFFFFU ) /*!< Max NRT steps in 1fc (0xFFFF steps of 4096/fc => 0xFFFF * 302us = 19.8s ) */
  208. #define RFAL_ST25R3916_NRT_DISABLED 0U /*!< NRT Disabled: All 0 No-response timer is not started, wait forever */
  209. #define RFAL_ST25R3916_MRT_MAX_1FC rfalConv64fcTo1fc( 0x00FFU ) /*!< Max MRT steps in 1fc (0x00FF steps of 64/fc => 0x00FF * 4.72us = 1.2ms ) */
  210. #define RFAL_ST25R3916_MRT_MIN_1FC rfalConv64fcTo1fc( 0x0004U ) /*!< Min MRT steps in 1fc ( 0<=mrt<=4 ; 4 (64/fc) => 0x0004 * 4.72us = 18.88us ) */
  211. #define RFAL_ST25R3916_GT_MAX_1FC rfalConvMsTo1fc( 6000U ) /*!< Max GT value allowed in 1/fc (SFGI=14 => SFGT + dSFGT = 5.4s) */
  212. #define RFAL_ST25R3916_GT_MIN_1FC rfalConvMsTo1fc(RFAL_ST25R3916_SW_TMR_MIN_1MS)/*!< Min GT value allowed in 1/fc */
  213. #define RFAL_ST25R3916_SW_TMR_MIN_1MS 1U /*!< Min value of a SW timer in ms */
  214. #define RFAL_OBSMODE_DISABLE 0x00U /*!< Observation Mode disabled */
  215. #define RFAL_RX_INCOMPLETE_MAXLEN (uint8_t)1U /*!< Threshold value where incoming rx may be considered as incomplete */
  216. #define RFAL_EMVCO_RX_MAXLEN (uint8_t)4U /*!< Maximum value where EMVCo to apply special error handling */
  217. #define RFAL_NORXE_TOUT 50U /*!< Timeout to be used on a potential missing RXE - Silicon ST25R3916 Errata #TBD */
  218. #define RFAL_ISO14443A_SDD_RES_LEN 5U /*!< SDD_RES | Anticollision (UID CLn) length - rfalNfcaSddRes */
  219. #define RFAL_ISO14443A_CRC_INTVAL 0x6363 /*!< ISO14443 CRC Initial Value|Register */
  220. #define RFAL_FELICA_POLL_DELAY_TIME 512U /*!< FeliCa Poll Processing time is 2.417 ms ~512*64/fc Digital 1.1 A4 */
  221. #define RFAL_FELICA_POLL_SLOT_TIME 256U /*!< FeliCa Poll Time Slot duration is 1.208 ms ~256*64/fc Digital 1.1 A4 */
  222. #define RFAL_LM_SENSF_RD0_POS 17U /*!< FeliCa SENSF_RES Request Data RD0 position */
  223. #define RFAL_LM_SENSF_RD1_POS 18U /*!< FeliCa SENSF_RES Request Data RD1 position */
  224. #define RFAL_LM_NFCID_INCOMPLETE 0x04U /*!< NFCA NFCID not complete bit in SEL_RES (SAK) */
  225. #define RFAL_ISO15693_IGNORE_BITS rfalConvBytesToBits(2U) /*!< Ignore collisions before the UID (RES_FLAG + DSFID) */
  226. #define RFAL_ISO15693_INV_RES_LEN 12U /*!< ISO15693 Inventory response length with CRC (bytes) */
  227. #define RFAL_ISO15693_INV_RES_DUR 4U /*!< ISO15693 Inventory response duration @ 26 kbps (ms) */
  228. #define RFAL_WU_MIN_WEIGHT_VAL 4U /*!< ST25R3916 minimum Wake-up weight value */
  229. /*******************************************************************************/
  230. #define RFAL_LM_GT rfalConvUsTo1fc(100U) /*!< Listen Mode Guard Time enforced (GT - Passive; TIRFG - Active) */
  231. #define RFAL_FDT_POLL_ADJUSTMENT rfalConvUsTo1fc(80U) /*!< FDT Poll adjustment: Time between the expiration of GPT to the actual Tx */
  232. #define RFAL_FDT_LISTEN_MRT_ADJUSTMENT 64U /*!< MRT jitter adjustment: timeout will be between [ tout ; tout + 64 cycles ] */
  233. #define RFAL_AP2P_FIELDOFF_TRFW rfalConv8fcTo1fc(64U) /*!< Time after TXE and Field Off in AP2P Trfw: 37.76us -> 64 (8/fc) */
  234. #ifndef RFAL_ST25R3916_AAT_SETTLE
  235. #define RFAL_ST25R3916_AAT_SETTLE 5U /*!< Time in ms required for AAT pins and Osc to settle after en bit set */
  236. #endif /* RFAL_ST25R3916_AAT_SETTLE */
  237. /*! FWT adjustment:
  238. * 64 : NRT jitter between TXE and NRT start */
  239. #define RFAL_FWT_ADJUSTMENT 64U
  240. /*! FWT ISO14443A adjustment:
  241. * 512 : 4bit length
  242. * 64 : Half a bit duration due to ST25R3916 Coherent receiver (1/fc) */
  243. #define RFAL_FWT_A_ADJUSTMENT (512U + 64U)
  244. /*! FWT ISO14443B adjustment:
  245. * SOF (14etu) + 1Byte (10etu) + 1etu (IRQ comes 1etu after first byte) - 3etu (ST25R3916 sends TXE 3etu after) */
  246. #define RFAL_FWT_B_ADJUSTMENT ((14U + 10U + 1U - 3U) * 128U)
  247. /*! FWT FeliCa 212 adjustment:
  248. * 1024 : Length of the two Sync bytes at 212kbps */
  249. #define RFAL_FWT_F_212_ADJUSTMENT 1024U
  250. /*! FWT FeliCa 424 adjustment:
  251. * 512 : Length of the two Sync bytes at 424kbps */
  252. #define RFAL_FWT_F_424_ADJUSTMENT 512U
  253. /*! Time between our field Off and other peer field On : Tadt + (n x Trfw)
  254. * Ecma 340 11.1.2 - Tadt: [56.64 , 188.72] us ; n: [0 , 3] ; Trfw = 37.76 us
  255. * Should be: 189 + (3*38) = 303us ; we'll use a more relaxed setting: 605 us */
  256. #define RFAL_AP2P_FIELDON_TADTTRFW rfalConvUsTo1fc(605U)
  257. /*! FDT Listen adjustment for ISO14443A EMVCo 2.6 4.8.1.3 ; Digital 1.1 6.10
  258. *
  259. * 276: Time from the rising pulse of the pause of the logic '1' (i.e. the time point to measure the deaftime from),
  260. * to the actual end of the EOF sequence (the point where the MRT starts). Please note that the ST25R391x uses the
  261. * ISO14443-2 definition where the EOF consists of logic '0' followed by sequence Y.
  262. * -64: Further adjustment for receiver to be ready just before first bit
  263. */
  264. #define RFAL_FDT_LISTEN_A_ADJUSTMENT (276U-64U)
  265. /*! FDT Listen adjustment for ISO14443B EMVCo 2.6 4.8.1.6 ; Digital 1.1 7.9
  266. *
  267. * 340: Time from the rising edge of the EoS to the starting point of the MRT timer (sometime after the final high
  268. * part of the EoS is completed)
  269. */
  270. #define RFAL_FDT_LISTEN_B_ADJUSTMENT 340U
  271. /*! FDT Listen adjustment for ISO15693
  272. * ISO15693 2000 8.4 t1 MIN = 4192/fc
  273. * ISO15693 2009 9.1 t1 MIN = 4320/fc
  274. * Digital 2.1 B.5 FDTV,LISTEN,MIN = 4310/fc
  275. * Set FDT Listen one step earlier than on the more recent spec versions for greater interoprability
  276. */
  277. #define RFAL_FDT_LISTEN_V_ADJUSTMENT 64U
  278. /*! FDT Poll adjustment for ISO14443B Correlator - sst 5 etu */
  279. #define RFAL_FDT_LISTEN_B_ADJT_CORR 128U
  280. /*! FDT Poll adjustment for ISO14443B Correlator sst window - 5 etu */
  281. #define RFAL_FDT_LISTEN_B_ADJT_CORR_SST 20U
  282. /*
  283. ******************************************************************************
  284. * GLOBAL MACROS
  285. ******************************************************************************
  286. */
  287. /*! Calculates Transceive Sanity Timer. It accounts for the slowest bit rate and the longest data format
  288. * 1s for transmission and reception of a 4K message at 106kpbs (~425ms each direction)
  289. * plus TxRx preparation and FIFO load over Serial Interface */
  290. #define rfalCalcSanityTmr( fwt ) (uint16_t)(1000U + rfalConv1fcToMs((fwt)))
  291. #define rfalGennTRFW( n ) (((n)+1U)&ST25R3916_REG_AUX_nfc_n_mask) /*!< Generates the next n*TRRW used for RFCA */
  292. #define rfalCalcNumBytes( nBits ) (((uint32_t)(nBits) + 7U) / 8U) /*!< Returns the number of bytes required to fit given the number of bits */
  293. #define rfalTimerStart( timer, time_ms ) do{ platformTimerDestroy( timer ); (timer) = platformTimerCreate((uint16_t)(time_ms)); } while(0) /*!< Configures and starts timer */
  294. #define rfalTimerisExpired( timer ) platformTimerIsExpired( timer ) /*!< Checks if timer has expired */
  295. #define rfalTimerDestroy( timer ) platformTimerDestroy( timer ) /*!< Destroys timer */
  296. #define rfalST25R3916ObsModeDisable() st25r3916WriteTestRegister(0x01U, (0x40U)) /*!< Disable ST25R3916 Observation mode */
  297. #define rfalST25R3916ObsModeTx() st25r3916WriteTestRegister(0x01U, (0x40U|gRFAL.conf.obsvModeTx)) /*!< Enable Tx Observation mode */
  298. #define rfalST25R3916ObsModeRx() st25r3916WriteTestRegister(0x01U, (0x40U|gRFAL.conf.obsvModeRx)) /*!< Enable Rx Observation mode */
  299. #define rfalCheckDisableObsMode() if(gRFAL.conf.obsvModeRx != 0U){ rfalST25R3916ObsModeDisable(); } /*!< Checks if the observation mode is enabled, and applies on ST25R3916 */
  300. #define rfalCheckEnableObsModeTx() if(gRFAL.conf.obsvModeTx != 0U){ rfalST25R3916ObsModeTx(); } /*!< Checks if the observation mode is enabled, and applies on ST25R3916 */
  301. #define rfalCheckEnableObsModeRx() if(gRFAL.conf.obsvModeRx != 0U){ rfalST25R3916ObsModeRx(); } /*!< Checks if the observation mode is enabled, and applies on ST25R3916 */
  302. #define rfalGetIncmplBits( FIFOStatus2 ) (( (FIFOStatus2) >> 1) & 0x07U) /*!< Returns the number of bits from fifo status */
  303. #define rfalIsIncompleteByteError( error ) (((error) >= ERR_INCOMPLETE_BYTE) && ((error) <= ERR_INCOMPLETE_BYTE_07)) /*!< Checks if given error is a Incomplete error */
  304. #define rfalAdjACBR( b ) (((uint16_t)(b) >= (uint16_t)RFAL_BR_52p97) ? (uint16_t)(b) : ((uint16_t)(b)+1U)) /*!< Adjusts ST25R391x Bit rate to Analog Configuration */
  305. #define rfalConvBR2ACBR( b ) (((rfalAdjACBR((b)))<<RFAL_ANALOG_CONFIG_BITRATE_SHIFT) & RFAL_ANALOG_CONFIG_BITRATE_MASK) /*!< Converts ST25R391x Bit rate to Analog Configuration bit rate id */
  306. #define rfalConvTDFormat( v ) ((uint16_t)(v) << 8U) /*!< Converts a uint8_t to the format used in SW Tag Detection */
  307. /*
  308. ******************************************************************************
  309. * LOCAL VARIABLES
  310. ******************************************************************************
  311. */
  312. static rfal gRFAL; /*!< RFAL module instance */
  313. /*
  314. ******************************************************************************
  315. * LOCAL FUNCTION PROTOTYPES
  316. ******************************************************************************
  317. */
  318. static void rfalTransceiveTx( void );
  319. static void rfalTransceiveRx( void );
  320. static ReturnCode rfalTransceiveRunBlockingTx( void );
  321. static void rfalPrepareTransceive( void );
  322. static void rfalCleanupTransceive( void );
  323. static void rfalErrorHandling( void );
  324. static ReturnCode rfalRunTransceiveWorker( void );
  325. #if RFAL_FEATURE_LISTEN_MODE
  326. static ReturnCode rfalRunListenModeWorker( void );
  327. #endif /* RFAL_FEATURE_LISTEN_MODE */
  328. #if RFAL_FEATURE_WAKEUP_MODE
  329. static void rfalRunWakeUpModeWorker( void );
  330. static uint16_t rfalWakeUpModeFilter( uint16_t curRef, uint16_t curVal, uint8_t weight );
  331. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  332. static void rfalFIFOStatusUpdate( void );
  333. static void rfalFIFOStatusClear( void );
  334. static bool rfalFIFOStatusIsMissingPar( void );
  335. static bool rfalFIFOStatusIsIncompleteByte( void );
  336. static uint16_t rfalFIFOStatusGetNumBytes( void );
  337. static uint8_t rfalFIFOGetNumIncompleteBits( void );
  338. /*
  339. ******************************************************************************
  340. * GLOBAL FUNCTIONS
  341. ******************************************************************************
  342. */
  343. /*******************************************************************************/
  344. ReturnCode rfalInitialize( void )
  345. {
  346. ReturnCode err;
  347. EXIT_ON_ERR( err, st25r3916Initialize() );
  348. st25r3916ClearInterrupts();
  349. /* Disable any previous observation mode */
  350. rfalST25R3916ObsModeDisable();
  351. /*******************************************************************************/
  352. /* Apply RF Chip generic initialization */
  353. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_INIT) );
  354. /*******************************************************************************/
  355. /* Enable External Field Detector as: Automatics */
  356. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_en_fd_mask, ST25R3916_REG_OP_CONTROL_en_fd_auto_efd );
  357. /* Clear FIFO status local copy */
  358. rfalFIFOStatusClear();
  359. /*******************************************************************************/
  360. gRFAL.state = RFAL_STATE_INIT;
  361. gRFAL.mode = RFAL_MODE_NONE;
  362. gRFAL.field = false;
  363. /* Set RFAL default configs */
  364. gRFAL.conf.obsvModeRx = RFAL_OBSMODE_DISABLE;
  365. gRFAL.conf.obsvModeTx = RFAL_OBSMODE_DISABLE;
  366. gRFAL.conf.eHandling = RFAL_ERRORHANDLING_NONE;
  367. /* Transceive set to IDLE */
  368. gRFAL.TxRx.lastState = RFAL_TXRX_STATE_IDLE;
  369. gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
  370. /* Disable all timings */
  371. gRFAL.timings.FDTListen = RFAL_TIMING_NONE;
  372. gRFAL.timings.FDTPoll = RFAL_TIMING_NONE;
  373. gRFAL.timings.GT = RFAL_TIMING_NONE;
  374. gRFAL.timings.nTRFW = 0U;
  375. /* Destroy any previous pending timers */
  376. rfalTimerDestroy( gRFAL.tmr.GT );
  377. rfalTimerDestroy( gRFAL.tmr.txRx );
  378. rfalTimerDestroy( gRFAL.tmr.RXE );
  379. gRFAL.tmr.GT = RFAL_TIMING_NONE;
  380. gRFAL.tmr.txRx = RFAL_TIMING_NONE;
  381. gRFAL.tmr.RXE = RFAL_TIMING_NONE;
  382. gRFAL.callbacks.preTxRx = NULL;
  383. gRFAL.callbacks.postTxRx = NULL;
  384. #if RFAL_FEATURE_NFCV
  385. /* Initialize NFC-V Data */
  386. gRFAL.nfcvData.ignoreBits = 0;
  387. #endif /* RFAL_FEATURE_NFCV */
  388. #if RFAL_FEATURE_LISTEN_MODE
  389. /* Initialize Listen Mode */
  390. gRFAL.Lm.state = RFAL_LM_STATE_NOT_INIT;
  391. gRFAL.Lm.brDetected = RFAL_BR_KEEP;
  392. gRFAL.Lm.iniFlag = false;
  393. #endif /* RFAL_FEATURE_LISTEN_MODE */
  394. #if RFAL_FEATURE_WAKEUP_MODE
  395. /* Initialize Wake-Up Mode */
  396. gRFAL.wum.state = RFAL_WUM_STATE_NOT_INIT;
  397. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  398. #if RFAL_FEATURE_LOWPOWER_MODE
  399. /* Initialize Low Power Mode */
  400. gRFAL.lpm.isRunning = false;
  401. #endif /* RFAL_FEATURE_LOWPOWER_MODE */
  402. /*******************************************************************************/
  403. /* Perform Automatic Calibration (if configured to do so). *
  404. * Registers set by rfalSetAnalogConfig will tell rfalCalibrate what to perform*/
  405. rfalCalibrate();
  406. return ERR_NONE;
  407. }
  408. /*******************************************************************************/
  409. ReturnCode rfalCalibrate( void )
  410. {
  411. uint16_t resValue;
  412. /* Check if RFAL is not initialized */
  413. if( gRFAL.state == RFAL_STATE_IDLE )
  414. {
  415. return ERR_WRONG_STATE;
  416. }
  417. /*******************************************************************************/
  418. /* Perform ST25R3916 regulators and antenna calibration */
  419. /*******************************************************************************/
  420. /* Automatic regulator adjustment only performed if not set manually on Analog Configs */
  421. if( st25r3916CheckReg( ST25R3916_REG_REGULATOR_CONTROL, ST25R3916_REG_REGULATOR_CONTROL_reg_s, 0x00 ) )
  422. {
  423. /* Adjust the regulators so that Antenna Calibrate has better Regulator values */
  424. st25r3916AdjustRegulators( &resValue );
  425. }
  426. return ERR_NONE;
  427. }
  428. /*******************************************************************************/
  429. ReturnCode rfalAdjustRegulators( uint16_t* result )
  430. {
  431. return st25r3916AdjustRegulators( result );
  432. }
  433. /*******************************************************************************/
  434. void rfalSetUpperLayerCallback( rfalUpperLayerCallback pFunc )
  435. {
  436. st25r3916IRQCallbackSet( pFunc );
  437. }
  438. /*******************************************************************************/
  439. void rfalSetPreTxRxCallback( rfalPreTxRxCallback pFunc )
  440. {
  441. gRFAL.callbacks.preTxRx = pFunc;
  442. }
  443. /*******************************************************************************/
  444. void rfalSetPostTxRxCallback( rfalPostTxRxCallback pFunc )
  445. {
  446. gRFAL.callbacks.postTxRx = pFunc;
  447. }
  448. /*******************************************************************************/
  449. ReturnCode rfalDeinitialize( void )
  450. {
  451. /* Deinitialize chip */
  452. st25r3916Deinitialize();
  453. /* Set Analog configurations for deinitialization */
  454. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_DEINIT) );
  455. gRFAL.state = RFAL_STATE_IDLE;
  456. return ERR_NONE;
  457. }
  458. /*******************************************************************************/
  459. void rfalSetObsvMode( uint8_t txMode, uint8_t rxMode )
  460. {
  461. gRFAL.conf.obsvModeTx = txMode;
  462. gRFAL.conf.obsvModeRx = rxMode;
  463. }
  464. /*******************************************************************************/
  465. void rfalGetObsvMode( uint8_t* txMode, uint8_t* rxMode )
  466. {
  467. if(txMode != NULL)
  468. {
  469. *txMode = gRFAL.conf.obsvModeTx;
  470. }
  471. if(rxMode != NULL)
  472. {
  473. *rxMode = gRFAL.conf.obsvModeRx;
  474. }
  475. }
  476. /*******************************************************************************/
  477. void rfalDisableObsvMode( void )
  478. {
  479. gRFAL.conf.obsvModeTx = RFAL_OBSMODE_DISABLE;
  480. gRFAL.conf.obsvModeRx = RFAL_OBSMODE_DISABLE;
  481. }
  482. /*******************************************************************************/
  483. ReturnCode rfalSetMode( rfalMode mode, rfalBitRate txBR, rfalBitRate rxBR )
  484. {
  485. /* Check if RFAL is not initialized */
  486. if( gRFAL.state == RFAL_STATE_IDLE )
  487. {
  488. return ERR_WRONG_STATE;
  489. }
  490. /* Check allowed bit rate value */
  491. if( (txBR == RFAL_BR_KEEP) || (rxBR == RFAL_BR_KEEP) )
  492. {
  493. return ERR_PARAM;
  494. }
  495. switch( mode )
  496. {
  497. /*******************************************************************************/
  498. case RFAL_MODE_POLL_NFCA:
  499. /* Disable wake up mode, if set */
  500. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  501. /* Enable ISO14443A mode */
  502. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_iso14443a );
  503. /* Set Analog configurations for this mode and bit rate */
  504. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  505. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  506. break;
  507. /*******************************************************************************/
  508. case RFAL_MODE_POLL_NFCA_T1T:
  509. /* Disable wake up mode, if set */
  510. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  511. /* Enable Topaz mode */
  512. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_topaz );
  513. /* Set Analog configurations for this mode and bit rate */
  514. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  515. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  516. break;
  517. /*******************************************************************************/
  518. case RFAL_MODE_POLL_NFCB:
  519. /* Disable wake up mode, if set */
  520. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  521. /* Enable ISO14443B mode */
  522. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_iso14443b );
  523. /* Set the EGT, SOF, EOF and EOF */
  524. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_1,
  525. (ST25R3916_REG_ISO14443B_1_egt_mask | ST25R3916_REG_ISO14443B_1_sof_mask | ST25R3916_REG_ISO14443B_1_eof),
  526. ( (0U<<ST25R3916_REG_ISO14443B_1_egt_shift) | ST25R3916_REG_ISO14443B_1_sof_0_10etu | ST25R3916_REG_ISO14443B_1_sof_1_2etu | ST25R3916_REG_ISO14443B_1_eof_10etu) );
  527. /* Set the minimum TR1, SOF, EOF and EOF12 */
  528. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_2,
  529. (ST25R3916_REG_ISO14443B_2_tr1_mask | ST25R3916_REG_ISO14443B_2_no_sof | ST25R3916_REG_ISO14443B_2_no_eof),
  530. (ST25R3916_REG_ISO14443B_2_tr1_80fs80fs) );
  531. /* Set Analog configurations for this mode and bit rate */
  532. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  533. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  534. break;
  535. /*******************************************************************************/
  536. case RFAL_MODE_POLL_B_PRIME:
  537. /* Disable wake up mode, if set */
  538. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  539. /* Enable ISO14443B mode */
  540. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_iso14443b );
  541. /* Set the EGT, SOF, EOF and EOF */
  542. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_1,
  543. (ST25R3916_REG_ISO14443B_1_egt_mask | ST25R3916_REG_ISO14443B_1_sof_mask | ST25R3916_REG_ISO14443B_1_eof),
  544. ( (0U<<ST25R3916_REG_ISO14443B_1_egt_shift) | ST25R3916_REG_ISO14443B_1_sof_0_10etu | ST25R3916_REG_ISO14443B_1_sof_1_2etu | ST25R3916_REG_ISO14443B_1_eof_10etu) );
  545. /* Set the minimum TR1, EOF and EOF12 */
  546. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_2,
  547. (ST25R3916_REG_ISO14443B_2_tr1_mask | ST25R3916_REG_ISO14443B_2_no_sof | ST25R3916_REG_ISO14443B_2_no_eof),
  548. (ST25R3916_REG_ISO14443B_2_tr1_80fs80fs | ST25R3916_REG_ISO14443B_2_no_sof ) );
  549. /* Set Analog configurations for this mode and bit rate */
  550. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  551. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  552. break;
  553. /*******************************************************************************/
  554. case RFAL_MODE_POLL_B_CTS:
  555. /* Disable wake up mode, if set */
  556. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  557. /* Enable ISO14443B mode */
  558. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_iso14443b );
  559. /* Set the EGT, SOF, EOF and EOF */
  560. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_1,
  561. (ST25R3916_REG_ISO14443B_1_egt_mask | ST25R3916_REG_ISO14443B_1_sof_mask | ST25R3916_REG_ISO14443B_1_eof),
  562. ( (0U<<ST25R3916_REG_ISO14443B_1_egt_shift) | ST25R3916_REG_ISO14443B_1_sof_0_10etu | ST25R3916_REG_ISO14443B_1_sof_1_2etu | ST25R3916_REG_ISO14443B_1_eof_10etu) );
  563. /* Set the minimum TR1, clear SOF, EOF and EOF12 */
  564. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443B_2,
  565. (ST25R3916_REG_ISO14443B_2_tr1_mask | ST25R3916_REG_ISO14443B_2_no_sof | ST25R3916_REG_ISO14443B_2_no_eof),
  566. (ST25R3916_REG_ISO14443B_2_tr1_80fs80fs | ST25R3916_REG_ISO14443B_2_no_sof | ST25R3916_REG_ISO14443B_2_no_eof ) );
  567. /* Set Analog configurations for this mode and bit rate */
  568. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  569. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  570. break;
  571. /*******************************************************************************/
  572. case RFAL_MODE_POLL_NFCF:
  573. /* Disable wake up mode, if set */
  574. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  575. /* Enable FeliCa mode */
  576. st25r3916WriteRegister( ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_felica );
  577. /* Set Analog configurations for this mode and bit rate */
  578. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  579. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  580. break;
  581. /*******************************************************************************/
  582. case RFAL_MODE_POLL_NFCV:
  583. case RFAL_MODE_POLL_PICOPASS:
  584. #if !RFAL_FEATURE_NFCV
  585. return ERR_DISABLED;
  586. #else
  587. /* Disable wake up mode, if set */
  588. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  589. /* Set Analog configurations for this mode and bit rate */
  590. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  591. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  592. break;
  593. #endif /* RFAL_FEATURE_NFCV */
  594. /*******************************************************************************/
  595. case RFAL_MODE_POLL_ACTIVE_P2P:
  596. /* Set NFCIP1 active communication Initiator mode and Automatic Response RF Collision Avoidance to always after EOF */
  597. st25r3916WriteRegister( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ_init | ST25R3916_REG_MODE_om_nfc | ST25R3916_REG_MODE_nfc_ar_eof) );
  598. /* External Field Detector enabled as Automatics on rfalInitialize() */
  599. /* Set NRT to start at end of TX (own) field */
  600. st25r3916ChangeRegisterBits( ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_nfc, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_nfc_off );
  601. /* Set GPT to start after end of TX, as GPT is used in active communication mode to timeout the field switching off */
  602. /* The field is turned off 37.76us after the end of the transmission Trfw */
  603. st25r3916SetStartGPTimer( (uint16_t)rfalConv1fcTo8fc( RFAL_AP2P_FIELDOFF_TRFW ), ST25R3916_REG_TIMER_EMV_CONTROL_gptc_etx_nfc );
  604. /* Set PPon2 timer with the max time between our field Off and other peer field On : Tadt + (n x Trfw) */
  605. st25r3916WriteRegister( ST25R3916_REG_PPON2, (uint8_t)rfalConv1fcTo64fc( RFAL_AP2P_FIELDON_TADTTRFW ) );
  606. /* Set Analog configurations for this mode and bit rate */
  607. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  608. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  609. break;
  610. /*******************************************************************************/
  611. case RFAL_MODE_LISTEN_ACTIVE_P2P:
  612. /* Set NFCIP1 active communication Target mode and Automatic Response RF Collision Avoidance to always after EOF */
  613. st25r3916WriteRegister( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om_targ_nfcip | ST25R3916_REG_MODE_nfc_ar_eof) );
  614. /* Set TARFG: 0 (75us+0ms=75us), as Target no Guard time needed */
  615. st25r3916WriteRegister( ST25R3916_REG_FIELD_ON_GT, 0U );
  616. /* External Field Detector enabled as Automatics on rfalInitialize() */
  617. /* Set NRT to start at end of TX (own) field */
  618. st25r3916ChangeRegisterBits( ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_nfc, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_nfc_off );
  619. /* Set GPT to start after end of TX, as GPT is used in active communication mode to timeout the field switching off */
  620. /* The field is turned off 37.76us after the end of the transmission Trfw */
  621. st25r3916SetStartGPTimer( (uint16_t)rfalConv1fcTo8fc( RFAL_AP2P_FIELDOFF_TRFW ), ST25R3916_REG_TIMER_EMV_CONTROL_gptc_etx_nfc );
  622. /* Set PPon2 timer with the max time between our field Off and other peer field On : Tadt + (n x Trfw) */
  623. st25r3916WriteRegister( ST25R3916_REG_PPON2, (uint8_t)rfalConv1fcTo64fc( RFAL_AP2P_FIELDON_TADTTRFW ) );
  624. /* Set Analog configurations for this mode and bit rate */
  625. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  626. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  627. break;
  628. /*******************************************************************************/
  629. case RFAL_MODE_LISTEN_NFCA:
  630. /* Disable wake up mode, if set */
  631. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  632. /* Enable Passive Target NFC-A mode, disable any Collision Avoidance */
  633. st25r3916WriteRegister( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_targ_nfca | ST25R3916_REG_MODE_nfc_ar_off) );
  634. /* Set Analog configurations for this mode */
  635. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  636. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  637. break;
  638. /*******************************************************************************/
  639. case RFAL_MODE_LISTEN_NFCF:
  640. /* Disable wake up mode, if set */
  641. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  642. /* Enable Passive Target NFC-F mode, disable any Collision Avoidance */
  643. st25r3916WriteRegister( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_targ_nfcf | ST25R3916_REG_MODE_nfc_ar_off) );
  644. /* Set Analog configurations for this mode */
  645. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX) );
  646. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX) );
  647. break;
  648. /*******************************************************************************/
  649. case RFAL_MODE_LISTEN_NFCB:
  650. return ERR_NOTSUPP;
  651. /*******************************************************************************/
  652. default:
  653. return ERR_NOT_IMPLEMENTED;
  654. }
  655. /* Set state as STATE_MODE_SET only if not initialized yet (PSL) */
  656. gRFAL.state = ((gRFAL.state < RFAL_STATE_MODE_SET) ? RFAL_STATE_MODE_SET : gRFAL.state);
  657. gRFAL.mode = mode;
  658. /* Apply the given bit rate */
  659. return rfalSetBitRate(txBR, rxBR);
  660. }
  661. /*******************************************************************************/
  662. rfalMode rfalGetMode( void )
  663. {
  664. return gRFAL.mode;
  665. }
  666. /*******************************************************************************/
  667. ReturnCode rfalSetBitRate( rfalBitRate txBR, rfalBitRate rxBR )
  668. {
  669. ReturnCode ret;
  670. /* Check if RFAL is not initialized */
  671. if( gRFAL.state == RFAL_STATE_IDLE )
  672. {
  673. return ERR_WRONG_STATE;
  674. }
  675. /* Store the new Bit Rates */
  676. gRFAL.txBR = ((txBR == RFAL_BR_KEEP) ? gRFAL.txBR : txBR);
  677. gRFAL.rxBR = ((rxBR == RFAL_BR_KEEP) ? gRFAL.rxBR : rxBR);
  678. /* Update the bitrate reg if not in NFCV mode (streaming) */
  679. if( (RFAL_MODE_POLL_NFCV != gRFAL.mode) && (RFAL_MODE_POLL_PICOPASS != gRFAL.mode) )
  680. {
  681. /* Set bit rate register */
  682. EXIT_ON_ERR( ret, st25r3916SetBitrate( (uint8_t)gRFAL.txBR, (uint8_t)gRFAL.rxBR ) );
  683. }
  684. switch( gRFAL.mode )
  685. {
  686. /*******************************************************************************/
  687. case RFAL_MODE_POLL_NFCA:
  688. case RFAL_MODE_POLL_NFCA_T1T:
  689. /* Set Analog configurations for this bit rate */
  690. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON) );
  691. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  692. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  693. break;
  694. /*******************************************************************************/
  695. case RFAL_MODE_POLL_NFCB:
  696. case RFAL_MODE_POLL_B_PRIME:
  697. case RFAL_MODE_POLL_B_CTS:
  698. /* Set Analog configurations for this bit rate */
  699. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON) );
  700. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  701. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  702. break;
  703. /*******************************************************************************/
  704. case RFAL_MODE_POLL_NFCF:
  705. /* Set Analog configurations for this bit rate */
  706. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON) );
  707. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  708. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  709. break;
  710. /*******************************************************************************/
  711. case RFAL_MODE_POLL_NFCV:
  712. case RFAL_MODE_POLL_PICOPASS:
  713. #if !RFAL_FEATURE_NFCV
  714. return ERR_DISABLED;
  715. #else
  716. if( ((gRFAL.rxBR != RFAL_BR_26p48) && (gRFAL.rxBR != RFAL_BR_52p97))
  717. || ((gRFAL.txBR != RFAL_BR_1p66) && (gRFAL.txBR != RFAL_BR_26p48)) )
  718. {
  719. return ERR_PARAM;
  720. }
  721. {
  722. const struct iso15693StreamConfig *isoStreamConfig;
  723. struct st25r3916StreamConfig streamConf;
  724. iso15693PhyConfig_t config;
  725. config.coding = (( gRFAL.txBR == RFAL_BR_1p66 ) ? ISO15693_VCD_CODING_1_256 : ISO15693_VCD_CODING_1_4);
  726. switch (gRFAL.rxBR){
  727. case RFAL_BR_52p97:
  728. config.speedMode = 1;
  729. break;
  730. default:
  731. config.speedMode = 0;
  732. break;
  733. }
  734. iso15693PhyConfigure(&config, &isoStreamConfig);
  735. /* MISRA 11.3 - Cannot point directly into different object type, copy to local var */
  736. streamConf.din = isoStreamConfig->din;
  737. streamConf.dout = isoStreamConfig->dout;
  738. streamConf.report_period_length = isoStreamConfig->report_period_length;
  739. streamConf.useBPSK = isoStreamConfig->useBPSK;
  740. st25r3916StreamConfigure(&streamConf);
  741. }
  742. /* Set Analog configurations for this bit rate */
  743. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON) );
  744. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  745. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  746. break;
  747. #endif /* RFAL_FEATURE_NFCV */
  748. /*******************************************************************************/
  749. case RFAL_MODE_POLL_ACTIVE_P2P:
  750. /* Set Analog configurations for this bit rate */
  751. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON) );
  752. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  753. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  754. break;
  755. /*******************************************************************************/
  756. case RFAL_MODE_LISTEN_ACTIVE_P2P:
  757. /* Set Analog configurations for this bit rate */
  758. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LISTEN_COMMON) );
  759. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  760. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  761. break;
  762. /*******************************************************************************/
  763. case RFAL_MODE_LISTEN_NFCA:
  764. /* Set Analog configurations for this bit rate */
  765. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LISTEN_COMMON) );
  766. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  767. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  768. break;
  769. /*******************************************************************************/
  770. case RFAL_MODE_LISTEN_NFCF:
  771. /* Set Analog configurations for this bit rate */
  772. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LISTEN_COMMON) );
  773. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ) );
  774. rfalSetAnalogConfig( (rfalAnalogConfigId)(RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ) );
  775. break;
  776. /*******************************************************************************/
  777. case RFAL_MODE_LISTEN_NFCB:
  778. case RFAL_MODE_NONE:
  779. return ERR_WRONG_STATE;
  780. /*******************************************************************************/
  781. default:
  782. return ERR_NOT_IMPLEMENTED;
  783. }
  784. return ERR_NONE;
  785. }
  786. /*******************************************************************************/
  787. ReturnCode rfalGetBitRate( rfalBitRate *txBR, rfalBitRate *rxBR )
  788. {
  789. if( (gRFAL.state == RFAL_STATE_IDLE) || (gRFAL.mode == RFAL_MODE_NONE) )
  790. {
  791. return ERR_WRONG_STATE;
  792. }
  793. if( txBR != NULL )
  794. {
  795. *txBR = gRFAL.txBR;
  796. }
  797. if( rxBR != NULL )
  798. {
  799. *rxBR = gRFAL.rxBR;
  800. }
  801. return ERR_NONE;
  802. }
  803. /*******************************************************************************/
  804. void rfalSetErrorHandling( rfalEHandling eHandling )
  805. {
  806. switch(eHandling)
  807. {
  808. case RFAL_ERRORHANDLING_NFC:
  809. case RFAL_ERRORHANDLING_NONE:
  810. st25r3916ClrRegisterBits( ST25R3916_REG_EMD_SUP_CONF, ST25R3916_REG_EMD_SUP_CONF_emd_emv );
  811. break;
  812. case RFAL_ERRORHANDLING_EMVCO:
  813. /* MISRA 16.4: no empty default statement (in case RFAL_SW_EMD is defined) */
  814. #ifndef RFAL_SW_EMD
  815. st25r3916ModifyRegister( ST25R3916_REG_EMD_SUP_CONF,
  816. (ST25R3916_REG_EMD_SUP_CONF_emd_emv | ST25R3916_REG_EMD_SUP_CONF_emd_thld_mask),
  817. (ST25R3916_REG_EMD_SUP_CONF_emd_emv_on | RFAL_EMVCO_RX_MAXLEN) );
  818. #endif /* RFAL_SW_EMD */
  819. break;
  820. default:
  821. /* MISRA 16.4: no empty default statement (a comment being enough) */
  822. break;
  823. }
  824. gRFAL.conf.eHandling = eHandling;
  825. }
  826. /*******************************************************************************/
  827. rfalEHandling rfalGetErrorHandling( void )
  828. {
  829. return gRFAL.conf.eHandling;
  830. }
  831. /*******************************************************************************/
  832. void rfalSetFDTPoll( uint32_t FDTPoll )
  833. {
  834. gRFAL.timings.FDTPoll = MIN( FDTPoll, RFAL_ST25R3916_GPT_MAX_1FC );
  835. }
  836. /*******************************************************************************/
  837. uint32_t rfalGetFDTPoll( void )
  838. {
  839. return gRFAL.timings.FDTPoll;
  840. }
  841. /*******************************************************************************/
  842. void rfalSetFDTListen( uint32_t FDTListen )
  843. {
  844. gRFAL.timings.FDTListen = MIN( FDTListen, RFAL_ST25R3916_MRT_MAX_1FC );
  845. }
  846. /*******************************************************************************/
  847. uint32_t rfalGetFDTListen( void )
  848. {
  849. return gRFAL.timings.FDTListen;
  850. }
  851. /*******************************************************************************/
  852. void rfalSetGT( uint32_t GT )
  853. {
  854. gRFAL.timings.GT = MIN( GT, RFAL_ST25R3916_GT_MAX_1FC );
  855. }
  856. /*******************************************************************************/
  857. uint32_t rfalGetGT( void )
  858. {
  859. return gRFAL.timings.GT;
  860. }
  861. /*******************************************************************************/
  862. bool rfalIsGTExpired( void )
  863. {
  864. if( gRFAL.tmr.GT != RFAL_TIMING_NONE )
  865. {
  866. if( !rfalTimerisExpired( gRFAL.tmr.GT ) )
  867. {
  868. return false;
  869. }
  870. }
  871. return true;
  872. }
  873. /*******************************************************************************/
  874. ReturnCode rfalFieldOnAndStartGT( void )
  875. {
  876. ReturnCode ret;
  877. /* Check if RFAL has been initialized (Oscillator should be running) and also
  878. * if a direct register access has been performed and left the Oscillator Off */
  879. if( !st25r3916IsOscOn() || (gRFAL.state < RFAL_STATE_INIT) )
  880. {
  881. return ERR_WRONG_STATE;
  882. }
  883. ret = ERR_NONE;
  884. /* Set Analog configurations for Field On event */
  885. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_FIELD_ON) );
  886. /*******************************************************************************/
  887. /* Perform collision avoidance and turn field On if not already On */
  888. if( !st25r3916IsTxEnabled() || !gRFAL.field )
  889. {
  890. /* Set TARFG: 0 (75us+0ms=75us), GT is fulfilled using a SW timer */
  891. st25r3916WriteRegister( ST25R3916_REG_FIELD_ON_GT, 0U );
  892. /* Use Thresholds set by AnalogConfig */
  893. ret = st25r3916PerformCollisionAvoidance( ST25R3916_CMD_INITIAL_RF_COLLISION, ST25R3916_THRESHOLD_DO_NOT_SET, ST25R3916_THRESHOLD_DO_NOT_SET, gRFAL.timings.nTRFW );
  894. /* n * TRFW timing shall vary Activity 2.1 3.3.1.1 */
  895. gRFAL.timings.nTRFW = rfalGennTRFW( gRFAL.timings.nTRFW );
  896. gRFAL.field = st25r3916IsTxEnabled(); //(ret == ERR_NONE);
  897. /* Only turn on Receiver and Transmitter if field was successfully turned On */
  898. if(gRFAL.field)
  899. {
  900. st25r3916TxRxOn(); /* Enable Tx and Rx (Tx is already On)*/
  901. }
  902. }
  903. /*******************************************************************************/
  904. /* Start GT timer in case the GT value is set */
  905. if( (gRFAL.timings.GT != RFAL_TIMING_NONE) )
  906. {
  907. /* Ensure that a SW timer doesn't have a lower value then the minimum */
  908. rfalTimerStart( gRFAL.tmr.GT, rfalConv1fcToMs( MAX( (gRFAL.timings.GT), RFAL_ST25R3916_GT_MIN_1FC) ) );
  909. }
  910. return ret;
  911. }
  912. /*******************************************************************************/
  913. ReturnCode rfalFieldOff( void )
  914. {
  915. /* Check whether a TxRx is not yet finished */
  916. if( gRFAL.TxRx.state != RFAL_TXRX_STATE_IDLE )
  917. {
  918. rfalCleanupTransceive();
  919. }
  920. /* Disable Tx and Rx */
  921. st25r3916TxRxOff();
  922. /* Set Analog configurations for Field Off event */
  923. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_FIELD_OFF) );
  924. gRFAL.field = false;
  925. return ERR_NONE;
  926. }
  927. /*******************************************************************************/
  928. ReturnCode rfalStartTransceive( const rfalTransceiveContext *ctx )
  929. {
  930. uint32_t FxTAdj; /* FWT or FDT adjustment calculation */
  931. /* Check for valid parameters */
  932. if( ctx == NULL )
  933. {
  934. return ERR_PARAM;
  935. }
  936. /* Ensure that RFAL is already Initialized and the mode has been set */
  937. if( (gRFAL.state >= RFAL_STATE_MODE_SET) /*&& (gRFAL.TxRx.state == RFAL_TXRX_STATE_INIT )*/ )
  938. {
  939. /*******************************************************************************/
  940. /* Check whether the field is already On, otherwise no TXE will be received */
  941. if( !st25r3916IsTxEnabled() && (!rfalIsModePassiveListen( gRFAL.mode ) && (ctx->txBuf != NULL)) )
  942. {
  943. return ERR_WRONG_STATE;
  944. }
  945. gRFAL.TxRx.ctx = *ctx;
  946. /*******************************************************************************/
  947. if( gRFAL.timings.FDTListen != RFAL_TIMING_NONE )
  948. {
  949. /* Calculate MRT adjustment accordingly to the current mode */
  950. FxTAdj = RFAL_FDT_LISTEN_MRT_ADJUSTMENT;
  951. if(gRFAL.mode == RFAL_MODE_POLL_NFCA) { FxTAdj += (uint32_t)RFAL_FDT_LISTEN_A_ADJUSTMENT; }
  952. if(gRFAL.mode == RFAL_MODE_POLL_NFCA_T1T) { FxTAdj += (uint32_t)RFAL_FDT_LISTEN_A_ADJUSTMENT; }
  953. if(gRFAL.mode == RFAL_MODE_POLL_NFCB) { FxTAdj += (uint32_t)RFAL_FDT_LISTEN_B_ADJUSTMENT; }
  954. if(gRFAL.mode == RFAL_MODE_POLL_NFCV) { FxTAdj += (uint32_t)RFAL_FDT_LISTEN_V_ADJUSTMENT; }
  955. /* Ensure that MRT is using 64/fc steps */
  956. st25r3916ClrRegisterBits(ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_mrt_step );
  957. /* If Correlator is being used further adjustment is required for NFCB */
  958. if( (st25r3916CheckReg(ST25R3916_REG_AUX, ST25R3916_REG_AUX_dis_corr, 0x00U)) && (gRFAL.mode == RFAL_MODE_POLL_NFCB) )
  959. {
  960. FxTAdj += (uint32_t)RFAL_FDT_LISTEN_B_ADJT_CORR; /* Reduce FDT(Listen) */
  961. st25r3916SetRegisterBits( ST25R3916_REG_CORR_CONF1, ST25R3916_REG_CORR_CONF1_corr_s3 ); /* Ensure BPSK start to 33 pilot pulses */
  962. st25r3916ChangeRegisterBits( ST25R3916_REG_SUBC_START_TIME, ST25R3916_REG_SUBC_START_TIME_sst_mask, RFAL_FDT_LISTEN_B_ADJT_CORR_SST ); /* Set sst */
  963. }
  964. /* Set Minimum FDT(Listen) in which PICC is not allowed to send a response */
  965. st25r3916WriteRegister( ST25R3916_REG_MASK_RX_TIMER, (uint8_t)rfalConv1fcTo64fc( (FxTAdj > gRFAL.timings.FDTListen) ? RFAL_ST25R3916_MRT_MIN_1FC : (gRFAL.timings.FDTListen - FxTAdj) ) );
  966. }
  967. /*******************************************************************************/
  968. /* FDT Poll will be loaded in rfalPrepareTransceive() once the previous was expired */
  969. /*******************************************************************************/
  970. if( (gRFAL.TxRx.ctx.fwt != RFAL_FWT_NONE) && (gRFAL.TxRx.ctx.fwt != 0U) )
  971. {
  972. /* Ensure proper timing configuration */
  973. if( gRFAL.timings.FDTListen >= gRFAL.TxRx.ctx.fwt )
  974. {
  975. return ERR_PARAM;
  976. }
  977. FxTAdj = RFAL_FWT_ADJUSTMENT;
  978. if(gRFAL.mode == RFAL_MODE_POLL_NFCA) { FxTAdj += (uint32_t)RFAL_FWT_A_ADJUSTMENT; }
  979. if(gRFAL.mode == RFAL_MODE_POLL_NFCA_T1T) { FxTAdj += (uint32_t)RFAL_FWT_A_ADJUSTMENT; }
  980. if(gRFAL.mode == RFAL_MODE_POLL_NFCB) { FxTAdj += (uint32_t)RFAL_FWT_B_ADJUSTMENT; }
  981. if( (gRFAL.mode == RFAL_MODE_POLL_NFCF) || (gRFAL.mode == RFAL_MODE_POLL_ACTIVE_P2P) )
  982. {
  983. FxTAdj += (uint32_t)((gRFAL.txBR == RFAL_BR_212) ? RFAL_FWT_F_212_ADJUSTMENT : RFAL_FWT_F_424_ADJUSTMENT );
  984. }
  985. /* Ensure that the given FWT doesn't exceed NRT maximum */
  986. gRFAL.TxRx.ctx.fwt = MIN( (gRFAL.TxRx.ctx.fwt + FxTAdj), RFAL_ST25R3916_NRT_MAX_1FC );
  987. /* Set FWT in the NRT */
  988. st25r3916SetNoResponseTime( rfalConv1fcTo64fc( gRFAL.TxRx.ctx.fwt ) );
  989. }
  990. else
  991. {
  992. /* Disable NRT, no NRE will be triggered, therefore wait endlessly for Rx */
  993. st25r3916SetNoResponseTime( RFAL_ST25R3916_NRT_DISABLED );
  994. }
  995. gRFAL.state = RFAL_STATE_TXRX;
  996. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_IDLE;
  997. gRFAL.TxRx.status = ERR_BUSY;
  998. #if RFAL_FEATURE_NFCV
  999. /*******************************************************************************/
  1000. if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
  1001. { /* Exchange receive buffer with internal buffer */
  1002. gRFAL.nfcvData.origCtx = gRFAL.TxRx.ctx;
  1003. gRFAL.TxRx.ctx.rxBuf = ((gRFAL.nfcvData.origCtx.rxBuf != NULL) ? gRFAL.nfcvData.codingBuffer : NULL);
  1004. gRFAL.TxRx.ctx.rxBufLen = (uint16_t)rfalConvBytesToBits(sizeof(gRFAL.nfcvData.codingBuffer));
  1005. gRFAL.TxRx.ctx.flags = (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL
  1006. | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP
  1007. | (uint32_t)RFAL_TXRX_FLAGS_NFCIP1_OFF
  1008. | (uint32_t)(gRFAL.nfcvData.origCtx.flags & (uint32_t)RFAL_TXRX_FLAGS_AGC_OFF)
  1009. | (uint32_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP
  1010. | (uint32_t)RFAL_TXRX_FLAGS_PAR_TX_NONE;
  1011. /* In NFCV a TxRx with a valid txBuf and txBufSize==0 indicates to send an EOF */
  1012. /* Skip logic below that would go directly into receive */
  1013. if ( gRFAL.TxRx.ctx.txBuf != NULL )
  1014. {
  1015. return ERR_NONE;
  1016. }
  1017. }
  1018. #endif /* RFAL_FEATURE_NFCV */
  1019. /*******************************************************************************/
  1020. /* Check if the Transceive start performing Tx or goes directly to Rx */
  1021. if( (gRFAL.TxRx.ctx.txBuf == NULL) || (gRFAL.TxRx.ctx.txBufLen == 0U) )
  1022. {
  1023. /* Clear FIFO, Clear and Enable the Interrupts */
  1024. rfalPrepareTransceive( );
  1025. /* In AP2P check the field status */
  1026. if( rfalIsModeActiveComm(gRFAL.mode) )
  1027. {
  1028. /* Disable our field upon a Rx reEnable, and start PPON2 manually */
  1029. st25r3916TxOff();
  1030. st25r3916ExecuteCommand( ST25R3916_CMD_START_PPON2_TIMER );
  1031. }
  1032. /* No Tx done, enable the Receiver */
  1033. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  1034. /* Start NRT manually, if FWT = 0 (wait endlessly for Rx) chip will ignore anyhow */
  1035. st25r3916ExecuteCommand( ST25R3916_CMD_START_NO_RESPONSE_TIMER );
  1036. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_IDLE;
  1037. }
  1038. return ERR_NONE;
  1039. }
  1040. return ERR_WRONG_STATE;
  1041. }
  1042. /*******************************************************************************/
  1043. bool rfalIsTransceiveInTx( void )
  1044. {
  1045. return ( (gRFAL.TxRx.state >= RFAL_TXRX_STATE_TX_IDLE) && (gRFAL.TxRx.state < RFAL_TXRX_STATE_RX_IDLE) );
  1046. }
  1047. /*******************************************************************************/
  1048. bool rfalIsTransceiveInRx( void )
  1049. {
  1050. return (gRFAL.TxRx.state >= RFAL_TXRX_STATE_RX_IDLE);
  1051. }
  1052. /*******************************************************************************/
  1053. ReturnCode rfalTransceiveBlockingTx( uint8_t* txBuf, uint16_t txBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags, uint32_t fwt )
  1054. {
  1055. ReturnCode ret;
  1056. rfalTransceiveContext ctx;
  1057. rfalCreateByteFlagsTxRxContext( ctx, txBuf, txBufLen, rxBuf, rxBufLen, actLen, flags, fwt );
  1058. EXIT_ON_ERR( ret, rfalStartTransceive( &ctx ) );
  1059. return rfalTransceiveRunBlockingTx();
  1060. }
  1061. /*******************************************************************************/
  1062. static ReturnCode rfalTransceiveRunBlockingTx( void )
  1063. {
  1064. ReturnCode ret;
  1065. do{
  1066. rfalWorker();
  1067. ret = rfalGetTransceiveStatus();
  1068. }
  1069. while( rfalIsTransceiveInTx() && (ret == ERR_BUSY) );
  1070. if( rfalIsTransceiveInRx() )
  1071. {
  1072. return ERR_NONE;
  1073. }
  1074. return ret;
  1075. }
  1076. /*******************************************************************************/
  1077. ReturnCode rfalTransceiveBlockingRx( void )
  1078. {
  1079. ReturnCode ret;
  1080. do{
  1081. rfalWorker();
  1082. ret = rfalGetTransceiveStatus();
  1083. }
  1084. while( rfalIsTransceiveInRx() && (ret == ERR_BUSY) );
  1085. return ret;
  1086. }
  1087. /*******************************************************************************/
  1088. ReturnCode rfalTransceiveBlockingTxRx( uint8_t* txBuf, uint16_t txBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags, uint32_t fwt )
  1089. {
  1090. ReturnCode ret;
  1091. EXIT_ON_ERR( ret, rfalTransceiveBlockingTx( txBuf, txBufLen, rxBuf, rxBufLen, actLen, flags, fwt ) );
  1092. ret = rfalTransceiveBlockingRx();
  1093. /* Convert received bits to bytes */
  1094. if( actLen != NULL )
  1095. {
  1096. *actLen = rfalConvBitsToBytes(*actLen);
  1097. }
  1098. return ret;
  1099. }
  1100. /*******************************************************************************/
  1101. static ReturnCode rfalRunTransceiveWorker( void )
  1102. {
  1103. if( gRFAL.state == RFAL_STATE_TXRX )
  1104. {
  1105. /*******************************************************************************/
  1106. /* Check Transceive Sanity Timer has expired */
  1107. if( gRFAL.tmr.txRx != RFAL_TIMING_NONE )
  1108. {
  1109. if( rfalTimerisExpired( gRFAL.tmr.txRx ) )
  1110. {
  1111. /* If sanity timer has expired abort ongoing transceive and signal error */
  1112. gRFAL.TxRx.status = ERR_IO;
  1113. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1114. }
  1115. }
  1116. /*******************************************************************************/
  1117. /* Run Tx or Rx state machines */
  1118. if( rfalIsTransceiveInTx() )
  1119. {
  1120. rfalTransceiveTx();
  1121. return rfalGetTransceiveStatus();
  1122. }
  1123. if( rfalIsTransceiveInRx() )
  1124. {
  1125. rfalTransceiveRx();
  1126. return rfalGetTransceiveStatus();
  1127. }
  1128. }
  1129. return ERR_WRONG_STATE;
  1130. }
  1131. /*******************************************************************************/
  1132. rfalTransceiveState rfalGetTransceiveState( void )
  1133. {
  1134. return gRFAL.TxRx.state;
  1135. }
  1136. /*******************************************************************************/
  1137. ReturnCode rfalGetTransceiveStatus( void )
  1138. {
  1139. return ((gRFAL.TxRx.state == RFAL_TXRX_STATE_IDLE) ? gRFAL.TxRx.status : ERR_BUSY);
  1140. }
  1141. /*******************************************************************************/
  1142. ReturnCode rfalGetTransceiveRSSI( uint16_t *rssi )
  1143. {
  1144. uint16_t amRSSI;
  1145. uint16_t pmRSSI;
  1146. bool isSumMode;
  1147. if( rssi == NULL )
  1148. {
  1149. return ERR_PARAM;
  1150. }
  1151. st25r3916GetRSSI( &amRSSI, &pmRSSI );
  1152. /* Check if Correlator Summation mode is being used */
  1153. isSumMode = (st25r3916CheckReg( ST25R3916_REG_CORR_CONF1, ST25R3916_REG_CORR_CONF1_corr_s4, ST25R3916_REG_CORR_CONF1_corr_s4 ) ? st25r3916CheckReg( ST25R3916_REG_AUX, ST25R3916_REG_AUX_dis_corr, 0x00 ) : false );
  1154. if( isSumMode )
  1155. {
  1156. /*******************************************************************************/
  1157. /* Using SQRT from math.h and float. If due to compiler, resources or performance
  1158. * issue this cannot be used, other approaches can be foreseen with less accuracy:
  1159. * Use a simpler sqrt algorithm
  1160. * *rssi = MAX( amRSSI, pmRSSI );
  1161. * *rssi = ( (amRSSI + pmRSSI) / 2);
  1162. */
  1163. *rssi = (uint16_t) sqrt( ((double)amRSSI*(double)amRSSI) + ((double)pmRSSI*(double)pmRSSI) ); /* PRQA S 5209 # MISRA 4.9 - External function (sqrt()) requires double */
  1164. }
  1165. else
  1166. {
  1167. /* Check which channel was used */
  1168. *rssi = ( st25r3916CheckReg( ST25R3916_REG_AUX_DISPLAY, ST25R3916_REG_AUX_DISPLAY_a_cha, ST25R3916_REG_AUX_DISPLAY_a_cha ) ? pmRSSI : amRSSI );
  1169. }
  1170. return ERR_NONE;
  1171. }
  1172. /*******************************************************************************/
  1173. void rfalWorker( void )
  1174. {
  1175. platformProtectWorker(); /* Protect RFAL Worker/Task/Process */
  1176. switch( gRFAL.state )
  1177. {
  1178. case RFAL_STATE_TXRX:
  1179. rfalRunTransceiveWorker();
  1180. break;
  1181. #if RFAL_FEATURE_LISTEN_MODE
  1182. case RFAL_STATE_LM:
  1183. rfalRunListenModeWorker();
  1184. break;
  1185. #endif /* RFAL_FEATURE_LISTEN_MODE */
  1186. #if RFAL_FEATURE_WAKEUP_MODE
  1187. case RFAL_STATE_WUM:
  1188. rfalRunWakeUpModeWorker();
  1189. break;
  1190. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  1191. /* Nothing to be done */
  1192. default:
  1193. /* MISRA 16.4: no empty default statement (a comment being enough) */
  1194. break;
  1195. }
  1196. platformUnprotectWorker(); /* Unprotect RFAL Worker/Task/Process */
  1197. }
  1198. /*******************************************************************************/
  1199. static void rfalErrorHandling( void )
  1200. {
  1201. uint16_t fifoBytesToRead;
  1202. fifoBytesToRead = rfalFIFOStatusGetNumBytes();
  1203. #ifdef RFAL_SW_EMD
  1204. /*******************************************************************************/
  1205. /* EMVCo */
  1206. /*******************************************************************************/
  1207. if( gRFAL.conf.eHandling == RFAL_ERRORHANDLING_EMVCO )
  1208. {
  1209. bool rxHasIncParError;
  1210. /*******************************************************************************/
  1211. /* EMD Handling - NFC Forum Digital 1.1 4.1.1.1 ; EMVCo v2.5 4.9.2 */
  1212. /* ReEnable the receiver on frames with a length < 4 bytes, upon: */
  1213. /* - Collision or Framing error detected */
  1214. /* - Residual bits are detected (hard framing error) */
  1215. /* - Parity error */
  1216. /* - CRC error */
  1217. /*******************************************************************************/
  1218. /* Check if reception has incomplete bytes or parity error */
  1219. rxHasIncParError = ( rfalFIFOStatusIsIncompleteByte() ? true : rfalFIFOStatusIsMissingPar() ); /* MISRA 13.5 */
  1220. /* In case there are residual bits decrement FIFO bytes */
  1221. /* Ensure FIFO contains some byte as the FIFO might be empty upon Framing errors */
  1222. if( (fifoBytesToRead > 0U) && rxHasIncParError )
  1223. {
  1224. fifoBytesToRead--;
  1225. }
  1226. if( ( (gRFAL.fifo.bytesTotal + fifoBytesToRead) < RFAL_EMVCO_RX_MAXLEN ) &&
  1227. ( (gRFAL.TxRx.status == ERR_RF_COLLISION) || (gRFAL.TxRx.status == ERR_FRAMING) ||
  1228. (gRFAL.TxRx.status == ERR_PAR) || (gRFAL.TxRx.status == ERR_CRC) ||
  1229. rxHasIncParError ) )
  1230. {
  1231. /* Ignore this reception, ReEnable receiver which also clears the FIFO */
  1232. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  1233. /* Ensure that the NRT has not expired meanwhile */
  1234. if( st25r3916CheckReg( ST25R3916_REG_NFCIP1_BIT_RATE, ST25R3916_REG_NFCIP1_BIT_RATE_nrt_on, 0x00 ) )
  1235. {
  1236. if( st25r3916CheckReg( ST25R3916_REG_AUX_DISPLAY, ST25R3916_REG_AUX_DISPLAY_rx_act, 0x00 ) )
  1237. {
  1238. /* Abort reception */
  1239. st25r3916ExecuteCommand( ST25R3916_CMD_MASK_RECEIVE_DATA );
  1240. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1241. return;
  1242. }
  1243. }
  1244. rfalFIFOStatusClear();
  1245. gRFAL.fifo.bytesTotal = 0;
  1246. gRFAL.TxRx.status = ERR_BUSY;
  1247. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXS;
  1248. }
  1249. return;
  1250. }
  1251. #endif
  1252. /*******************************************************************************/
  1253. /* ISO14443A Mode */
  1254. /*******************************************************************************/
  1255. if( gRFAL.mode == RFAL_MODE_POLL_NFCA )
  1256. {
  1257. /*******************************************************************************/
  1258. /* If we received a frame with a incomplete byte we`ll raise a specific error *
  1259. * ( support for T2T 4 bit ACK / NAK, MIFARE and Kovio ) */
  1260. /*******************************************************************************/
  1261. if( (gRFAL.TxRx.status == ERR_PAR) || (gRFAL.TxRx.status == ERR_CRC) )
  1262. {
  1263. if( rfalFIFOStatusIsIncompleteByte() )
  1264. {
  1265. st25r3916ReadFifo( (uint8_t*)(gRFAL.TxRx.ctx.rxBuf), fifoBytesToRead );
  1266. if( (gRFAL.TxRx.ctx.rxRcvdLen) != NULL )
  1267. {
  1268. *gRFAL.TxRx.ctx.rxRcvdLen = rfalFIFOGetNumIncompleteBits();
  1269. }
  1270. gRFAL.TxRx.status = ERR_INCOMPLETE_BYTE;
  1271. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1272. }
  1273. }
  1274. }
  1275. }
  1276. /*******************************************************************************/
  1277. static void rfalCleanupTransceive( void )
  1278. {
  1279. /*******************************************************************************/
  1280. /* Transceive flags */
  1281. /*******************************************************************************/
  1282. /* Restore default settings on NFCIP1 mode, Receiving parity + CRC bits and manual Tx Parity*/
  1283. st25r3916ClrRegisterBits( ST25R3916_REG_ISO14443A_NFC, (ST25R3916_REG_ISO14443A_NFC_no_tx_par | ST25R3916_REG_ISO14443A_NFC_no_rx_par | ST25R3916_REG_ISO14443A_NFC_nfc_f0) );
  1284. /* Restore AGC enabled */
  1285. st25r3916SetRegisterBits( ST25R3916_REG_RX_CONF2, ST25R3916_REG_RX_CONF2_agc_en );
  1286. /*******************************************************************************/
  1287. /*******************************************************************************/
  1288. /* Transceive timers */
  1289. /*******************************************************************************/
  1290. rfalTimerDestroy( gRFAL.tmr.txRx );
  1291. rfalTimerDestroy( gRFAL.tmr.RXE );
  1292. gRFAL.tmr.txRx = RFAL_TIMING_NONE;
  1293. gRFAL.tmr.RXE = RFAL_TIMING_NONE;
  1294. /*******************************************************************************/
  1295. /*******************************************************************************/
  1296. /* Execute Post Transceive Callback */
  1297. /*******************************************************************************/
  1298. if( gRFAL.callbacks.postTxRx != NULL )
  1299. {
  1300. gRFAL.callbacks.postTxRx();
  1301. }
  1302. /*******************************************************************************/
  1303. }
  1304. /*******************************************************************************/
  1305. static void rfalPrepareTransceive( void )
  1306. {
  1307. uint32_t maskInterrupts;
  1308. uint8_t reg;
  1309. /* If we are in RW or AP2P mode */
  1310. if( !rfalIsModePassiveListen( gRFAL.mode ) )
  1311. {
  1312. /* Reset receive logic with STOP command */
  1313. st25r3916ExecuteCommand( ST25R3916_CMD_STOP );
  1314. /* Reset Rx Gain */
  1315. st25r3916ExecuteCommand( ST25R3916_CMD_RESET_RXGAIN );
  1316. }
  1317. else
  1318. {
  1319. /* In Passive Listen Mode do not use STOP as it stops FDT timer */
  1320. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  1321. }
  1322. /*******************************************************************************/
  1323. /* FDT Poll */
  1324. /*******************************************************************************/
  1325. if( rfalIsModePassiveComm( gRFAL.mode ) ) /* Passive Comms */
  1326. {
  1327. /* In Passive communications General Purpose Timer is used to measure FDT Poll */
  1328. if( gRFAL.timings.FDTPoll != RFAL_TIMING_NONE )
  1329. {
  1330. /* Configure GPT to start at RX end */
  1331. st25r3916SetStartGPTimer( (uint16_t)rfalConv1fcTo8fc( MIN( gRFAL.timings.FDTPoll, (gRFAL.timings.FDTPoll - RFAL_FDT_POLL_ADJUSTMENT) ) ), ST25R3916_REG_TIMER_EMV_CONTROL_gptc_erx );
  1332. }
  1333. }
  1334. /*******************************************************************************/
  1335. /* Execute Pre Transceive Callback */
  1336. /*******************************************************************************/
  1337. if( gRFAL.callbacks.preTxRx != NULL )
  1338. {
  1339. gRFAL.callbacks.preTxRx();
  1340. }
  1341. /*******************************************************************************/
  1342. maskInterrupts = ( ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_TXE |
  1343. ST25R3916_IRQ_MASK_RXS | ST25R3916_IRQ_MASK_RXE |
  1344. ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC |
  1345. ST25R3916_IRQ_MASK_ERR1 | ST25R3916_IRQ_MASK_ERR2 |
  1346. ST25R3916_IRQ_MASK_NRE );
  1347. /*******************************************************************************/
  1348. /* Transceive flags */
  1349. /*******************************************************************************/
  1350. reg = (ST25R3916_REG_ISO14443A_NFC_no_tx_par_off | ST25R3916_REG_ISO14443A_NFC_no_rx_par_off | ST25R3916_REG_ISO14443A_NFC_nfc_f0_off);
  1351. /* Check if NFCIP1 mode is to be enabled */
  1352. if( (gRFAL.TxRx.ctx.flags & (uint8_t)RFAL_TXRX_FLAGS_NFCIP1_ON) != 0U )
  1353. {
  1354. reg |= ST25R3916_REG_ISO14443A_NFC_nfc_f0;
  1355. }
  1356. /* Check if Parity check is to be skipped and to keep the parity + CRC bits in FIFO */
  1357. if( (gRFAL.TxRx.ctx.flags & (uint8_t)RFAL_TXRX_FLAGS_PAR_RX_KEEP) != 0U )
  1358. {
  1359. reg |= ST25R3916_REG_ISO14443A_NFC_no_rx_par;
  1360. }
  1361. /* Check if automatic Parity bits is to be disabled */
  1362. if( (gRFAL.TxRx.ctx.flags & (uint8_t)RFAL_TXRX_FLAGS_PAR_TX_NONE) != 0U )
  1363. {
  1364. reg |= ST25R3916_REG_ISO14443A_NFC_no_tx_par;
  1365. }
  1366. /* Apply current TxRx flags on ISO14443A and NFC 106kb/s Settings Register */
  1367. st25r3916ChangeRegisterBits( ST25R3916_REG_ISO14443A_NFC, (ST25R3916_REG_ISO14443A_NFC_no_tx_par | ST25R3916_REG_ISO14443A_NFC_no_rx_par | ST25R3916_REG_ISO14443A_NFC_nfc_f0), reg );
  1368. /* Check if AGC is to be disabled */
  1369. if( (gRFAL.TxRx.ctx.flags & (uint8_t)RFAL_TXRX_FLAGS_AGC_OFF) != 0U )
  1370. {
  1371. st25r3916ClrRegisterBits( ST25R3916_REG_RX_CONF2, ST25R3916_REG_RX_CONF2_agc_en );
  1372. }
  1373. else
  1374. {
  1375. st25r3916SetRegisterBits( ST25R3916_REG_RX_CONF2, ST25R3916_REG_RX_CONF2_agc_en );
  1376. }
  1377. /*******************************************************************************/
  1378. /*******************************************************************************/
  1379. /* EMVCo NRT mode */
  1380. /*******************************************************************************/
  1381. if( gRFAL.conf.eHandling == RFAL_ERRORHANDLING_EMVCO )
  1382. {
  1383. st25r3916SetRegisterBits( ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_emv );
  1384. maskInterrupts |= ST25R3916_IRQ_MASK_RX_REST;
  1385. }
  1386. else
  1387. {
  1388. st25r3916ClrRegisterBits( ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_nrt_emv );
  1389. }
  1390. /*******************************************************************************/
  1391. /* In Passive Listen mode additionally enable External Field interrupts */
  1392. if( rfalIsModePassiveListen( gRFAL.mode ) )
  1393. {
  1394. maskInterrupts |= ( ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_WU_F ); /* Enable external Field interrupts to detect Link Loss and SENF_REQ auto responses */
  1395. }
  1396. /* In Active comms enable also External Field interrupts and set RF Collsion Avoindance */
  1397. if( rfalIsModeActiveComm( gRFAL.mode ) )
  1398. {
  1399. maskInterrupts |= ( ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_EON | ST25R3916_IRQ_MASK_PPON2 | ST25R3916_IRQ_MASK_CAT | ST25R3916_IRQ_MASK_CAC );
  1400. /* Set n=0 for subsequent RF Collision Avoidance */
  1401. st25r3916ChangeRegisterBits(ST25R3916_REG_AUX, ST25R3916_REG_AUX_nfc_n_mask, 0);
  1402. }
  1403. /*******************************************************************************/
  1404. /* Start transceive Sanity Timer if a FWT is used */
  1405. if( (gRFAL.TxRx.ctx.fwt != RFAL_FWT_NONE) && (gRFAL.TxRx.ctx.fwt != 0U) )
  1406. {
  1407. rfalTimerStart( gRFAL.tmr.txRx, rfalCalcSanityTmr( gRFAL.TxRx.ctx.fwt ) );
  1408. }
  1409. /*******************************************************************************/
  1410. /*******************************************************************************/
  1411. /* Clear and enable these interrupts */
  1412. st25r3916GetInterrupt( maskInterrupts );
  1413. st25r3916EnableInterrupts( maskInterrupts );
  1414. /* Clear FIFO status local copy */
  1415. rfalFIFOStatusClear();
  1416. }
  1417. /*******************************************************************************/
  1418. static void rfalTransceiveTx( void )
  1419. {
  1420. volatile uint32_t irqs;
  1421. uint16_t tmp;
  1422. ReturnCode ret;
  1423. /* Supress warning in case NFC-V feature is disabled */
  1424. ret = ERR_NONE;
  1425. NO_WARNING( ret );
  1426. irqs = ST25R3916_IRQ_MASK_NONE;
  1427. if( gRFAL.TxRx.state != gRFAL.TxRx.lastState )
  1428. {
  1429. /* rfalLogD( "RFAL: lastSt: %d curSt: %d \r\n", gRFAL.TxRx.lastState, gRFAL.TxRx.state ); */
  1430. gRFAL.TxRx.lastState = gRFAL.TxRx.state;
  1431. }
  1432. switch( gRFAL.TxRx.state )
  1433. {
  1434. /*******************************************************************************/
  1435. case RFAL_TXRX_STATE_TX_IDLE:
  1436. /* Nothing to do */
  1437. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_WAIT_GT ;
  1438. /* fall through */
  1439. /*******************************************************************************/
  1440. case RFAL_TXRX_STATE_TX_WAIT_GT: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1441. if( !rfalIsGTExpired() )
  1442. {
  1443. break;
  1444. }
  1445. rfalTimerDestroy( gRFAL.tmr.GT );
  1446. gRFAL.tmr.GT = RFAL_TIMING_NONE;
  1447. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_WAIT_FDT;
  1448. /* fall through */
  1449. /*******************************************************************************/
  1450. case RFAL_TXRX_STATE_TX_WAIT_FDT: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1451. /* Only in Passive communications GPT is used to measure FDT Poll */
  1452. if( rfalIsModePassiveComm( gRFAL.mode ) )
  1453. {
  1454. if( st25r3916IsGPTRunning() )
  1455. {
  1456. break;
  1457. }
  1458. }
  1459. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_TRANSMIT;
  1460. /* fall through */
  1461. /*******************************************************************************/
  1462. case RFAL_TXRX_STATE_TX_TRANSMIT: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1463. /* Clear FIFO, Clear and Enable the Interrupts */
  1464. rfalPrepareTransceive( );
  1465. /* ST25R3916 has a fixed FIFO water level */
  1466. gRFAL.fifo.expWL = RFAL_FIFO_OUT_WL;
  1467. #if RFAL_FEATURE_NFCV
  1468. /*******************************************************************************/
  1469. /* In NFC-V streaming mode, the FIFO needs to be loaded with the coded bits */
  1470. if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
  1471. {
  1472. #if 0
  1473. /* Debugging code: output the payload bits by writing into the FIFO and subsequent clearing */
  1474. st25r3916WriteFifo(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen));
  1475. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  1476. #endif
  1477. /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
  1478. gRFAL.nfcvData.nfcvOffset = 0;
  1479. ret = iso15693VCDCode(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen), (((gRFAL.nfcvData.origCtx.flags & (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL) != 0U)?false:true),(((gRFAL.nfcvData.origCtx.flags & (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL) != 0U)?false:true), (RFAL_MODE_POLL_PICOPASS == gRFAL.mode),
  1480. &gRFAL.fifo.bytesTotal, &gRFAL.nfcvData.nfcvOffset, gRFAL.nfcvData.codingBuffer, MIN( (uint16_t)ST25R3916_FIFO_DEPTH, (uint16_t)sizeof(gRFAL.nfcvData.codingBuffer) ), &gRFAL.fifo.bytesWritten);
  1481. if( (ret != ERR_NONE) && (ret != ERR_AGAIN) )
  1482. {
  1483. gRFAL.TxRx.status = ret;
  1484. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1485. break;
  1486. }
  1487. /* Set the number of full bytes and bits to be transmitted */
  1488. st25r3916SetNumTxBits( (uint16_t)rfalConvBytesToBits(gRFAL.fifo.bytesTotal) );
  1489. /* Load FIFO with coded bytes */
  1490. st25r3916WriteFifo( gRFAL.nfcvData.codingBuffer, gRFAL.fifo.bytesWritten );
  1491. }
  1492. /*******************************************************************************/
  1493. else
  1494. #endif /* RFAL_FEATURE_NFCV */
  1495. {
  1496. /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
  1497. gRFAL.fifo.bytesTotal = (uint16_t)rfalCalcNumBytes(gRFAL.TxRx.ctx.txBufLen);
  1498. /* Set the number of full bytes and bits to be transmitted */
  1499. st25r3916SetNumTxBits( gRFAL.TxRx.ctx.txBufLen );
  1500. /* Load FIFO with total length or FIFO's maximum */
  1501. gRFAL.fifo.bytesWritten = MIN( gRFAL.fifo.bytesTotal, ST25R3916_FIFO_DEPTH );
  1502. st25r3916WriteFifo( gRFAL.TxRx.ctx.txBuf, gRFAL.fifo.bytesWritten );
  1503. }
  1504. /*Check if Observation Mode is enabled and set it on ST25R391x */
  1505. rfalCheckEnableObsModeTx();
  1506. /*******************************************************************************/
  1507. /* If we're in Passive Listen mode ensure that the external field is still On */
  1508. if( rfalIsModePassiveListen(gRFAL.mode) )
  1509. {
  1510. if( !rfalIsExtFieldOn() )
  1511. {
  1512. gRFAL.TxRx.status = ERR_LINK_LOSS;
  1513. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1514. break;
  1515. }
  1516. }
  1517. /*******************************************************************************/
  1518. /* Trigger/Start transmission */
  1519. if( (gRFAL.TxRx.ctx.flags & (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL) != 0U )
  1520. {
  1521. st25r3916ExecuteCommand( ST25R3916_CMD_TRANSMIT_WITHOUT_CRC );
  1522. }
  1523. else
  1524. {
  1525. st25r3916ExecuteCommand( ST25R3916_CMD_TRANSMIT_WITH_CRC );
  1526. }
  1527. /* Check if a WL level is expected or TXE should come */
  1528. gRFAL.TxRx.state = (( gRFAL.fifo.bytesWritten < gRFAL.fifo.bytesTotal ) ? RFAL_TXRX_STATE_TX_WAIT_WL : RFAL_TXRX_STATE_TX_WAIT_TXE);
  1529. break;
  1530. /*******************************************************************************/
  1531. case RFAL_TXRX_STATE_TX_WAIT_WL:
  1532. irqs = st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_TXE) );
  1533. if( irqs == ST25R3916_IRQ_MASK_NONE )
  1534. {
  1535. break; /* No interrupt to process */
  1536. }
  1537. if( ((irqs & ST25R3916_IRQ_MASK_FWL) != 0U) && ((irqs & ST25R3916_IRQ_MASK_TXE) == 0U) )
  1538. {
  1539. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_RELOAD_FIFO;
  1540. }
  1541. else
  1542. {
  1543. gRFAL.TxRx.status = ERR_IO;
  1544. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1545. break;
  1546. }
  1547. /* fall through */
  1548. /*******************************************************************************/
  1549. case RFAL_TXRX_STATE_TX_RELOAD_FIFO: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1550. #if RFAL_FEATURE_NFCV
  1551. /*******************************************************************************/
  1552. /* In NFC-V streaming mode, the FIFO needs to be loaded with the coded bits */
  1553. if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
  1554. {
  1555. uint16_t maxLen;
  1556. /* Load FIFO with the remaining length or maximum available (which fit on the coding buffer) */
  1557. maxLen = (uint16_t)MIN( (gRFAL.fifo.bytesTotal - gRFAL.fifo.bytesWritten), gRFAL.fifo.expWL);
  1558. maxLen = (uint16_t)MIN( maxLen, sizeof(gRFAL.nfcvData.codingBuffer) );
  1559. tmp = 0;
  1560. /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
  1561. ret = iso15693VCDCode(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen), (((gRFAL.nfcvData.origCtx.flags & (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL) != 0U)?false:true),(((gRFAL.nfcvData.origCtx.flags & (uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL) != 0U)?false:true), (RFAL_MODE_POLL_PICOPASS == gRFAL.mode),
  1562. &gRFAL.fifo.bytesTotal, &gRFAL.nfcvData.nfcvOffset, gRFAL.nfcvData.codingBuffer, maxLen, &tmp);
  1563. if( (ret != ERR_NONE) && (ret != ERR_AGAIN) )
  1564. {
  1565. gRFAL.TxRx.status = ret;
  1566. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1567. break;
  1568. }
  1569. /* Load FIFO with coded bytes */
  1570. st25r3916WriteFifo( gRFAL.nfcvData.codingBuffer, tmp );
  1571. }
  1572. /*******************************************************************************/
  1573. else
  1574. #endif /* RFAL_FEATURE_NFCV */
  1575. {
  1576. /* Load FIFO with the remaining length or maximum available */
  1577. tmp = MIN( (gRFAL.fifo.bytesTotal - gRFAL.fifo.bytesWritten), gRFAL.fifo.expWL); /* tmp holds the number of bytes written on this iteration */
  1578. st25r3916WriteFifo( &gRFAL.TxRx.ctx.txBuf[gRFAL.fifo.bytesWritten], tmp );
  1579. }
  1580. /* Update total written bytes to FIFO */
  1581. gRFAL.fifo.bytesWritten += tmp;
  1582. /* Check if a WL level is expected or TXE should come */
  1583. gRFAL.TxRx.state = (( gRFAL.fifo.bytesWritten < gRFAL.fifo.bytesTotal ) ? RFAL_TXRX_STATE_TX_WAIT_WL : RFAL_TXRX_STATE_TX_WAIT_TXE);
  1584. break;
  1585. /*******************************************************************************/
  1586. case RFAL_TXRX_STATE_TX_WAIT_TXE:
  1587. irqs = st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_TXE) );
  1588. if( irqs == ST25R3916_IRQ_MASK_NONE )
  1589. {
  1590. break; /* No interrupt to process */
  1591. }
  1592. if( (irqs & ST25R3916_IRQ_MASK_TXE) != 0U )
  1593. {
  1594. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_DONE;
  1595. }
  1596. else if( (irqs & ST25R3916_IRQ_MASK_FWL) != 0U )
  1597. {
  1598. break; /* Ignore ST25R3916 FIFO WL if total TxLen is already on the FIFO */
  1599. }
  1600. else
  1601. {
  1602. gRFAL.TxRx.status = ERR_IO;
  1603. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1604. break;
  1605. }
  1606. /* fall through */
  1607. /*******************************************************************************/
  1608. case RFAL_TXRX_STATE_TX_DONE: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1609. /* If no rxBuf is provided do not wait/expect Rx */
  1610. if( gRFAL.TxRx.ctx.rxBuf == NULL )
  1611. {
  1612. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  1613. rfalCheckDisableObsMode();
  1614. /* Clean up Transceive */
  1615. rfalCleanupTransceive();
  1616. gRFAL.TxRx.status = ERR_NONE;
  1617. gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
  1618. break;
  1619. }
  1620. rfalCheckEnableObsModeRx();
  1621. /* Goto Rx */
  1622. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_IDLE;
  1623. break;
  1624. /*******************************************************************************/
  1625. case RFAL_TXRX_STATE_TX_FAIL:
  1626. /* Error should be assigned by previous state */
  1627. if( gRFAL.TxRx.status == ERR_BUSY )
  1628. {
  1629. gRFAL.TxRx.status = ERR_SYSTEM;
  1630. }
  1631. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  1632. rfalCheckDisableObsMode();
  1633. /* Clean up Transceive */
  1634. rfalCleanupTransceive();
  1635. gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
  1636. break;
  1637. /*******************************************************************************/
  1638. default:
  1639. gRFAL.TxRx.status = ERR_SYSTEM;
  1640. gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_FAIL;
  1641. break;
  1642. }
  1643. }
  1644. /*******************************************************************************/
  1645. static void rfalTransceiveRx( void )
  1646. {
  1647. volatile uint32_t irqs;
  1648. uint16_t tmp;
  1649. uint16_t aux;
  1650. irqs = ST25R3916_IRQ_MASK_NONE;
  1651. if( gRFAL.TxRx.state != gRFAL.TxRx.lastState )
  1652. {
  1653. /* rfalLogD( "RFAL: lastSt: %d curSt: %d \r\n", gRFAL.TxRx.lastState, gRFAL.TxRx.state ); */
  1654. gRFAL.TxRx.lastState = gRFAL.TxRx.state;
  1655. }
  1656. switch( gRFAL.TxRx.state )
  1657. {
  1658. /*******************************************************************************/
  1659. case RFAL_TXRX_STATE_RX_IDLE:
  1660. /* Clear rx counters */
  1661. gRFAL.fifo.bytesWritten = 0; /* Total bytes written on RxBuffer */
  1662. gRFAL.fifo.bytesTotal = 0; /* Total bytes in FIFO will now be from Rx */
  1663. if( gRFAL.TxRx.ctx.rxRcvdLen != NULL )
  1664. {
  1665. *gRFAL.TxRx.ctx.rxRcvdLen = 0;
  1666. }
  1667. gRFAL.TxRx.state = ( rfalIsModeActiveComm( gRFAL.mode ) ? RFAL_TXRX_STATE_RX_WAIT_EON : RFAL_TXRX_STATE_RX_WAIT_RXS );
  1668. break;
  1669. /*******************************************************************************/
  1670. case RFAL_TXRX_STATE_RX_WAIT_RXS:
  1671. /*******************************************************************************/
  1672. irqs = st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_RXS | ST25R3916_IRQ_MASK_NRE | ST25R3916_IRQ_MASK_EOF) );
  1673. if( irqs == ST25R3916_IRQ_MASK_NONE )
  1674. {
  1675. break; /* No interrupt to process */
  1676. }
  1677. /* Only raise Timeout if NRE is detected with no Rx Start (NRT EMV mode) */
  1678. if( ((irqs & ST25R3916_IRQ_MASK_NRE) != 0U) && ((irqs & ST25R3916_IRQ_MASK_RXS) == 0U) )
  1679. {
  1680. gRFAL.TxRx.status = ERR_TIMEOUT;
  1681. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1682. break;
  1683. }
  1684. /* Only raise Link Loss if EOF is detected with no Rx Start */
  1685. if( ((irqs & ST25R3916_IRQ_MASK_EOF) != 0U) && ((irqs & ST25R3916_IRQ_MASK_RXS) == 0U) )
  1686. {
  1687. /* In AP2P a Field On has already occurred - treat this as timeout | mute */
  1688. gRFAL.TxRx.status = ( rfalIsModeActiveComm( gRFAL.mode ) ? ERR_TIMEOUT : ERR_LINK_LOSS );
  1689. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1690. break;
  1691. }
  1692. if( (irqs & ST25R3916_IRQ_MASK_RXS) != 0U )
  1693. {
  1694. /*******************************************************************************/
  1695. /* REMARK: Silicon workaround ST25R3916 Errata #TBD */
  1696. /* Rarely on corrupted frames I_rxs gets signaled but I_rxe is not signaled */
  1697. /* Use a SW timer to handle an eventual missing RXE */
  1698. rfalTimerStart( gRFAL.tmr.RXE, RFAL_NORXE_TOUT );
  1699. /*******************************************************************************/
  1700. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXE;
  1701. }
  1702. else
  1703. {
  1704. gRFAL.TxRx.status = ERR_IO;
  1705. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1706. break;
  1707. }
  1708. /* remove NRE that might appear together (NRT EMV mode), and remove RXS, but keep EOF if present for next state */
  1709. irqs &= ~(ST25R3916_IRQ_MASK_RXS | ST25R3916_IRQ_MASK_NRE);
  1710. /* fall through */
  1711. /*******************************************************************************/
  1712. case RFAL_TXRX_STATE_RX_WAIT_RXE: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1713. /*******************************************************************************/
  1714. /* REMARK: Silicon workaround ST25R3916 Errata #TBD */
  1715. /* ST25R396 may indicate RXS without RXE afterwards, this happens rarely on */
  1716. /* corrupted frames. */
  1717. /* SW timer is used to timeout upon a missing RXE */
  1718. if( rfalTimerisExpired( gRFAL.tmr.RXE ) )
  1719. {
  1720. gRFAL.TxRx.status = ERR_FRAMING;
  1721. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1722. }
  1723. /*******************************************************************************/
  1724. irqs |= st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_FWL | ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_RX_REST | ST25R3916_IRQ_MASK_WU_F ) );
  1725. if( irqs == ST25R3916_IRQ_MASK_NONE )
  1726. {
  1727. break; /* No interrupt to process */
  1728. }
  1729. if( (irqs & ST25R3916_IRQ_MASK_RX_REST) != 0U )
  1730. {
  1731. /* RX_REST indicates that Receiver has been reseted due to EMD, therefore a RXS + RXE should *
  1732. * follow if a good reception is followed within the valid initial timeout */
  1733. /* Check whether NRT has expired already, if so signal a timeout */
  1734. if( st25r3916GetInterrupt( ST25R3916_IRQ_MASK_NRE ) != 0U )
  1735. {
  1736. gRFAL.TxRx.status = ERR_TIMEOUT;
  1737. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1738. break;
  1739. }
  1740. if( st25r3916CheckReg( ST25R3916_REG_NFCIP1_BIT_RATE, ST25R3916_REG_NFCIP1_BIT_RATE_nrt_on, 0 ) ) /* MISRA 13.5 */
  1741. {
  1742. gRFAL.TxRx.status = ERR_TIMEOUT;
  1743. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1744. break;
  1745. }
  1746. /* Discard any previous RXS */
  1747. st25r3916GetInterrupt( ST25R3916_IRQ_MASK_RXS );
  1748. /* Check whether a following reception has already started */
  1749. if( st25r3916CheckReg( ST25R3916_REG_AUX_DISPLAY, ST25R3916_REG_AUX_DISPLAY_rx_act, ST25R3916_REG_AUX_DISPLAY_rx_act) )
  1750. {
  1751. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXE;
  1752. break;
  1753. }
  1754. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXS;
  1755. break;
  1756. }
  1757. if( ((irqs & ST25R3916_IRQ_MASK_FWL) != 0U) && ((irqs & ST25R3916_IRQ_MASK_RXE) == 0U) )
  1758. {
  1759. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_FIFO;
  1760. break;
  1761. }
  1762. /* Automatic responses allowed during TxRx only for the SENSF_REQ */
  1763. if( (irqs & ST25R3916_IRQ_MASK_WU_F) != 0U )
  1764. {
  1765. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXS;
  1766. break;
  1767. }
  1768. /* After RXE retrieve and check for any error irqs */
  1769. irqs |= st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_ERR1 | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_COL) );
  1770. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_ERR_CHECK;
  1771. /* fall through */
  1772. /*******************************************************************************/
  1773. case RFAL_TXRX_STATE_RX_ERR_CHECK: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1774. if( (irqs & ST25R3916_IRQ_MASK_ERR1) != 0U )
  1775. {
  1776. gRFAL.TxRx.status = ERR_FRAMING;
  1777. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1778. /* Check if there's a specific error handling for this */
  1779. rfalErrorHandling();
  1780. break;
  1781. }
  1782. /* Discard Soft Framing errors in AP2P and CE */
  1783. else if( rfalIsModePassivePoll( gRFAL.mode ) && ((irqs & ST25R3916_IRQ_MASK_ERR2) != 0U) )
  1784. {
  1785. gRFAL.TxRx.status = ERR_FRAMING;
  1786. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1787. /* Check if there's a specific error handling for this */
  1788. rfalErrorHandling();
  1789. break;
  1790. }
  1791. else if( (irqs & ST25R3916_IRQ_MASK_PAR) != 0U )
  1792. {
  1793. gRFAL.TxRx.status = ERR_PAR;
  1794. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1795. /* Check if there's a specific error handling for this */
  1796. rfalErrorHandling();
  1797. break;
  1798. }
  1799. else if( (irqs & ST25R3916_IRQ_MASK_CRC) != 0U )
  1800. {
  1801. gRFAL.TxRx.status = ERR_CRC;
  1802. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1803. /* Check if there's a specific error handling for this */
  1804. rfalErrorHandling();
  1805. break;
  1806. }
  1807. else if( (irqs & ST25R3916_IRQ_MASK_COL) != 0U )
  1808. {
  1809. gRFAL.TxRx.status = ERR_RF_COLLISION;
  1810. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1811. /* Check if there's a specific error handling for this */
  1812. rfalErrorHandling();
  1813. break;
  1814. }
  1815. else if( rfalIsModePassiveListen( gRFAL.mode ) && ((irqs & ST25R3916_IRQ_MASK_EOF) != 0U) )
  1816. {
  1817. gRFAL.TxRx.status = ERR_LINK_LOSS;
  1818. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1819. break;
  1820. }
  1821. else if( (irqs & ST25R3916_IRQ_MASK_RXE) != 0U )
  1822. {
  1823. /* Reception ended without any error indication, *
  1824. * check FIFO status for malformed or incomplete frames */
  1825. /* Check if the reception ends with an incomplete byte (residual bits) */
  1826. if( rfalFIFOStatusIsIncompleteByte() )
  1827. {
  1828. gRFAL.TxRx.status = ERR_INCOMPLETE_BYTE;
  1829. }
  1830. /* Check if the reception ends missing parity bit */
  1831. else if( rfalFIFOStatusIsMissingPar() )
  1832. {
  1833. gRFAL.TxRx.status = ERR_FRAMING;
  1834. }
  1835. else
  1836. {
  1837. /* MISRA 15.7 - Empty else */
  1838. }
  1839. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
  1840. }
  1841. else
  1842. {
  1843. gRFAL.TxRx.status = ERR_IO;
  1844. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1845. break;
  1846. }
  1847. /* fall through */
  1848. /*******************************************************************************/
  1849. case RFAL_TXRX_STATE_RX_READ_DATA: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1850. tmp = rfalFIFOStatusGetNumBytes();
  1851. /*******************************************************************************/
  1852. /* Check if CRC should not be placed in rxBuf */
  1853. if( ((gRFAL.TxRx.ctx.flags & (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP) == 0U) )
  1854. {
  1855. /* if received frame was bigger than CRC */
  1856. if( (uint16_t)(gRFAL.fifo.bytesTotal + tmp) > 0U )
  1857. {
  1858. /* By default CRC will not be placed into the rxBuffer */
  1859. if( ( tmp > RFAL_CRC_LEN) )
  1860. {
  1861. tmp -= RFAL_CRC_LEN;
  1862. }
  1863. /* If the CRC was already placed into rxBuffer (due to WL interrupt where CRC was already in FIFO Read)
  1864. * cannot remove it from rxBuf. Can only remove it from rxBufLen not indicate the presence of CRC */
  1865. else if(gRFAL.fifo.bytesTotal > RFAL_CRC_LEN)
  1866. {
  1867. gRFAL.fifo.bytesTotal -= RFAL_CRC_LEN;
  1868. }
  1869. else
  1870. {
  1871. /* MISRA 15.7 - Empty else */
  1872. }
  1873. }
  1874. }
  1875. gRFAL.fifo.bytesTotal += tmp; /* add to total bytes counter */
  1876. /*******************************************************************************/
  1877. /* Check if remaining bytes fit on the rxBuf available */
  1878. if( gRFAL.fifo.bytesTotal > rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) )
  1879. {
  1880. tmp = (uint16_t)( rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) - gRFAL.fifo.bytesWritten);
  1881. /* Transmission errors have precedence over buffer error */
  1882. if( gRFAL.TxRx.status == ERR_BUSY )
  1883. {
  1884. gRFAL.TxRx.status = ERR_NOMEM;
  1885. }
  1886. }
  1887. /*******************************************************************************/
  1888. /* Retrieve remaining bytes from FIFO to rxBuf, and assign total length rcvd */
  1889. st25r3916ReadFifo( &gRFAL.TxRx.ctx.rxBuf[gRFAL.fifo.bytesWritten], tmp);
  1890. if( gRFAL.TxRx.ctx.rxRcvdLen != NULL )
  1891. {
  1892. (*gRFAL.TxRx.ctx.rxRcvdLen) = (uint16_t)rfalConvBytesToBits( gRFAL.fifo.bytesTotal );
  1893. if( rfalFIFOStatusIsIncompleteByte() )
  1894. {
  1895. (*gRFAL.TxRx.ctx.rxRcvdLen) -= (RFAL_BITS_IN_BYTE - rfalFIFOGetNumIncompleteBits());
  1896. }
  1897. }
  1898. #if RFAL_FEATURE_NFCV
  1899. /*******************************************************************************/
  1900. /* Decode sub bit stream into payload bits for NFCV, if no error found so far */
  1901. if( ((RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode)) && (gRFAL.TxRx.status == ERR_BUSY) )
  1902. {
  1903. ReturnCode ret;
  1904. uint16_t offset = 0; /* REMARK offset not currently used */
  1905. ret = iso15693VICCDecode(gRFAL.TxRx.ctx.rxBuf, gRFAL.fifo.bytesTotal,
  1906. gRFAL.nfcvData.origCtx.rxBuf, rfalConvBitsToBytes(gRFAL.nfcvData.origCtx.rxBufLen), &offset, gRFAL.nfcvData.origCtx.rxRcvdLen, gRFAL.nfcvData.ignoreBits, (RFAL_MODE_POLL_PICOPASS == gRFAL.mode));
  1907. if( ((ERR_NONE == ret) || (ERR_CRC == ret))
  1908. && (((uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP & gRFAL.nfcvData.origCtx.flags) == 0U)
  1909. && ((*gRFAL.nfcvData.origCtx.rxRcvdLen % RFAL_BITS_IN_BYTE) == 0U)
  1910. && (*gRFAL.nfcvData.origCtx.rxRcvdLen >= rfalConvBytesToBits(RFAL_CRC_LEN) )
  1911. )
  1912. {
  1913. *gRFAL.nfcvData.origCtx.rxRcvdLen -= (uint16_t)rfalConvBytesToBits(RFAL_CRC_LEN); /* Remove CRC */
  1914. }
  1915. #if 0
  1916. /* Debugging code: output the payload bits by writing into the FIFO and subsequent clearing */
  1917. st25r3916WriteFifo(gRFAL.nfcvData.origCtx.rxBuf, rfalConvBitsToBytes( *gRFAL.nfcvData.origCtx.rxRcvdLen));
  1918. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  1919. #endif
  1920. /* Restore original ctx */
  1921. gRFAL.TxRx.ctx = gRFAL.nfcvData.origCtx;
  1922. gRFAL.TxRx.status = ((ret != ERR_NONE) ? ret : ERR_BUSY);
  1923. }
  1924. #endif /* RFAL_FEATURE_NFCV */
  1925. /*******************************************************************************/
  1926. /* If an error as been marked/detected don't fall into to RX_DONE */
  1927. if( gRFAL.TxRx.status != ERR_BUSY )
  1928. {
  1929. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  1930. break;
  1931. }
  1932. if( rfalIsModeActiveComm( gRFAL.mode ) )
  1933. {
  1934. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_EOF;
  1935. break;
  1936. }
  1937. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_DONE;
  1938. /* fall through */
  1939. /*******************************************************************************/
  1940. case RFAL_TXRX_STATE_RX_DONE: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  1941. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  1942. rfalCheckDisableObsMode();
  1943. /* Clean up Transceive */
  1944. rfalCleanupTransceive();
  1945. gRFAL.TxRx.status = ERR_NONE;
  1946. gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
  1947. break;
  1948. /*******************************************************************************/
  1949. case RFAL_TXRX_STATE_RX_READ_FIFO:
  1950. /*******************************************************************************/
  1951. /* REMARK: Silicon workaround ST25R3916 Errata #TBD */
  1952. /* Rarely on corrupted frames I_rxs gets signaled but I_rxe is not signaled */
  1953. /* Use a SW timer to handle an eventual missing RXE */
  1954. rfalTimerStart( gRFAL.tmr.RXE, RFAL_NORXE_TOUT );
  1955. /*******************************************************************************/
  1956. tmp = rfalFIFOStatusGetNumBytes();
  1957. gRFAL.fifo.bytesTotal += tmp;
  1958. /*******************************************************************************/
  1959. /* Calculate the amount of bytes that still fits in rxBuf */
  1960. aux = (( gRFAL.fifo.bytesTotal > rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) ) ? (rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) - gRFAL.fifo.bytesWritten) : tmp);
  1961. /*******************************************************************************/
  1962. /* Retrieve incoming bytes from FIFO to rxBuf, and store already read amount */
  1963. st25r3916ReadFifo( &gRFAL.TxRx.ctx.rxBuf[gRFAL.fifo.bytesWritten], aux);
  1964. gRFAL.fifo.bytesWritten += aux;
  1965. /*******************************************************************************/
  1966. /* If the bytes already read were not the full FIFO WL, dump the remaining *
  1967. * FIFO so that ST25R391x can continue with reception */
  1968. if( aux < tmp )
  1969. {
  1970. st25r3916ReadFifo( NULL, (tmp - aux) );
  1971. }
  1972. rfalFIFOStatusClear();
  1973. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXE;
  1974. break;
  1975. /*******************************************************************************/
  1976. case RFAL_TXRX_STATE_RX_FAIL:
  1977. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  1978. rfalCheckDisableObsMode();
  1979. /* Clean up Transceive */
  1980. rfalCleanupTransceive();
  1981. /* Error should be assigned by previous state */
  1982. if( gRFAL.TxRx.status == ERR_BUSY )
  1983. {
  1984. gRFAL.TxRx.status = ERR_SYSTEM;
  1985. }
  1986. /*rfalLogD( "RFAL: curSt: %d Error: %d \r\n", gRFAL.TxRx.state, gRFAL.TxRx.status );*/
  1987. gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
  1988. break;
  1989. /*******************************************************************************/
  1990. case RFAL_TXRX_STATE_RX_WAIT_EON:
  1991. irqs = st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_EON | ST25R3916_IRQ_MASK_NRE | ST25R3916_IRQ_MASK_PPON2) );
  1992. if( irqs == ST25R3916_IRQ_MASK_NONE )
  1993. {
  1994. break; /* No interrupt to process */
  1995. }
  1996. if( (irqs & ST25R3916_IRQ_MASK_EON) != 0U )
  1997. {
  1998. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXS;
  1999. }
  2000. if( (irqs & ST25R3916_IRQ_MASK_NRE) != 0U )
  2001. {
  2002. gRFAL.TxRx.status = ERR_TIMEOUT;
  2003. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  2004. }
  2005. if( (irqs & ST25R3916_IRQ_MASK_PPON2) != 0U )
  2006. {
  2007. gRFAL.TxRx.status = ERR_LINK_LOSS;
  2008. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  2009. }
  2010. break;
  2011. /*******************************************************************************/
  2012. case RFAL_TXRX_STATE_RX_WAIT_EOF:
  2013. irqs = st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_CAT | ST25R3916_IRQ_MASK_CAC) );
  2014. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2015. {
  2016. break; /* No interrupt to process */
  2017. }
  2018. if( (irqs & ST25R3916_IRQ_MASK_CAT) != 0U )
  2019. {
  2020. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_DONE;
  2021. }
  2022. else if( (irqs & ST25R3916_IRQ_MASK_CAC) != 0U )
  2023. {
  2024. gRFAL.TxRx.status = ERR_RF_COLLISION;
  2025. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  2026. }
  2027. else
  2028. {
  2029. gRFAL.TxRx.status = ERR_IO;
  2030. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  2031. }
  2032. break;
  2033. /*******************************************************************************/
  2034. default:
  2035. gRFAL.TxRx.status = ERR_SYSTEM;
  2036. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
  2037. break;
  2038. }
  2039. }
  2040. /*******************************************************************************/
  2041. static void rfalFIFOStatusUpdate( void )
  2042. {
  2043. if(gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] == RFAL_FIFO_STATUS_INVALID)
  2044. {
  2045. st25r3916ReadMultipleRegisters( ST25R3916_REG_FIFO_STATUS1, gRFAL.fifo.status, ST25R3916_FIFO_STATUS_LEN );
  2046. }
  2047. }
  2048. /*******************************************************************************/
  2049. static void rfalFIFOStatusClear( void )
  2050. {
  2051. gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] = RFAL_FIFO_STATUS_INVALID;
  2052. }
  2053. /*******************************************************************************/
  2054. static uint16_t rfalFIFOStatusGetNumBytes( void )
  2055. {
  2056. uint16_t result;
  2057. rfalFIFOStatusUpdate();
  2058. result = ((((uint16_t)gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3916_REG_FIFO_STATUS2_fifo_b_mask) >> ST25R3916_REG_FIFO_STATUS2_fifo_b_shift) << RFAL_BITS_IN_BYTE);
  2059. result |= (((uint16_t)gRFAL.fifo.status[RFAL_FIFO_STATUS_REG1]) & 0x00FFU);
  2060. return result;
  2061. }
  2062. /*******************************************************************************/
  2063. static bool rfalFIFOStatusIsIncompleteByte( void )
  2064. {
  2065. rfalFIFOStatusUpdate();
  2066. return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3916_REG_FIFO_STATUS2_fifo_lb_mask) != 0U);
  2067. }
  2068. /*******************************************************************************/
  2069. static bool rfalFIFOStatusIsMissingPar( void )
  2070. {
  2071. rfalFIFOStatusUpdate();
  2072. return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3916_REG_FIFO_STATUS2_np_lb) != 0U);
  2073. }
  2074. /*******************************************************************************/
  2075. static uint8_t rfalFIFOGetNumIncompleteBits( void )
  2076. {
  2077. rfalFIFOStatusUpdate();
  2078. return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3916_REG_FIFO_STATUS2_fifo_lb_mask) >> ST25R3916_REG_FIFO_STATUS2_fifo_lb_shift);
  2079. }
  2080. #if RFAL_FEATURE_NFCA
  2081. /*******************************************************************************/
  2082. ReturnCode rfalISO14443ATransceiveShortFrame( rfal14443AShortFrameCmd txCmd, uint8_t* rxBuf, uint8_t rxBufLen, uint16_t* rxRcvdLen, uint32_t fwt )
  2083. {
  2084. ReturnCode ret;
  2085. uint8_t directCmd;
  2086. /* Check if RFAL is properly initialized */
  2087. if( !st25r3916IsTxEnabled() || (gRFAL.state < RFAL_STATE_MODE_SET) || (( gRFAL.mode != RFAL_MODE_POLL_NFCA ) && ( gRFAL.mode != RFAL_MODE_POLL_NFCA_T1T )) )
  2088. {
  2089. return ERR_WRONG_STATE;
  2090. }
  2091. /* Check for valid parameters */
  2092. if( (rxBuf == NULL) || (rxRcvdLen == NULL) || (fwt == RFAL_FWT_NONE) )
  2093. {
  2094. return ERR_PARAM;
  2095. }
  2096. /*******************************************************************************/
  2097. /* Select the Direct Command to be performed */
  2098. switch (txCmd)
  2099. {
  2100. case RFAL_14443A_SHORTFRAME_CMD_WUPA:
  2101. directCmd = ST25R3916_CMD_TRANSMIT_WUPA;
  2102. break;
  2103. case RFAL_14443A_SHORTFRAME_CMD_REQA:
  2104. directCmd = ST25R3916_CMD_TRANSMIT_REQA;
  2105. break;
  2106. default:
  2107. return ERR_PARAM;
  2108. }
  2109. /* Disable CRC while receiving since ATQA has no CRC included */
  2110. st25r3916SetRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_no_crc_rx );
  2111. /*******************************************************************************/
  2112. /* Wait for GT and FDT */
  2113. while( !rfalIsGTExpired() ) { /* MISRA 15.6: mandatory brackets */ };
  2114. while( st25r3916IsGPTRunning() ) { /* MISRA 15.6: mandatory brackets */ };
  2115. rfalTimerDestroy( gRFAL.tmr.GT );
  2116. gRFAL.tmr.GT = RFAL_TIMING_NONE;
  2117. /*******************************************************************************/
  2118. /* Prepare for Transceive, Receive only (bypass Tx states) */
  2119. gRFAL.TxRx.ctx.flags = ( (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP );
  2120. gRFAL.TxRx.ctx.rxBuf = rxBuf;
  2121. gRFAL.TxRx.ctx.rxBufLen = rxBufLen;
  2122. gRFAL.TxRx.ctx.rxRcvdLen = rxRcvdLen;
  2123. gRFAL.TxRx.ctx.fwt = fwt;
  2124. /*******************************************************************************/
  2125. /* Load NRT with FWT */
  2126. st25r3916SetNoResponseTime( rfalConv1fcTo64fc( MIN( (fwt + RFAL_FWT_ADJUSTMENT + RFAL_FWT_A_ADJUSTMENT), RFAL_ST25R3916_NRT_MAX_1FC ) ) );
  2127. if( gRFAL.timings.FDTListen != RFAL_TIMING_NONE )
  2128. {
  2129. /* Ensure that MRT is using 64/fc steps */
  2130. st25r3916ClrRegisterBits(ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_mrt_step );
  2131. /* Set Minimum FDT(Listen) in which PICC is not allowed to send a response */
  2132. st25r3916WriteRegister( ST25R3916_REG_MASK_RX_TIMER, (uint8_t)rfalConv1fcTo64fc( ((RFAL_FDT_LISTEN_MRT_ADJUSTMENT + RFAL_FDT_LISTEN_A_ADJUSTMENT) > gRFAL.timings.FDTListen) ? RFAL_ST25R3916_MRT_MIN_1FC : (gRFAL.timings.FDTListen - (RFAL_FDT_LISTEN_MRT_ADJUSTMENT + RFAL_FDT_LISTEN_A_ADJUSTMENT)) ) );
  2133. }
  2134. /* In Passive communications General Purpose Timer is used to measure FDT Poll */
  2135. if( gRFAL.timings.FDTPoll != RFAL_TIMING_NONE )
  2136. {
  2137. /* Configure GPT to start at RX end */
  2138. st25r3916SetStartGPTimer( (uint16_t)rfalConv1fcTo8fc( MIN( gRFAL.timings.FDTPoll, (gRFAL.timings.FDTPoll - RFAL_FDT_POLL_ADJUSTMENT) ) ) , ST25R3916_REG_TIMER_EMV_CONTROL_gptc_erx );
  2139. }
  2140. /*******************************************************************************/
  2141. rfalPrepareTransceive();
  2142. /* Also enable bit collision interrupt */
  2143. st25r3916GetInterrupt( ST25R3916_IRQ_MASK_COL );
  2144. st25r3916EnableInterrupts( ST25R3916_IRQ_MASK_COL );
  2145. /*Check if Observation Mode is enabled and set it on ST25R391x */
  2146. rfalCheckEnableObsModeTx();
  2147. /*******************************************************************************/
  2148. /* Clear nbtx bits before sending WUPA/REQA - otherwise ST25R3916 will report parity error, Note2 of the register */
  2149. st25r3916WriteRegister( ST25R3916_REG_NUM_TX_BYTES2, 0);
  2150. /* Send either WUPA or REQA. All affected tags will backscatter ATQA and change to READY state */
  2151. st25r3916ExecuteCommand( directCmd );
  2152. /* Wait for TXE */
  2153. if( st25r3916WaitForInterruptsTimed( ST25R3916_IRQ_MASK_TXE, (uint16_t)MAX( rfalConv1fcToMs( fwt ), RFAL_ST25R3916_SW_TMR_MIN_1MS ) ) == 0U )
  2154. {
  2155. ret = ERR_IO;
  2156. }
  2157. else
  2158. {
  2159. /*Check if Observation Mode is enabled and set it on ST25R391x */
  2160. rfalCheckEnableObsModeRx();
  2161. /* Jump into a transceive Rx state for reception (bypass Tx states) */
  2162. gRFAL.state = RFAL_STATE_TXRX;
  2163. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_IDLE;
  2164. gRFAL.TxRx.status = ERR_BUSY;
  2165. /* Execute Transceive Rx blocking */
  2166. ret = rfalTransceiveBlockingRx();
  2167. }
  2168. /* Disable Collision interrupt */
  2169. st25r3916DisableInterrupts( (ST25R3916_IRQ_MASK_COL) );
  2170. /* ReEnable CRC on Rx */
  2171. st25r3916ClrRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_no_crc_rx );
  2172. return ret;
  2173. }
  2174. /*******************************************************************************/
  2175. ReturnCode rfalISO14443ATransceiveAnticollisionFrame( uint8_t *buf, uint8_t *bytesToSend, uint8_t *bitsToSend, uint16_t *rxLength, uint32_t fwt )
  2176. {
  2177. ReturnCode ret;
  2178. rfalTransceiveContext ctx;
  2179. uint8_t collByte;
  2180. uint8_t collData;
  2181. /* Check if RFAL is properly initialized */
  2182. if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCA ) )
  2183. {
  2184. return ERR_WRONG_STATE;
  2185. }
  2186. /* Check for valid parameters */
  2187. if( (buf == NULL) || (bytesToSend == NULL) || (bitsToSend == NULL) || (rxLength == NULL) )
  2188. {
  2189. return ERR_PARAM;
  2190. }
  2191. /*******************************************************************************/
  2192. /* Set speficic Analog Config for Anticolission if needed */
  2193. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_ANTICOL) );
  2194. /*******************************************************************************/
  2195. /* Enable anti collision to recognise collision in first byte of SENS_REQ */
  2196. st25r3916SetRegisterBits( ST25R3916_REG_ISO14443A_NFC, ST25R3916_REG_ISO14443A_NFC_antcl );
  2197. /* Disable CRC while receiving */
  2198. st25r3916SetRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_no_crc_rx );
  2199. /*******************************************************************************/
  2200. /* Prepare for Transceive */
  2201. ctx.flags = ( (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP );
  2202. ctx.txBuf = buf;
  2203. ctx.txBufLen = (uint16_t)(rfalConvBytesToBits( *bytesToSend ) + *bitsToSend );
  2204. ctx.rxBuf = &buf[*bytesToSend];
  2205. ctx.rxBufLen = (uint16_t)rfalConvBytesToBits( RFAL_ISO14443A_SDD_RES_LEN );
  2206. ctx.rxRcvdLen = rxLength;
  2207. ctx.fwt = fwt;
  2208. /* Disable Automatic Gain Control (AGC) for better detection of collisions if using Coherent Receiver */
  2209. ctx.flags |= (st25r3916CheckReg( ST25R3916_REG_AUX, ST25R3916_REG_AUX_dis_corr, ST25R3916_REG_AUX_dis_corr ) ? (uint32_t)RFAL_TXRX_FLAGS_AGC_OFF : 0x00U );
  2210. rfalStartTransceive( &ctx );
  2211. /* Additionally enable bit collision interrupt */
  2212. st25r3916GetInterrupt( ST25R3916_IRQ_MASK_COL );
  2213. st25r3916EnableInterrupts( ST25R3916_IRQ_MASK_COL );
  2214. /*******************************************************************************/
  2215. collByte = 0;
  2216. /* save the collision byte */
  2217. if ((*bitsToSend) > 0U)
  2218. {
  2219. buf[(*bytesToSend)] <<= (RFAL_BITS_IN_BYTE - (*bitsToSend));
  2220. buf[(*bytesToSend)] >>= (RFAL_BITS_IN_BYTE - (*bitsToSend));
  2221. collByte = buf[(*bytesToSend)];
  2222. }
  2223. /*******************************************************************************/
  2224. /* Run Transceive blocking */
  2225. ret = rfalTransceiveRunBlockingTx();
  2226. if( ret == ERR_NONE)
  2227. {
  2228. ret = rfalTransceiveBlockingRx();
  2229. /*******************************************************************************/
  2230. if ((*bitsToSend) > 0U)
  2231. {
  2232. buf[(*bytesToSend)] >>= (*bitsToSend);
  2233. buf[(*bytesToSend)] <<= (*bitsToSend);
  2234. buf[(*bytesToSend)] |= collByte;
  2235. }
  2236. if( (ERR_RF_COLLISION == ret) )
  2237. {
  2238. /* read out collision register */
  2239. st25r3916ReadRegister( ST25R3916_REG_COLLISION_STATUS, &collData);
  2240. (*bytesToSend) = ((collData >> ST25R3916_REG_COLLISION_STATUS_c_byte_shift) & 0x0FU); // 4-bits Byte information
  2241. (*bitsToSend) = ((collData >> ST25R3916_REG_COLLISION_STATUS_c_bit_shift) & 0x07U); // 3-bits bit information
  2242. }
  2243. }
  2244. /*******************************************************************************/
  2245. /* Disable Collision interrupt */
  2246. st25r3916DisableInterrupts( (ST25R3916_IRQ_MASK_COL) );
  2247. /* Disable anti collision again */
  2248. st25r3916ClrRegisterBits( ST25R3916_REG_ISO14443A_NFC, ST25R3916_REG_ISO14443A_NFC_antcl );
  2249. /* ReEnable CRC on Rx */
  2250. st25r3916ClrRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_no_crc_rx );
  2251. /*******************************************************************************/
  2252. /* Restore common Analog configurations for this mode */
  2253. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX) );
  2254. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX) );
  2255. return ret;
  2256. }
  2257. #endif /* RFAL_FEATURE_NFCA */
  2258. #if RFAL_FEATURE_NFCV
  2259. /*******************************************************************************/
  2260. ReturnCode rfalISO15693TransceiveAnticollisionFrame( uint8_t *txBuf, uint8_t txBufLen, uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen )
  2261. {
  2262. ReturnCode ret;
  2263. rfalTransceiveContext ctx;
  2264. /* Check if RFAL is properly initialized */
  2265. if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCV ) )
  2266. {
  2267. return ERR_WRONG_STATE;
  2268. }
  2269. /*******************************************************************************/
  2270. /* Set speficic Analog Config for Anticolission if needed */
  2271. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_ANTICOL) );
  2272. /* Ignoring collisions before the UID (RES_FLAG + DSFID) */
  2273. gRFAL.nfcvData.ignoreBits = (uint16_t)RFAL_ISO15693_IGNORE_BITS;
  2274. /*******************************************************************************/
  2275. /* Prepare for Transceive */
  2276. ctx.flags = ((txBufLen==0U)?(uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL:(uint32_t)RFAL_TXRX_FLAGS_CRC_TX_AUTO) | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_AGC_OFF | ((txBufLen==0U)?(uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL:(uint32_t)RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO); /* Disable Automatic Gain Control (AGC) for better detection of collision */
  2277. ctx.txBuf = txBuf;
  2278. ctx.txBufLen = (uint16_t)rfalConvBytesToBits(txBufLen);
  2279. ctx.rxBuf = rxBuf;
  2280. ctx.rxBufLen = (uint16_t)rfalConvBytesToBits(rxBufLen);
  2281. ctx.rxRcvdLen = actLen;
  2282. ctx.fwt = rfalConv64fcTo1fc(ISO15693_FWT);
  2283. rfalStartTransceive( &ctx );
  2284. /*******************************************************************************/
  2285. /* Run Transceive blocking */
  2286. ret = rfalTransceiveRunBlockingTx();
  2287. if( ret == ERR_NONE)
  2288. {
  2289. ret = rfalTransceiveBlockingRx();
  2290. }
  2291. /* Check if a Transmission error and received data is less then expected */
  2292. if( ((ret == ERR_RF_COLLISION) || (ret == ERR_CRC) || (ret == ERR_FRAMING)) && (rfalConvBitsToBytes(*ctx.rxRcvdLen) < RFAL_ISO15693_INV_RES_LEN) )
  2293. {
  2294. /* If INVENTORY_RES is shorter than expected, tag is still modulating *
  2295. * Ensure that response is complete before next frame */
  2296. platformDelay( (uint8_t)( (RFAL_ISO15693_INV_RES_LEN - rfalConvBitsToBytes(*ctx.rxRcvdLen)) / ((RFAL_ISO15693_INV_RES_LEN / RFAL_ISO15693_INV_RES_DUR)+1U) ));
  2297. }
  2298. /* Restore common Analog configurations for this mode */
  2299. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX) );
  2300. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX) );
  2301. gRFAL.nfcvData.ignoreBits = 0;
  2302. return ret;
  2303. }
  2304. /*******************************************************************************/
  2305. ReturnCode rfalISO15693TransceiveEOFAnticollision( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen )
  2306. {
  2307. uint8_t dummy;
  2308. return rfalISO15693TransceiveAnticollisionFrame( &dummy, 0, rxBuf, rxBufLen, actLen );
  2309. }
  2310. /*******************************************************************************/
  2311. ReturnCode rfalISO15693TransceiveEOF( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen )
  2312. {
  2313. ReturnCode ret;
  2314. uint8_t dummy;
  2315. /* Check if RFAL is properly initialized */
  2316. if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCV ) )
  2317. {
  2318. return ERR_WRONG_STATE;
  2319. }
  2320. /*******************************************************************************/
  2321. /* Run Transceive blocking */
  2322. ret = rfalTransceiveBlockingTxRx( &dummy,
  2323. 0,
  2324. rxBuf,
  2325. rxBufLen,
  2326. actLen,
  2327. ( (uint32_t)RFAL_TXRX_FLAGS_CRC_TX_MANUAL | (uint32_t)RFAL_TXRX_FLAGS_CRC_RX_KEEP | (uint32_t)RFAL_TXRX_FLAGS_AGC_ON ),
  2328. rfalConv64fcTo1fc(ISO15693_FWT) );
  2329. return ret;
  2330. }
  2331. #endif /* RFAL_FEATURE_NFCV */
  2332. #if RFAL_FEATURE_NFCF
  2333. /*******************************************************************************/
  2334. ReturnCode rfalFeliCaPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes* pollResList, uint8_t pollResListSize, uint8_t *devicesDetected, uint8_t *collisionsDetected )
  2335. {
  2336. ReturnCode ret;
  2337. uint8_t frame[RFAL_FELICA_POLL_REQ_LEN - RFAL_FELICA_LEN_LEN]; // LEN is added by ST25R391x automatically
  2338. uint16_t actLen;
  2339. uint8_t frameIdx;
  2340. uint8_t devDetected;
  2341. uint8_t colDetected;
  2342. rfalEHandling curHandling;
  2343. uint8_t nbSlots;
  2344. /* Check if RFAL is properly initialized */
  2345. if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCF ) )
  2346. {
  2347. return ERR_WRONG_STATE;
  2348. }
  2349. frameIdx = 0;
  2350. colDetected = 0;
  2351. devDetected = 0;
  2352. nbSlots = (uint8_t)slots;
  2353. /*******************************************************************************/
  2354. /* Compute SENSF_REQ frame */
  2355. frame[frameIdx++] = (uint8_t)FELICA_CMD_POLLING; /* CMD: SENF_REQ */
  2356. frame[frameIdx++] = (uint8_t)(sysCode >> 8); /* System Code (SC) */
  2357. frame[frameIdx++] = (uint8_t)(sysCode & 0xFFU); /* System Code (SC) */
  2358. frame[frameIdx++] = reqCode; /* Communication Parameter Request (RC)*/
  2359. frame[frameIdx++] = nbSlots; /* TimeSlot (TSN) */
  2360. /*******************************************************************************/
  2361. /* NRT should not stop on reception - Use EMVCo mode to run NRT in nrt_emv *
  2362. * ERRORHANDLING_EMVCO has no special handling for NFC-F mode */
  2363. curHandling = gRFAL.conf.eHandling;
  2364. rfalSetErrorHandling( RFAL_ERRORHANDLING_EMVCO );
  2365. /*******************************************************************************/
  2366. /* Run transceive blocking,
  2367. * Calculate Total Response Time in(64/fc):
  2368. * 512 PICC process time + (n * 256 Time Slot duration) */
  2369. ret = rfalTransceiveBlockingTx( frame,
  2370. (uint16_t)frameIdx,
  2371. (uint8_t*)gRFAL.nfcfData.pollResponses,
  2372. RFAL_FELICA_POLL_RES_LEN,
  2373. &actLen,
  2374. (RFAL_TXRX_FLAGS_DEFAULT),
  2375. rfalConv64fcTo1fc( RFAL_FELICA_POLL_DELAY_TIME + (RFAL_FELICA_POLL_SLOT_TIME * ((uint32_t)nbSlots + 1U)) ) );
  2376. /*******************************************************************************/
  2377. /* If Tx OK, Wait for all responses, store them as soon as they appear */
  2378. if( ret == ERR_NONE )
  2379. {
  2380. bool timeout;
  2381. do
  2382. {
  2383. ret = rfalTransceiveBlockingRx();
  2384. if( ret == ERR_TIMEOUT )
  2385. {
  2386. /* Upon timeout the full Poll Delay + (Slot time)*(nbSlots) has expired */
  2387. timeout = true;
  2388. }
  2389. else
  2390. {
  2391. /* Reception done, reEnabled Rx for following Slot */
  2392. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2393. st25r3916ExecuteCommand( ST25R3916_CMD_RESET_RXGAIN );
  2394. /* If the reception was OK, new device found */
  2395. if( ret == ERR_NONE )
  2396. {
  2397. devDetected++;
  2398. /* Overwrite the Transceive context for the next reception */
  2399. gRFAL.TxRx.ctx.rxBuf = (uint8_t*)gRFAL.nfcfData.pollResponses[devDetected];
  2400. }
  2401. /* If the reception was not OK, mark as collision */
  2402. else
  2403. {
  2404. colDetected++;
  2405. }
  2406. /* Check whether NRT has expired meanwhile */
  2407. timeout = st25r3916CheckReg( ST25R3916_REG_NFCIP1_BIT_RATE, ST25R3916_REG_NFCIP1_BIT_RATE_nrt_on, 0x00 );
  2408. if( !timeout )
  2409. {
  2410. /* Jump again into transceive Rx state for the following reception */
  2411. gRFAL.TxRx.status = ERR_BUSY;
  2412. gRFAL.state = RFAL_STATE_TXRX;
  2413. gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_IDLE;
  2414. }
  2415. }
  2416. }while( ((nbSlots--) != 0U) && !timeout );
  2417. }
  2418. /*******************************************************************************/
  2419. /* Restore NRT to normal mode - back to previous error handling */
  2420. rfalSetErrorHandling( curHandling );
  2421. /*******************************************************************************/
  2422. /* Assign output parameters if requested */
  2423. if( (pollResList != NULL) && (pollResListSize > 0U) && (devDetected > 0U) )
  2424. {
  2425. ST_MEMCPY( pollResList, gRFAL.nfcfData.pollResponses, (RFAL_FELICA_POLL_RES_LEN * (uint32_t)MIN(pollResListSize, devDetected) ) );
  2426. }
  2427. if( devicesDetected != NULL )
  2428. {
  2429. *devicesDetected = devDetected;
  2430. }
  2431. if( collisionsDetected != NULL )
  2432. {
  2433. *collisionsDetected = colDetected;
  2434. }
  2435. return (( (colDetected != 0U) || (devDetected != 0U)) ? ERR_NONE : ret);
  2436. }
  2437. #endif /* RFAL_FEATURE_NFCF */
  2438. /*****************************************************************************
  2439. * Listen Mode *
  2440. *****************************************************************************/
  2441. /*******************************************************************************/
  2442. bool rfalIsExtFieldOn( void )
  2443. {
  2444. return st25r3916IsExtFieldOn();
  2445. }
  2446. #if RFAL_FEATURE_LISTEN_MODE
  2447. /*******************************************************************************/
  2448. ReturnCode rfalListenStart( uint32_t lmMask, const rfalLmConfPA *confA, const rfalLmConfPB *confB, const rfalLmConfPF *confF, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rxLen )
  2449. {
  2450. t_rfalPTMem PTMem; /* PRQA S 0759 # MISRA 19.2 - Allocating Union where members are of the same type, just different names. Thus no problem can occur. */
  2451. uint8_t* pPTMem;
  2452. uint8_t autoResp;
  2453. /* Check if RFAL is initialized */
  2454. if( gRFAL.state < RFAL_STATE_INIT )
  2455. {
  2456. return ERR_WRONG_STATE;
  2457. }
  2458. gRFAL.Lm.state = RFAL_LM_STATE_NOT_INIT;
  2459. gRFAL.Lm.mdIrqs = ST25R3916_IRQ_MASK_NONE;
  2460. gRFAL.Lm.mdReg = (ST25R3916_REG_MODE_targ_init | ST25R3916_REG_MODE_om_nfc | ST25R3916_REG_MODE_nfc_ar_off);
  2461. /* By default disable all automatic responses */
  2462. autoResp = (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a | ST25R3916_REG_PASSIVE_TARGET_rfu | ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r | ST25R3916_REG_PASSIVE_TARGET_d_ac_ap2p);
  2463. /*******************************************************************************/
  2464. if( (lmMask & RFAL_LM_MASK_NFCA) != 0U )
  2465. {
  2466. /* Check if the conf has been provided */
  2467. if( confA == NULL )
  2468. {
  2469. return ERR_PARAM;
  2470. }
  2471. pPTMem = (uint8_t*)PTMem.PTMem_A;
  2472. /*******************************************************************************/
  2473. /* Check and set supported NFCID Length */
  2474. switch(confA->nfcidLen)
  2475. {
  2476. case RFAL_LM_NFCID_LEN_04:
  2477. st25r3916ChangeRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_nfc_id_mask, ST25R3916_REG_AUX_nfc_id_4bytes );
  2478. break;
  2479. case RFAL_LM_NFCID_LEN_07:
  2480. st25r3916ChangeRegisterBits( ST25R3916_REG_AUX, ST25R3916_REG_AUX_nfc_id_mask, ST25R3916_REG_AUX_nfc_id_7bytes );
  2481. break;
  2482. default:
  2483. return ERR_PARAM;
  2484. }
  2485. /*******************************************************************************/
  2486. /* Set NFCID */
  2487. ST_MEMCPY( pPTMem, confA->nfcid, RFAL_NFCID1_TRIPLE_LEN );
  2488. pPTMem = &pPTMem[RFAL_NFCID1_TRIPLE_LEN]; /* MISRA 18.4 */
  2489. /* Set SENS_RES */
  2490. ST_MEMCPY( pPTMem, confA->SENS_RES, RFAL_LM_SENS_RES_LEN );
  2491. pPTMem = &pPTMem[RFAL_LM_SENS_RES_LEN]; /* MISRA 18.4 */
  2492. /* Set SEL_RES */
  2493. *pPTMem++ = ( (confA->nfcidLen == RFAL_LM_NFCID_LEN_04) ? ( confA->SEL_RES & ~RFAL_LM_NFCID_INCOMPLETE ) : (confA->SEL_RES | RFAL_LM_NFCID_INCOMPLETE) );
  2494. *pPTMem++ = ( confA->SEL_RES & ~RFAL_LM_NFCID_INCOMPLETE );
  2495. *pPTMem++ = ( confA->SEL_RES & ~RFAL_LM_NFCID_INCOMPLETE );
  2496. /* Write into PTMem-A */
  2497. st25r3916WritePTMem( PTMem.PTMem_A, ST25R3916_PTM_A_LEN );
  2498. /*******************************************************************************/
  2499. /* Enable automatic responses for A */
  2500. autoResp &= ~ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a;
  2501. /* Set Target mode, Bit Rate detection and Listen Mode for NFC-F */
  2502. gRFAL.Lm.mdReg |= (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om0 | ST25R3916_REG_MODE_nfc_ar_off);
  2503. gRFAL.Lm.mdIrqs |= (ST25R3916_IRQ_MASK_WU_A | ST25R3916_IRQ_MASK_WU_A_X | ST25R3916_IRQ_MASK_RXE_PTA);
  2504. }
  2505. /*******************************************************************************/
  2506. if( (lmMask & RFAL_LM_MASK_NFCB) != 0U )
  2507. {
  2508. /* Check if the conf has been provided */
  2509. if( confB == NULL )
  2510. {
  2511. return ERR_PARAM;
  2512. }
  2513. return ERR_NOTSUPP;
  2514. }
  2515. /*******************************************************************************/
  2516. if( (lmMask & RFAL_LM_MASK_NFCF) != 0U )
  2517. {
  2518. pPTMem = (uint8_t*)PTMem.PTMem_F;
  2519. /* Check if the conf has been provided */
  2520. if( confF == NULL )
  2521. {
  2522. return ERR_PARAM;
  2523. }
  2524. /*******************************************************************************/
  2525. /* Set System Code */
  2526. ST_MEMCPY( pPTMem, confF->SC, RFAL_LM_SENSF_SC_LEN );
  2527. pPTMem = &pPTMem[RFAL_LM_SENSF_SC_LEN]; /* MISRA 18.4 */
  2528. /* Set SENSF_RES */
  2529. ST_MEMCPY( pPTMem, confF->SENSF_RES, RFAL_LM_SENSF_RES_LEN );
  2530. /* Set RD bytes to 0x00 as ST25R3916 cannot support advances features */
  2531. pPTMem[RFAL_LM_SENSF_RD0_POS] = 0x00; /* NFC Forum Digital 1.1 Table 46: 0x00 */
  2532. pPTMem[RFAL_LM_SENSF_RD1_POS] = 0x00; /* NFC Forum Digital 1.1 Table 47: No automatic bit rates */
  2533. pPTMem = &pPTMem[RFAL_LM_SENS_RES_LEN]; /* MISRA 18.4 */
  2534. /* Write into PTMem-F */
  2535. st25r3916WritePTMemF( PTMem.PTMem_F, ST25R3916_PTM_F_LEN );
  2536. /*******************************************************************************/
  2537. /* Write 24 TSN "Random" Numbers at first initialization and let it rollover */
  2538. if( !gRFAL.Lm.iniFlag )
  2539. {
  2540. pPTMem = (uint8_t*)PTMem.TSN;
  2541. *pPTMem++ = 0x12;
  2542. *pPTMem++ = 0x34;
  2543. *pPTMem++ = 0x56;
  2544. *pPTMem++ = 0x78;
  2545. *pPTMem++ = 0x9A;
  2546. *pPTMem++ = 0xBC;
  2547. *pPTMem++ = 0xDF;
  2548. *pPTMem++ = 0x21;
  2549. *pPTMem++ = 0x43;
  2550. *pPTMem++ = 0x65;
  2551. *pPTMem++ = 0x87;
  2552. *pPTMem++ = 0xA9;
  2553. /* Write into PTMem-TSN */
  2554. st25r3916WritePTMemTSN( PTMem.TSN, ST25R3916_PTM_TSN_LEN );
  2555. }
  2556. /*******************************************************************************/
  2557. /* Enable automatic responses for F */
  2558. autoResp &= ~(ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r);
  2559. /* Set Target mode, Bit Rate detection and Listen Mode for NFC-F */
  2560. gRFAL.Lm.mdReg |= (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om2 | ST25R3916_REG_MODE_nfc_ar_off);
  2561. /* In CE NFC-F any data without error will be passed to FIFO, to support CUP */
  2562. gRFAL.Lm.mdIrqs |= (ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_RXE_PTA | ST25R3916_IRQ_MASK_RXE);
  2563. }
  2564. /*******************************************************************************/
  2565. if( (lmMask & RFAL_LM_MASK_ACTIVE_P2P) != 0U )
  2566. {
  2567. /* Enable Reception of P2P frames */
  2568. autoResp &= ~(ST25R3916_REG_PASSIVE_TARGET_d_ac_ap2p);
  2569. /* Set Target mode, Bit Rate detection and Automatic Response RF Collision Avoidance */
  2570. gRFAL.Lm.mdReg |= (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om2 | ST25R3916_REG_MODE_om0 | ST25R3916_REG_MODE_nfc_ar_auto_rx);
  2571. /* n * TRFW timing shall vary Activity 2.1 3.4.1.1 */
  2572. st25r3916ChangeRegisterBits(ST25R3916_REG_AUX, ST25R3916_REG_AUX_nfc_n_mask, gRFAL.timings.nTRFW);
  2573. gRFAL.timings.nTRFW = rfalGennTRFW( gRFAL.timings.nTRFW );
  2574. gRFAL.Lm.mdIrqs |= ( ST25R3916_IRQ_MASK_RXE );
  2575. }
  2576. /* Check if one of the modes were selected */
  2577. if( (gRFAL.Lm.mdReg & ST25R3916_REG_MODE_targ) == ST25R3916_REG_MODE_targ_targ )
  2578. {
  2579. gRFAL.state = RFAL_STATE_LM;
  2580. gRFAL.Lm.mdMask = lmMask;
  2581. gRFAL.Lm.rxBuf = rxBuf;
  2582. gRFAL.Lm.rxBufLen = rxBufLen;
  2583. gRFAL.Lm.rxLen = rxLen;
  2584. *gRFAL.Lm.rxLen = 0;
  2585. gRFAL.Lm.dataFlag = false;
  2586. gRFAL.Lm.iniFlag = true;
  2587. /* Apply the Automatic Responses configuration */
  2588. st25r3916ChangeRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a | ST25R3916_REG_PASSIVE_TARGET_rfu | ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r | ST25R3916_REG_PASSIVE_TARGET_d_ac_ap2p ), autoResp );
  2589. /* Disable GPT trigger source */
  2590. st25r3916ChangeRegisterBits( ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_gptc_mask, ST25R3916_REG_TIMER_EMV_CONTROL_gptc_no_trigger );
  2591. /* On Bit Rate Detection Mode ST25R391x will filter incoming frames during MRT time starting on External Field On event, use 512/fc steps */
  2592. st25r3916SetRegisterBits(ST25R3916_REG_TIMER_EMV_CONTROL, ST25R3916_REG_TIMER_EMV_CONTROL_mrt_step_512 );
  2593. st25r3916WriteRegister( ST25R3916_REG_MASK_RX_TIMER, (uint8_t)rfalConv1fcTo512fc( RFAL_LM_GT ) );
  2594. /* Restore default settings on NFCIP1 mode, Receiving parity + CRC bits and manual Tx Parity*/
  2595. st25r3916ClrRegisterBits( ST25R3916_REG_ISO14443A_NFC, (ST25R3916_REG_ISO14443A_NFC_no_tx_par | ST25R3916_REG_ISO14443A_NFC_no_rx_par | ST25R3916_REG_ISO14443A_NFC_nfc_f0) );
  2596. /* External Field Detector enabled as Automatics on rfalInitialize() */
  2597. /* Set Analog configurations for generic Listen mode */
  2598. /* Not on SetState(POWER OFF) as otherwise would be applied on every Field Event */
  2599. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LISTEN_ON) );
  2600. /* Initialize as POWER_OFF and set proper mode in RF Chip */
  2601. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2602. }
  2603. else
  2604. {
  2605. return ERR_REQUEST; /* Listen Start called but no mode was enabled */
  2606. }
  2607. return ERR_NONE;
  2608. }
  2609. /*******************************************************************************/
  2610. static ReturnCode rfalRunListenModeWorker( void )
  2611. {
  2612. volatile uint32_t irqs;
  2613. uint8_t tmp;
  2614. if( gRFAL.state != RFAL_STATE_LM )
  2615. {
  2616. return ERR_WRONG_STATE;
  2617. }
  2618. switch( gRFAL.Lm.state )
  2619. {
  2620. /*******************************************************************************/
  2621. case RFAL_LM_STATE_POWER_OFF:
  2622. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_EON ) );
  2623. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2624. {
  2625. break; /* No interrupt to process */
  2626. }
  2627. if( (irqs & ST25R3916_IRQ_MASK_EON) != 0U )
  2628. {
  2629. rfalListenSetState( RFAL_LM_STATE_IDLE );
  2630. }
  2631. else
  2632. {
  2633. break;
  2634. }
  2635. /* fall through */
  2636. /*******************************************************************************/
  2637. case RFAL_LM_STATE_IDLE: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */
  2638. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_NFCT | ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_RXE_PTA ) );
  2639. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2640. {
  2641. break; /* No interrupt to process */
  2642. }
  2643. if( (irqs & ST25R3916_IRQ_MASK_NFCT) != 0U )
  2644. {
  2645. /* Retrieve detected bitrate */
  2646. uint8_t newBr;
  2647. st25r3916ReadRegister( ST25R3916_REG_NFCIP1_BIT_RATE, &newBr );
  2648. newBr >>= ST25R3916_REG_NFCIP1_BIT_RATE_nfc_rate_shift;
  2649. if (newBr > ST25R3916_REG_BIT_RATE_rxrate_424)
  2650. {
  2651. newBr = ST25R3916_REG_BIT_RATE_rxrate_424;
  2652. }
  2653. gRFAL.Lm.brDetected = (rfalBitRate)(newBr); /* PRQA S 4342 # MISRA 10.5 - Guaranteed that no invalid enum values may be created. See also equalityGuard_RFAL_BR_106 ff.*/
  2654. }
  2655. if( ((irqs & ST25R3916_IRQ_MASK_WU_F) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2656. {
  2657. rfalListenSetState( RFAL_LM_STATE_READY_F );
  2658. }
  2659. else if( ((irqs & ST25R3916_IRQ_MASK_RXE) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2660. {
  2661. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_ERR1 ) );
  2662. if( ((irqs & ST25R3916_IRQ_MASK_CRC) != 0U) || ((irqs & ST25R3916_IRQ_MASK_PAR) != 0U) || ((irqs & ST25R3916_IRQ_MASK_ERR1) != 0U))
  2663. {
  2664. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  2665. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2666. st25r3916TxOff();
  2667. break; /* A bad reception occurred, remain in same state */
  2668. }
  2669. /* Retrieve received data */
  2670. *gRFAL.Lm.rxLen = st25r3916GetNumFIFOBytes();
  2671. st25r3916ReadFifo( gRFAL.Lm.rxBuf, MIN( *gRFAL.Lm.rxLen, rfalConvBitsToBytes(gRFAL.Lm.rxBufLen) ) );
  2672. /*******************************************************************************/
  2673. /* REMARK: Silicon workaround ST25R3916 Errata #TBD */
  2674. /* In bitrate detection mode CRC is now checked for NFC-A frames */
  2675. if( (*gRFAL.Lm.rxLen > RFAL_CRC_LEN) && (gRFAL.Lm.brDetected == RFAL_BR_106) )
  2676. {
  2677. if( rfalCrcCalculateCcitt( RFAL_ISO14443A_CRC_INTVAL, gRFAL.Lm.rxBuf, *gRFAL.Lm.rxLen ) != 0U )
  2678. {
  2679. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  2680. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2681. st25r3916TxOff();
  2682. break; /* A bad reception occurred, remain in same state */
  2683. }
  2684. }
  2685. /*******************************************************************************/
  2686. /* Check if the data we got has at least the CRC and remove it, otherwise leave at 0 */
  2687. *gRFAL.Lm.rxLen -= ((*gRFAL.Lm.rxLen > RFAL_CRC_LEN) ? RFAL_CRC_LEN : *gRFAL.Lm.rxLen);
  2688. *gRFAL.Lm.rxLen = (uint16_t)rfalConvBytesToBits( *gRFAL.Lm.rxLen );
  2689. gRFAL.Lm.dataFlag = true;
  2690. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  2691. rfalCheckDisableObsMode();
  2692. }
  2693. else if( ((irqs & ST25R3916_IRQ_MASK_RXE_PTA) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2694. {
  2695. if( ((gRFAL.Lm.mdMask & RFAL_LM_MASK_NFCA) != 0U) && (gRFAL.Lm.brDetected == RFAL_BR_106) )
  2696. {
  2697. st25r3916ReadRegister( ST25R3916_REG_PASSIVE_TARGET_STATUS, &tmp );
  2698. if( tmp > ST25R3916_REG_PASSIVE_TARGET_STATUS_pta_st_idle )
  2699. {
  2700. rfalListenSetState( RFAL_LM_STATE_READY_A );
  2701. }
  2702. }
  2703. }
  2704. else if( ((irqs & ST25R3916_IRQ_MASK_EOF) != 0U) && (!gRFAL.Lm.dataFlag) )
  2705. {
  2706. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2707. }
  2708. else
  2709. {
  2710. /* MISRA 15.7 - Empty else */
  2711. }
  2712. break;
  2713. /*******************************************************************************/
  2714. case RFAL_LM_STATE_READY_F:
  2715. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_EOF) );
  2716. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2717. {
  2718. break; /* No interrupt to process */
  2719. }
  2720. if( (irqs & ST25R3916_IRQ_MASK_WU_F) != 0U )
  2721. {
  2722. break;
  2723. }
  2724. else if( (irqs & ST25R3916_IRQ_MASK_RXE) != 0U )
  2725. {
  2726. /* Retrieve the error flags/irqs */
  2727. irqs |= st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_ERR1) );
  2728. if( ((irqs & ST25R3916_IRQ_MASK_CRC) != 0U) || ((irqs & ST25R3916_IRQ_MASK_ERR1) != 0U) )
  2729. {
  2730. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  2731. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2732. break; /* A bad reception occurred, remain in same state */
  2733. }
  2734. /* Retrieve received data */
  2735. *gRFAL.Lm.rxLen = st25r3916GetNumFIFOBytes();
  2736. st25r3916ReadFifo( gRFAL.Lm.rxBuf, MIN( *gRFAL.Lm.rxLen, rfalConvBitsToBytes(gRFAL.Lm.rxBufLen) ) );
  2737. /* Check if the data we got has at least the CRC and remove it, otherwise leave at 0 */
  2738. *gRFAL.Lm.rxLen -= ((*gRFAL.Lm.rxLen > RFAL_CRC_LEN) ? RFAL_CRC_LEN : *gRFAL.Lm.rxLen);
  2739. *gRFAL.Lm.rxLen = (uint16_t)rfalConvBytesToBits( *gRFAL.Lm.rxLen );
  2740. gRFAL.Lm.dataFlag = true;
  2741. }
  2742. else if( (irqs & ST25R3916_IRQ_MASK_EOF) != 0U )
  2743. {
  2744. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2745. }
  2746. else
  2747. {
  2748. /* MISRA 15.7 - Empty else */
  2749. }
  2750. break;
  2751. /*******************************************************************************/
  2752. case RFAL_LM_STATE_READY_A:
  2753. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_WU_A ) );
  2754. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2755. {
  2756. break; /* No interrupt to process */
  2757. }
  2758. if( (irqs & ST25R3916_IRQ_MASK_WU_A) != 0U )
  2759. {
  2760. rfalListenSetState( RFAL_LM_STATE_ACTIVE_A );
  2761. }
  2762. else if( (irqs & ST25R3916_IRQ_MASK_EOF) != 0U )
  2763. {
  2764. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2765. }
  2766. else
  2767. {
  2768. /* MISRA 15.7 - Empty else */
  2769. }
  2770. break;
  2771. /*******************************************************************************/
  2772. case RFAL_LM_STATE_ACTIVE_A:
  2773. case RFAL_LM_STATE_ACTIVE_Ax:
  2774. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_EOF) );
  2775. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2776. {
  2777. break; /* No interrupt to process */
  2778. }
  2779. if( (irqs & ST25R3916_IRQ_MASK_RXE) != 0U )
  2780. {
  2781. /* Retrieve the error flags/irqs */
  2782. irqs |= st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_ERR1) );
  2783. *gRFAL.Lm.rxLen = st25r3916GetNumFIFOBytes();
  2784. if( ((irqs & ST25R3916_IRQ_MASK_CRC) != 0U) || ((irqs & ST25R3916_IRQ_MASK_ERR1) != 0U) ||
  2785. ((irqs & ST25R3916_IRQ_MASK_PAR) != 0U) || (*gRFAL.Lm.rxLen <= RFAL_CRC_LEN) )
  2786. {
  2787. /* Clear rx context and FIFO */
  2788. *gRFAL.Lm.rxLen = 0;
  2789. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  2790. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2791. /* Check if we should go to IDLE or Sleep */
  2792. if( gRFAL.Lm.state == RFAL_LM_STATE_ACTIVE_Ax )
  2793. {
  2794. rfalListenSleepStart( RFAL_LM_STATE_SLEEP_A, gRFAL.Lm.rxBuf, gRFAL.Lm.rxBufLen, gRFAL.Lm.rxLen );
  2795. }
  2796. else
  2797. {
  2798. rfalListenSetState( RFAL_LM_STATE_IDLE );
  2799. }
  2800. st25r3916DisableInterrupts( ST25R3916_IRQ_MASK_RXE );
  2801. break;
  2802. }
  2803. /* Remove CRC from length */
  2804. *gRFAL.Lm.rxLen -= RFAL_CRC_LEN;
  2805. /* Retrieve received data */
  2806. st25r3916ReadFifo( gRFAL.Lm.rxBuf, MIN( *gRFAL.Lm.rxLen, rfalConvBitsToBytes(gRFAL.Lm.rxBufLen) ) );
  2807. *gRFAL.Lm.rxLen = (uint16_t)rfalConvBytesToBits( *gRFAL.Lm.rxLen );
  2808. gRFAL.Lm.dataFlag = true;
  2809. }
  2810. else if( (irqs & ST25R3916_IRQ_MASK_EOF) != 0U )
  2811. {
  2812. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2813. }
  2814. else
  2815. {
  2816. /* MISRA 15.7 - Empty else */
  2817. }
  2818. break;
  2819. /*******************************************************************************/
  2820. case RFAL_LM_STATE_SLEEP_A:
  2821. case RFAL_LM_STATE_SLEEP_B:
  2822. case RFAL_LM_STATE_SLEEP_AF:
  2823. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_NFCT | ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_RXE | ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_RXE_PTA ) );
  2824. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2825. {
  2826. break; /* No interrupt to process */
  2827. }
  2828. if( (irqs & ST25R3916_IRQ_MASK_NFCT) != 0U )
  2829. {
  2830. uint8_t newBr;
  2831. /* Retrieve detected bitrate */
  2832. st25r3916ReadRegister( ST25R3916_REG_NFCIP1_BIT_RATE, &newBr );
  2833. newBr >>= ST25R3916_REG_NFCIP1_BIT_RATE_nfc_rate_shift;
  2834. if (newBr > ST25R3916_REG_BIT_RATE_rxrate_424)
  2835. {
  2836. newBr = ST25R3916_REG_BIT_RATE_rxrate_424;
  2837. }
  2838. gRFAL.Lm.brDetected = (rfalBitRate)(newBr); /* PRQA S 4342 # MISRA 10.5 - Guaranteed that no invalid enum values may be created. See also equalityGuard_RFAL_BR_106 ff.*/
  2839. }
  2840. if( ((irqs & ST25R3916_IRQ_MASK_WU_F) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2841. {
  2842. rfalListenSetState( RFAL_LM_STATE_READY_F );
  2843. }
  2844. else if( ((irqs & ST25R3916_IRQ_MASK_RXE) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2845. {
  2846. /* Clear rx context and FIFO */
  2847. *gRFAL.Lm.rxLen = 0;
  2848. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  2849. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2850. /* REMARK: In order to support CUP or proprietary frames, handling could be added here */
  2851. }
  2852. else if( ((irqs & ST25R3916_IRQ_MASK_RXE_PTA) != 0U) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
  2853. {
  2854. if( ((gRFAL.Lm.mdMask & RFAL_LM_MASK_NFCA) != 0U) && (gRFAL.Lm.brDetected == RFAL_BR_106) )
  2855. {
  2856. st25r3916ReadRegister( ST25R3916_REG_PASSIVE_TARGET_STATUS, &tmp );
  2857. if( tmp > ST25R3916_REG_PASSIVE_TARGET_STATUS_pta_st_halt )
  2858. {
  2859. rfalListenSetState( RFAL_LM_STATE_READY_Ax );
  2860. }
  2861. }
  2862. }
  2863. else if( (irqs & ST25R3916_IRQ_MASK_EOF) != 0U )
  2864. {
  2865. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2866. }
  2867. else
  2868. {
  2869. /* MISRA 15.7 - Empty else */
  2870. }
  2871. break;
  2872. /*******************************************************************************/
  2873. case RFAL_LM_STATE_READY_Ax:
  2874. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_EOF | ST25R3916_IRQ_MASK_WU_A_X ) );
  2875. if( irqs == ST25R3916_IRQ_MASK_NONE )
  2876. {
  2877. break; /* No interrupt to process */
  2878. }
  2879. if( (irqs & ST25R3916_IRQ_MASK_WU_A_X) != 0U )
  2880. {
  2881. rfalListenSetState( RFAL_LM_STATE_ACTIVE_Ax );
  2882. }
  2883. else if( (irqs & ST25R3916_IRQ_MASK_EOF) != 0U )
  2884. {
  2885. rfalListenSetState( RFAL_LM_STATE_POWER_OFF );
  2886. }
  2887. else
  2888. {
  2889. /* MISRA 15.7 - Empty else */
  2890. }
  2891. break;
  2892. /*******************************************************************************/
  2893. case RFAL_LM_STATE_CARDEMU_4A:
  2894. case RFAL_LM_STATE_CARDEMU_4B:
  2895. case RFAL_LM_STATE_CARDEMU_3:
  2896. case RFAL_LM_STATE_TARGET_F:
  2897. case RFAL_LM_STATE_TARGET_A:
  2898. break;
  2899. /*******************************************************************************/
  2900. default:
  2901. return ERR_WRONG_STATE;
  2902. }
  2903. return ERR_NONE;
  2904. }
  2905. /*******************************************************************************/
  2906. ReturnCode rfalListenStop( void )
  2907. {
  2908. /* Check if RFAL is initialized */
  2909. if( gRFAL.state < RFAL_STATE_INIT )
  2910. {
  2911. return ERR_WRONG_STATE;
  2912. }
  2913. gRFAL.Lm.state = RFAL_LM_STATE_NOT_INIT;
  2914. /*Check if Observation Mode was enabled and disable it on ST25R391x */
  2915. rfalCheckDisableObsMode();
  2916. /* Re-Enable the Oscillator if not running */
  2917. st25r3916OscOn();
  2918. /* Disable Receiver and Transmitter */
  2919. rfalFieldOff();
  2920. /* Disable all automatic responses */
  2921. st25r3916SetRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r | ST25R3916_REG_PASSIVE_TARGET_rfu | ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a | ST25R3916_REG_PASSIVE_TARGET_d_ac_ap2p) );
  2922. /* As there's no Off mode, set default value: ISO14443A with automatic RF Collision Avoidance Off */
  2923. st25r3916WriteRegister( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_om_iso14443a | ST25R3916_REG_MODE_tr_am_ook | ST25R3916_REG_MODE_nfc_ar_off) );
  2924. st25r3916DisableInterrupts( (ST25R3916_IRQ_MASK_RXE_PTA | ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_WU_A | ST25R3916_IRQ_MASK_WU_A_X | ST25R3916_IRQ_MASK_RFU2 | ST25R3916_IRQ_MASK_OSC ) );
  2925. st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_RXE_PTA | ST25R3916_IRQ_MASK_WU_F | ST25R3916_IRQ_MASK_WU_A | ST25R3916_IRQ_MASK_WU_A_X | ST25R3916_IRQ_MASK_RFU2 ) );
  2926. /* Set Analog configurations for Listen Off event */
  2927. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LISTEN_OFF) );
  2928. return ERR_NONE;
  2929. }
  2930. /*******************************************************************************/
  2931. ReturnCode rfalListenSleepStart( rfalLmState sleepSt, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rxLen )
  2932. {
  2933. /* Check if RFAL is not initialized */
  2934. if( gRFAL.state < RFAL_STATE_INIT )
  2935. {
  2936. return ERR_WRONG_STATE;
  2937. }
  2938. switch(sleepSt)
  2939. {
  2940. /*******************************************************************************/
  2941. case RFAL_LM_STATE_SLEEP_A:
  2942. /* Enable automatic responses for A */
  2943. st25r3916ClrRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a) );
  2944. /* Reset NFCA target */
  2945. st25r3916ExecuteCommand( ST25R3916_CMD_GOTO_SLEEP );
  2946. /* Set Target mode, Bit Rate detection and Listen Mode for NFC-A */
  2947. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE ,
  2948. (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_mask | ST25R3916_REG_MODE_nfc_ar_mask) ,
  2949. (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om0 | ST25R3916_REG_MODE_nfc_ar_off) );
  2950. break;
  2951. /*******************************************************************************/
  2952. case RFAL_LM_STATE_SLEEP_AF:
  2953. /* Enable automatic responses for A + F */
  2954. st25r3916ClrRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r | ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a) );
  2955. /* Reset NFCA target state */
  2956. st25r3916ExecuteCommand( ST25R3916_CMD_GOTO_SLEEP );
  2957. /* Set Target mode, Bit Rate detection, Listen Mode for NFC-A and NFC-F */
  2958. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE ,
  2959. (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_mask | ST25R3916_REG_MODE_nfc_ar_mask) ,
  2960. (ST25R3916_REG_MODE_targ_targ | ST25R3916_REG_MODE_om3 | ST25R3916_REG_MODE_om2 | ST25R3916_REG_MODE_om0 | ST25R3916_REG_MODE_nfc_ar_off) );
  2961. break;
  2962. /*******************************************************************************/
  2963. case RFAL_LM_STATE_SLEEP_B:
  2964. /* REMARK: Support for CE-B would be added here */
  2965. return ERR_NOT_IMPLEMENTED;
  2966. /*******************************************************************************/
  2967. default:
  2968. return ERR_PARAM;
  2969. }
  2970. /* Ensure that the NFCIP1 mode is disabled */
  2971. st25r3916ClrRegisterBits( ST25R3916_REG_ISO14443A_NFC, ST25R3916_REG_ISO14443A_NFC_nfc_f0 );
  2972. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  2973. /* Clear and enable required IRQs */
  2974. st25r3916ClearAndEnableInterrupts( (ST25R3916_IRQ_MASK_NFCT | ST25R3916_IRQ_MASK_RXS | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR1 |
  2975. ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_EON | ST25R3916_IRQ_MASK_EOF | gRFAL.Lm.mdIrqs ) );
  2976. /* Check whether the field was turn off right after the Sleep request */
  2977. if( !rfalIsExtFieldOn() )
  2978. {
  2979. /*rfalLogD( "RFAL: curState: %02X newState: %02X \r\n", gRFAL.Lm.state, RFAL_LM_STATE_NOT_INIT );*/
  2980. rfalListenStop();
  2981. return ERR_LINK_LOSS;
  2982. }
  2983. /*rfalLogD( "RFAL: curState: %02X newState: %02X \r\n", gRFAL.Lm.state, sleepSt );*/
  2984. /* Set the new Sleep State*/
  2985. gRFAL.Lm.state = sleepSt;
  2986. gRFAL.state = RFAL_STATE_LM;
  2987. gRFAL.Lm.rxBuf = rxBuf;
  2988. gRFAL.Lm.rxBufLen = rxBufLen;
  2989. gRFAL.Lm.rxLen = rxLen;
  2990. *gRFAL.Lm.rxLen = 0;
  2991. gRFAL.Lm.dataFlag = false;
  2992. return ERR_NONE;
  2993. }
  2994. /*******************************************************************************/
  2995. rfalLmState rfalListenGetState( bool *dataFlag, rfalBitRate *lastBR )
  2996. {
  2997. /* Allow state retrieval even if gRFAL.state != RFAL_STATE_LM so *
  2998. * that this Lm state can be used by caller after activation */
  2999. if( lastBR != NULL )
  3000. {
  3001. *lastBR = gRFAL.Lm.brDetected;
  3002. }
  3003. if( dataFlag != NULL )
  3004. {
  3005. *dataFlag = gRFAL.Lm.dataFlag;
  3006. }
  3007. return gRFAL.Lm.state;
  3008. }
  3009. /*******************************************************************************/
  3010. ReturnCode rfalListenSetState( rfalLmState newSt )
  3011. {
  3012. ReturnCode ret;
  3013. rfalLmState newState;
  3014. bool reSetState;
  3015. /* Check if RFAL is initialized */
  3016. if( gRFAL.state < RFAL_STATE_INIT )
  3017. {
  3018. return ERR_WRONG_STATE;
  3019. }
  3020. /* SetState clears the Data flag */
  3021. gRFAL.Lm.dataFlag = false;
  3022. newState = newSt;
  3023. ret = ERR_NONE;
  3024. do{
  3025. reSetState = false;
  3026. /*******************************************************************************/
  3027. switch( newState )
  3028. {
  3029. /*******************************************************************************/
  3030. case RFAL_LM_STATE_POWER_OFF:
  3031. /* Enable the receiver and reset logic */
  3032. st25r3916SetRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_rx_en );
  3033. st25r3916ExecuteCommand( ST25R3916_CMD_STOP );
  3034. if( (gRFAL.Lm.mdMask & RFAL_LM_MASK_NFCA) != 0U )
  3035. {
  3036. /* Enable automatic responses for A */
  3037. st25r3916ClrRegisterBits( ST25R3916_REG_PASSIVE_TARGET, ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a );
  3038. /* Prepares the NFCIP-1 Passive target logic to wait in the Sense/Idle state */
  3039. st25r3916ExecuteCommand( ST25R3916_CMD_GOTO_SENSE );
  3040. }
  3041. if( (gRFAL.Lm.mdMask & RFAL_LM_MASK_NFCF) != 0U )
  3042. {
  3043. /* Enable automatic responses for F */
  3044. st25r3916ClrRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r) );
  3045. }
  3046. if( (gRFAL.Lm.mdMask & RFAL_LM_MASK_ACTIVE_P2P) != 0U )
  3047. {
  3048. /* Ensure automatic response RF Collision Avoidance is back to only after Rx */
  3049. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE, ST25R3916_REG_MODE_nfc_ar_mask, ST25R3916_REG_MODE_nfc_ar_auto_rx );
  3050. /* Ensure that our field is Off, as automatic response RF Collision Avoidance may have been triggered */
  3051. st25r3916TxOff();
  3052. }
  3053. /*******************************************************************************/
  3054. /* Ensure that the NFCIP1 mode is disabled */
  3055. st25r3916ClrRegisterBits( ST25R3916_REG_ISO14443A_NFC, ST25R3916_REG_ISO14443A_NFC_nfc_f0 );
  3056. /*******************************************************************************/
  3057. /* Clear and enable required IRQs */
  3058. st25r3916DisableInterrupts( ST25R3916_IRQ_MASK_ALL );
  3059. st25r3916ClearAndEnableInterrupts( (ST25R3916_IRQ_MASK_NFCT | ST25R3916_IRQ_MASK_RXS | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR1 | ST25R3916_IRQ_MASK_OSC |
  3060. ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_EON | ST25R3916_IRQ_MASK_EOF | gRFAL.Lm.mdIrqs ) );
  3061. /*******************************************************************************/
  3062. /* Clear the bitRate previously detected */
  3063. gRFAL.Lm.brDetected = RFAL_BR_KEEP;
  3064. /*******************************************************************************/
  3065. /* Apply the initial mode */
  3066. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_mask | ST25R3916_REG_MODE_nfc_ar_mask), (uint8_t)gRFAL.Lm.mdReg );
  3067. /*******************************************************************************/
  3068. /* Check if external Field is already On */
  3069. if( rfalIsExtFieldOn() )
  3070. {
  3071. reSetState = true;
  3072. newState = RFAL_LM_STATE_IDLE; /* Set IDLE state */
  3073. }
  3074. #if 1 /* Perform bit rate detection in Low power mode */
  3075. else
  3076. {
  3077. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, (ST25R3916_REG_OP_CONTROL_tx_en | ST25R3916_REG_OP_CONTROL_rx_en | ST25R3916_REG_OP_CONTROL_en) );
  3078. }
  3079. #endif
  3080. break;
  3081. /*******************************************************************************/
  3082. case RFAL_LM_STATE_IDLE:
  3083. /*******************************************************************************/
  3084. /* Check if device is coming from Low Power bit rate detection */
  3085. if( !st25r3916CheckReg( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_en, ST25R3916_REG_OP_CONTROL_en ) )
  3086. {
  3087. /* Exit Low Power mode and confirm the temporarily enable */
  3088. st25r3916SetRegisterBits( ST25R3916_REG_OP_CONTROL, (ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_rx_en) );
  3089. if( !st25r3916CheckReg( ST25R3916_REG_AUX_DISPLAY, ST25R3916_REG_AUX_DISPLAY_osc_ok, ST25R3916_REG_AUX_DISPLAY_osc_ok ) )
  3090. {
  3091. /* Wait for Oscilator ready */
  3092. if( st25r3916WaitForInterruptsTimed( ST25R3916_IRQ_MASK_OSC, ST25R3916_TOUT_OSC_STABLE ) == 0U )
  3093. {
  3094. ret = ERR_IO;
  3095. break;
  3096. }
  3097. }
  3098. }
  3099. else
  3100. {
  3101. st25r3916GetInterrupt(ST25R3916_IRQ_MASK_OSC);
  3102. }
  3103. /*******************************************************************************/
  3104. /* In Active P2P the Initiator may: Turn its field On; LM goes into IDLE state;
  3105. * Initiator sends an unexpected frame raising a Protocol error; Initiator
  3106. * turns its field Off and ST25R3916 performs the automatic RF Collision
  3107. * Avoidance keeping our field On; upon a Protocol error upper layer sets
  3108. * again the state to IDLE to clear dataFlag and wait for next data.
  3109. *
  3110. * Ensure that when upper layer calls SetState(IDLE), it restores initial
  3111. * configuration and that check whether an external Field is still present */
  3112. if( (gRFAL.Lm.mdMask & RFAL_LM_MASK_ACTIVE_P2P) != 0U )
  3113. {
  3114. /* Ensure nfc_ar is reseted and back to only after Rx */
  3115. st25r3916ExecuteCommand( ST25R3916_CMD_STOP );
  3116. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE, ST25R3916_REG_MODE_nfc_ar_mask, ST25R3916_REG_MODE_nfc_ar_auto_rx );
  3117. /* Ensure that our field is Off, as automatic response RF Collision Avoidance may have been triggered */
  3118. st25r3916TxOff();
  3119. /* If external Field is no longer detected go back to POWER_OFF */
  3120. if( !st25r3916IsExtFieldOn() )
  3121. {
  3122. reSetState = true;
  3123. newState = RFAL_LM_STATE_POWER_OFF; /* Set POWER_OFF state */
  3124. }
  3125. }
  3126. /*******************************************************************************/
  3127. /* If we are in ACTIVE_A, reEnable Listen for A before going to IDLE, otherwise do nothing */
  3128. if( gRFAL.Lm.state == RFAL_LM_STATE_ACTIVE_A )
  3129. {
  3130. /* Enable automatic responses for A and Reset NFCA target state */
  3131. st25r3916ClrRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a) );
  3132. st25r3916ExecuteCommand( ST25R3916_CMD_GOTO_SENSE );
  3133. }
  3134. /* ReEnable the receiver */
  3135. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  3136. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  3137. /*******************************************************************************/
  3138. /*Check if Observation Mode is enabled and set it on ST25R391x */
  3139. rfalCheckEnableObsModeRx();
  3140. break;
  3141. /*******************************************************************************/
  3142. case RFAL_LM_STATE_READY_F:
  3143. /*******************************************************************************/
  3144. /* If we're coming from BitRate detection mode, the Bit Rate Definition reg
  3145. * still has the last bit rate used.
  3146. * If a frame is received between setting the mode to Listen NFCA and
  3147. * setting Bit Rate Definition reg, it will raise a framing error.
  3148. * Set the bitrate immediately, and then the normal SetMode procedure */
  3149. st25r3916SetBitrate( (uint8_t)gRFAL.Lm.brDetected, (uint8_t)gRFAL.Lm.brDetected );
  3150. /*******************************************************************************/
  3151. /* Disable automatic responses for NFC-A */
  3152. st25r3916SetRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a) );
  3153. /* Set Mode NFC-F only */
  3154. ret = rfalSetMode( RFAL_MODE_LISTEN_NFCF, gRFAL.Lm.brDetected, gRFAL.Lm.brDetected );
  3155. gRFAL.state = RFAL_STATE_LM; /* Keep in Listen Mode */
  3156. /* ReEnable the receiver */
  3157. st25r3916ExecuteCommand( ST25R3916_CMD_CLEAR_FIFO );
  3158. st25r3916ExecuteCommand( ST25R3916_CMD_UNMASK_RECEIVE_DATA );
  3159. /* Clear any previous transmission errors (if Reader polled for other/unsupported technologies) */
  3160. st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_ERR1) );
  3161. st25r3916EnableInterrupts( ST25R3916_IRQ_MASK_RXE ); /* Start looking for any incoming data */
  3162. break;
  3163. /*******************************************************************************/
  3164. case RFAL_LM_STATE_CARDEMU_3:
  3165. /* Set Listen NFCF mode */
  3166. ret = rfalSetMode( RFAL_MODE_LISTEN_NFCF, gRFAL.Lm.brDetected, gRFAL.Lm.brDetected );
  3167. break;
  3168. /*******************************************************************************/
  3169. case RFAL_LM_STATE_READY_Ax:
  3170. case RFAL_LM_STATE_READY_A:
  3171. /*******************************************************************************/
  3172. /* If we're coming from BitRate detection mode, the Bit Rate Definition reg
  3173. * still has the last bit rate used.
  3174. * If a frame is received between setting the mode to Listen NFCA and
  3175. * setting Bit Rate Definition reg, it will raise a framing error.
  3176. * Set the bitrate immediately, and then the normal SetMode procedure */
  3177. st25r3916SetBitrate( (uint8_t)gRFAL.Lm.brDetected, (uint8_t)gRFAL.Lm.brDetected );
  3178. /*******************************************************************************/
  3179. /* Disable automatic responses for NFC-F */
  3180. st25r3916SetRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r) );
  3181. /* Set Mode NFC-A only */
  3182. ret = rfalSetMode( RFAL_MODE_LISTEN_NFCA, gRFAL.Lm.brDetected, gRFAL.Lm.brDetected );
  3183. gRFAL.state = RFAL_STATE_LM; /* Keep in Listen Mode */
  3184. break;
  3185. /*******************************************************************************/
  3186. case RFAL_LM_STATE_ACTIVE_Ax:
  3187. case RFAL_LM_STATE_ACTIVE_A:
  3188. /* Disable automatic responses for A */
  3189. st25r3916SetRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_106_ac_a) );
  3190. /* Clear any previous transmission errors (if Reader polled for other/unsupported technologies) */
  3191. st25r3916GetInterrupt( (ST25R3916_IRQ_MASK_PAR | ST25R3916_IRQ_MASK_CRC | ST25R3916_IRQ_MASK_ERR2 | ST25R3916_IRQ_MASK_ERR1) );
  3192. st25r3916EnableInterrupts( ST25R3916_IRQ_MASK_RXE ); /* Start looking for any incoming data */
  3193. break;
  3194. case RFAL_LM_STATE_TARGET_F:
  3195. /* Disable Automatic response SENSF_REQ */
  3196. st25r3916SetRegisterBits( ST25R3916_REG_PASSIVE_TARGET, (ST25R3916_REG_PASSIVE_TARGET_d_212_424_1r) );
  3197. break;
  3198. /*******************************************************************************/
  3199. case RFAL_LM_STATE_SLEEP_A:
  3200. case RFAL_LM_STATE_SLEEP_B:
  3201. case RFAL_LM_STATE_SLEEP_AF:
  3202. /* These sleep states have to be set by the rfalListenSleepStart() method */
  3203. return ERR_REQUEST;
  3204. /*******************************************************************************/
  3205. case RFAL_LM_STATE_CARDEMU_4A:
  3206. case RFAL_LM_STATE_CARDEMU_4B:
  3207. case RFAL_LM_STATE_TARGET_A:
  3208. /* States not handled by the LM, just keep state context */
  3209. break;
  3210. /*******************************************************************************/
  3211. default:
  3212. return ERR_WRONG_STATE;
  3213. }
  3214. }
  3215. while( reSetState );
  3216. gRFAL.Lm.state = newState;
  3217. return ret;
  3218. }
  3219. #endif /* RFAL_FEATURE_LISTEN_MODE */
  3220. /*******************************************************************************
  3221. * Wake-Up Mode *
  3222. *******************************************************************************/
  3223. #if RFAL_FEATURE_WAKEUP_MODE
  3224. /*******************************************************************************/
  3225. ReturnCode rfalWakeUpModeStart( const rfalWakeUpConfig *config )
  3226. {
  3227. uint8_t aux;
  3228. uint8_t reg;
  3229. uint32_t irqs;
  3230. /* Check if RFAL is not initialized */
  3231. if( gRFAL.state < RFAL_STATE_INIT )
  3232. {
  3233. return ERR_WRONG_STATE;
  3234. }
  3235. /* The Wake-Up procedure is explained in detail in Application Note: AN4985 */
  3236. if( config == NULL )
  3237. {
  3238. gRFAL.wum.cfg.period = RFAL_WUM_PERIOD_200MS;
  3239. gRFAL.wum.cfg.irqTout = false;
  3240. gRFAL.wum.cfg.indAmp.enabled = true;
  3241. gRFAL.wum.cfg.indPha.enabled = false;
  3242. gRFAL.wum.cfg.cap.enabled = false;
  3243. gRFAL.wum.cfg.indAmp.delta = 2U;
  3244. gRFAL.wum.cfg.indAmp.reference = RFAL_WUM_REFERENCE_AUTO;
  3245. gRFAL.wum.cfg.indAmp.autoAvg = false;
  3246. /*******************************************************************************/
  3247. /* Check if AAT is enabled and if so make use of the SW Tag Detection */
  3248. if( st25r3916CheckReg( ST25R3916_REG_IO_CONF2, ST25R3916_REG_IO_CONF2_aat_en, ST25R3916_REG_IO_CONF2_aat_en ) )
  3249. {
  3250. gRFAL.wum.cfg.swTagDetect = true;
  3251. gRFAL.wum.cfg.indAmp.autoAvg = true;
  3252. gRFAL.wum.cfg.indAmp.aaWeight = RFAL_WUM_AA_WEIGHT_16;
  3253. }
  3254. }
  3255. else
  3256. {
  3257. gRFAL.wum.cfg = *config;
  3258. }
  3259. /* Check for valid configuration */
  3260. if( (!gRFAL.wum.cfg.cap.enabled && !gRFAL.wum.cfg.indAmp.enabled && !gRFAL.wum.cfg.indPha.enabled) ||
  3261. (gRFAL.wum.cfg.cap.enabled && (gRFAL.wum.cfg.indAmp.enabled || gRFAL.wum.cfg.indPha.enabled)) ||
  3262. (gRFAL.wum.cfg.cap.enabled && gRFAL.wum.cfg.swTagDetect) ||
  3263. ( (gRFAL.wum.cfg.indAmp.reference > RFAL_WUM_REFERENCE_AUTO) ||
  3264. (gRFAL.wum.cfg.indPha.reference > RFAL_WUM_REFERENCE_AUTO) ||
  3265. (gRFAL.wum.cfg.cap.reference > RFAL_WUM_REFERENCE_AUTO) ) )
  3266. {
  3267. return ERR_PARAM;
  3268. }
  3269. irqs = ST25R3916_IRQ_MASK_NONE;
  3270. /* Disable Tx, Rx, External Field Detector and set default ISO14443A mode */
  3271. st25r3916TxRxOff();
  3272. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_en_fd_mask );
  3273. st25r3916ChangeRegisterBits( ST25R3916_REG_MODE, (ST25R3916_REG_MODE_targ | ST25R3916_REG_MODE_om_mask), (ST25R3916_REG_MODE_targ_init | ST25R3916_REG_MODE_om_iso14443a) );
  3274. /* Set Analog configurations for Wake-up On event */
  3275. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_WAKEUP_ON) );
  3276. /*******************************************************************************/
  3277. /* Prepare Wake-Up Timer Control Register */
  3278. reg = (uint8_t)(((uint8_t)gRFAL.wum.cfg.period & 0x0FU) << ST25R3916_REG_WUP_TIMER_CONTROL_wut_shift);
  3279. reg |= (uint8_t)(((uint8_t)gRFAL.wum.cfg.period < (uint8_t)RFAL_WUM_PERIOD_100MS) ? ST25R3916_REG_WUP_TIMER_CONTROL_wur : 0x00U);
  3280. if( gRFAL.wum.cfg.irqTout || gRFAL.wum.cfg.swTagDetect )
  3281. {
  3282. reg |= ST25R3916_REG_WUP_TIMER_CONTROL_wto;
  3283. irqs |= ST25R3916_IRQ_MASK_WT;
  3284. }
  3285. /* Check if HW Wake-up is to be used or SW Tag detection */
  3286. if( gRFAL.wum.cfg.swTagDetect )
  3287. {
  3288. gRFAL.wum.cfg.indAmp.reference = 0U;
  3289. gRFAL.wum.cfg.indPha.reference = 0U;
  3290. gRFAL.wum.cfg.cap.reference = 0U;
  3291. }
  3292. else
  3293. {
  3294. /*******************************************************************************/
  3295. /* Check if Inductive Amplitude is to be performed */
  3296. if( gRFAL.wum.cfg.indAmp.enabled )
  3297. {
  3298. aux = (uint8_t)((gRFAL.wum.cfg.indAmp.delta) << ST25R3916_REG_AMPLITUDE_MEASURE_CONF_am_d_shift);
  3299. aux |= (uint8_t)(gRFAL.wum.cfg.indAmp.aaInclMeas ? ST25R3916_REG_AMPLITUDE_MEASURE_CONF_am_aam : 0x00U);
  3300. aux |= (uint8_t)(((uint8_t)gRFAL.wum.cfg.indAmp.aaWeight << ST25R3916_REG_AMPLITUDE_MEASURE_CONF_am_aew_shift) & ST25R3916_REG_AMPLITUDE_MEASURE_CONF_am_aew_mask);
  3301. aux |= (uint8_t)(gRFAL.wum.cfg.indAmp.autoAvg ? ST25R3916_REG_AMPLITUDE_MEASURE_CONF_am_ae : 0x00U);
  3302. st25r3916WriteRegister( ST25R3916_REG_AMPLITUDE_MEASURE_CONF, aux );
  3303. /* Only need to set the reference if not using Auto Average */
  3304. if( !gRFAL.wum.cfg.indAmp.autoAvg )
  3305. {
  3306. if( gRFAL.wum.cfg.indAmp.reference == RFAL_WUM_REFERENCE_AUTO )
  3307. {
  3308. st25r3916MeasureAmplitude( &aux );
  3309. gRFAL.wum.cfg.indAmp.reference = aux;
  3310. }
  3311. st25r3916WriteRegister( ST25R3916_REG_AMPLITUDE_MEASURE_REF, (uint8_t)gRFAL.wum.cfg.indAmp.reference );
  3312. }
  3313. reg |= ST25R3916_REG_WUP_TIMER_CONTROL_wam;
  3314. irqs |= ST25R3916_IRQ_MASK_WAM;
  3315. }
  3316. /*******************************************************************************/
  3317. /* Check if Inductive Phase is to be performed */
  3318. if( gRFAL.wum.cfg.indPha.enabled )
  3319. {
  3320. aux = (uint8_t)((gRFAL.wum.cfg.indPha.delta) << ST25R3916_REG_PHASE_MEASURE_CONF_pm_d_shift);
  3321. aux |= (uint8_t)(gRFAL.wum.cfg.indPha.aaInclMeas ? ST25R3916_REG_PHASE_MEASURE_CONF_pm_aam : 0x00U);
  3322. aux |= (uint8_t)(((uint8_t)gRFAL.wum.cfg.indPha.aaWeight << ST25R3916_REG_PHASE_MEASURE_CONF_pm_aew_shift) & ST25R3916_REG_PHASE_MEASURE_CONF_pm_aew_mask);
  3323. aux |= (uint8_t)(gRFAL.wum.cfg.indPha.autoAvg ? ST25R3916_REG_PHASE_MEASURE_CONF_pm_ae : 0x00U);
  3324. st25r3916WriteRegister( ST25R3916_REG_PHASE_MEASURE_CONF, aux );
  3325. /* Only need to set the reference if not using Auto Average */
  3326. if( !gRFAL.wum.cfg.indPha.autoAvg )
  3327. {
  3328. if( gRFAL.wum.cfg.indPha.reference == RFAL_WUM_REFERENCE_AUTO )
  3329. {
  3330. st25r3916MeasurePhase( &aux );
  3331. gRFAL.wum.cfg.indPha.reference = aux;
  3332. }
  3333. st25r3916WriteRegister( ST25R3916_REG_PHASE_MEASURE_REF, (uint8_t)gRFAL.wum.cfg.indPha.reference );
  3334. }
  3335. reg |= ST25R3916_REG_WUP_TIMER_CONTROL_wph;
  3336. irqs |= ST25R3916_IRQ_MASK_WPH;
  3337. }
  3338. /*******************************************************************************/
  3339. /* Check if Capacitive is to be performed */
  3340. if( gRFAL.wum.cfg.cap.enabled )
  3341. {
  3342. /*******************************************************************************/
  3343. /* Perform Capacitive sensor calibration */
  3344. /* Disable Oscillator and Field */
  3345. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, (ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_tx_en) );
  3346. /* Sensor gain should be configured on Analog Config: RFAL_ANALOG_CONFIG_CHIP_WAKEUP_ON */
  3347. /* Perform calibration procedure */
  3348. st25r3916CalibrateCapacitiveSensor( NULL );
  3349. /*******************************************************************************/
  3350. aux = (uint8_t)((gRFAL.wum.cfg.cap.delta) << ST25R3916_REG_CAPACITANCE_MEASURE_CONF_cm_d_shift);
  3351. aux |= (uint8_t)(gRFAL.wum.cfg.cap.aaInclMeas ? ST25R3916_REG_CAPACITANCE_MEASURE_CONF_cm_aam : 0x00U);
  3352. aux |= (uint8_t)(((uint8_t)gRFAL.wum.cfg.cap.aaWeight << ST25R3916_REG_CAPACITANCE_MEASURE_CONF_cm_aew_shift) & ST25R3916_REG_CAPACITANCE_MEASURE_CONF_cm_aew_mask);
  3353. aux |= (uint8_t)(gRFAL.wum.cfg.cap.autoAvg ? ST25R3916_REG_CAPACITANCE_MEASURE_CONF_cm_ae : 0x00U);
  3354. st25r3916WriteRegister( ST25R3916_REG_CAPACITANCE_MEASURE_CONF, aux );
  3355. /* Only need to set the reference if not using Auto Average */
  3356. if( !gRFAL.wum.cfg.cap.autoAvg || gRFAL.wum.cfg.swTagDetect )
  3357. {
  3358. if( gRFAL.wum.cfg.indPha.reference == RFAL_WUM_REFERENCE_AUTO )
  3359. {
  3360. st25r3916MeasureCapacitance( &aux );
  3361. gRFAL.wum.cfg.cap.reference = aux;
  3362. }
  3363. st25r3916WriteRegister( ST25R3916_REG_CAPACITANCE_MEASURE_REF, (uint8_t)gRFAL.wum.cfg.cap.reference );
  3364. }
  3365. reg |= ST25R3916_REG_WUP_TIMER_CONTROL_wcap;
  3366. irqs |= ST25R3916_IRQ_MASK_WCAP;
  3367. }
  3368. }
  3369. /* Disable and clear all interrupts except Wake-Up IRQs */
  3370. st25r3916DisableInterrupts( ST25R3916_IRQ_MASK_ALL );
  3371. st25r3916GetInterrupt( irqs );
  3372. st25r3916EnableInterrupts( irqs );
  3373. /* Enable Low Power Wake-Up Mode (Disable: Oscilattor, Tx, Rx and External Field Detector) */
  3374. st25r3916WriteRegister( ST25R3916_REG_WUP_TIMER_CONTROL, reg );
  3375. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL ,
  3376. (ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_rx_en | ST25R3916_REG_OP_CONTROL_tx_en |
  3377. ST25R3916_REG_OP_CONTROL_en_fd_mask | ST25R3916_REG_OP_CONTROL_wu ) ,
  3378. ST25R3916_REG_OP_CONTROL_wu );
  3379. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED;
  3380. gRFAL.state = RFAL_STATE_WUM;
  3381. return ERR_NONE;
  3382. }
  3383. /*******************************************************************************/
  3384. bool rfalWakeUpModeHasWoke( void )
  3385. {
  3386. return (gRFAL.wum.state >= RFAL_WUM_STATE_ENABLED_WOKE);
  3387. }
  3388. /*******************************************************************************/
  3389. static uint16_t rfalWakeUpModeFilter( uint16_t curRef, uint16_t curVal, uint8_t weight )
  3390. {
  3391. uint16_t newRef;
  3392. /* Perform the averaging|filter as describded in ST25R3916 DS */
  3393. /* Avoid signed arithmetics by spliting in two cases */
  3394. if( curVal > curRef )
  3395. {
  3396. newRef = curRef + (( curVal - curRef ) / weight );
  3397. /* In order for the reference to converge to final value *
  3398. * increment once the diff is smaller that the weight */
  3399. if( (curVal != curRef) && (curRef == newRef) )
  3400. {
  3401. newRef &= 0xFF00U;
  3402. newRef += 0x0100U;
  3403. }
  3404. }
  3405. else
  3406. {
  3407. newRef = curRef - (( curRef - curVal ) / weight );
  3408. /* In order for the reference to converge to final value *
  3409. * decrement once the diff is smaller that the weight */
  3410. if( (curVal != curRef) && (curRef == newRef) )
  3411. {
  3412. newRef &= 0xFF00U;
  3413. }
  3414. }
  3415. return newRef;
  3416. }
  3417. /*******************************************************************************/
  3418. static void rfalRunWakeUpModeWorker( void )
  3419. {
  3420. uint32_t irqs;
  3421. uint8_t reg;
  3422. uint16_t value;
  3423. uint16_t delta;
  3424. if( gRFAL.state != RFAL_STATE_WUM )
  3425. {
  3426. return;
  3427. }
  3428. switch( gRFAL.wum.state )
  3429. {
  3430. case RFAL_WUM_STATE_ENABLED:
  3431. case RFAL_WUM_STATE_ENABLED_WOKE:
  3432. irqs = st25r3916GetInterrupt( ( ST25R3916_IRQ_MASK_WT | ST25R3916_IRQ_MASK_WAM | ST25R3916_IRQ_MASK_WPH | ST25R3916_IRQ_MASK_WCAP ) );
  3433. if( irqs == ST25R3916_IRQ_MASK_NONE )
  3434. {
  3435. break; /* No interrupt to process */
  3436. }
  3437. /*******************************************************************************/
  3438. /* Check and mark which measurement(s) cause interrupt */
  3439. if((irqs & ST25R3916_IRQ_MASK_WAM) != 0U)
  3440. {
  3441. st25r3916ReadRegister( ST25R3916_REG_AMPLITUDE_MEASURE_RESULT, &reg );
  3442. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
  3443. }
  3444. if((irqs & ST25R3916_IRQ_MASK_WPH) != 0U)
  3445. {
  3446. st25r3916ReadRegister( ST25R3916_REG_PHASE_MEASURE_RESULT, &reg );
  3447. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
  3448. }
  3449. if((irqs & ST25R3916_IRQ_MASK_WCAP) != 0U)
  3450. {
  3451. st25r3916ReadRegister( ST25R3916_REG_CAPACITANCE_MEASURE_RESULT, &reg );
  3452. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
  3453. }
  3454. if((irqs & ST25R3916_IRQ_MASK_WT) != 0U)
  3455. {
  3456. /*******************************************************************************/
  3457. if( gRFAL.wum.cfg.swTagDetect )
  3458. {
  3459. /* Enable Ready mode and wait the settle time */
  3460. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL, (ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_wu), ST25R3916_REG_OP_CONTROL_en );
  3461. platformDelay( RFAL_ST25R3916_AAT_SETTLE );
  3462. /*******************************************************************************/
  3463. if( gRFAL.wum.cfg.indAmp.enabled )
  3464. {
  3465. /* Perform amplitude measurement */
  3466. st25r3916MeasureAmplitude( &reg );
  3467. /* Convert inputs to TD format */
  3468. value = rfalConvTDFormat( reg );
  3469. delta = rfalConvTDFormat( gRFAL.wum.cfg.indAmp.delta );
  3470. /* Set first measurement as reference */
  3471. if( gRFAL.wum.cfg.indAmp.reference == 0U )
  3472. {
  3473. gRFAL.wum.cfg.indAmp.reference = value;
  3474. }
  3475. /* Check if device should be woken */
  3476. if( ( value >= (gRFAL.wum.cfg.indAmp.reference + delta) ) ||
  3477. ( value <= (gRFAL.wum.cfg.indAmp.reference - delta) ) )
  3478. {
  3479. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
  3480. break;
  3481. }
  3482. /* Update moving reference if enabled */
  3483. if( gRFAL.wum.cfg.indAmp.autoAvg )
  3484. {
  3485. gRFAL.wum.cfg.indAmp.reference = rfalWakeUpModeFilter( gRFAL.wum.cfg.indAmp.reference, value, (RFAL_WU_MIN_WEIGHT_VAL<<(uint8_t)gRFAL.wum.cfg.indAmp.aaWeight) );
  3486. }
  3487. }
  3488. /*******************************************************************************/
  3489. if( gRFAL.wum.cfg.indPha.enabled )
  3490. {
  3491. /* Perform Phase measurement */
  3492. st25r3916MeasurePhase( &reg );
  3493. /* Convert inputs to TD format */
  3494. value = rfalConvTDFormat( reg );
  3495. delta = rfalConvTDFormat( gRFAL.wum.cfg.indPha.delta );
  3496. /* Set first measurement as reference */
  3497. if( gRFAL.wum.cfg.indPha.reference == 0U )
  3498. {
  3499. gRFAL.wum.cfg.indPha.reference = value;
  3500. }
  3501. /* Check if device should be woken */
  3502. if( ( value >= (gRFAL.wum.cfg.indPha.reference + delta) ) ||
  3503. ( value <= (gRFAL.wum.cfg.indPha.reference - delta) ) )
  3504. {
  3505. gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
  3506. break;
  3507. }
  3508. /* Update moving reference if enabled */
  3509. if( gRFAL.wum.cfg.indPha.autoAvg )
  3510. {
  3511. gRFAL.wum.cfg.indPha.reference = rfalWakeUpModeFilter( gRFAL.wum.cfg.indPha.reference, value, (RFAL_WU_MIN_WEIGHT_VAL<<(uint8_t)gRFAL.wum.cfg.indPha.aaWeight) );
  3512. }
  3513. }
  3514. /* Re-Enable low power Wake-Up mode for wto to trigger another measurement(s) */
  3515. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL, (ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_wu), (ST25R3916_REG_OP_CONTROL_wu) );
  3516. }
  3517. }
  3518. break;
  3519. default:
  3520. /* MISRA 16.4: no empty default statement (a comment being enough) */
  3521. break;
  3522. }
  3523. }
  3524. /*******************************************************************************/
  3525. ReturnCode rfalWakeUpModeStop( void )
  3526. {
  3527. /* Check if RFAL is in Wake-up mode */
  3528. if( gRFAL.state != RFAL_STATE_WUM )
  3529. {
  3530. return ERR_WRONG_STATE;
  3531. }
  3532. gRFAL.wum.state = RFAL_WUM_STATE_NOT_INIT;
  3533. /* Disable Wake-Up Mode */
  3534. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_wu );
  3535. st25r3916DisableInterrupts( (ST25R3916_IRQ_MASK_WT | ST25R3916_IRQ_MASK_WAM | ST25R3916_IRQ_MASK_WPH | ST25R3916_IRQ_MASK_WCAP) );
  3536. /* Re-Enable External Field Detector as: Automatics */
  3537. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_en_fd_mask, ST25R3916_REG_OP_CONTROL_en_fd_auto_efd );
  3538. /* Re-Enable the Oscillator */
  3539. st25r3916OscOn();
  3540. /* Set Analog configurations for Wake-up Off event */
  3541. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_WAKEUP_OFF) );
  3542. return ERR_NONE;
  3543. }
  3544. #endif /* RFAL_FEATURE_WAKEUP_MODE */
  3545. /*******************************************************************************
  3546. * Low-Power Mode *
  3547. *******************************************************************************/
  3548. #if RFAL_FEATURE_LOWPOWER_MODE
  3549. /*******************************************************************************/
  3550. ReturnCode rfalLowPowerModeStart( void )
  3551. {
  3552. /* Check if RFAL is not initialized */
  3553. if( gRFAL.state < RFAL_STATE_INIT )
  3554. {
  3555. return ERR_WRONG_STATE;
  3556. }
  3557. /* Stop any ongoing activity and set the device in low power by disabling oscillator, transmitter, receiver and external field detector */
  3558. st25r3916ExecuteCommand( ST25R3916_CMD_STOP );
  3559. st25r3916ClrRegisterBits( ST25R3916_REG_OP_CONTROL, ( ST25R3916_REG_OP_CONTROL_en | ST25R3916_REG_OP_CONTROL_rx_en |
  3560. ST25R3916_REG_OP_CONTROL_wu | ST25R3916_REG_OP_CONTROL_tx_en |
  3561. ST25R3916_REG_OP_CONTROL_en_fd_mask ) );
  3562. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LOWPOWER_ON) );
  3563. gRFAL.state = RFAL_STATE_IDLE;
  3564. gRFAL.lpm.isRunning = true;
  3565. return ERR_NONE;
  3566. }
  3567. /*******************************************************************************/
  3568. ReturnCode rfalLowPowerModeStop( void )
  3569. {
  3570. ReturnCode ret;
  3571. /* Check if RFAL is on right state */
  3572. if( !gRFAL.lpm.isRunning )
  3573. {
  3574. return ERR_WRONG_STATE;
  3575. }
  3576. /* Re-enable device */
  3577. EXIT_ON_ERR( ret, st25r3916OscOn());
  3578. st25r3916ChangeRegisterBits( ST25R3916_REG_OP_CONTROL, ST25R3916_REG_OP_CONTROL_en_fd_mask, ST25R3916_REG_OP_CONTROL_en_fd_auto_efd );
  3579. rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_LOWPOWER_OFF) );
  3580. gRFAL.state = RFAL_STATE_INIT;
  3581. return ERR_NONE;
  3582. }
  3583. #endif /* RFAL_FEATURE_LOWPOWER_MODE */
  3584. /*******************************************************************************
  3585. * RF Chip *
  3586. *******************************************************************************/
  3587. /*******************************************************************************/
  3588. ReturnCode rfalChipWriteReg( uint16_t reg, const uint8_t* values, uint8_t len )
  3589. {
  3590. if( !st25r3916IsRegValid( (uint8_t)reg) )
  3591. {
  3592. return ERR_PARAM;
  3593. }
  3594. return st25r3916WriteMultipleRegisters( (uint8_t)reg, values, len );
  3595. }
  3596. /*******************************************************************************/
  3597. ReturnCode rfalChipReadReg( uint16_t reg, uint8_t* values, uint8_t len )
  3598. {
  3599. if( !st25r3916IsRegValid( (uint8_t)reg) )
  3600. {
  3601. return ERR_PARAM;
  3602. }
  3603. return st25r3916ReadMultipleRegisters( (uint8_t)reg, values, len );
  3604. }
  3605. /*******************************************************************************/
  3606. ReturnCode rfalChipExecCmd( uint16_t cmd )
  3607. {
  3608. if( !st25r3916IsCmdValid( (uint8_t)cmd) )
  3609. {
  3610. return ERR_PARAM;
  3611. }
  3612. return st25r3916ExecuteCommand( (uint8_t) cmd );
  3613. }
  3614. /*******************************************************************************/
  3615. ReturnCode rfalChipWriteTestReg( uint16_t reg, uint8_t value )
  3616. {
  3617. return st25r3916WriteTestRegister( (uint8_t)reg, value );
  3618. }
  3619. /*******************************************************************************/
  3620. ReturnCode rfalChipReadTestReg( uint16_t reg, uint8_t* value )
  3621. {
  3622. return st25r3916ReadTestRegister( (uint8_t)reg, value );
  3623. }
  3624. /*******************************************************************************/
  3625. ReturnCode rfalChipChangeRegBits( uint16_t reg, uint8_t valueMask, uint8_t value )
  3626. {
  3627. if( !st25r3916IsRegValid( (uint8_t)reg) )
  3628. {
  3629. return ERR_PARAM;
  3630. }
  3631. return st25r3916ChangeRegisterBits( (uint8_t)reg, valueMask, value );
  3632. }
  3633. /*******************************************************************************/
  3634. ReturnCode rfalChipChangeTestRegBits( uint16_t reg, uint8_t valueMask, uint8_t value )
  3635. {
  3636. st25r3916ChangeTestRegisterBits( (uint8_t)reg, valueMask, value );
  3637. return ERR_NONE;
  3638. }
  3639. /*******************************************************************************/
  3640. ReturnCode rfalChipSetRFO( uint8_t rfo )
  3641. {
  3642. return st25r3916ChangeRegisterBits( ST25R3916_REG_TX_DRIVER, ST25R3916_REG_TX_DRIVER_d_res_mask, rfo);
  3643. }
  3644. /*******************************************************************************/
  3645. ReturnCode rfalChipGetRFO( uint8_t* result )
  3646. {
  3647. ReturnCode ret;
  3648. ret = st25r3916ReadRegister(ST25R3916_REG_TX_DRIVER, result);
  3649. (*result) = ((*result) & ST25R3916_REG_TX_DRIVER_d_res_mask);
  3650. return ret;
  3651. }
  3652. /*******************************************************************************/
  3653. ReturnCode rfalChipMeasureAmplitude( uint8_t* result )
  3654. {
  3655. ReturnCode err;
  3656. uint8_t reg_opc, reg_mode, reg_conf1, reg_conf2;
  3657. /* Save registers which will be adjusted below */
  3658. st25r3916ReadRegister(ST25R3916_REG_OP_CONTROL, &reg_opc);
  3659. st25r3916ReadRegister(ST25R3916_REG_MODE, &reg_mode);
  3660. st25r3916ReadRegister(ST25R3916_REG_RX_CONF1, &reg_conf1);
  3661. st25r3916ReadRegister(ST25R3916_REG_RX_CONF2, &reg_conf2);
  3662. /* Set values as per defaults of DS. These regs/bits influence receiver chain and change amplitude */
  3663. /* Doing so achieves an amplitude comparable over a complete polling cylce */
  3664. st25r3916WriteRegister(ST25R3916_REG_OP_CONTROL, (reg_opc & ~ST25R3916_REG_OP_CONTROL_rx_chn));
  3665. st25r3916WriteRegister(ST25R3916_REG_MODE, ST25R3916_REG_MODE_om_iso14443a
  3666. | ST25R3916_REG_MODE_targ_init
  3667. | ST25R3916_REG_MODE_tr_am_ook
  3668. | ST25R3916_REG_MODE_nfc_ar_off);
  3669. st25r3916WriteRegister(ST25R3916_REG_RX_CONF1, (reg_conf1 & ~ST25R3916_REG_RX_CONF1_ch_sel_AM));
  3670. st25r3916WriteRegister(ST25R3916_REG_RX_CONF2, ((reg_conf2 & ~(ST25R3916_REG_RX_CONF2_demod_mode | ST25R3916_REG_RX_CONF2_amd_sel))
  3671. | ST25R3916_REG_RX_CONF2_amd_sel_peak));
  3672. /* Perform the actual measurement */
  3673. err = st25r3916MeasureAmplitude( result );
  3674. /* Restore values */
  3675. st25r3916WriteRegister(ST25R3916_REG_OP_CONTROL, reg_opc);
  3676. st25r3916WriteRegister(ST25R3916_REG_MODE, reg_mode);
  3677. st25r3916WriteRegister(ST25R3916_REG_RX_CONF1, reg_conf1);
  3678. st25r3916WriteRegister(ST25R3916_REG_RX_CONF2, reg_conf2);
  3679. return err;
  3680. }
  3681. /*******************************************************************************/
  3682. ReturnCode rfalChipMeasurePhase( uint8_t* result )
  3683. {
  3684. st25r3916MeasurePhase( result );
  3685. return ERR_NONE;
  3686. }
  3687. /*******************************************************************************/
  3688. ReturnCode rfalChipMeasureCapacitance( uint8_t* result )
  3689. {
  3690. st25r3916MeasureCapacitance( result );
  3691. return ERR_NONE;
  3692. }
  3693. /*******************************************************************************/
  3694. ReturnCode rfalChipMeasurePowerSupply( uint8_t param, uint8_t* result )
  3695. {
  3696. *result = st25r3916MeasurePowerSupply( param );
  3697. return ERR_NONE;
  3698. }
  3699. /*******************************************************************************/
  3700. extern uint8_t invalid_size_of_stream_configs[(sizeof(struct st25r3916StreamConfig) == sizeof(struct iso15693StreamConfig))?1:(-1)];