Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

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:
Fri Jan 15 11:02:30 2016 +0000
Revision:
15:67e136b6921d
Parent:
13:840a9c7f90b9
Child:
16:b0d62f4b185a
move the NFC_InitTypeDef struct as M24SR_InitTypeDef

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