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

X-NUCLEO-NFC01A1 Dynamic NFC Tag