rfal_st25xv.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. /******************************************************************************
  2. * \attention
  3. *
  4. * <h2><center>&copy; COPYRIGHT 2020 STMicroelectronics</center></h2>
  5. *
  6. * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
  7. * You may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at:
  9. *
  10. * www.st.com/myliberty
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
  15. * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. *
  20. ******************************************************************************/
  21. /*
  22. * PROJECT: ST25R391x firmware
  23. * Revision:
  24. * LANGUAGE: ISO C99
  25. */
  26. /*! \file rfal_st25xv.c
  27. *
  28. * \author Gustavo Patricio
  29. *
  30. * \brief NFC-V ST25 NFC-V Tag specific features
  31. *
  32. * This module provides support for ST's specific features available on
  33. * NFC-V (ISO15693) tag families: ST25D, ST25TV, M24LR
  34. *
  35. */
  36. /*
  37. ******************************************************************************
  38. * INCLUDES
  39. ******************************************************************************
  40. */
  41. #include "../include/rfal_st25xv.h"
  42. #include "../include/rfal_nfcv.h"
  43. #include "../utils.h"
  44. /*
  45. ******************************************************************************
  46. * ENABLE SWITCH
  47. ******************************************************************************
  48. */
  49. #ifndef RFAL_FEATURE_ST25xV
  50. #define RFAL_FEATURE_ST25xV false /* ST25xV module configuration missing. Disabled by default */
  51. #endif
  52. #if RFAL_FEATURE_ST25xV
  53. /*
  54. ******************************************************************************
  55. * GLOBAL DEFINES
  56. ******************************************************************************
  57. */
  58. #define RFAL_ST25xV_READ_CONFIG_LEN \
  59. 2U /*!< READ CONFIGURATION length */
  60. #define RFAL_ST25xV_READ_MSG_LEN_LEN \
  61. 2U /*!< READ MESSAGE LENGTH length */
  62. #define RFAL_ST25xV_CONF_POINTER_LEN \
  63. 1U /*!< READ/WRITE CONFIGURATION Pointer length */
  64. #define RFAL_ST25xV_CONF_REGISTER_LEN \
  65. 1U /*!< READ/WRITE CONFIGURATION Register length */
  66. #define RFAL_ST25xV_PWDNUM_LEN \
  67. 1U /*!< Password Number length */
  68. #define RFAL_ST25xV_PWD_LEN \
  69. 8U /*!< Password length */
  70. #define RFAL_ST25xV_MBPOINTER_LEN \
  71. 1U /*!< Read Message MBPointer length */
  72. #define RFAL_ST25xV_NUMBYTES_LEN \
  73. 1U /*!< Read Message Number of Bytes length */
  74. #define RFAL_ST25TV02K_TBOOT_RF \
  75. 1U /*!< RF Boot time (Minimum time from carrier generation to first data) */
  76. #define RFAL_ST25TV02K_TRF_OFF \
  77. 2U /*!< RF OFF time */
  78. #define RFAL_ST25xV_FDT_POLL_MAX \
  79. rfalConvMsTo1fc(20) /*!< Maximum Wait time FDTV,EOF 20 ms Digital 2.1 B.5 */
  80. #define RFAL_NFCV_FLAG_POS \
  81. 0U /*!< Flag byte position */
  82. #define RFAL_NFCV_FLAG_LEN \
  83. 1U /*!< Flag byte length */
  84. /*
  85. ******************************************************************************
  86. * LOCAL FUNCTION PROTOTYPES
  87. ******************************************************************************
  88. */
  89. static ReturnCode rfalST25xVPollerGenericReadConfiguration(
  90. uint8_t cmd,
  91. uint8_t flags,
  92. const uint8_t* uid,
  93. uint8_t pointer,
  94. uint8_t* regValue);
  95. static ReturnCode rfalST25xVPollerGenericWriteConfiguration(
  96. uint8_t cmd,
  97. uint8_t flags,
  98. const uint8_t* uid,
  99. uint8_t pointer,
  100. uint8_t regValue);
  101. static ReturnCode rfalST25xVPollerGenericReadMessageLength(
  102. uint8_t cmd,
  103. uint8_t flags,
  104. const uint8_t* uid,
  105. uint8_t* msgLen);
  106. static ReturnCode rfalST25xVPollerGenericReadMessage(
  107. uint8_t cmd,
  108. uint8_t flags,
  109. const uint8_t* uid,
  110. uint8_t mbPointer,
  111. uint8_t numBytes,
  112. uint8_t* rxBuf,
  113. uint16_t rxBufLen,
  114. uint16_t* rcvLen);
  115. static ReturnCode rfalST25xVPollerGenericWriteMessage(
  116. uint8_t cmd,
  117. uint8_t flags,
  118. const uint8_t* uid,
  119. uint8_t msgLen,
  120. const uint8_t* msgData,
  121. uint8_t* txBuf,
  122. uint16_t txBufLen);
  123. /*
  124. ******************************************************************************
  125. * LOCAL FUNCTIONS
  126. ******************************************************************************
  127. */
  128. /*******************************************************************************/
  129. static ReturnCode rfalST25xVPollerGenericReadConfiguration(
  130. uint8_t cmd,
  131. uint8_t flags,
  132. const uint8_t* uid,
  133. uint8_t pointer,
  134. uint8_t* regValue) {
  135. ReturnCode ret;
  136. uint8_t p;
  137. uint16_t rcvLen;
  138. rfalNfcvGenericRes res;
  139. if(regValue == NULL) {
  140. return ERR_PARAM;
  141. }
  142. p = pointer;
  143. ret = rfalNfcvPollerTransceiveReq(
  144. cmd,
  145. flags,
  146. RFAL_NFCV_ST_IC_MFG_CODE,
  147. uid,
  148. &p,
  149. sizeof(uint8_t),
  150. (uint8_t*)&res,
  151. sizeof(rfalNfcvGenericRes),
  152. &rcvLen);
  153. if(ret == ERR_NONE) {
  154. if(rcvLen < RFAL_ST25xV_READ_CONFIG_LEN) {
  155. ret = ERR_PROTO;
  156. } else {
  157. *regValue = res.data[0];
  158. }
  159. }
  160. return ret;
  161. }
  162. /*******************************************************************************/
  163. static ReturnCode rfalST25xVPollerGenericWriteConfiguration(
  164. uint8_t cmd,
  165. uint8_t flags,
  166. const uint8_t* uid,
  167. uint8_t pointer,
  168. uint8_t regValue) {
  169. uint8_t data[RFAL_ST25xV_CONF_POINTER_LEN + RFAL_ST25xV_CONF_REGISTER_LEN];
  170. uint8_t dataLen;
  171. uint16_t rcvLen;
  172. rfalNfcvGenericRes res;
  173. dataLen = 0U;
  174. data[dataLen++] = pointer;
  175. data[dataLen++] = regValue;
  176. return rfalNfcvPollerTransceiveReq(
  177. cmd,
  178. flags,
  179. RFAL_NFCV_ST_IC_MFG_CODE,
  180. uid,
  181. data,
  182. dataLen,
  183. (uint8_t*)&res,
  184. sizeof(rfalNfcvGenericRes),
  185. &rcvLen);
  186. }
  187. /*******************************************************************************/
  188. static ReturnCode rfalST25xVPollerGenericReadMessageLength(
  189. uint8_t cmd,
  190. uint8_t flags,
  191. const uint8_t* uid,
  192. uint8_t* msgLen) {
  193. ReturnCode ret;
  194. uint16_t rcvLen;
  195. rfalNfcvGenericRes res;
  196. if(msgLen == NULL) {
  197. return ERR_PARAM;
  198. }
  199. ret = rfalNfcvPollerTransceiveReq(
  200. cmd,
  201. flags,
  202. RFAL_NFCV_ST_IC_MFG_CODE,
  203. uid,
  204. NULL,
  205. 0,
  206. (uint8_t*)&res,
  207. sizeof(rfalNfcvGenericRes),
  208. &rcvLen);
  209. if(ret == ERR_NONE) {
  210. if(rcvLen < RFAL_ST25xV_READ_MSG_LEN_LEN) {
  211. ret = ERR_PROTO;
  212. } else {
  213. *msgLen = res.data[0];
  214. }
  215. }
  216. return ret;
  217. }
  218. /*******************************************************************************/
  219. static ReturnCode rfalST25xVPollerGenericReadMessage(
  220. uint8_t cmd,
  221. uint8_t flags,
  222. const uint8_t* uid,
  223. uint8_t mbPointer,
  224. uint8_t numBytes,
  225. uint8_t* rxBuf,
  226. uint16_t rxBufLen,
  227. uint16_t* rcvLen) {
  228. uint8_t data[RFAL_ST25xV_MBPOINTER_LEN + RFAL_ST25xV_NUMBYTES_LEN];
  229. uint8_t dataLen;
  230. dataLen = 0;
  231. /* Compute Request Data */
  232. data[dataLen++] = mbPointer;
  233. data[dataLen++] = numBytes;
  234. return rfalNfcvPollerTransceiveReq(
  235. cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen);
  236. }
  237. /*******************************************************************************/
  238. static ReturnCode rfalST25xVPollerGenericWriteMessage(
  239. uint8_t cmd,
  240. uint8_t flags,
  241. const uint8_t* uid,
  242. uint8_t msgLen,
  243. const uint8_t* msgData,
  244. uint8_t* txBuf,
  245. uint16_t txBufLen) {
  246. ReturnCode ret;
  247. uint8_t reqFlag;
  248. uint16_t msgIt;
  249. rfalBitRate rxBR;
  250. bool fastMode;
  251. rfalNfcvGenericRes res;
  252. uint16_t rcvLen;
  253. /* Calculate required Tx buf length: Mfg Code UID MSGLen MSGLen+1 */
  254. msgIt = (uint16_t)(msgLen + sizeof(flags) + sizeof(cmd) + 1U +
  255. ((uid != NULL) ? RFAL_NFCV_UID_LEN : 0U) + 1U + 1U);
  256. /* Note: MSGlength parameter of the command is the number of Data bytes minus - 1 (00 for 1 byte of data, FFh for 256 bytes of data) */
  257. /* Check for valid parameters */
  258. if((txBuf == NULL) || (msgData == NULL) || (txBufLen < msgIt)) {
  259. return ERR_PARAM;
  260. }
  261. msgIt = 0;
  262. fastMode = false;
  263. /* Check if the command is an ST's Fast command */
  264. if(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_WRITE_MESSAGE) {
  265. /* Store current Rx bit rate and move to fast mode */
  266. rfalGetBitRate(NULL, &rxBR);
  267. rfalSetBitRate(RFAL_BR_KEEP, RFAL_BR_52p97);
  268. fastMode = true;
  269. }
  270. /* Compute Request Command */
  271. reqFlag = (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS) &
  272. ~((uint32_t)RFAL_NFCV_REQ_FLAG_SELECT)));
  273. reqFlag |=
  274. ((uid != NULL) ? (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS : (uint8_t)RFAL_NFCV_REQ_FLAG_SELECT);
  275. txBuf[msgIt++] = reqFlag;
  276. txBuf[msgIt++] = cmd;
  277. txBuf[msgIt++] = RFAL_NFCV_ST_IC_MFG_CODE;
  278. if(uid != NULL) {
  279. ST_MEMCPY(&txBuf[msgIt], uid, RFAL_NFCV_UID_LEN);
  280. msgIt += RFAL_NFCV_UID_LEN;
  281. }
  282. txBuf[msgIt++] = msgLen;
  283. ST_MEMCPY(
  284. &txBuf[msgIt],
  285. msgData,
  286. (uint16_t)(msgLen + (uint16_t)1U)); /* Message Data contains (MSGLength + 1) bytes */
  287. msgIt += (uint16_t)(msgLen + (uint16_t)1U);
  288. /* Transceive Command */
  289. ret = rfalTransceiveBlockingTxRx(
  290. txBuf,
  291. msgIt,
  292. (uint8_t*)&res,
  293. sizeof(rfalNfcvGenericRes),
  294. &rcvLen,
  295. RFAL_TXRX_FLAGS_DEFAULT,
  296. RFAL_ST25xV_FDT_POLL_MAX);
  297. /* Restore Rx BitRate */
  298. if(fastMode) {
  299. rfalSetBitRate(RFAL_BR_KEEP, rxBR);
  300. }
  301. if(ret != ERR_NONE) {
  302. return ret;
  303. }
  304. /* Check if the response minimum length has been received */
  305. if(rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN) {
  306. return ERR_PROTO;
  307. }
  308. /* Check if an error has been signalled */
  309. if((res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U) {
  310. return ERR_PROTO;
  311. }
  312. return ERR_NONE;
  313. }
  314. /*
  315. ******************************************************************************
  316. * GLOBAL FUNCTIONS
  317. ******************************************************************************
  318. */
  319. /*******************************************************************************/
  320. ReturnCode rfalST25xVPollerM24LRReadSingleBlock(
  321. uint8_t flags,
  322. const uint8_t* uid,
  323. uint16_t blockNum,
  324. uint8_t* rxBuf,
  325. uint16_t rxBufLen,
  326. uint16_t* rcvLen) {
  327. uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
  328. uint8_t dataLen;
  329. dataLen = 0;
  330. /* Compute Request Data */
  331. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  332. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  333. return rfalNfcvPollerTransceiveReq(
  334. RFAL_NFCV_CMD_READ_SINGLE_BLOCK,
  335. (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
  336. RFAL_NFCV_PARAM_SKIP,
  337. uid,
  338. data,
  339. dataLen,
  340. rxBuf,
  341. rxBufLen,
  342. rcvLen);
  343. }
  344. /*******************************************************************************/
  345. ReturnCode rfalST25xVPollerM24LRWriteSingleBlock(
  346. uint8_t flags,
  347. const uint8_t* uid,
  348. uint16_t blockNum,
  349. const uint8_t* wrData,
  350. uint8_t blockLen) {
  351. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_MAX_BLOCK_LEN)];
  352. uint8_t dataLen;
  353. uint16_t rcvLen;
  354. rfalNfcvGenericRes res;
  355. /* Check for valid parameters */
  356. if((blockLen == 0U) || (blockLen > (uint8_t)RFAL_NFCV_MAX_BLOCK_LEN) || (wrData == NULL)) {
  357. return ERR_PARAM;
  358. }
  359. dataLen = 0U;
  360. /* Compute Request Data */
  361. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  362. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  363. ST_MEMCPY(&data[dataLen], wrData, blockLen); /* Append Block data to write */
  364. dataLen += blockLen;
  365. return rfalNfcvPollerTransceiveReq(
  366. RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK,
  367. (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
  368. RFAL_NFCV_PARAM_SKIP,
  369. uid,
  370. data,
  371. dataLen,
  372. (uint8_t*)&res,
  373. sizeof(rfalNfcvGenericRes),
  374. &rcvLen);
  375. }
  376. /*******************************************************************************/
  377. ReturnCode rfalST25xVPollerM24LRReadMultipleBlocks(
  378. uint8_t flags,
  379. const uint8_t* uid,
  380. uint16_t firstBlockNum,
  381. uint8_t numOfBlocks,
  382. uint8_t* rxBuf,
  383. uint16_t rxBufLen,
  384. uint16_t* rcvLen) {
  385. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
  386. uint8_t dataLen;
  387. dataLen = 0U;
  388. /* Compute Request Data */
  389. data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
  390. data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  391. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  392. return rfalNfcvPollerTransceiveReq(
  393. RFAL_NFCV_CMD_READ_MULTIPLE_BLOCKS,
  394. (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
  395. RFAL_NFCV_PARAM_SKIP,
  396. uid,
  397. data,
  398. dataLen,
  399. rxBuf,
  400. rxBufLen,
  401. rcvLen);
  402. }
  403. /*******************************************************************************/
  404. ReturnCode rfalST25xVPollerFastReadSingleBlock(
  405. uint8_t flags,
  406. const uint8_t* uid,
  407. uint8_t blockNum,
  408. uint8_t* rxBuf,
  409. uint16_t rxBufLen,
  410. uint16_t* rcvLen) {
  411. uint8_t bn;
  412. bn = blockNum;
  413. return rfalNfcvPollerTransceiveReq(
  414. RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK,
  415. flags,
  416. RFAL_NFCV_ST_IC_MFG_CODE,
  417. uid,
  418. &bn,
  419. sizeof(uint8_t),
  420. rxBuf,
  421. rxBufLen,
  422. rcvLen);
  423. }
  424. /*******************************************************************************/
  425. ReturnCode rfalST25xVPollerM24LRFastReadSingleBlock(
  426. uint8_t flags,
  427. const uint8_t* uid,
  428. uint16_t blockNum,
  429. uint8_t* rxBuf,
  430. uint16_t rxBufLen,
  431. uint16_t* rcvLen) {
  432. uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
  433. uint8_t dataLen;
  434. dataLen = 0;
  435. /* Compute Request Data */
  436. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  437. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  438. return rfalNfcvPollerTransceiveReq(
  439. RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK,
  440. (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
  441. RFAL_NFCV_ST_IC_MFG_CODE,
  442. uid,
  443. data,
  444. dataLen,
  445. rxBuf,
  446. rxBufLen,
  447. rcvLen);
  448. }
  449. /*******************************************************************************/
  450. ReturnCode rfalST25xVPollerM24LRFastReadMultipleBlocks(
  451. uint8_t flags,
  452. const uint8_t* uid,
  453. uint16_t firstBlockNum,
  454. uint8_t numOfBlocks,
  455. uint8_t* rxBuf,
  456. uint16_t rxBufLen,
  457. uint16_t* rcvLen) {
  458. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
  459. uint8_t dataLen;
  460. dataLen = 0U;
  461. /* Compute Request Data */
  462. data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
  463. data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  464. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  465. return rfalNfcvPollerTransceiveReq(
  466. RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS,
  467. (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
  468. RFAL_NFCV_ST_IC_MFG_CODE,
  469. uid,
  470. data,
  471. dataLen,
  472. rxBuf,
  473. rxBufLen,
  474. rcvLen);
  475. }
  476. /*******************************************************************************/
  477. ReturnCode rfalST25xVPollerFastReadMultipleBlocks(
  478. uint8_t flags,
  479. const uint8_t* uid,
  480. uint8_t firstBlockNum,
  481. uint8_t numOfBlocks,
  482. uint8_t* rxBuf,
  483. uint16_t rxBufLen,
  484. uint16_t* rcvLen) {
  485. uint8_t data[(RFAL_NFCV_BLOCKNUM_LEN + RFAL_NFCV_BLOCKNUM_LEN)];
  486. uint8_t dataLen;
  487. dataLen = 0U;
  488. /* Compute Request Data */
  489. data[dataLen++] = firstBlockNum; /* Set first Block Number */
  490. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  491. return rfalNfcvPollerTransceiveReq(
  492. RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS,
  493. flags,
  494. RFAL_NFCV_ST_IC_MFG_CODE,
  495. uid,
  496. data,
  497. dataLen,
  498. rxBuf,
  499. rxBufLen,
  500. rcvLen);
  501. }
  502. /*******************************************************************************/
  503. ReturnCode rfalST25xVPollerFastExtendedReadSingleBlock(
  504. uint8_t flags,
  505. const uint8_t* uid,
  506. uint16_t blockNum,
  507. uint8_t* rxBuf,
  508. uint16_t rxBufLen,
  509. uint16_t* rcvLen) {
  510. uint8_t data[RFAL_NFCV_BLOCKNUM_EXTENDED_LEN];
  511. uint8_t dataLen;
  512. dataLen = 0U;
  513. /* Compute Request Data */
  514. data[dataLen++] = (uint8_t)
  515. blockNum; /* TS T5T 1.0 BNo is considered as a multi-byte field. TS T5T 1.0 5.1.1.13 multi-byte field follows [DIGITAL]. [DIGITAL] 9.3.1 A multiple byte field is transmitted LSB first. */
  516. data[dataLen++] = (uint8_t)((blockNum >> 8U) & 0xFFU);
  517. return rfalNfcvPollerTransceiveReq(
  518. RFAL_NFCV_CMD_FAST_EXTENDED_READ_SINGLE_BLOCK,
  519. flags,
  520. RFAL_NFCV_ST_IC_MFG_CODE,
  521. uid,
  522. data,
  523. dataLen,
  524. rxBuf,
  525. rxBufLen,
  526. rcvLen);
  527. }
  528. /*******************************************************************************/
  529. ReturnCode rfalST25xVPollerFastExtReadMultipleBlocks(
  530. uint8_t flags,
  531. const uint8_t* uid,
  532. uint16_t firstBlockNum,
  533. uint16_t numOfBlocks,
  534. uint8_t* rxBuf,
  535. uint16_t rxBufLen,
  536. uint16_t* rcvLen) {
  537. uint8_t data[(RFAL_NFCV_BLOCKNUM_EXTENDED_LEN + RFAL_NFCV_BLOCKNUM_EXTENDED_LEN)];
  538. uint8_t dataLen;
  539. dataLen = 0U;
  540. /* Compute Request Data */
  541. data[dataLen++] = (uint8_t)((firstBlockNum >> 0U) & 0xFFU);
  542. data[dataLen++] = (uint8_t)((firstBlockNum >> 8U) & 0xFFU);
  543. data[dataLen++] = (uint8_t)((numOfBlocks >> 0U) & 0xFFU);
  544. data[dataLen++] = (uint8_t)((numOfBlocks >> 8U) & 0xFFU);
  545. return rfalNfcvPollerTransceiveReq(
  546. RFAL_NFCV_CMD_FAST_EXTENDED_READ_MULTIPLE_BLOCKS,
  547. flags,
  548. RFAL_NFCV_ST_IC_MFG_CODE,
  549. uid,
  550. data,
  551. dataLen,
  552. rxBuf,
  553. rxBufLen,
  554. rcvLen);
  555. }
  556. /*******************************************************************************/
  557. ReturnCode rfalST25xVPollerReadConfiguration(
  558. uint8_t flags,
  559. const uint8_t* uid,
  560. uint8_t pointer,
  561. uint8_t* regValue) {
  562. return rfalST25xVPollerGenericReadConfiguration(
  563. RFAL_NFCV_CMD_READ_CONFIGURATION, flags, uid, pointer, regValue);
  564. }
  565. /*******************************************************************************/
  566. ReturnCode rfalST25xVPollerWriteConfiguration(
  567. uint8_t flags,
  568. const uint8_t* uid,
  569. uint8_t pointer,
  570. uint8_t regValue) {
  571. return rfalST25xVPollerGenericWriteConfiguration(
  572. RFAL_NFCV_CMD_WRITE_CONFIGURATION, flags, uid, pointer, regValue);
  573. }
  574. /*******************************************************************************/
  575. ReturnCode rfalST25xVPollerReadDynamicConfiguration(
  576. uint8_t flags,
  577. const uint8_t* uid,
  578. uint8_t pointer,
  579. uint8_t* regValue) {
  580. return rfalST25xVPollerGenericReadConfiguration(
  581. RFAL_NFCV_CMD_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  582. }
  583. /*******************************************************************************/
  584. ReturnCode rfalST25xVPollerWriteDynamicConfiguration(
  585. uint8_t flags,
  586. const uint8_t* uid,
  587. uint8_t pointer,
  588. uint8_t regValue) {
  589. return rfalST25xVPollerGenericWriteConfiguration(
  590. RFAL_NFCV_CMD_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  591. }
  592. /*******************************************************************************/
  593. ReturnCode rfalST25xVPollerFastReadDynamicConfiguration(
  594. uint8_t flags,
  595. const uint8_t* uid,
  596. uint8_t pointer,
  597. uint8_t* regValue) {
  598. return rfalST25xVPollerGenericReadConfiguration(
  599. RFAL_NFCV_CMD_FAST_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  600. }
  601. /*******************************************************************************/
  602. ReturnCode rfalST25xVPollerFastWriteDynamicConfiguration(
  603. uint8_t flags,
  604. const uint8_t* uid,
  605. uint8_t pointer,
  606. uint8_t regValue) {
  607. return rfalST25xVPollerGenericWriteConfiguration(
  608. RFAL_NFCV_CMD_FAST_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  609. }
  610. /*******************************************************************************/
  611. ReturnCode rfalST25xVPollerPresentPassword(
  612. uint8_t flags,
  613. const uint8_t* uid,
  614. uint8_t pwdNum,
  615. const uint8_t* pwd,
  616. uint8_t pwdLen) {
  617. uint8_t data[RFAL_ST25xV_PWDNUM_LEN + RFAL_ST25xV_PWD_LEN];
  618. uint8_t dataLen;
  619. uint16_t rcvLen;
  620. rfalNfcvGenericRes res;
  621. if((pwdLen > RFAL_ST25xV_PWD_LEN) || (pwd == NULL)) {
  622. return ERR_PARAM;
  623. }
  624. dataLen = 0U;
  625. data[dataLen++] = pwdNum;
  626. if(pwdLen > 0U) {
  627. ST_MEMCPY(&data[dataLen], pwd, pwdLen);
  628. }
  629. dataLen += pwdLen;
  630. return rfalNfcvPollerTransceiveReq(
  631. RFAL_NFCV_CMD_PRESENT_PASSWORD,
  632. flags,
  633. RFAL_NFCV_ST_IC_MFG_CODE,
  634. uid,
  635. data,
  636. dataLen,
  637. (uint8_t*)&res,
  638. sizeof(rfalNfcvGenericRes),
  639. &rcvLen);
  640. }
  641. /*******************************************************************************/
  642. ReturnCode rfalST25xVPollerGetRandomNumber(
  643. uint8_t flags,
  644. const uint8_t* uid,
  645. uint8_t* rxBuf,
  646. uint16_t rxBufLen,
  647. uint16_t* rcvLen) {
  648. rfalFieldOff();
  649. platformDelay(RFAL_ST25TV02K_TRF_OFF);
  650. rfalNfcvPollerInitialize();
  651. rfalFieldOnAndStartGT();
  652. platformDelay(RFAL_ST25TV02K_TBOOT_RF);
  653. return rfalNfcvPollerTransceiveReq(
  654. RFAL_NFCV_CMD_GET_RANDOM_NUMBER,
  655. flags,
  656. RFAL_NFCV_ST_IC_MFG_CODE,
  657. uid,
  658. NULL,
  659. 0U,
  660. rxBuf,
  661. rxBufLen,
  662. rcvLen);
  663. }
  664. /*******************************************************************************/
  665. ReturnCode rfalST25xVPollerWriteMessage(
  666. uint8_t flags,
  667. const uint8_t* uid,
  668. uint8_t msgLen,
  669. const uint8_t* msgData,
  670. uint8_t* txBuf,
  671. uint16_t txBufLen) {
  672. return rfalST25xVPollerGenericWriteMessage(
  673. RFAL_NFCV_CMD_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
  674. }
  675. /*******************************************************************************/
  676. ReturnCode rfalST25xVPollerFastWriteMessage(
  677. uint8_t flags,
  678. const uint8_t* uid,
  679. uint8_t msgLen,
  680. const uint8_t* msgData,
  681. uint8_t* txBuf,
  682. uint16_t txBufLen) {
  683. return rfalST25xVPollerGenericWriteMessage(
  684. RFAL_NFCV_CMD_FAST_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
  685. }
  686. /*******************************************************************************/
  687. ReturnCode rfalST25xVPollerReadMessageLength(uint8_t flags, const uint8_t* uid, uint8_t* msgLen) {
  688. return rfalST25xVPollerGenericReadMessageLength(
  689. RFAL_NFCV_CMD_READ_MESSAGE_LENGTH, flags, uid, msgLen);
  690. }
  691. /*******************************************************************************/
  692. ReturnCode rfalST25xVPollerFastReadMsgLength(uint8_t flags, const uint8_t* uid, uint8_t* msgLen) {
  693. return rfalST25xVPollerGenericReadMessageLength(
  694. RFAL_NFCV_CMD_FAST_READ_MESSAGE_LENGTH, flags, uid, msgLen);
  695. }
  696. /*******************************************************************************/
  697. ReturnCode rfalST25xVPollerReadMessage(
  698. uint8_t flags,
  699. const uint8_t* uid,
  700. uint8_t mbPointer,
  701. uint8_t numBytes,
  702. uint8_t* rxBuf,
  703. uint16_t rxBufLen,
  704. uint16_t* rcvLen) {
  705. return rfalST25xVPollerGenericReadMessage(
  706. RFAL_NFCV_CMD_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen);
  707. }
  708. /*******************************************************************************/
  709. ReturnCode rfalST25xVPollerFastReadMessage(
  710. uint8_t flags,
  711. const uint8_t* uid,
  712. uint8_t mbPointer,
  713. uint8_t numBytes,
  714. uint8_t* rxBuf,
  715. uint16_t rxBufLen,
  716. uint16_t* rcvLen) {
  717. return rfalST25xVPollerGenericReadMessage(
  718. RFAL_NFCV_CMD_FAST_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen);
  719. }
  720. #endif /* RFAL_FEATURE_ST25xV */