rfal_st25xv.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  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 "rfal_st25xv.h"
  42. #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 2U /*!< READ CONFIGURATION length */
  59. #define RFAL_ST25xV_READ_MSG_LEN_LEN 2U /*!< READ MESSAGE LENGTH length */
  60. #define RFAL_ST25xV_CONF_POINTER_LEN 1U /*!< READ/WRITE CONFIGURATION Pointer length */
  61. #define RFAL_ST25xV_CONF_REGISTER_LEN 1U /*!< READ/WRITE CONFIGURATION Register length */
  62. #define RFAL_ST25xV_PWDNUM_LEN 1U /*!< Password Number length */
  63. #define RFAL_ST25xV_PWD_LEN 8U /*!< Password length */
  64. #define RFAL_ST25xV_MBPOINTER_LEN 1U /*!< Read Message MBPointer length */
  65. #define RFAL_ST25xV_NUMBYTES_LEN 1U /*!< Read Message Number of Bytes length */
  66. #define RFAL_ST25TV02K_TBOOT_RF 1U /*!< RF Boot time (Minimum time from carrier generation to first data) */
  67. #define RFAL_ST25TV02K_TRF_OFF 2U /*!< RF OFF time */
  68. #define RFAL_ST25xV_FDT_POLL_MAX rfalConvMsTo1fc(20) /*!< Maximum Wait time FDTV,EOF 20 ms Digital 2.1 B.5 */
  69. #define RFAL_NFCV_FLAG_POS 0U /*!< Flag byte position */
  70. #define RFAL_NFCV_FLAG_LEN 1U /*!< Flag byte length */
  71. /*
  72. ******************************************************************************
  73. * LOCAL FUNCTION PROTOTYPES
  74. ******************************************************************************
  75. */
  76. static ReturnCode rfalST25xVPollerGenericReadConfiguration(uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue );
  77. static ReturnCode rfalST25xVPollerGenericWriteConfiguration( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue );
  78. static ReturnCode rfalST25xVPollerGenericReadMessageLength( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t* msgLen );
  79. static ReturnCode rfalST25xVPollerGenericReadMessage( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
  80. static ReturnCode rfalST25xVPollerGenericWriteMessage( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen );
  81. /*
  82. ******************************************************************************
  83. * LOCAL FUNCTIONS
  84. ******************************************************************************
  85. */
  86. /*******************************************************************************/
  87. static ReturnCode rfalST25xVPollerGenericReadConfiguration(uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue )
  88. {
  89. ReturnCode ret;
  90. uint8_t p;
  91. uint16_t rcvLen;
  92. rfalNfcvGenericRes res;
  93. if( regValue == NULL )
  94. {
  95. return ERR_PARAM;
  96. }
  97. p = pointer;
  98. ret = rfalNfcvPollerTransceiveReq( cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, &p, sizeof(uint8_t), (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
  99. if( ret == ERR_NONE )
  100. {
  101. if( rcvLen < RFAL_ST25xV_READ_CONFIG_LEN )
  102. {
  103. ret = ERR_PROTO;
  104. }
  105. else
  106. {
  107. *regValue = res.data[0];
  108. }
  109. }
  110. return ret;
  111. }
  112. /*******************************************************************************/
  113. static ReturnCode rfalST25xVPollerGenericWriteConfiguration( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue )
  114. {
  115. uint8_t data[RFAL_ST25xV_CONF_POINTER_LEN + RFAL_ST25xV_CONF_REGISTER_LEN];
  116. uint8_t dataLen;
  117. uint16_t rcvLen;
  118. rfalNfcvGenericRes res;
  119. dataLen = 0U;
  120. data[dataLen++] = pointer;
  121. data[dataLen++] = regValue;
  122. return rfalNfcvPollerTransceiveReq( cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
  123. }
  124. /*******************************************************************************/
  125. static ReturnCode rfalST25xVPollerGenericReadMessageLength( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t* msgLen )
  126. {
  127. ReturnCode ret;
  128. uint16_t rcvLen;
  129. rfalNfcvGenericRes res;
  130. if( msgLen == NULL )
  131. {
  132. return ERR_PARAM;
  133. }
  134. ret = rfalNfcvPollerTransceiveReq( cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, NULL, 0, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
  135. if( ret == ERR_NONE )
  136. {
  137. if( rcvLen < RFAL_ST25xV_READ_MSG_LEN_LEN )
  138. {
  139. ret = ERR_PROTO;
  140. }
  141. else
  142. {
  143. *msgLen = res.data[0];
  144. }
  145. }
  146. return ret;
  147. }
  148. /*******************************************************************************/
  149. static ReturnCode rfalST25xVPollerGenericReadMessage( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  150. {
  151. uint8_t data[RFAL_ST25xV_MBPOINTER_LEN + RFAL_ST25xV_NUMBYTES_LEN];
  152. uint8_t dataLen;
  153. dataLen = 0;
  154. /* Compute Request Data */
  155. data[dataLen++] = mbPointer;
  156. data[dataLen++] = numBytes;
  157. return rfalNfcvPollerTransceiveReq( cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  158. }
  159. /*******************************************************************************/
  160. static ReturnCode rfalST25xVPollerGenericWriteMessage( uint8_t cmd, uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen )
  161. {
  162. ReturnCode ret;
  163. uint8_t reqFlag;
  164. uint16_t msgIt;
  165. rfalBitRate rxBR;
  166. bool fastMode;
  167. rfalNfcvGenericRes res;
  168. uint16_t rcvLen;
  169. /* Calculate required Tx buf length: Mfg Code UID MSGLen MSGLen+1 */
  170. msgIt = (uint16_t)( msgLen + sizeof(flags) + sizeof(cmd) + 1U + ((uid != NULL) ? RFAL_NFCV_UID_LEN : 0U) + 1U + 1U );
  171. /* 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) */
  172. /* Check for valid parameters */
  173. if( (txBuf == NULL) || (msgData == NULL) || (txBufLen < msgIt) )
  174. {
  175. return ERR_PARAM;
  176. }
  177. msgIt = 0;
  178. fastMode = false;
  179. /* Check if the command is an ST's Fast command */
  180. if( cmd == (uint8_t)RFAL_NFCV_CMD_FAST_WRITE_MESSAGE )
  181. {
  182. /* Store current Rx bit rate and move to fast mode */
  183. rfalGetBitRate( NULL, &rxBR );
  184. rfalSetBitRate( RFAL_BR_KEEP, RFAL_BR_52p97 );
  185. fastMode = true;
  186. }
  187. /* Compute Request Command */
  188. reqFlag = (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS) & ~((uint32_t)RFAL_NFCV_REQ_FLAG_SELECT)));
  189. reqFlag |= (( uid != NULL ) ? (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS : (uint8_t)RFAL_NFCV_REQ_FLAG_SELECT);
  190. txBuf[msgIt++] = reqFlag;
  191. txBuf[msgIt++] = cmd;
  192. txBuf[msgIt++] = RFAL_NFCV_ST_IC_MFG_CODE;
  193. if( uid != NULL )
  194. {
  195. ST_MEMCPY( &txBuf[msgIt], uid, RFAL_NFCV_UID_LEN );
  196. msgIt += RFAL_NFCV_UID_LEN;
  197. }
  198. txBuf[msgIt++] = msgLen;
  199. ST_MEMCPY( &txBuf[msgIt], msgData, (uint16_t)(msgLen +(uint16_t) 1U) ); /* Message Data contains (MSGLength + 1) bytes */
  200. msgIt += (uint16_t)(msgLen + (uint16_t)1U);
  201. /* Transceive Command */
  202. ret = rfalTransceiveBlockingTxRx( txBuf, msgIt, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25xV_FDT_POLL_MAX );
  203. /* Restore Rx BitRate */
  204. if( fastMode )
  205. {
  206. rfalSetBitRate( RFAL_BR_KEEP, rxBR );
  207. }
  208. if( ret != ERR_NONE )
  209. {
  210. return ret;
  211. }
  212. /* Check if the response minimum length has been received */
  213. if( rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN )
  214. {
  215. return ERR_PROTO;
  216. }
  217. /* Check if an error has been signalled */
  218. if( (res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U )
  219. {
  220. return ERR_PROTO;
  221. }
  222. return ERR_NONE;
  223. }
  224. /*
  225. ******************************************************************************
  226. * GLOBAL FUNCTIONS
  227. ******************************************************************************
  228. */
  229. /*******************************************************************************/
  230. ReturnCode rfalST25xVPollerM24LRReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  231. {
  232. uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
  233. uint8_t dataLen;
  234. dataLen = 0;
  235. /* Compute Request Data */
  236. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  237. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  238. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_READ_SINGLE_BLOCK, (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT), RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  239. }
  240. /*******************************************************************************/
  241. ReturnCode rfalST25xVPollerM24LRWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, const uint8_t* wrData, uint8_t blockLen )
  242. {
  243. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_MAX_BLOCK_LEN)];
  244. uint8_t dataLen;
  245. uint16_t rcvLen;
  246. rfalNfcvGenericRes res;
  247. /* Check for valid parameters */
  248. if( (blockLen == 0U) || (blockLen > (uint8_t)RFAL_NFCV_MAX_BLOCK_LEN) || (wrData == NULL) )
  249. {
  250. return ERR_PARAM;
  251. }
  252. dataLen = 0U;
  253. /* Compute Request Data */
  254. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  255. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  256. ST_MEMCPY( &data[dataLen], wrData, blockLen ); /* Append Block data to write */
  257. dataLen += blockLen;
  258. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK, (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT), RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
  259. }
  260. /*******************************************************************************/
  261. ReturnCode rfalST25xVPollerM24LRReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  262. {
  263. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
  264. uint8_t dataLen;
  265. dataLen = 0U;
  266. /* Compute Request Data */
  267. data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
  268. data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  269. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  270. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_READ_MULTIPLE_BLOCKS, (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT), RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  271. }
  272. /*******************************************************************************/
  273. ReturnCode rfalST25xVPollerFastReadSingleBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  274. {
  275. uint8_t bn;
  276. bn = blockNum;
  277. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, &bn, sizeof(uint8_t), rxBuf, rxBufLen, rcvLen );
  278. }
  279. /*******************************************************************************/
  280. ReturnCode rfalST25xVPollerM24LRFastReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  281. {
  282. uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
  283. uint8_t dataLen;
  284. dataLen = 0;
  285. /* Compute Request Data */
  286. data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
  287. data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  288. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK, (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT), RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  289. }
  290. /*******************************************************************************/
  291. ReturnCode rfalST25xVPollerM24LRFastReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  292. {
  293. uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
  294. uint8_t dataLen;
  295. dataLen = 0U;
  296. /* Compute Request Data */
  297. data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
  298. data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
  299. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  300. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS, (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT), RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  301. }
  302. /*******************************************************************************/
  303. ReturnCode rfalST25xVPollerFastReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  304. {
  305. uint8_t data[(RFAL_NFCV_BLOCKNUM_LEN + RFAL_NFCV_BLOCKNUM_LEN)];
  306. uint8_t dataLen;
  307. dataLen = 0U;
  308. /* Compute Request Data */
  309. data[dataLen++] = firstBlockNum; /* Set first Block Number */
  310. data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
  311. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  312. }
  313. /*******************************************************************************/
  314. ReturnCode rfalST25xVPollerFastExtendedReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  315. {
  316. uint8_t data[RFAL_NFCV_BLOCKNUM_EXTENDED_LEN];
  317. uint8_t dataLen;
  318. dataLen = 0U;
  319. /* Compute Request Data */
  320. data[dataLen++] = (uint8_t)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. */
  321. data[dataLen++] = (uint8_t)((blockNum >> 8U) & 0xFFU);
  322. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_EXTENDED_READ_SINGLE_BLOCK, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  323. }
  324. /*******************************************************************************/
  325. ReturnCode rfalST25xVPollerFastExtReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint16_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  326. {
  327. uint8_t data[(RFAL_NFCV_BLOCKNUM_EXTENDED_LEN + RFAL_NFCV_BLOCKNUM_EXTENDED_LEN)];
  328. uint8_t dataLen;
  329. dataLen = 0U;
  330. /* Compute Request Data */
  331. data[dataLen++] = (uint8_t)((firstBlockNum >> 0U) & 0xFFU);
  332. data[dataLen++] = (uint8_t)((firstBlockNum >> 8U) & 0xFFU);
  333. data[dataLen++] = (uint8_t)((numOfBlocks >> 0U) & 0xFFU);
  334. data[dataLen++] = (uint8_t)((numOfBlocks >> 8U) & 0xFFU);
  335. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_FAST_EXTENDED_READ_MULTIPLE_BLOCKS, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
  336. }
  337. /*******************************************************************************/
  338. ReturnCode rfalST25xVPollerReadConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue )
  339. {
  340. return rfalST25xVPollerGenericReadConfiguration(RFAL_NFCV_CMD_READ_CONFIGURATION, flags, uid, pointer, regValue );
  341. }
  342. /*******************************************************************************/
  343. ReturnCode rfalST25xVPollerWriteConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue )
  344. {
  345. return rfalST25xVPollerGenericWriteConfiguration( RFAL_NFCV_CMD_WRITE_CONFIGURATION, flags, uid, pointer, regValue);
  346. }
  347. /*******************************************************************************/
  348. ReturnCode rfalST25xVPollerReadDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue )
  349. {
  350. return rfalST25xVPollerGenericReadConfiguration(RFAL_NFCV_CMD_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue );
  351. }
  352. /*******************************************************************************/
  353. ReturnCode rfalST25xVPollerWriteDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue )
  354. {
  355. return rfalST25xVPollerGenericWriteConfiguration( RFAL_NFCV_CMD_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  356. }
  357. /*******************************************************************************/
  358. ReturnCode rfalST25xVPollerFastReadDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue )
  359. {
  360. return rfalST25xVPollerGenericReadConfiguration(RFAL_NFCV_CMD_FAST_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue );
  361. }
  362. /*******************************************************************************/
  363. ReturnCode rfalST25xVPollerFastWriteDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue )
  364. {
  365. return rfalST25xVPollerGenericWriteConfiguration( RFAL_NFCV_CMD_FAST_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
  366. }
  367. /*******************************************************************************/
  368. ReturnCode rfalST25xVPollerPresentPassword( uint8_t flags, const uint8_t* uid, uint8_t pwdNum, const uint8_t *pwd, uint8_t pwdLen)
  369. {
  370. uint8_t data[RFAL_ST25xV_PWDNUM_LEN + RFAL_ST25xV_PWD_LEN];
  371. uint8_t dataLen;
  372. uint16_t rcvLen;
  373. rfalNfcvGenericRes res;
  374. if( (pwdLen > RFAL_ST25xV_PWD_LEN) || (pwd == NULL) )
  375. {
  376. return ERR_PARAM;
  377. }
  378. dataLen = 0U;
  379. data[dataLen++] = pwdNum;
  380. if( pwdLen > 0U )
  381. {
  382. ST_MEMCPY(&data[dataLen], pwd, pwdLen);
  383. }
  384. dataLen += pwdLen;
  385. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_PRESENT_PASSWORD, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
  386. }
  387. /*******************************************************************************/
  388. ReturnCode rfalST25xVPollerGetRandomNumber( uint8_t flags, const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  389. {
  390. rfalFieldOff();
  391. platformDelay(RFAL_ST25TV02K_TRF_OFF);
  392. rfalNfcvPollerInitialize();
  393. rfalFieldOnAndStartGT();
  394. platformDelay(RFAL_ST25TV02K_TBOOT_RF);
  395. return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_GET_RANDOM_NUMBER, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, NULL, 0U, rxBuf, rxBufLen, rcvLen );
  396. }
  397. /*******************************************************************************/
  398. ReturnCode rfalST25xVPollerWriteMessage( uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen )
  399. {
  400. return rfalST25xVPollerGenericWriteMessage( RFAL_NFCV_CMD_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
  401. }
  402. /*******************************************************************************/
  403. ReturnCode rfalST25xVPollerFastWriteMessage( uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen )
  404. {
  405. return rfalST25xVPollerGenericWriteMessage( RFAL_NFCV_CMD_FAST_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
  406. }
  407. /*******************************************************************************/
  408. ReturnCode rfalST25xVPollerReadMessageLength( uint8_t flags, const uint8_t* uid, uint8_t* msgLen )
  409. {
  410. return rfalST25xVPollerGenericReadMessageLength(RFAL_NFCV_CMD_READ_MESSAGE_LENGTH, flags, uid, msgLen);
  411. }
  412. /*******************************************************************************/
  413. ReturnCode rfalST25xVPollerFastReadMsgLength( uint8_t flags, const uint8_t* uid, uint8_t* msgLen )
  414. {
  415. return rfalST25xVPollerGenericReadMessageLength(RFAL_NFCV_CMD_FAST_READ_MESSAGE_LENGTH, flags, uid, msgLen);
  416. }
  417. /*******************************************************************************/
  418. ReturnCode rfalST25xVPollerReadMessage( uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  419. {
  420. return rfalST25xVPollerGenericReadMessage(RFAL_NFCV_CMD_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen );
  421. }
  422. /*******************************************************************************/
  423. ReturnCode rfalST25xVPollerFastReadMessage( uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
  424. {
  425. return rfalST25xVPollerGenericReadMessage(RFAL_NFCV_CMD_FAST_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen );
  426. }
  427. #endif /* RFAL_FEATURE_ST25xV */