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:
Tue Dec 22 15:34:24 2015 +0000
Revision:
6:96389fb79676
Parent:
4:cb1b4304a93e
Child:
7:19fc04b8fec6
add the NdefNdfTagM24SR

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