This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Thu Nov 19 08:50:18 2015 +0000
Revision:
0:674813bd5ec9
Child:
1:6d202b62ed68
first commit,

Who changed what in which revision?

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