This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.
Dependencies: NDefLib X_NUCLEO_NFC01A1 mbed
Fork of X-MBED-NFC1 by
This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.
The available demos are:
- SAMPLE_WRITE_URL: write a tag with the ST home page URL
- SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
- SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
- SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.
To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .
m24sr/m24sr_class.cpp@2:0648c1561eb2, 2015-12-01 (annotated)
- Committer:
- giovannivisentini
- Date:
- Tue Dec 01 08:30:54 2015 +0000
- Revision:
- 2:0648c1561eb2
- Parent:
- 1:6d202b62ed68
change the tag content when the user press the button
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| giovannivisentini | 1:6d202b62ed68 | 1 | /** |
| giovannivisentini | 1:6d202b62ed68 | 2 | ****************************************************************************** |
| giovannivisentini | 1:6d202b62ed68 | 3 | * @file m24sr_class.cpp |
| giovannivisentini | 1:6d202b62ed68 | 4 | * @author MMY Application Team |
| giovannivisentini | 1:6d202b62ed68 | 5 | * @version V1.2.0 |
| giovannivisentini | 1:6d202b62ed68 | 6 | * @date 20-October-2014 |
| giovannivisentini | 1:6d202b62ed68 | 7 | * @brief This file provides a set of functions to interface with the M24SR |
| giovannivisentini | 1:6d202b62ed68 | 8 | * device. |
| giovannivisentini | 1:6d202b62ed68 | 9 | ****************************************************************************** |
| giovannivisentini | 1:6d202b62ed68 | 10 | * @attention |
| giovannivisentini | 1:6d202b62ed68 | 11 | * |
| giovannivisentini | 1:6d202b62ed68 | 12 | * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> |
| giovannivisentini | 1:6d202b62ed68 | 13 | * |
| giovannivisentini | 1:6d202b62ed68 | 14 | * Redistribution and use in source and binary forms, with or without modification, |
| giovannivisentini | 1:6d202b62ed68 | 15 | * are permitted provided that the following conditions are met: |
| giovannivisentini | 1:6d202b62ed68 | 16 | * 1. Redistributions of source code must retain the above copyright notice, |
| giovannivisentini | 1:6d202b62ed68 | 17 | * this list of conditions and the following disclaimer. |
| giovannivisentini | 1:6d202b62ed68 | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
| giovannivisentini | 1:6d202b62ed68 | 19 | * this list of conditions and the following disclaimer in the documentation |
| giovannivisentini | 1:6d202b62ed68 | 20 | * and/or other materials provided with the distribution. |
| giovannivisentini | 1:6d202b62ed68 | 21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
| giovannivisentini | 1:6d202b62ed68 | 22 | * may be used to endorse or promote products derived from this software |
| giovannivisentini | 1:6d202b62ed68 | 23 | * without specific prior written permission. |
| giovannivisentini | 1:6d202b62ed68 | 24 | * |
| giovannivisentini | 1:6d202b62ed68 | 25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| giovannivisentini | 1:6d202b62ed68 | 26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| giovannivisentini | 1:6d202b62ed68 | 27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| giovannivisentini | 1:6d202b62ed68 | 28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| giovannivisentini | 1:6d202b62ed68 | 29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| giovannivisentini | 1:6d202b62ed68 | 30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| giovannivisentini | 1:6d202b62ed68 | 31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| giovannivisentini | 1:6d202b62ed68 | 32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| giovannivisentini | 1:6d202b62ed68 | 33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| giovannivisentini | 1:6d202b62ed68 | 34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| giovannivisentini | 1:6d202b62ed68 | 35 | * |
| giovannivisentini | 1:6d202b62ed68 | 36 | ****************************************************************************** |
| giovannivisentini | 1:6d202b62ed68 | 37 | */ |
| giovannivisentini | 1:6d202b62ed68 | 38 | |
| giovannivisentini | 1:6d202b62ed68 | 39 | |
| giovannivisentini | 1:6d202b62ed68 | 40 | |
| giovannivisentini | 1:6d202b62ed68 | 41 | /* Includes ------------------------------------------------------------------*/ |
| giovannivisentini | 1:6d202b62ed68 | 42 | #include "m24sr_class.h" |
| giovannivisentini | 1:6d202b62ed68 | 43 | #include "m24sr.h" |
| giovannivisentini | 1:6d202b62ed68 | 44 | |
| giovannivisentini | 2:0648c1561eb2 | 45 | /** |
| giovannivisentini | 2:0648c1561eb2 | 46 | * default password, it is used also for reach the super user mode throught the i2c channel |
| giovannivisentini | 2:0648c1561eb2 | 47 | */ |
| giovannivisentini | 1:6d202b62ed68 | 48 | const uint8_t M24SR::DEFAULT_PASSWORD[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| giovannivisentini | 1:6d202b62ed68 | 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
| giovannivisentini | 1:6d202b62ed68 | 50 | |
| giovannivisentini | 1:6d202b62ed68 | 51 | /** @addtogroup M24SR_Driver |
| giovannivisentini | 1:6d202b62ed68 | 52 | * @{ |
| giovannivisentini | 1:6d202b62ed68 | 53 | * @brief <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b> |
| giovannivisentini | 1:6d202b62ed68 | 54 | */ |
| giovannivisentini | 1:6d202b62ed68 | 55 | |
| giovannivisentini | 1:6d202b62ed68 | 56 | /** @defgroup drv_M24SR |
| giovannivisentini | 1:6d202b62ed68 | 57 | * @{ |
| giovannivisentini | 1:6d202b62ed68 | 58 | * @brief This file contains the driver which implements all the M24SR commands. |
| giovannivisentini | 1:6d202b62ed68 | 59 | */ |
| giovannivisentini | 1:6d202b62ed68 | 60 | |
| giovannivisentini | 1:6d202b62ed68 | 61 | #ifndef errchk |
| giovannivisentini | 2:0648c1561eb2 | 62 | |
| giovannivisentini | 2:0648c1561eb2 | 63 | /** value return by the NFC chip when a command is successfully done */ |
| giovannivisentini | 1:6d202b62ed68 | 64 | #define NFC_COMMAND_SUCCESS 0x9000 |
| giovannivisentini | 2:0648c1561eb2 | 65 | |
| giovannivisentini | 2:0648c1561eb2 | 66 | /** call the fCall funtion and check that the return status is NFC_COMMAND_SUCCESS, |
| giovannivisentini | 2:0648c1561eb2 | 67 | * otherwise return the error status*/ |
| giovannivisentini | 1:6d202b62ed68 | 68 | #define errchk(fCall) {\ |
| giovannivisentini | 1:6d202b62ed68 | 69 | const NFC_StatusTypeDef status = (fCall); \ |
| giovannivisentini | 1:6d202b62ed68 | 70 | if((status!=NFC_SUCCESS)) \ |
| giovannivisentini | 1:6d202b62ed68 | 71 | return status; \ |
| giovannivisentini | 1:6d202b62ed68 | 72 | }\ |
| giovannivisentini | 1:6d202b62ed68 | 73 | |
| giovannivisentini | 1:6d202b62ed68 | 74 | #endif |
| giovannivisentini | 1:6d202b62ed68 | 75 | |
| giovannivisentini | 1:6d202b62ed68 | 76 | /** |
| giovannivisentini | 1:6d202b62ed68 | 77 | * @brief This function updates the CRC |
| giovannivisentini | 1:6d202b62ed68 | 78 | * @param None |
| giovannivisentini | 1:6d202b62ed68 | 79 | * @retval None |
| giovannivisentini | 1:6d202b62ed68 | 80 | */ |
| giovannivisentini | 1:6d202b62ed68 | 81 | uint16_t M24SR_UpdateCrc(uint8_t ch, uint16_t *lpwCrc) { |
| giovannivisentini | 1:6d202b62ed68 | 82 | ch = (ch ^ (uint8_t) ((*lpwCrc) & 0x00FF)); |
| giovannivisentini | 1:6d202b62ed68 | 83 | ch = (ch ^ (ch << 4)); |
| giovannivisentini | 1:6d202b62ed68 | 84 | *lpwCrc = (*lpwCrc >> 8) ^ ((uint16_t) ch << 8) ^ ((uint16_t) ch << 3) |
| giovannivisentini | 1:6d202b62ed68 | 85 | ^ ((uint16_t) ch >> 4); |
| giovannivisentini | 1:6d202b62ed68 | 86 | |
| giovannivisentini | 1:6d202b62ed68 | 87 | return (*lpwCrc); |
| giovannivisentini | 1:6d202b62ed68 | 88 | } |
| giovannivisentini | 1:6d202b62ed68 | 89 | |
| giovannivisentini | 1:6d202b62ed68 | 90 | /** |
| giovannivisentini | 1:6d202b62ed68 | 91 | * @brief This function returns the CRC 16 |
| giovannivisentini | 1:6d202b62ed68 | 92 | * @param Data : pointer on the data used to compute the CRC16 |
| giovannivisentini | 1:6d202b62ed68 | 93 | * @param Length : number of byte of the data |
| giovannivisentini | 1:6d202b62ed68 | 94 | * @retval CRC16 |
| giovannivisentini | 1:6d202b62ed68 | 95 | */ |
| giovannivisentini | 1:6d202b62ed68 | 96 | uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) { |
| giovannivisentini | 1:6d202b62ed68 | 97 | uint8_t chBlock; |
| giovannivisentini | 1:6d202b62ed68 | 98 | uint16_t wCrc = 0x6363; // ITU-V.41 |
| giovannivisentini | 1:6d202b62ed68 | 99 | |
| giovannivisentini | 1:6d202b62ed68 | 100 | do { |
| giovannivisentini | 1:6d202b62ed68 | 101 | chBlock = *Data++; |
| giovannivisentini | 1:6d202b62ed68 | 102 | M24SR_UpdateCrc(chBlock, &wCrc); |
| giovannivisentini | 1:6d202b62ed68 | 103 | } while (--Length); |
| giovannivisentini | 1:6d202b62ed68 | 104 | |
| giovannivisentini | 1:6d202b62ed68 | 105 | return wCrc; |
| giovannivisentini | 1:6d202b62ed68 | 106 | } |
| giovannivisentini | 1:6d202b62ed68 | 107 | |
| giovannivisentini | 1:6d202b62ed68 | 108 | /** |
| giovannivisentini | 1:6d202b62ed68 | 109 | * @brief This function computes the CRC16 residue as defined by CRC ISO/IEC 13239 |
| giovannivisentini | 1:6d202b62ed68 | 110 | * @param DataIn : input to data |
| giovannivisentini | 2:0648c1561eb2 | 111 | * @param Length : Number of bits of DataIn |
| giovannivisentini | 1:6d202b62ed68 | 112 | * @retval Status (SW1&SW2) : CRC16 residue is correct |
| giovannivisentini | 1:6d202b62ed68 | 113 | * @retval M24SR_ERROR_CRC : CRC16 residue is false |
| giovannivisentini | 1:6d202b62ed68 | 114 | */ |
| giovannivisentini | 1:6d202b62ed68 | 115 | NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue(uint8_t *DataIn, uint8_t Length) { |
| giovannivisentini | 1:6d202b62ed68 | 116 | uint16_t ResCRC = 0x0000; |
| giovannivisentini | 1:6d202b62ed68 | 117 | |
| giovannivisentini | 1:6d202b62ed68 | 118 | /* check the CRC16 Residue */ |
| giovannivisentini | 1:6d202b62ed68 | 119 | if (Length != 0) |
| giovannivisentini | 1:6d202b62ed68 | 120 | ResCRC = M24SR_ComputeCrc(DataIn, Length); |
| giovannivisentini | 1:6d202b62ed68 | 121 | |
| giovannivisentini | 1:6d202b62ed68 | 122 | if (ResCRC == 0x0000) { |
| giovannivisentini | 1:6d202b62ed68 | 123 | /* Good CRC, but error status from M24SR */ |
| giovannivisentini | 1:6d202b62ed68 | 124 | return (NFC_StatusTypeDef) (((DataIn[Length - UB_STATUS_OFFSET] << 8) |
| giovannivisentini | 1:6d202b62ed68 | 125 | & 0xFF00) | (DataIn[Length - LB_STATUS_OFFSET] & 0x00FF)); |
| giovannivisentini | 1:6d202b62ed68 | 126 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 127 | ResCRC = 0x0000; |
| giovannivisentini | 1:6d202b62ed68 | 128 | ResCRC = M24SR_ComputeCrc(DataIn, 5); |
| giovannivisentini | 1:6d202b62ed68 | 129 | if (ResCRC != 0x0000) { |
| giovannivisentini | 1:6d202b62ed68 | 130 | /* Bad CRC */ |
| giovannivisentini | 1:6d202b62ed68 | 131 | return NFC_IO_ERROR_CRC; |
| giovannivisentini | 1:6d202b62ed68 | 132 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 133 | /* Good CRC, but error status from M24SR */ |
| giovannivisentini | 1:6d202b62ed68 | 134 | return (NFC_StatusTypeDef) (((DataIn[1] << 8) & 0xFF00) |
| giovannivisentini | 1:6d202b62ed68 | 135 | | (DataIn[2] & 0x00FF)); |
| giovannivisentini | 1:6d202b62ed68 | 136 | } |
| giovannivisentini | 1:6d202b62ed68 | 137 | } |
| giovannivisentini | 1:6d202b62ed68 | 138 | } |
| giovannivisentini | 1:6d202b62ed68 | 139 | |
| giovannivisentini | 1:6d202b62ed68 | 140 | /** |
| giovannivisentini | 1:6d202b62ed68 | 141 | * @brief This functions creates an I block command according to the structures CommandStructure and data->command. |
| giovannivisentini | 1:6d202b62ed68 | 142 | * @param Command : structue which contains the field of the different parameter |
| giovannivisentini | 1:6d202b62ed68 | 143 | * @param CommandStructure : structure that contain the structure of the command (if the different field are presnet or not |
| giovannivisentini | 1:6d202b62ed68 | 144 | * @param NbByte : number of byte of the command |
| giovannivisentini | 1:6d202b62ed68 | 145 | * @param pCommand : pointer of the command created |
| giovannivisentini | 1:6d202b62ed68 | 146 | */ |
| giovannivisentini | 1:6d202b62ed68 | 147 | void M24SR_BuildIBlockCommand(uint16_t CommandStructure, C_APDU *Command, |
| giovannivisentini | 1:6d202b62ed68 | 148 | uint8_t uDIDbyte, uint16_t *NbByte, uint8_t *pCommand) { |
| giovannivisentini | 1:6d202b62ed68 | 149 | uint16_t uCRC16; |
| giovannivisentini | 1:6d202b62ed68 | 150 | static uint8_t BlockNumber = 0x01; |
| giovannivisentini | 1:6d202b62ed68 | 151 | |
| giovannivisentini | 1:6d202b62ed68 | 152 | (*NbByte) = 0; |
| giovannivisentini | 1:6d202b62ed68 | 153 | |
| giovannivisentini | 1:6d202b62ed68 | 154 | /* add the PCD byte */ |
| giovannivisentini | 1:6d202b62ed68 | 155 | if ((CommandStructure & M24SR_PCB_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 156 | /* toggle the block number */ |
| giovannivisentini | 1:6d202b62ed68 | 157 | BlockNumber = TOGGLE(BlockNumber); |
| giovannivisentini | 1:6d202b62ed68 | 158 | /* Add the I block byte */ |
| giovannivisentini | 1:6d202b62ed68 | 159 | pCommand[(*NbByte)++] = 0x02 | BlockNumber; |
| giovannivisentini | 1:6d202b62ed68 | 160 | } |
| giovannivisentini | 1:6d202b62ed68 | 161 | |
| giovannivisentini | 1:6d202b62ed68 | 162 | /* add the DID byte */ |
| giovannivisentini | 1:6d202b62ed68 | 163 | if ((BlockNumber & M24SR_DID_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 164 | /* Add the I block byte */ |
| giovannivisentini | 1:6d202b62ed68 | 165 | pCommand[(*NbByte)++] = uDIDbyte; |
| giovannivisentini | 1:6d202b62ed68 | 166 | } |
| giovannivisentini | 1:6d202b62ed68 | 167 | |
| giovannivisentini | 1:6d202b62ed68 | 168 | /* add the Class byte */ |
| giovannivisentini | 1:6d202b62ed68 | 169 | if ((CommandStructure & M24SR_CLA_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 170 | pCommand[(*NbByte)++] = Command->Header.CLA; |
| giovannivisentini | 1:6d202b62ed68 | 171 | } |
| giovannivisentini | 1:6d202b62ed68 | 172 | /* add the instruction byte byte */ |
| giovannivisentini | 1:6d202b62ed68 | 173 | if ((CommandStructure & M24SR_INS_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 174 | pCommand[(*NbByte)++] = Command->Header.INS; |
| giovannivisentini | 1:6d202b62ed68 | 175 | } |
| giovannivisentini | 1:6d202b62ed68 | 176 | /* add the Selection Mode byte */ |
| giovannivisentini | 1:6d202b62ed68 | 177 | if ((CommandStructure & M24SR_P1_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 178 | pCommand[(*NbByte)++] = Command->Header.P1; |
| giovannivisentini | 1:6d202b62ed68 | 179 | } |
| giovannivisentini | 1:6d202b62ed68 | 180 | /* add the Selection Mode byte */ |
| giovannivisentini | 1:6d202b62ed68 | 181 | if ((CommandStructure & M24SR_P2_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 182 | pCommand[(*NbByte)++] = Command->Header.P2; |
| giovannivisentini | 1:6d202b62ed68 | 183 | } |
| giovannivisentini | 1:6d202b62ed68 | 184 | /* add Data field lengthbyte */ |
| giovannivisentini | 1:6d202b62ed68 | 185 | if ((CommandStructure & M24SR_LC_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 186 | pCommand[(*NbByte)++] = Command->Body.LC; |
| giovannivisentini | 1:6d202b62ed68 | 187 | } |
| giovannivisentini | 1:6d202b62ed68 | 188 | /* add Data field */ |
| giovannivisentini | 1:6d202b62ed68 | 189 | if ((CommandStructure & M24SR_DATA_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 190 | memcpy(&(pCommand[(*NbByte)]), Command->Body.pData, Command->Body.LC); |
| giovannivisentini | 1:6d202b62ed68 | 191 | (*NbByte) += Command->Body.LC; |
| giovannivisentini | 1:6d202b62ed68 | 192 | } |
| giovannivisentini | 1:6d202b62ed68 | 193 | /* add Le field */ |
| giovannivisentini | 1:6d202b62ed68 | 194 | if ((CommandStructure & M24SR_LE_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 195 | pCommand[(*NbByte)++] = Command->Body.LE; |
| giovannivisentini | 1:6d202b62ed68 | 196 | } |
| giovannivisentini | 1:6d202b62ed68 | 197 | /* add CRC field */ |
| giovannivisentini | 1:6d202b62ed68 | 198 | if ((CommandStructure & M24SR_CRC_NEEDED) != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 199 | uCRC16 = M24SR_ComputeCrc(pCommand, (uint8_t) (*NbByte)); |
| giovannivisentini | 1:6d202b62ed68 | 200 | /* append the CRC16 */ |
| giovannivisentini | 1:6d202b62ed68 | 201 | pCommand[(*NbByte)++] = GETLSB(uCRC16); |
| giovannivisentini | 1:6d202b62ed68 | 202 | pCommand[(*NbByte)++] = GETMSB(uCRC16); |
| giovannivisentini | 1:6d202b62ed68 | 203 | } |
| giovannivisentini | 1:6d202b62ed68 | 204 | |
| giovannivisentini | 1:6d202b62ed68 | 205 | } |
| giovannivisentini | 1:6d202b62ed68 | 206 | |
| giovannivisentini | 1:6d202b62ed68 | 207 | #if 0 |
| giovannivisentini | 1:6d202b62ed68 | 208 | /** |
| giovannivisentini | 1:6d202b62ed68 | 209 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an I-block |
| giovannivisentini | 1:6d202b62ed68 | 210 | * @param pBuffer : pointer of the data |
| giovannivisentini | 1:6d202b62ed68 | 211 | * @retval M24SR_STATUS_SUCCESS : the data is a I-Block |
| giovannivisentini | 1:6d202b62ed68 | 212 | * @retval M24SR_ERROR_DEFAULT : the data is not a I-Block |
| giovannivisentini | 1:6d202b62ed68 | 213 | */ |
| giovannivisentini | 1:6d202b62ed68 | 214 | static int8_t IsIBlock (uint8_t *pBuffer) |
| giovannivisentini | 1:6d202b62ed68 | 215 | { |
| giovannivisentini | 1:6d202b62ed68 | 216 | |
| giovannivisentini | 1:6d202b62ed68 | 217 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_IBLOCK) |
| giovannivisentini | 1:6d202b62ed68 | 218 | { |
| giovannivisentini | 1:6d202b62ed68 | 219 | return M24SR_STATUS_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 220 | } |
| giovannivisentini | 1:6d202b62ed68 | 221 | else |
| giovannivisentini | 1:6d202b62ed68 | 222 | { |
| giovannivisentini | 1:6d202b62ed68 | 223 | return M24SR_ERROR_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 224 | } |
| giovannivisentini | 1:6d202b62ed68 | 225 | |
| giovannivisentini | 1:6d202b62ed68 | 226 | } |
| giovannivisentini | 1:6d202b62ed68 | 227 | |
| giovannivisentini | 1:6d202b62ed68 | 228 | /** |
| giovannivisentini | 1:6d202b62ed68 | 229 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an R-block |
| giovannivisentini | 1:6d202b62ed68 | 230 | * @param pBuffer : pointer of the data |
| giovannivisentini | 1:6d202b62ed68 | 231 | * @retval M24SR_STATUS_SUCCESS : the data is a R-Block |
| giovannivisentini | 1:6d202b62ed68 | 232 | * @retval M24SR_ERROR_DEFAULT : the data is not a R-Block |
| giovannivisentini | 1:6d202b62ed68 | 233 | */ |
| giovannivisentini | 1:6d202b62ed68 | 234 | static int8_t IsRBlock (uint8_t *pBuffer) |
| giovannivisentini | 1:6d202b62ed68 | 235 | { |
| giovannivisentini | 1:6d202b62ed68 | 236 | |
| giovannivisentini | 1:6d202b62ed68 | 237 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_RBLOCK) |
| giovannivisentini | 1:6d202b62ed68 | 238 | { |
| giovannivisentini | 1:6d202b62ed68 | 239 | return M24SR_STATUS_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 240 | } |
| giovannivisentini | 1:6d202b62ed68 | 241 | else |
| giovannivisentini | 1:6d202b62ed68 | 242 | { |
| giovannivisentini | 1:6d202b62ed68 | 243 | return M24SR_ERROR_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 244 | } |
| giovannivisentini | 1:6d202b62ed68 | 245 | |
| giovannivisentini | 1:6d202b62ed68 | 246 | } |
| giovannivisentini | 1:6d202b62ed68 | 247 | #endif |
| giovannivisentini | 1:6d202b62ed68 | 248 | |
| giovannivisentini | 1:6d202b62ed68 | 249 | /** |
| giovannivisentini | 1:6d202b62ed68 | 250 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an s-block |
| giovannivisentini | 1:6d202b62ed68 | 251 | * @param pBuffer : pointer of the data |
| giovannivisentini | 1:6d202b62ed68 | 252 | * @retval M24SR_STATUS_SUCCESS : the data is a S-Block |
| giovannivisentini | 1:6d202b62ed68 | 253 | * @retval M24SR_ERROR_DEFAULT : the data is not a S-Block |
| giovannivisentini | 1:6d202b62ed68 | 254 | */ |
| giovannivisentini | 1:6d202b62ed68 | 255 | static NFC_StatusTypeDef IsSBlock(uint8_t *pBuffer) { |
| giovannivisentini | 1:6d202b62ed68 | 256 | |
| giovannivisentini | 1:6d202b62ed68 | 257 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) { |
| giovannivisentini | 1:6d202b62ed68 | 258 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 259 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 260 | return NFC_ERROR; |
| giovannivisentini | 1:6d202b62ed68 | 261 | } |
| giovannivisentini | 1:6d202b62ed68 | 262 | |
| giovannivisentini | 1:6d202b62ed68 | 263 | } |
| giovannivisentini | 1:6d202b62ed68 | 264 | |
| giovannivisentini | 1:6d202b62ed68 | 265 | /** |
| giovannivisentini | 1:6d202b62ed68 | 266 | * @brief This function sends the FWT extension command (S-Block format) |
| giovannivisentini | 1:6d202b62ed68 | 267 | * @param FWTbyte : FWT value |
| giovannivisentini | 1:6d202b62ed68 | 268 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 269 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 270 | */ |
| giovannivisentini | 1:6d202b62ed68 | 271 | NFC_StatusTypeDef M24SR::M24SR_FWTExtension(uint8_t FWTbyte) { |
| giovannivisentini | 1:6d202b62ed68 | 272 | uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 1:6d202b62ed68 | 273 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 274 | uint8_t NthByte = 0; |
| giovannivisentini | 1:6d202b62ed68 | 275 | uint16_t uCRC16; |
| giovannivisentini | 1:6d202b62ed68 | 276 | |
| giovannivisentini | 1:6d202b62ed68 | 277 | /* create the response */ |
| giovannivisentini | 1:6d202b62ed68 | 278 | pBuffer[NthByte++] = 0xF2; |
| giovannivisentini | 1:6d202b62ed68 | 279 | pBuffer[NthByte++] = FWTbyte; |
| giovannivisentini | 1:6d202b62ed68 | 280 | /* compute the CRC */ |
| giovannivisentini | 1:6d202b62ed68 | 281 | uCRC16 = M24SR_ComputeCrc(pBuffer, 0x02); |
| giovannivisentini | 1:6d202b62ed68 | 282 | /* append the CRC16 */ |
| giovannivisentini | 1:6d202b62ed68 | 283 | pBuffer[NthByte++] = GETLSB(uCRC16); |
| giovannivisentini | 1:6d202b62ed68 | 284 | pBuffer[NthByte++] = GETMSB(uCRC16); |
| giovannivisentini | 1:6d202b62ed68 | 285 | |
| giovannivisentini | 1:6d202b62ed68 | 286 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 287 | errchk(M24SR_IO_SendI2Ccommand(NthByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 288 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 289 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 290 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 291 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 292 | |
| giovannivisentini | 1:6d202b62ed68 | 293 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 294 | |
| giovannivisentini | 1:6d202b62ed68 | 295 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 296 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 297 | else |
| giovannivisentini | 1:6d202b62ed68 | 298 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 299 | } |
| giovannivisentini | 1:6d202b62ed68 | 300 | |
| giovannivisentini | 1:6d202b62ed68 | 301 | /** |
| giovannivisentini | 1:6d202b62ed68 | 302 | * @brief This function sends the KillSession command to the M24SR device |
| giovannivisentini | 1:6d202b62ed68 | 303 | * @param None |
| giovannivisentini | 2:0648c1561eb2 | 304 | * @retval NFC_SUCCESS : the function is successful. |
| giovannivisentini | 2:0648c1561eb2 | 305 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 306 | */ |
| giovannivisentini | 1:6d202b62ed68 | 307 | NFC_StatusTypeDef M24SR::M24SR_KillSession(void) { |
| giovannivisentini | 1:6d202b62ed68 | 308 | uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND; |
| giovannivisentini | 1:6d202b62ed68 | 309 | |
| giovannivisentini | 1:6d202b62ed68 | 310 | errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 311 | |
| giovannivisentini | 1:6d202b62ed68 | 312 | /* Insure no access will be done just after open session */ |
| giovannivisentini | 1:6d202b62ed68 | 313 | /* The only way here is to poll I2C to know when M24SR is ready */ |
| giovannivisentini | 1:6d202b62ed68 | 314 | /* GPO can not be use with KillSession command */ |
| giovannivisentini | 1:6d202b62ed68 | 315 | errchk(M24SR_IO_PollI2C()); |
| giovannivisentini | 1:6d202b62ed68 | 316 | |
| giovannivisentini | 1:6d202b62ed68 | 317 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 318 | } |
| giovannivisentini | 1:6d202b62ed68 | 319 | |
| giovannivisentini | 1:6d202b62ed68 | 320 | /** |
| giovannivisentini | 1:6d202b62ed68 | 321 | * @brief This function sends the Deselect command (S-Block format) |
| giovannivisentini | 2:0648c1561eb2 | 322 | * @retval NFC_SUCCESS : the function is successful. |
| giovannivisentini | 2:0648c1561eb2 | 323 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 324 | */ |
| giovannivisentini | 1:6d202b62ed68 | 325 | NFC_StatusTypeDef M24SR::M24SR_Deselect(void) { |
| giovannivisentini | 1:6d202b62ed68 | 326 | uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND; |
| giovannivisentini | 1:6d202b62ed68 | 327 | |
| giovannivisentini | 1:6d202b62ed68 | 328 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 329 | errchk(M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 330 | |
| giovannivisentini | 1:6d202b62ed68 | 331 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 332 | /* flush the M24SR buffer */ |
| giovannivisentini | 1:6d202b62ed68 | 333 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 334 | |
| giovannivisentini | 1:6d202b62ed68 | 335 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 336 | } |
| giovannivisentini | 1:6d202b62ed68 | 337 | |
| giovannivisentini | 1:6d202b62ed68 | 338 | /** |
| giovannivisentini | 1:6d202b62ed68 | 339 | * @brief This function sends the SelectApplication command |
| giovannivisentini | 2:0648c1561eb2 | 340 | * @retval NFC_SUCCESS : the function is successful. |
| giovannivisentini | 2:0648c1561eb2 | 341 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 342 | */ |
| giovannivisentini | 1:6d202b62ed68 | 343 | NFC_StatusTypeDef M24SR::M24SR_SelectApplication(void) { |
| giovannivisentini | 1:6d202b62ed68 | 344 | |
| giovannivisentini | 1:6d202b62ed68 | 345 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 346 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 347 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 1:6d202b62ed68 | 348 | uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND; |
| giovannivisentini | 1:6d202b62ed68 | 349 | uint8_t uLe = 0x00; |
| giovannivisentini | 1:6d202b62ed68 | 350 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 351 | uint16_t uP1P2 =0x0400, |
| giovannivisentini | 1:6d202b62ed68 | 352 | NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 353 | |
| giovannivisentini | 1:6d202b62ed68 | 354 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 355 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 356 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 1:6d202b62ed68 | 357 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 358 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 359 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 360 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 361 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 1:6d202b62ed68 | 362 | /* copy the data */ |
| giovannivisentini | 1:6d202b62ed68 | 363 | command.Body.pData = pDataOut; |
| giovannivisentini | 1:6d202b62ed68 | 364 | /* copy the number of byte to read */ |
| giovannivisentini | 1:6d202b62ed68 | 365 | command.Body.LE = uLe; |
| giovannivisentini | 1:6d202b62ed68 | 366 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 367 | M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command, |
| giovannivisentini | 1:6d202b62ed68 | 368 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 369 | |
| giovannivisentini | 1:6d202b62ed68 | 370 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 371 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 372 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 373 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 374 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 375 | |
| giovannivisentini | 1:6d202b62ed68 | 376 | status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 377 | |
| giovannivisentini | 1:6d202b62ed68 | 378 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 379 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 380 | else |
| giovannivisentini | 1:6d202b62ed68 | 381 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 382 | |
| giovannivisentini | 1:6d202b62ed68 | 383 | } |
| giovannivisentini | 1:6d202b62ed68 | 384 | |
| giovannivisentini | 1:6d202b62ed68 | 385 | /** |
| giovannivisentini | 1:6d202b62ed68 | 386 | * @brief This function initialize the M24SR device |
| giovannivisentini | 1:6d202b62ed68 | 387 | * @retval None |
| giovannivisentini | 1:6d202b62ed68 | 388 | */ |
| giovannivisentini | 1:6d202b62ed68 | 389 | NFC_StatusTypeDef M24SR::M24SR_Init(NFC_InitTypeDef *notUsed) { |
| giovannivisentini | 1:6d202b62ed68 | 390 | (void) notUsed; |
| giovannivisentini | 1:6d202b62ed68 | 391 | |
| giovannivisentini | 1:6d202b62ed68 | 392 | errchk(M24SR_KillSession()) |
| giovannivisentini | 1:6d202b62ed68 | 393 | errchk(M24SR_ManageI2CGPO(I2C_ANSWER_READY)) |
| giovannivisentini | 1:6d202b62ed68 | 394 | errchk(M24SR_Deselect()) |
| giovannivisentini | 1:6d202b62ed68 | 395 | |
| giovannivisentini | 1:6d202b62ed68 | 396 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 397 | } |
| giovannivisentini | 1:6d202b62ed68 | 398 | |
| giovannivisentini | 1:6d202b62ed68 | 399 | NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) { |
| giovannivisentini | 1:6d202b62ed68 | 400 | if (!nfc_id) { |
| giovannivisentini | 1:6d202b62ed68 | 401 | return NFC_ERROR; |
| giovannivisentini | 1:6d202b62ed68 | 402 | } |
| giovannivisentini | 1:6d202b62ed68 | 403 | |
| giovannivisentini | 1:6d202b62ed68 | 404 | errchk(M24SR_SelectApplication()) |
| giovannivisentini | 1:6d202b62ed68 | 405 | |
| giovannivisentini | 1:6d202b62ed68 | 406 | return M24SR_ReadBinary(0x0011, 1, nfc_id); |
| giovannivisentini | 1:6d202b62ed68 | 407 | } |
| giovannivisentini | 1:6d202b62ed68 | 408 | |
| giovannivisentini | 1:6d202b62ed68 | 409 | /** |
| giovannivisentini | 1:6d202b62ed68 | 410 | * @brief This function sends the GetSession command to the M24SR device |
| giovannivisentini | 2:0648c1561eb2 | 411 | * @retval NFC_SUCCESS : the function is successful. |
| giovannivisentini | 1:6d202b62ed68 | 412 | * @retval Status (SW1&SW2) : if operation does not complete. |
| giovannivisentini | 1:6d202b62ed68 | 413 | */ |
| giovannivisentini | 1:6d202b62ed68 | 414 | NFC_StatusTypeDef M24SR::M24SR_GetSession(void) { |
| giovannivisentini | 1:6d202b62ed68 | 415 | uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND; |
| giovannivisentini | 1:6d202b62ed68 | 416 | |
| giovannivisentini | 1:6d202b62ed68 | 417 | errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 418 | |
| giovannivisentini | 1:6d202b62ed68 | 419 | /* Insure no access will be done just after open session */ |
| giovannivisentini | 1:6d202b62ed68 | 420 | /* The only way here is to poll I2C to know when M24SR is ready */ |
| giovannivisentini | 1:6d202b62ed68 | 421 | /* GPO can not be use with GetSession command */ |
| giovannivisentini | 1:6d202b62ed68 | 422 | errchk(M24SR_IO_PollI2C()); |
| giovannivisentini | 1:6d202b62ed68 | 423 | |
| giovannivisentini | 1:6d202b62ed68 | 424 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 425 | |
| giovannivisentini | 1:6d202b62ed68 | 426 | } |
| giovannivisentini | 1:6d202b62ed68 | 427 | |
| giovannivisentini | 1:6d202b62ed68 | 428 | /** |
| giovannivisentini | 1:6d202b62ed68 | 429 | * @brief This function sends the SelectCCFile command |
| giovannivisentini | 2:0648c1561eb2 | 430 | * @retval NFC_SUCCESS : the function is successful. |
| giovannivisentini | 2:0648c1561eb2 | 431 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 432 | * @retval Status (SW1&SW2) : if operation does not complete for another reason. |
| giovannivisentini | 1:6d202b62ed68 | 433 | */ |
| giovannivisentini | 1:6d202b62ed68 | 434 | NFC_StatusTypeDef M24SR::M24SR_SelectCCfile(void) { |
| giovannivisentini | 1:6d202b62ed68 | 435 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 436 | |
| giovannivisentini | 1:6d202b62ed68 | 437 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 438 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 1:6d202b62ed68 | 439 | uint8_t pDataOut[] = CC_FILE_ID_BYTES; |
| giovannivisentini | 1:6d202b62ed68 | 440 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 441 | uint16_t uP1P2 =0x000C, |
| giovannivisentini | 1:6d202b62ed68 | 442 | NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 443 | |
| giovannivisentini | 1:6d202b62ed68 | 444 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 445 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 446 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 1:6d202b62ed68 | 447 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 448 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 449 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 450 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 451 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 1:6d202b62ed68 | 452 | command.Body.pData = pDataOut; |
| giovannivisentini | 1:6d202b62ed68 | 453 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 454 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 455 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 456 | |
| giovannivisentini | 1:6d202b62ed68 | 457 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 458 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 459 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 460 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 461 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 462 | |
| giovannivisentini | 1:6d202b62ed68 | 463 | status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 464 | |
| giovannivisentini | 1:6d202b62ed68 | 465 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 466 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 467 | else |
| giovannivisentini | 1:6d202b62ed68 | 468 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 469 | } |
| giovannivisentini | 1:6d202b62ed68 | 470 | |
| giovannivisentini | 1:6d202b62ed68 | 471 | /** |
| giovannivisentini | 1:6d202b62ed68 | 472 | * @brief This function sends the SelectSystemFile command |
| giovannivisentini | 1:6d202b62ed68 | 473 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 474 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 475 | */ |
| giovannivisentini | 1:6d202b62ed68 | 476 | NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile(void) { |
| giovannivisentini | 1:6d202b62ed68 | 477 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 478 | |
| giovannivisentini | 1:6d202b62ed68 | 479 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 480 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 1:6d202b62ed68 | 481 | uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES; |
| giovannivisentini | 1:6d202b62ed68 | 482 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 483 | uint16_t uP1P2 =0x000C, |
| giovannivisentini | 1:6d202b62ed68 | 484 | NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 485 | |
| giovannivisentini | 1:6d202b62ed68 | 486 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 487 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 488 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 1:6d202b62ed68 | 489 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 490 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 491 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 492 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 493 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 1:6d202b62ed68 | 494 | command.Body.pData = pDataOut; |
| giovannivisentini | 1:6d202b62ed68 | 495 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 496 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 497 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 498 | |
| giovannivisentini | 1:6d202b62ed68 | 499 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 500 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 501 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 502 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 503 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 504 | |
| giovannivisentini | 1:6d202b62ed68 | 505 | status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 506 | |
| giovannivisentini | 1:6d202b62ed68 | 507 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 508 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 509 | else |
| giovannivisentini | 1:6d202b62ed68 | 510 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 511 | } |
| giovannivisentini | 1:6d202b62ed68 | 512 | |
| giovannivisentini | 1:6d202b62ed68 | 513 | /** |
| giovannivisentini | 1:6d202b62ed68 | 514 | * @brief This function sends the SelectNDEFfile command |
| giovannivisentini | 1:6d202b62ed68 | 515 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 516 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 517 | */ |
| giovannivisentini | 1:6d202b62ed68 | 518 | NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile(uint16_t NDEFfileId) { |
| giovannivisentini | 1:6d202b62ed68 | 519 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 520 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 521 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 1:6d202b62ed68 | 522 | uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) }; |
| giovannivisentini | 1:6d202b62ed68 | 523 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 524 | uint16_t uP1P2 = 0x000C, NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 525 | |
| giovannivisentini | 1:6d202b62ed68 | 526 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 527 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 528 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 1:6d202b62ed68 | 529 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 530 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 531 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 532 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 533 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 1:6d202b62ed68 | 534 | command.Body.pData = pDataOut; |
| giovannivisentini | 1:6d202b62ed68 | 535 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 536 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 537 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 538 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 539 | |
| giovannivisentini | 1:6d202b62ed68 | 540 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 541 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 542 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 543 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 544 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 545 | |
| giovannivisentini | 1:6d202b62ed68 | 546 | status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn)); |
| giovannivisentini | 1:6d202b62ed68 | 547 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 548 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 549 | else |
| giovannivisentini | 1:6d202b62ed68 | 550 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 551 | |
| giovannivisentini | 1:6d202b62ed68 | 552 | } |
| giovannivisentini | 1:6d202b62ed68 | 553 | |
| giovannivisentini | 1:6d202b62ed68 | 554 | /** |
| giovannivisentini | 1:6d202b62ed68 | 555 | * @brief This function sends a read binary command |
| giovannivisentini | 1:6d202b62ed68 | 556 | * @param Offset : first byte to read |
| giovannivisentini | 1:6d202b62ed68 | 557 | * @param NbByteToRead : number of byte to read |
| giovannivisentini | 1:6d202b62ed68 | 558 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 1:6d202b62ed68 | 559 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 560 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 561 | */ |
| giovannivisentini | 1:6d202b62ed68 | 562 | NFC_StatusTypeDef M24SR::M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead, |
| giovannivisentini | 1:6d202b62ed68 | 563 | uint8_t *pBufferRead) { |
| giovannivisentini | 1:6d202b62ed68 | 564 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 565 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 566 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 567 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 568 | |
| giovannivisentini | 1:6d202b62ed68 | 569 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 570 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 571 | command.Header.INS = C_APDU_READ_BINARY; |
| giovannivisentini | 1:6d202b62ed68 | 572 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 573 | command.Header.P1 = GETMSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 574 | command.Header.P2 = GETLSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 575 | /* copy the number of byte to read */ |
| giovannivisentini | 1:6d202b62ed68 | 576 | command.Body.LE = NbByteToRead; |
| giovannivisentini | 1:6d202b62ed68 | 577 | |
| giovannivisentini | 1:6d202b62ed68 | 578 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 579 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 580 | |
| giovannivisentini | 1:6d202b62ed68 | 581 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 582 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 583 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 584 | M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 585 | |
| giovannivisentini | 1:6d202b62ed68 | 586 | status = M24SR_IsCorrectCRC16Residue(pBuffer, |
| giovannivisentini | 1:6d202b62ed68 | 587 | NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 588 | if(status != NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 589 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 590 | /* retrieve the data without SW1 & SW2 as provided as return value of the function */ |
| giovannivisentini | 1:6d202b62ed68 | 591 | memcpy(pBufferRead, &pBuffer[1], NbByteToRead); |
| giovannivisentini | 1:6d202b62ed68 | 592 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 593 | |
| giovannivisentini | 1:6d202b62ed68 | 594 | } |
| giovannivisentini | 1:6d202b62ed68 | 595 | |
| giovannivisentini | 1:6d202b62ed68 | 596 | /** |
| giovannivisentini | 1:6d202b62ed68 | 597 | * @brief This function sends a ST read binary command (no error if access is not inside NDEF file) |
| giovannivisentini | 1:6d202b62ed68 | 598 | * @param Offset : first byte to read |
| giovannivisentini | 1:6d202b62ed68 | 599 | * @param NbByteToRead : number of byte to read |
| giovannivisentini | 1:6d202b62ed68 | 600 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 1:6d202b62ed68 | 601 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 602 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 603 | */ |
| giovannivisentini | 1:6d202b62ed68 | 604 | NFC_StatusTypeDef M24SR::M24SR_STReadBinary(uint16_t Offset, |
| giovannivisentini | 1:6d202b62ed68 | 605 | uint8_t NbByteToRead, uint8_t *pBufferRead) { |
| giovannivisentini | 1:6d202b62ed68 | 606 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 607 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 608 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 609 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 610 | |
| giovannivisentini | 1:6d202b62ed68 | 611 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 612 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 1:6d202b62ed68 | 613 | command.Header.INS = C_APDU_READ_BINARY; |
| giovannivisentini | 1:6d202b62ed68 | 614 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 615 | command.Header.P1 = GETMSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 616 | command.Header.P2 = GETLSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 617 | /* copy the number of byte to read */ |
| giovannivisentini | 1:6d202b62ed68 | 618 | command.Body.LE = NbByteToRead; |
| giovannivisentini | 1:6d202b62ed68 | 619 | |
| giovannivisentini | 1:6d202b62ed68 | 620 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 621 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 622 | |
| giovannivisentini | 1:6d202b62ed68 | 623 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 624 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 625 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 626 | M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 627 | |
| giovannivisentini | 1:6d202b62ed68 | 628 | status = M24SR_IsCorrectCRC16Residue(pBuffer, |
| giovannivisentini | 1:6d202b62ed68 | 629 | NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 630 | |
| giovannivisentini | 1:6d202b62ed68 | 631 | if(status != NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 632 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 633 | /* retrieve the data without SW1 & SW2 as provided as return value of the function */ |
| giovannivisentini | 1:6d202b62ed68 | 634 | memcpy(pBufferRead, &pBuffer[1], NbByteToRead); |
| giovannivisentini | 1:6d202b62ed68 | 635 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 636 | } |
| giovannivisentini | 1:6d202b62ed68 | 637 | |
| giovannivisentini | 1:6d202b62ed68 | 638 | /** |
| giovannivisentini | 1:6d202b62ed68 | 639 | * @brief This function sends a Update binary command |
| giovannivisentini | 1:6d202b62ed68 | 640 | * @param Offset : first byte to read |
| giovannivisentini | 1:6d202b62ed68 | 641 | * @param NbByteToWrite : number of byte to write |
| giovannivisentini | 1:6d202b62ed68 | 642 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 1:6d202b62ed68 | 643 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 644 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 645 | */ |
| giovannivisentini | 1:6d202b62ed68 | 646 | NFC_StatusTypeDef M24SR::M24SR_UpdateBinary(uint16_t Offset, |
| giovannivisentini | 1:6d202b62ed68 | 647 | uint8_t NbByteToWrite, uint8_t *pDataToWrite) { |
| giovannivisentini | 1:6d202b62ed68 | 648 | //TODO check the length of the data to write |
| giovannivisentini | 1:6d202b62ed68 | 649 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 650 | |
| giovannivisentini | 1:6d202b62ed68 | 651 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 652 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 653 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 654 | |
| giovannivisentini | 1:6d202b62ed68 | 655 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 656 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 657 | command.Header.INS = C_APDU_UPDATE_BINARY; |
| giovannivisentini | 1:6d202b62ed68 | 658 | /* copy the offset */ |
| giovannivisentini | 1:6d202b62ed68 | 659 | command.Header.P1 = GETMSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 660 | command.Header.P2 = GETLSB(Offset); |
| giovannivisentini | 1:6d202b62ed68 | 661 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 662 | command.Body.LC = NbByteToWrite; |
| giovannivisentini | 1:6d202b62ed68 | 663 | command.Body.pData = pDataToWrite; |
| giovannivisentini | 1:6d202b62ed68 | 664 | /* copy the File Id */ |
| giovannivisentini | 1:6d202b62ed68 | 665 | //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite ); |
| giovannivisentini | 1:6d202b62ed68 | 666 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 667 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 668 | |
| giovannivisentini | 1:6d202b62ed68 | 669 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 670 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 671 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 672 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 673 | /* if the response is a Watiting frame extenstion request */ |
| giovannivisentini | 1:6d202b62ed68 | 674 | |
| giovannivisentini | 1:6d202b62ed68 | 675 | if (IsSBlock(pBuffer) == NFC_SUCCESS) { |
| giovannivisentini | 1:6d202b62ed68 | 676 | /*check the CRC */ |
| giovannivisentini | 1:6d202b62ed68 | 677 | status =M24SR_IsCorrectCRC16Residue(pBuffer, |
| giovannivisentini | 1:6d202b62ed68 | 678 | M24SR_WATINGTIMEEXTRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 679 | // TODO: why if we check ==NFC_Commandsuccess it fail? |
| giovannivisentini | 1:6d202b62ed68 | 680 | if (status != NFC_IO_ERROR_CRC) { |
| giovannivisentini | 1:6d202b62ed68 | 681 | /* send the FrameExension response*/ |
| giovannivisentini | 1:6d202b62ed68 | 682 | errchk(M24SR_FWTExtension(pBuffer[M24SR_OFFSET_PCB + 1])); |
| giovannivisentini | 1:6d202b62ed68 | 683 | }else |
| giovannivisentini | 1:6d202b62ed68 | 684 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 685 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 686 | status = M24SR_IsCorrectCRC16Residue(pBuffer, |
| giovannivisentini | 1:6d202b62ed68 | 687 | M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 688 | if(status!=NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 689 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 690 | } |
| giovannivisentini | 1:6d202b62ed68 | 691 | |
| giovannivisentini | 1:6d202b62ed68 | 692 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 693 | |
| giovannivisentini | 1:6d202b62ed68 | 694 | } |
| giovannivisentini | 1:6d202b62ed68 | 695 | |
| giovannivisentini | 1:6d202b62ed68 | 696 | /** |
| giovannivisentini | 1:6d202b62ed68 | 697 | * @brief This function sends the Verify command |
| giovannivisentini | 1:6d202b62ed68 | 698 | * @param uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd) |
| giovannivisentini | 1:6d202b62ed68 | 699 | * @param NbPwdByte : Number of byte ( 0x00 or 0x10) |
| giovannivisentini | 1:6d202b62ed68 | 700 | * @param pPwd : pointer on the passwaord |
| giovannivisentini | 1:6d202b62ed68 | 701 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 702 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 703 | */ |
| giovannivisentini | 1:6d202b62ed68 | 704 | NFC_StatusTypeDef M24SR::M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte, |
| giovannivisentini | 1:6d202b62ed68 | 705 | const uint8_t *pPwd) { |
| giovannivisentini | 1:6d202b62ed68 | 706 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 707 | |
| giovannivisentini | 1:6d202b62ed68 | 708 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 709 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 710 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 711 | |
| giovannivisentini | 1:6d202b62ed68 | 712 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 713 | if (uPwdId > 0x0003) { |
| giovannivisentini | 1:6d202b62ed68 | 714 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 715 | } |
| giovannivisentini | 1:6d202b62ed68 | 716 | if ((NbPwdByte != 0x00) && (NbPwdByte != 0x10)) { |
| giovannivisentini | 1:6d202b62ed68 | 717 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 718 | } |
| giovannivisentini | 1:6d202b62ed68 | 719 | |
| giovannivisentini | 1:6d202b62ed68 | 720 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 721 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 722 | command.Header.INS = C_APDU_VERIFY; |
| giovannivisentini | 1:6d202b62ed68 | 723 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 724 | command.Header.P1 = GETMSB(uPwdId); |
| giovannivisentini | 1:6d202b62ed68 | 725 | command.Header.P2 = GETLSB(uPwdId); |
| giovannivisentini | 1:6d202b62ed68 | 726 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 727 | command.Body.LC = NbPwdByte; |
| giovannivisentini | 1:6d202b62ed68 | 728 | |
| giovannivisentini | 1:6d202b62ed68 | 729 | if (NbPwdByte == 0x10) { |
| giovannivisentini | 1:6d202b62ed68 | 730 | /* copy the password */ |
| giovannivisentini | 1:6d202b62ed68 | 731 | command.Body.pData = pPwd; |
| giovannivisentini | 1:6d202b62ed68 | 732 | /* build the I2C command */ |
| giovannivisentini | 1:6d202b62ed68 | 733 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command, |
| giovannivisentini | 1:6d202b62ed68 | 734 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 735 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 736 | command.Body.pData = NULL; |
| giovannivisentini | 1:6d202b62ed68 | 737 | /* build the I2C command */ |
| giovannivisentini | 1:6d202b62ed68 | 738 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command, |
| giovannivisentini | 1:6d202b62ed68 | 739 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 740 | } |
| giovannivisentini | 1:6d202b62ed68 | 741 | |
| giovannivisentini | 1:6d202b62ed68 | 742 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 743 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 744 | /* wait for answer ready */ |
| giovannivisentini | 1:6d202b62ed68 | 745 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 746 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 747 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 748 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 749 | |
| giovannivisentini | 1:6d202b62ed68 | 750 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 751 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 752 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 753 | else |
| giovannivisentini | 1:6d202b62ed68 | 754 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 755 | |
| giovannivisentini | 1:6d202b62ed68 | 756 | } |
| giovannivisentini | 1:6d202b62ed68 | 757 | |
| giovannivisentini | 1:6d202b62ed68 | 758 | /** |
| giovannivisentini | 1:6d202b62ed68 | 759 | * @brief This function sends the ChangeReferenceData command |
| giovannivisentini | 1:6d202b62ed68 | 760 | * @param uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd) |
| giovannivisentini | 1:6d202b62ed68 | 761 | * @param pPwd : pointer on the passwaord |
| giovannivisentini | 1:6d202b62ed68 | 762 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 763 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 764 | */ |
| giovannivisentini | 1:6d202b62ed68 | 765 | NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData(uint16_t uPwdId, |
| giovannivisentini | 1:6d202b62ed68 | 766 | uint8_t *pPwd) { |
| giovannivisentini | 1:6d202b62ed68 | 767 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 768 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 769 | NFC_StatusTypeDef status; |
| giovannivisentini | 1:6d202b62ed68 | 770 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 771 | |
| giovannivisentini | 1:6d202b62ed68 | 772 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 773 | if (uPwdId > 0x0003) { |
| giovannivisentini | 1:6d202b62ed68 | 774 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 775 | } |
| giovannivisentini | 1:6d202b62ed68 | 776 | |
| giovannivisentini | 1:6d202b62ed68 | 777 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 778 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 779 | command.Header.INS = C_APDU_CHANGE; |
| giovannivisentini | 1:6d202b62ed68 | 780 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 781 | command.Header.P1 = GETMSB(uPwdId); |
| giovannivisentini | 1:6d202b62ed68 | 782 | command.Header.P2 = GETLSB(uPwdId); |
| giovannivisentini | 1:6d202b62ed68 | 783 | /* copy the number of byte of the data field */ |
| giovannivisentini | 1:6d202b62ed68 | 784 | command.Body.LC = M24SR_PASSWORD_NBBYTE; |
| giovannivisentini | 1:6d202b62ed68 | 785 | /* copy the password */ |
| giovannivisentini | 1:6d202b62ed68 | 786 | command.Body.pData = pPwd; |
| giovannivisentini | 1:6d202b62ed68 | 787 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 788 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 789 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 790 | |
| giovannivisentini | 1:6d202b62ed68 | 791 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 792 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 793 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 794 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 795 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 796 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 797 | |
| giovannivisentini | 1:6d202b62ed68 | 798 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 799 | |
| giovannivisentini | 1:6d202b62ed68 | 800 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 801 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 802 | else |
| giovannivisentini | 1:6d202b62ed68 | 803 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 804 | } |
| giovannivisentini | 1:6d202b62ed68 | 805 | |
| giovannivisentini | 1:6d202b62ed68 | 806 | /** |
| giovannivisentini | 1:6d202b62ed68 | 807 | * @brief This function sends the EnableVerificationRequirement command |
| giovannivisentini | 1:6d202b62ed68 | 808 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 1:6d202b62ed68 | 809 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 810 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 811 | */ |
| giovannivisentini | 1:6d202b62ed68 | 812 | NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement( |
| giovannivisentini | 1:6d202b62ed68 | 813 | uint16_t uReadOrWrite) { |
| giovannivisentini | 1:6d202b62ed68 | 814 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 815 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 816 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 817 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 818 | |
| giovannivisentini | 1:6d202b62ed68 | 819 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 820 | if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) { |
| giovannivisentini | 1:6d202b62ed68 | 821 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 822 | } |
| giovannivisentini | 1:6d202b62ed68 | 823 | |
| giovannivisentini | 1:6d202b62ed68 | 824 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 825 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 826 | command.Header.INS = C_APDU_ENABLE; |
| giovannivisentini | 1:6d202b62ed68 | 827 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 828 | command.Header.P1 = GETMSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 829 | command.Header.P2 = GETLSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 830 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 831 | M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, |
| giovannivisentini | 1:6d202b62ed68 | 832 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 833 | |
| giovannivisentini | 1:6d202b62ed68 | 834 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 835 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 836 | /* The right access to be updated in EEPROM need at least 6ms */ |
| giovannivisentini | 1:6d202b62ed68 | 837 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 838 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 839 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 840 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 841 | |
| giovannivisentini | 1:6d202b62ed68 | 842 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 843 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 844 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 845 | else |
| giovannivisentini | 1:6d202b62ed68 | 846 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 847 | } |
| giovannivisentini | 1:6d202b62ed68 | 848 | |
| giovannivisentini | 1:6d202b62ed68 | 849 | /** |
| giovannivisentini | 1:6d202b62ed68 | 850 | * @brief This function sends the DisableVerificationRequirement command |
| giovannivisentini | 1:6d202b62ed68 | 851 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 1:6d202b62ed68 | 852 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 853 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 854 | */ |
| giovannivisentini | 1:6d202b62ed68 | 855 | NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement( |
| giovannivisentini | 1:6d202b62ed68 | 856 | uint16_t uReadOrWrite) { |
| giovannivisentini | 1:6d202b62ed68 | 857 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 858 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 859 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 860 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 861 | |
| giovannivisentini | 1:6d202b62ed68 | 862 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 863 | if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) { |
| giovannivisentini | 1:6d202b62ed68 | 864 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 865 | } |
| giovannivisentini | 1:6d202b62ed68 | 866 | |
| giovannivisentini | 1:6d202b62ed68 | 867 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 868 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 1:6d202b62ed68 | 869 | command.Header.INS = C_APDU_DISABLE; |
| giovannivisentini | 1:6d202b62ed68 | 870 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 871 | command.Header.P1 = GETMSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 872 | command.Header.P2 = GETLSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 873 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 874 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command, |
| giovannivisentini | 1:6d202b62ed68 | 875 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 876 | |
| giovannivisentini | 1:6d202b62ed68 | 877 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 878 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 879 | /* The right access to be updated in EEPROM need at least 6ms */ |
| giovannivisentini | 1:6d202b62ed68 | 880 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 881 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 882 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 883 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 884 | |
| giovannivisentini | 1:6d202b62ed68 | 885 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 886 | |
| giovannivisentini | 1:6d202b62ed68 | 887 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 888 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 889 | else |
| giovannivisentini | 1:6d202b62ed68 | 890 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 891 | |
| giovannivisentini | 1:6d202b62ed68 | 892 | } |
| giovannivisentini | 1:6d202b62ed68 | 893 | |
| giovannivisentini | 1:6d202b62ed68 | 894 | /** |
| giovannivisentini | 1:6d202b62ed68 | 895 | * @brief This function sends the EnablePermananentState command |
| giovannivisentini | 1:6d202b62ed68 | 896 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 1:6d202b62ed68 | 897 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 898 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 899 | */ |
| giovannivisentini | 1:6d202b62ed68 | 900 | NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState(uint16_t uReadOrWrite) { |
| giovannivisentini | 1:6d202b62ed68 | 901 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 902 | |
| giovannivisentini | 1:6d202b62ed68 | 903 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 904 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 905 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 906 | |
| giovannivisentini | 1:6d202b62ed68 | 907 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 908 | if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) { |
| giovannivisentini | 1:6d202b62ed68 | 909 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 910 | } |
| giovannivisentini | 1:6d202b62ed68 | 911 | |
| giovannivisentini | 1:6d202b62ed68 | 912 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 913 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 1:6d202b62ed68 | 914 | command.Header.INS = C_APDU_ENABLE; |
| giovannivisentini | 1:6d202b62ed68 | 915 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 916 | command.Header.P1 = GETMSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 917 | command.Header.P2 = GETLSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 918 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 919 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 920 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 921 | |
| giovannivisentini | 1:6d202b62ed68 | 922 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 923 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 924 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 925 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 926 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 927 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 928 | |
| giovannivisentini | 1:6d202b62ed68 | 929 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 930 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 931 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 932 | else |
| giovannivisentini | 1:6d202b62ed68 | 933 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 934 | } |
| giovannivisentini | 1:6d202b62ed68 | 935 | |
| giovannivisentini | 1:6d202b62ed68 | 936 | /** |
| giovannivisentini | 1:6d202b62ed68 | 937 | * @brief This function sends the DisablePermanentState command |
| giovannivisentini | 1:6d202b62ed68 | 938 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 1:6d202b62ed68 | 939 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 940 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 941 | */ |
| giovannivisentini | 1:6d202b62ed68 | 942 | NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState(uint16_t uReadOrWrite) { |
| giovannivisentini | 1:6d202b62ed68 | 943 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 944 | |
| giovannivisentini | 1:6d202b62ed68 | 945 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 946 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 947 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 948 | |
| giovannivisentini | 1:6d202b62ed68 | 949 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 950 | if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) { |
| giovannivisentini | 1:6d202b62ed68 | 951 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 952 | } |
| giovannivisentini | 1:6d202b62ed68 | 953 | |
| giovannivisentini | 1:6d202b62ed68 | 954 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 955 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 1:6d202b62ed68 | 956 | command.Header.INS = C_APDU_DISABLE; |
| giovannivisentini | 1:6d202b62ed68 | 957 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 958 | command.Header.P1 = GETMSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 959 | command.Header.P2 = GETLSB(uReadOrWrite); |
| giovannivisentini | 1:6d202b62ed68 | 960 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 961 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command, |
| giovannivisentini | 1:6d202b62ed68 | 962 | uDIDbyte, &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 963 | |
| giovannivisentini | 1:6d202b62ed68 | 964 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 965 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 966 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 967 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 968 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 969 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 970 | |
| giovannivisentini | 1:6d202b62ed68 | 971 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 972 | |
| giovannivisentini | 1:6d202b62ed68 | 973 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 974 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 975 | else |
| giovannivisentini | 1:6d202b62ed68 | 976 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 977 | } |
| giovannivisentini | 1:6d202b62ed68 | 978 | |
| giovannivisentini | 1:6d202b62ed68 | 979 | /** |
| giovannivisentini | 1:6d202b62ed68 | 980 | * @brief This function generates a interrupt on GPO pin |
| giovannivisentini | 1:6d202b62ed68 | 981 | * @param None |
| giovannivisentini | 1:6d202b62ed68 | 982 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 983 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 984 | */ |
| giovannivisentini | 1:6d202b62ed68 | 985 | NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) { |
| giovannivisentini | 1:6d202b62ed68 | 986 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 987 | |
| giovannivisentini | 1:6d202b62ed68 | 988 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 989 | uint16_t uP1P2 = 0x001E; |
| giovannivisentini | 1:6d202b62ed68 | 990 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 991 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 992 | |
| giovannivisentini | 1:6d202b62ed68 | 993 | status = M24SR_ManageI2CGPO(INTERRUPT); |
| giovannivisentini | 1:6d202b62ed68 | 994 | |
| giovannivisentini | 1:6d202b62ed68 | 995 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 996 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 1:6d202b62ed68 | 997 | command.Header.INS = C_APDU_INTERRUPT; |
| giovannivisentini | 1:6d202b62ed68 | 998 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 999 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 1000 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 1001 | command.Body.LC = 0x00; |
| giovannivisentini | 1:6d202b62ed68 | 1002 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 1003 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 1004 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 1005 | |
| giovannivisentini | 1:6d202b62ed68 | 1006 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 1007 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 1008 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 1009 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 1010 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 1011 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 1012 | |
| giovannivisentini | 1:6d202b62ed68 | 1013 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 1014 | |
| giovannivisentini | 1:6d202b62ed68 | 1015 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 1016 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1017 | else |
| giovannivisentini | 1:6d202b62ed68 | 1018 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 1019 | |
| giovannivisentini | 1:6d202b62ed68 | 1020 | } |
| giovannivisentini | 1:6d202b62ed68 | 1021 | |
| giovannivisentini | 1:6d202b62ed68 | 1022 | /** |
| giovannivisentini | 1:6d202b62ed68 | 1023 | * @brief This function force GPO pin to low state or high Z |
| giovannivisentini | 1:6d202b62ed68 | 1024 | * @param uSetOrReset : select if GPO must be low (reset) or HiZ |
| giovannivisentini | 1:6d202b62ed68 | 1025 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 2:0648c1561eb2 | 1026 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occurred. |
| giovannivisentini | 1:6d202b62ed68 | 1027 | */ |
| giovannivisentini | 1:6d202b62ed68 | 1028 | NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) { |
| giovannivisentini | 1:6d202b62ed68 | 1029 | C_APDU command; |
| giovannivisentini | 1:6d202b62ed68 | 1030 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 1:6d202b62ed68 | 1031 | uint16_t uP1P2 = 0x001F; |
| giovannivisentini | 1:6d202b62ed68 | 1032 | NFC_StatusTypeDef status = NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1033 | uint16_t NbByte; |
| giovannivisentini | 1:6d202b62ed68 | 1034 | |
| giovannivisentini | 1:6d202b62ed68 | 1035 | /*check the parameters */ |
| giovannivisentini | 1:6d202b62ed68 | 1036 | if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) { |
| giovannivisentini | 1:6d202b62ed68 | 1037 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 1038 | } |
| giovannivisentini | 1:6d202b62ed68 | 1039 | |
| giovannivisentini | 1:6d202b62ed68 | 1040 | status = M24SR_ManageI2CGPO(STATE_CONTROL); |
| giovannivisentini | 1:6d202b62ed68 | 1041 | |
| giovannivisentini | 1:6d202b62ed68 | 1042 | /* build the command */ |
| giovannivisentini | 1:6d202b62ed68 | 1043 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 1:6d202b62ed68 | 1044 | command.Header.INS = C_APDU_INTERRUPT; |
| giovannivisentini | 1:6d202b62ed68 | 1045 | /* copy the Password Id */ |
| giovannivisentini | 1:6d202b62ed68 | 1046 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 1047 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 1:6d202b62ed68 | 1048 | command.Body.LC = 0x01; |
| giovannivisentini | 1:6d202b62ed68 | 1049 | command.Body.pData = &uSetOrReset; |
| giovannivisentini | 1:6d202b62ed68 | 1050 | /* copy the data */ |
| giovannivisentini | 1:6d202b62ed68 | 1051 | //memcpy(command.Body.pData , &uSetOrReset, 0x01 ); |
| giovannivisentini | 1:6d202b62ed68 | 1052 | //command.Body.LE = 0x00 ; |
| giovannivisentini | 1:6d202b62ed68 | 1053 | /* build the I²C command */ |
| giovannivisentini | 1:6d202b62ed68 | 1054 | M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte, |
| giovannivisentini | 1:6d202b62ed68 | 1055 | &NbByte, pBuffer); |
| giovannivisentini | 1:6d202b62ed68 | 1056 | |
| giovannivisentini | 1:6d202b62ed68 | 1057 | /* send the request */ |
| giovannivisentini | 1:6d202b62ed68 | 1058 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 1:6d202b62ed68 | 1059 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 1:6d202b62ed68 | 1060 | /* read the response */ |
| giovannivisentini | 1:6d202b62ed68 | 1061 | errchk( |
| giovannivisentini | 1:6d202b62ed68 | 1062 | M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 1:6d202b62ed68 | 1063 | |
| giovannivisentini | 1:6d202b62ed68 | 1064 | status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 1:6d202b62ed68 | 1065 | |
| giovannivisentini | 1:6d202b62ed68 | 1066 | if(status == NFC_COMMAND_SUCCESS) |
| giovannivisentini | 1:6d202b62ed68 | 1067 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1068 | else |
| giovannivisentini | 1:6d202b62ed68 | 1069 | return status; |
| giovannivisentini | 1:6d202b62ed68 | 1070 | } |
| giovannivisentini | 1:6d202b62ed68 | 1071 | |
| giovannivisentini | 1:6d202b62ed68 | 1072 | /** |
| giovannivisentini | 1:6d202b62ed68 | 1073 | * @brief This function configure GPO purpose for I2C session |
| giovannivisentini | 1:6d202b62ed68 | 1074 | * @param GPO_I2Cconfig: GPO configuration to set |
| giovannivisentini | 1:6d202b62ed68 | 1075 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 1:6d202b62ed68 | 1076 | */ |
| giovannivisentini | 1:6d202b62ed68 | 1077 | NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(M24SR_GPO_MGMT GPO_I2Cconfig) { |
| giovannivisentini | 1:6d202b62ed68 | 1078 | uint8_t GPO_config = 0; |
| giovannivisentini | 1:6d202b62ed68 | 1079 | |
| giovannivisentini | 1:6d202b62ed68 | 1080 | if (GPO_I2Cconfig > STATE_CONTROL) { |
| giovannivisentini | 1:6d202b62ed68 | 1081 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 1082 | } |
| giovannivisentini | 1:6d202b62ed68 | 1083 | |
| giovannivisentini | 1:6d202b62ed68 | 1084 | /* we must not be in interrupt mode for I2C synchro as we will change GPO purpose */ |
| giovannivisentini | 1:6d202b62ed68 | 1085 | M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING); |
| giovannivisentini | 1:6d202b62ed68 | 1086 | |
| giovannivisentini | 1:6d202b62ed68 | 1087 | errchk(M24SR_SelectApplication()); |
| giovannivisentini | 1:6d202b62ed68 | 1088 | |
| giovannivisentini | 1:6d202b62ed68 | 1089 | errchk(M24SR_SelectSystemfile()); |
| giovannivisentini | 1:6d202b62ed68 | 1090 | |
| giovannivisentini | 1:6d202b62ed68 | 1091 | errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config)) |
| giovannivisentini | 1:6d202b62ed68 | 1092 | |
| giovannivisentini | 1:6d202b62ed68 | 1093 | /* Update only GPO purpose for I2C */ |
| giovannivisentini | 1:6d202b62ed68 | 1094 | GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig; |
| giovannivisentini | 1:6d202b62ed68 | 1095 | |
| giovannivisentini | 1:6d202b62ed68 | 1096 | errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD)); |
| giovannivisentini | 1:6d202b62ed68 | 1097 | |
| giovannivisentini | 1:6d202b62ed68 | 1098 | errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config))); |
| giovannivisentini | 1:6d202b62ed68 | 1099 | |
| giovannivisentini | 1:6d202b62ed68 | 1100 | /* if we have set interrupt mode for I2C synchro we can enable interrupt mode */ |
| giovannivisentini | 1:6d202b62ed68 | 1101 | if (GPO_I2Cconfig == I2C_ANSWER_READY) |
| giovannivisentini | 1:6d202b62ed68 | 1102 | M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO); |
| giovannivisentini | 1:6d202b62ed68 | 1103 | |
| giovannivisentini | 1:6d202b62ed68 | 1104 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1105 | } |
| giovannivisentini | 1:6d202b62ed68 | 1106 | |
| giovannivisentini | 1:6d202b62ed68 | 1107 | /** |
| giovannivisentini | 1:6d202b62ed68 | 1108 | * @brief This function configure GPO purpose for RF session |
| giovannivisentini | 1:6d202b62ed68 | 1109 | * |
| giovannivisentini | 1:6d202b62ed68 | 1110 | * @param GPO_RFconfig: GPO configuration to set |
| giovannivisentini | 1:6d202b62ed68 | 1111 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 1:6d202b62ed68 | 1112 | */ |
| giovannivisentini | 1:6d202b62ed68 | 1113 | NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(M24SR_GPO_MGMT GPO_RFconfig) { |
| giovannivisentini | 1:6d202b62ed68 | 1114 | uint8_t GPO_config; |
| giovannivisentini | 1:6d202b62ed68 | 1115 | |
| giovannivisentini | 1:6d202b62ed68 | 1116 | if (GPO_RFconfig > STATE_CONTROL) { |
| giovannivisentini | 1:6d202b62ed68 | 1117 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 1:6d202b62ed68 | 1118 | } |
| giovannivisentini | 1:6d202b62ed68 | 1119 | |
| giovannivisentini | 1:6d202b62ed68 | 1120 | errchk(M24SR_SelectApplication()) |
| giovannivisentini | 1:6d202b62ed68 | 1121 | errchk(M24SR_SelectSystemfile()) |
| giovannivisentini | 1:6d202b62ed68 | 1122 | errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config)) |
| giovannivisentini | 1:6d202b62ed68 | 1123 | |
| giovannivisentini | 1:6d202b62ed68 | 1124 | /* Update only GPO purpose for I2C */ |
| giovannivisentini | 1:6d202b62ed68 | 1125 | GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig << 4); |
| giovannivisentini | 1:6d202b62ed68 | 1126 | |
| giovannivisentini | 1:6d202b62ed68 | 1127 | errchk(M24SR_SelectSystemfile()) |
| giovannivisentini | 1:6d202b62ed68 | 1128 | errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD)) |
| giovannivisentini | 1:6d202b62ed68 | 1129 | errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config))) |
| giovannivisentini | 1:6d202b62ed68 | 1130 | |
| giovannivisentini | 1:6d202b62ed68 | 1131 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1132 | } |
| giovannivisentini | 1:6d202b62ed68 | 1133 | |
| giovannivisentini | 1:6d202b62ed68 | 1134 | /** |
| giovannivisentini | 1:6d202b62ed68 | 1135 | * @brief This function enable or disable RF communication |
| giovannivisentini | 1:6d202b62ed68 | 1136 | * @param OnOffChoice: GPO configuration to set |
| giovannivisentini | 1:6d202b62ed68 | 1137 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 1:6d202b62ed68 | 1138 | */ |
| giovannivisentini | 1:6d202b62ed68 | 1139 | NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) { |
| giovannivisentini | 1:6d202b62ed68 | 1140 | /* Disable RF */ |
| giovannivisentini | 1:6d202b62ed68 | 1141 | if (OnOffChoice != 0) { |
| giovannivisentini | 1:6d202b62ed68 | 1142 | M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET); |
| giovannivisentini | 1:6d202b62ed68 | 1143 | } else { |
| giovannivisentini | 1:6d202b62ed68 | 1144 | M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET); |
| giovannivisentini | 1:6d202b62ed68 | 1145 | } |
| giovannivisentini | 1:6d202b62ed68 | 1146 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1147 | } |
| giovannivisentini | 1:6d202b62ed68 | 1148 | |
| giovannivisentini | 1:6d202b62ed68 | 1149 | NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte, |
| giovannivisentini | 1:6d202b62ed68 | 1150 | uint8_t *pBuffer) { |
| giovannivisentini | 1:6d202b62ed68 | 1151 | int ret = dev_i2c.write(address, (char*) pBuffer, NbByte); |
| giovannivisentini | 1:6d202b62ed68 | 1152 | if (ret == 0) |
| giovannivisentini | 1:6d202b62ed68 | 1153 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1154 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 1:6d202b62ed68 | 1155 | } |
| giovannivisentini | 1:6d202b62ed68 | 1156 | |
| giovannivisentini | 1:6d202b62ed68 | 1157 | NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte, |
| giovannivisentini | 1:6d202b62ed68 | 1158 | uint8_t *pBuffer) { |
| giovannivisentini | 1:6d202b62ed68 | 1159 | int ret = dev_i2c.read(address, (char*) pBuffer, NbByte); |
| giovannivisentini | 1:6d202b62ed68 | 1160 | if (ret == 0) |
| giovannivisentini | 1:6d202b62ed68 | 1161 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1162 | |
| giovannivisentini | 1:6d202b62ed68 | 1163 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 1:6d202b62ed68 | 1164 | } |
| giovannivisentini | 1:6d202b62ed68 | 1165 | |
| giovannivisentini | 1:6d202b62ed68 | 1166 | #define M24SR_POLL_DELAY 10 |
| giovannivisentini | 1:6d202b62ed68 | 1167 | #define M24SR_I2C_POLLING 200 /* In case M24SR will reply ACK failed allow to perform retry before returning error (HAL option not used) */ |
| giovannivisentini | 1:6d202b62ed68 | 1168 | |
| giovannivisentini | 1:6d202b62ed68 | 1169 | NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) { |
| giovannivisentini | 1:6d202b62ed68 | 1170 | |
| giovannivisentini | 1:6d202b62ed68 | 1171 | int status = 1; |
| giovannivisentini | 1:6d202b62ed68 | 1172 | uint32_t nbTry = 0; |
| giovannivisentini | 1:6d202b62ed68 | 1173 | char buffer; |
| giovannivisentini | 1:6d202b62ed68 | 1174 | // |
| giovannivisentini | 1:6d202b62ed68 | 1175 | wait_ms(M24SR_POLL_DELAY); |
| giovannivisentini | 1:6d202b62ed68 | 1176 | while (status != 0 && nbTry < M24SR_I2C_POLLING) { |
| giovannivisentini | 1:6d202b62ed68 | 1177 | status = dev_i2c.read(address, &buffer, 1, false); |
| giovannivisentini | 1:6d202b62ed68 | 1178 | nbTry++; |
| giovannivisentini | 1:6d202b62ed68 | 1179 | } |
| giovannivisentini | 1:6d202b62ed68 | 1180 | |
| giovannivisentini | 1:6d202b62ed68 | 1181 | if (status == 0) |
| giovannivisentini | 1:6d202b62ed68 | 1182 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1183 | //else |
| giovannivisentini | 1:6d202b62ed68 | 1184 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 1:6d202b62ed68 | 1185 | } |
| giovannivisentini | 1:6d202b62ed68 | 1186 | |
| giovannivisentini | 1:6d202b62ed68 | 1187 | NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void) { |
| giovannivisentini | 1:6d202b62ed68 | 1188 | uint32_t retry = 0xFFFFF; |
| giovannivisentini | 1:6d202b62ed68 | 1189 | int8_t stable = 0; |
| giovannivisentini | 1:6d202b62ed68 | 1190 | GPIO_PinState PinState; |
| giovannivisentini | 1:6d202b62ed68 | 1191 | |
| giovannivisentini | 1:6d202b62ed68 | 1192 | switch (syncMode) { |
| giovannivisentini | 1:6d202b62ed68 | 1193 | case M24SR_WAITINGTIME_POLLING: |
| giovannivisentini | 1:6d202b62ed68 | 1194 | return M24SR_IO_PollI2C(); |
| giovannivisentini | 1:6d202b62ed68 | 1195 | |
| giovannivisentini | 1:6d202b62ed68 | 1196 | case M24SR_WAITINGTIME_TIMEOUT: |
| giovannivisentini | 1:6d202b62ed68 | 1197 | // M24SR FWI=5 => (256*16/fc)*2^5=9.6ms but M24SR ask for extended time to program up to 246Bytes. |
| giovannivisentini | 1:6d202b62ed68 | 1198 | // can be improved by |
| giovannivisentini | 1:6d202b62ed68 | 1199 | wait_ms(80); |
| giovannivisentini | 1:6d202b62ed68 | 1200 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1201 | |
| giovannivisentini | 1:6d202b62ed68 | 1202 | case M24SR_WAITINGTIME_GPO: |
| giovannivisentini | 1:6d202b62ed68 | 1203 | do { |
| giovannivisentini | 1:6d202b62ed68 | 1204 | M24SR_IO_GPO_ReadPin(&PinState); |
| giovannivisentini | 1:6d202b62ed68 | 1205 | if (PinState == GPIO_PIN_RESET) { |
| giovannivisentini | 1:6d202b62ed68 | 1206 | stable++; |
| giovannivisentini | 1:6d202b62ed68 | 1207 | } |
| giovannivisentini | 1:6d202b62ed68 | 1208 | retry--; |
| giovannivisentini | 1:6d202b62ed68 | 1209 | } while (stable < 5 && retry > 0); |
| giovannivisentini | 1:6d202b62ed68 | 1210 | if (!retry) |
| giovannivisentini | 1:6d202b62ed68 | 1211 | goto Error; |
| giovannivisentini | 1:6d202b62ed68 | 1212 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1213 | |
| giovannivisentini | 1:6d202b62ed68 | 1214 | case M24SR_INTERRUPT_GPO: |
| giovannivisentini | 1:6d202b62ed68 | 1215 | |
| giovannivisentini | 1:6d202b62ed68 | 1216 | /* Check if the GPIO is not already low before calling this function */ |
| giovannivisentini | 1:6d202b62ed68 | 1217 | M24SR_IO_GPO_ReadPin(&PinState); |
| giovannivisentini | 1:6d202b62ed68 | 1218 | answerReadyInterrupt.enable_irq(); |
| giovannivisentini | 1:6d202b62ed68 | 1219 | if (PinState == GPIO_PIN_SET) { |
| giovannivisentini | 1:6d202b62ed68 | 1220 | while (!interruptIsFired) |
| giovannivisentini | 1:6d202b62ed68 | 1221 | __WFE(); |
| giovannivisentini | 1:6d202b62ed68 | 1222 | } |
| giovannivisentini | 1:6d202b62ed68 | 1223 | //the interrupt is disable insde the interrupt callback |
| giovannivisentini | 1:6d202b62ed68 | 1224 | //answerReadyInterrupt.disable_irq(); |
| giovannivisentini | 1:6d202b62ed68 | 1225 | interruptIsFired = false; |
| giovannivisentini | 1:6d202b62ed68 | 1226 | return NFC_SUCCESS; |
| giovannivisentini | 1:6d202b62ed68 | 1227 | |
| giovannivisentini | 1:6d202b62ed68 | 1228 | default: |
| giovannivisentini | 1:6d202b62ed68 | 1229 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 1:6d202b62ed68 | 1230 | } |
| giovannivisentini | 1:6d202b62ed68 | 1231 | |
| giovannivisentini | 1:6d202b62ed68 | 1232 | Error: return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 1:6d202b62ed68 | 1233 | } |
| giovannivisentini | 1:6d202b62ed68 | 1234 | |
| giovannivisentini | 1:6d202b62ed68 | 1235 | /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/ |
