ST / X_NUCLEO_NFC01A1

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

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

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?

UserRevisionLine numberNew 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>&copy; 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****/