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:
Thu Jan 28 16:38:30 2016 +0000
Revision:
20:aad5727cb8c6
Parent:
19:0b65a5813059
Child:
21:ccc4f3fed4b3
fix reading and password managment

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 16:b0d62f4b185a 44 #ifdef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 45 #undef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 46 #endif
giovannivisentini 16:b0d62f4b185a 47 #define GPIO_PIN_RESET (0)
giovannivisentini 0:969a2be49f41 48
giovannivisentini 16:b0d62f4b185a 49 #ifdef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 50 #undef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 51 #endif
giovannivisentini 13:840a9c7f90b9 52 #define GPIO_PIN_SET (1)
giovannivisentini 13:840a9c7f90b9 53
giovannivisentini 19:0b65a5813059 54 #define M24SR_MAX_BYTE_OPERATION_LENGHT (246)
giovannivisentini 19:0b65a5813059 55
giovannivisentini 0:969a2be49f41 56 /**
giovannivisentini 9:9f2e2e68d695 57 * default password, also used to enable super user mode throught the I2C channel
giovannivisentini 0:969a2be49f41 58 */
giovannivisentini 0:969a2be49f41 59 const uint8_t M24SR::DEFAULT_PASSWORD[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
giovannivisentini 0:969a2be49f41 60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
giovannivisentini 0:969a2be49f41 61
giovannivisentini 0:969a2be49f41 62 /** @addtogroup M24SR_Driver
giovannivisentini 0:969a2be49f41 63 * @{
giovannivisentini 0:969a2be49f41 64 * @brief <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b>
giovannivisentini 0:969a2be49f41 65 */
giovannivisentini 0:969a2be49f41 66
giovannivisentini 0:969a2be49f41 67 /** @defgroup drv_M24SR
giovannivisentini 0:969a2be49f41 68 * @{
giovannivisentini 0:969a2be49f41 69 * @brief This file contains the driver which implements all the M24SR commands.
giovannivisentini 0:969a2be49f41 70 */
giovannivisentini 0:969a2be49f41 71
giovannivisentini 0:969a2be49f41 72 #ifndef errchk
giovannivisentini 0:969a2be49f41 73
giovannivisentini 9:9f2e2e68d695 74 /** value returned by the NFC chip when a command is successfully completed */
giovannivisentini 0:969a2be49f41 75 #define NFC_COMMAND_SUCCESS 0x9000
giovannivisentini 19:0b65a5813059 76 //TODO remove errchek from the async function
giovannivisentini 7:19fc04b8fec6 77 /** call the fCall funtion and check that the return status is NFC_SUCCESS,
giovannivisentini 0:969a2be49f41 78 * otherwise return the error status*/
giovannivisentini 0:969a2be49f41 79 #define errchk(fCall) {\
giovannivisentini 0:969a2be49f41 80 const NFC_StatusTypeDef status = (fCall); \
giovannivisentini 0:969a2be49f41 81 if((status!=NFC_SUCCESS)) \
giovannivisentini 0:969a2be49f41 82 return status; \
giovannivisentini 0:969a2be49f41 83 }\
giovannivisentini 0:969a2be49f41 84
giovannivisentini 0:969a2be49f41 85 #endif
giovannivisentini 0:969a2be49f41 86
giovannivisentini 0:969a2be49f41 87 /**
giovannivisentini 0:969a2be49f41 88 * @brief This function updates the CRC
giovannivisentini 0:969a2be49f41 89 * @param None
giovannivisentini 0:969a2be49f41 90 * @retval None
giovannivisentini 0:969a2be49f41 91 */
giovannivisentini 4:cb1b4304a93e 92 static uint16_t M24SR_UpdateCrc(uint8_t ch, uint16_t *lpwCrc) {
giovannivisentini 0:969a2be49f41 93 ch = (ch ^ (uint8_t) ((*lpwCrc) & 0x00FF));
giovannivisentini 0:969a2be49f41 94 ch = (ch ^ (ch << 4));
giovannivisentini 0:969a2be49f41 95 *lpwCrc = (*lpwCrc >> 8) ^ ((uint16_t) ch << 8) ^ ((uint16_t) ch << 3)
giovannivisentini 0:969a2be49f41 96 ^ ((uint16_t) ch >> 4);
giovannivisentini 0:969a2be49f41 97
giovannivisentini 0:969a2be49f41 98 return (*lpwCrc);
giovannivisentini 0:969a2be49f41 99 }
giovannivisentini 0:969a2be49f41 100
giovannivisentini 0:969a2be49f41 101 /**
giovannivisentini 0:969a2be49f41 102 * @brief This function returns the CRC 16
giovannivisentini 0:969a2be49f41 103 * @param Data : pointer on the data used to compute the CRC16
giovannivisentini 9:9f2e2e68d695 104 * @param Length : number of bytes of the data
giovannivisentini 0:969a2be49f41 105 * @retval CRC16
giovannivisentini 0:969a2be49f41 106 */
giovannivisentini 4:cb1b4304a93e 107 static uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) {
giovannivisentini 0:969a2be49f41 108 uint8_t chBlock;
giovannivisentini 0:969a2be49f41 109 uint16_t wCrc = 0x6363; // ITU-V.41
giovannivisentini 0:969a2be49f41 110
giovannivisentini 0:969a2be49f41 111 do {
giovannivisentini 0:969a2be49f41 112 chBlock = *Data++;
giovannivisentini 0:969a2be49f41 113 M24SR_UpdateCrc(chBlock, &wCrc);
giovannivisentini 0:969a2be49f41 114 } while (--Length);
giovannivisentini 0:969a2be49f41 115
giovannivisentini 0:969a2be49f41 116 return wCrc;
giovannivisentini 0:969a2be49f41 117 }
giovannivisentini 0:969a2be49f41 118
giovannivisentini 0:969a2be49f41 119 /**
giovannivisentini 0:969a2be49f41 120 * @brief This function computes the CRC16 residue as defined by CRC ISO/IEC 13239
giovannivisentini 9:9f2e2e68d695 121 * @param DataIn : input data
giovannivisentini 0:969a2be49f41 122 * @param Length : Number of bits of DataIn
giovannivisentini 0:969a2be49f41 123 * @retval Status (SW1&SW2) : CRC16 residue is correct
giovannivisentini 0:969a2be49f41 124 * @retval M24SR_ERROR_CRC : CRC16 residue is false
giovannivisentini 0:969a2be49f41 125 */
giovannivisentini 4:cb1b4304a93e 126 static NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue(uint8_t *DataIn, uint8_t Length) {
giovannivisentini 0:969a2be49f41 127 uint16_t ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 128
giovannivisentini 0:969a2be49f41 129 /* check the CRC16 Residue */
giovannivisentini 0:969a2be49f41 130 if (Length != 0)
giovannivisentini 0:969a2be49f41 131 ResCRC = M24SR_ComputeCrc(DataIn, Length);
giovannivisentini 0:969a2be49f41 132
giovannivisentini 0:969a2be49f41 133 if (ResCRC == 0x0000) {
giovannivisentini 0:969a2be49f41 134 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 135 return (NFC_StatusTypeDef) (((DataIn[Length - UB_STATUS_OFFSET] << 8)
giovannivisentini 0:969a2be49f41 136 & 0xFF00) | (DataIn[Length - LB_STATUS_OFFSET] & 0x00FF));
giovannivisentini 0:969a2be49f41 137 } else {
giovannivisentini 0:969a2be49f41 138 ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 139 ResCRC = M24SR_ComputeCrc(DataIn, 5);
giovannivisentini 0:969a2be49f41 140 if (ResCRC != 0x0000) {
giovannivisentini 0:969a2be49f41 141 /* Bad CRC */
giovannivisentini 0:969a2be49f41 142 return NFC_IO_ERROR_CRC;
giovannivisentini 0:969a2be49f41 143 } else {
giovannivisentini 0:969a2be49f41 144 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 145 return (NFC_StatusTypeDef) (((DataIn[1] << 8) & 0xFF00)
giovannivisentini 0:969a2be49f41 146 | (DataIn[2] & 0x00FF));
giovannivisentini 0:969a2be49f41 147 }
giovannivisentini 0:969a2be49f41 148 }
giovannivisentini 0:969a2be49f41 149 }
giovannivisentini 0:969a2be49f41 150
giovannivisentini 0:969a2be49f41 151 /**
giovannivisentini 0:969a2be49f41 152 * @brief This functions creates an I block command according to the structures CommandStructure and data->command.
giovannivisentini 9:9f2e2e68d695 153 * @param Command : structure which contains the field of the different parameters
giovannivisentini 9:9f2e2e68d695 154 * @param CommandStructure : structure of the command
giovannivisentini 9:9f2e2e68d695 155 * @param NbByte : number of bytes of the command
giovannivisentini 9:9f2e2e68d695 156 * @param pCommand : pointer to the command created
giovannivisentini 0:969a2be49f41 157 */
giovannivisentini 4:cb1b4304a93e 158 static void M24SR_BuildIBlockCommand(uint16_t CommandStructure, C_APDU *Command,
giovannivisentini 0:969a2be49f41 159 uint8_t uDIDbyte, uint16_t *NbByte, uint8_t *pCommand) {
giovannivisentini 0:969a2be49f41 160 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 161 static uint8_t BlockNumber = 0x01;
giovannivisentini 0:969a2be49f41 162
giovannivisentini 0:969a2be49f41 163 (*NbByte) = 0;
giovannivisentini 0:969a2be49f41 164
giovannivisentini 0:969a2be49f41 165 /* add the PCD byte */
giovannivisentini 0:969a2be49f41 166 if ((CommandStructure & M24SR_PCB_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 167 /* toggle the block number */
giovannivisentini 0:969a2be49f41 168 BlockNumber = TOGGLE(BlockNumber);
giovannivisentini 0:969a2be49f41 169 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 170 pCommand[(*NbByte)++] = 0x02 | BlockNumber;
giovannivisentini 0:969a2be49f41 171 }
giovannivisentini 0:969a2be49f41 172
giovannivisentini 0:969a2be49f41 173 /* add the DID byte */
giovannivisentini 0:969a2be49f41 174 if ((BlockNumber & M24SR_DID_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 175 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 176 pCommand[(*NbByte)++] = uDIDbyte;
giovannivisentini 0:969a2be49f41 177 }
giovannivisentini 0:969a2be49f41 178
giovannivisentini 0:969a2be49f41 179 /* add the Class byte */
giovannivisentini 0:969a2be49f41 180 if ((CommandStructure & M24SR_CLA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 181 pCommand[(*NbByte)++] = Command->Header.CLA;
giovannivisentini 0:969a2be49f41 182 }
giovannivisentini 0:969a2be49f41 183 /* add the instruction byte byte */
giovannivisentini 0:969a2be49f41 184 if ((CommandStructure & M24SR_INS_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 185 pCommand[(*NbByte)++] = Command->Header.INS;
giovannivisentini 0:969a2be49f41 186 }
giovannivisentini 0:969a2be49f41 187 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 188 if ((CommandStructure & M24SR_P1_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 189 pCommand[(*NbByte)++] = Command->Header.P1;
giovannivisentini 0:969a2be49f41 190 }
giovannivisentini 0:969a2be49f41 191 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 192 if ((CommandStructure & M24SR_P2_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 193 pCommand[(*NbByte)++] = Command->Header.P2;
giovannivisentini 0:969a2be49f41 194 }
giovannivisentini 0:969a2be49f41 195 /* add Data field lengthbyte */
giovannivisentini 0:969a2be49f41 196 if ((CommandStructure & M24SR_LC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 197 pCommand[(*NbByte)++] = Command->Body.LC;
giovannivisentini 0:969a2be49f41 198 }
giovannivisentini 0:969a2be49f41 199 /* add Data field */
giovannivisentini 0:969a2be49f41 200 if ((CommandStructure & M24SR_DATA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 201 memcpy(&(pCommand[(*NbByte)]), Command->Body.pData, Command->Body.LC);
giovannivisentini 0:969a2be49f41 202 (*NbByte) += Command->Body.LC;
giovannivisentini 0:969a2be49f41 203 }
giovannivisentini 0:969a2be49f41 204 /* add Le field */
giovannivisentini 0:969a2be49f41 205 if ((CommandStructure & M24SR_LE_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 206 pCommand[(*NbByte)++] = Command->Body.LE;
giovannivisentini 0:969a2be49f41 207 }
giovannivisentini 0:969a2be49f41 208 /* add CRC field */
giovannivisentini 0:969a2be49f41 209 if ((CommandStructure & M24SR_CRC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 210 uCRC16 = M24SR_ComputeCrc(pCommand, (uint8_t) (*NbByte));
giovannivisentini 0:969a2be49f41 211 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 212 pCommand[(*NbByte)++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 213 pCommand[(*NbByte)++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 214 }
giovannivisentini 0:969a2be49f41 215
giovannivisentini 0:969a2be49f41 216 }
giovannivisentini 0:969a2be49f41 217
giovannivisentini 0:969a2be49f41 218
giovannivisentini 0:969a2be49f41 219 /**
giovannivisentini 9:9f2e2e68d695 220 * @brief This function returns M24SR_STATUS_SUCCESS if the pBuffer is an s-block
giovannivisentini 9:9f2e2e68d695 221 * @param pBuffer : pointer to the data
giovannivisentini 7:19fc04b8fec6 222 * @retval NFC_SUCCESS : the data is a S-Block
giovannivisentini 7:19fc04b8fec6 223 * @retval NFC_ERROR : the data is not a S-Block
giovannivisentini 0:969a2be49f41 224 */
giovannivisentini 0:969a2be49f41 225 static NFC_StatusTypeDef IsSBlock(uint8_t *pBuffer) {
giovannivisentini 0:969a2be49f41 226
giovannivisentini 0:969a2be49f41 227 if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) {
giovannivisentini 0:969a2be49f41 228 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 229 } else {
giovannivisentini 0:969a2be49f41 230 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 231 }
giovannivisentini 0:969a2be49f41 232
giovannivisentini 0:969a2be49f41 233 }
giovannivisentini 0:969a2be49f41 234
giovannivisentini 0:969a2be49f41 235 /**
giovannivisentini 0:969a2be49f41 236 * @brief This function sends the FWT extension command (S-Block format)
giovannivisentini 0:969a2be49f41 237 * @param FWTbyte : FWT value
giovannivisentini 9:9f2e2e68d695 238 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 239 */
giovannivisentini 19:0b65a5813059 240 NFC_StatusTypeDef M24SR::M24SR_SendFWTExtension(uint8_t FWTbyte) {
giovannivisentini 0:969a2be49f41 241 uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 242 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 243 uint8_t NthByte = 0;
giovannivisentini 0:969a2be49f41 244 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 245
giovannivisentini 0:969a2be49f41 246 /* create the response */
giovannivisentini 0:969a2be49f41 247 pBuffer[NthByte++] = 0xF2;
giovannivisentini 0:969a2be49f41 248 pBuffer[NthByte++] = FWTbyte;
giovannivisentini 0:969a2be49f41 249 /* compute the CRC */
giovannivisentini 0:969a2be49f41 250 uCRC16 = M24SR_ComputeCrc(pBuffer, 0x02);
giovannivisentini 0:969a2be49f41 251 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 252 pBuffer[NthByte++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 253 pBuffer[NthByte++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 254
giovannivisentini 0:969a2be49f41 255 /* send the request */
giovannivisentini 19:0b65a5813059 256 status = M24SR_IO_SendI2Ccommand(NthByte, pBuffer);
giovannivisentini 19:0b65a5813059 257 if(status != NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 258 return status;
giovannivisentini 19:0b65a5813059 259
giovannivisentini 19:0b65a5813059 260 mLastCommandSend=UPDATE;
giovannivisentini 19:0b65a5813059 261
giovannivisentini 19:0b65a5813059 262 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 263 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 264 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 265 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 266 else{
giovannivisentini 19:0b65a5813059 267 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 268 getCallback()->onUpdatedBinary(this,status,mLastCommandData.offset,
giovannivisentini 19:0b65a5813059 269 mLastCommandData.data,mLastCommandData.length);
giovannivisentini 19:0b65a5813059 270 return status;
giovannivisentini 19:0b65a5813059 271 }//if-else
giovannivisentini 19:0b65a5813059 272 }//if
giovannivisentini 0:969a2be49f41 273
giovannivisentini 19:0b65a5813059 274 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 275 }
giovannivisentini 0:969a2be49f41 276
giovannivisentini 19:0b65a5813059 277 /**
giovannivisentini 19:0b65a5813059 278 * @brief This function initialize the M24SR device
giovannivisentini 19:0b65a5813059 279 * @retval None
giovannivisentini 19:0b65a5813059 280 */
giovannivisentini 19:0b65a5813059 281 NFC_StatusTypeDef M24SR::M24SR_Init(M24SR_InitTypeDef *notUsed) {
giovannivisentini 19:0b65a5813059 282 (void) notUsed;
giovannivisentini 19:0b65a5813059 283 //force to open a i2c session
giovannivisentini 19:0b65a5813059 284 errchk(M24SR_KillSession())
giovannivisentini 19:0b65a5813059 285 //leave the gpo always up
giovannivisentini 19:0b65a5813059 286 errchk(M24SR_ManageI2CGPO(DEFAULT_GPO_STATUS))
giovannivisentini 19:0b65a5813059 287 //close the session
giovannivisentini 19:0b65a5813059 288 errchk(M24SR_Deselect())
giovannivisentini 19:0b65a5813059 289 mGpoEventInterrupt.enable_irq();
giovannivisentini 19:0b65a5813059 290 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 291 }
giovannivisentini 0:969a2be49f41 292
giovannivisentini 19:0b65a5813059 293
giovannivisentini 0:969a2be49f41 294 /**
giovannivisentini 0:969a2be49f41 295 * @brief This function sends the KillSession command to the M24SR device
giovannivisentini 0:969a2be49f41 296 * @param None
giovannivisentini 9:9f2e2e68d695 297 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 298 */
giovannivisentini 0:969a2be49f41 299 NFC_StatusTypeDef M24SR::M24SR_KillSession(void) {
giovannivisentini 0:969a2be49f41 300 uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
giovannivisentini 19:0b65a5813059 301 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 302 status = M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer);
giovannivisentini 19:0b65a5813059 303 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 304 mCallback->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 305 return status;
giovannivisentini 19:0b65a5813059 306 }
giovannivisentini 0:969a2be49f41 307
giovannivisentini 0:969a2be49f41 308 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 309 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 310 /* GPO can not be use with KillSession command */
giovannivisentini 19:0b65a5813059 311 status = M24SR_IO_PollI2C();
giovannivisentini 0:969a2be49f41 312
giovannivisentini 19:0b65a5813059 313 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 314 return status;
giovannivisentini 19:0b65a5813059 315
giovannivisentini 0:969a2be49f41 316 }
giovannivisentini 0:969a2be49f41 317
giovannivisentini 0:969a2be49f41 318 /**
giovannivisentini 0:969a2be49f41 319 * @brief This function sends the Deselect command (S-Block format)
giovannivisentini 9:9f2e2e68d695 320 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 321 */
giovannivisentini 0:969a2be49f41 322 NFC_StatusTypeDef M24SR::M24SR_Deselect(void) {
giovannivisentini 0:969a2be49f41 323 uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND;
giovannivisentini 19:0b65a5813059 324 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 325 /* send the request */
giovannivisentini 19:0b65a5813059 326 status = M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer);
giovannivisentini 19:0b65a5813059 327 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 328 getCallback()->onDeselect(this,status);
giovannivisentini 19:0b65a5813059 329 }
giovannivisentini 19:0b65a5813059 330
giovannivisentini 19:0b65a5813059 331 mLastCommandSend=DESELECT;
giovannivisentini 0:969a2be49f41 332
giovannivisentini 19:0b65a5813059 333 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 334 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 335 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 336 return M24SR_ReceiveDeselect();
giovannivisentini 19:0b65a5813059 337 else{
giovannivisentini 19:0b65a5813059 338 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 339 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 340 return status;
giovannivisentini 19:0b65a5813059 341 }//if-else
giovannivisentini 19:0b65a5813059 342
giovannivisentini 19:0b65a5813059 343 }
giovannivisentini 0:969a2be49f41 344
giovannivisentini 0:969a2be49f41 345 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 346 }
giovannivisentini 0:969a2be49f41 347
giovannivisentini 19:0b65a5813059 348 NFC_StatusTypeDef M24SR::M24SR_ReceiveDeselect(void){
giovannivisentini 19:0b65a5813059 349 uint8_t pBuffer[4];
giovannivisentini 19:0b65a5813059 350 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 351 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer);
giovannivisentini 19:0b65a5813059 352 getCallback()->onDeselect(this,status);
giovannivisentini 19:0b65a5813059 353 return status;
giovannivisentini 19:0b65a5813059 354 }
giovannivisentini 19:0b65a5813059 355
giovannivisentini 19:0b65a5813059 356
giovannivisentini 19:0b65a5813059 357
giovannivisentini 19:0b65a5813059 358 /**
giovannivisentini 19:0b65a5813059 359 * @brief This function sends the GetSession command to the M24SR device
giovannivisentini 19:0b65a5813059 360 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 19:0b65a5813059 361 * @retval Status (SW1&SW2) if operation does not complete.
giovannivisentini 19:0b65a5813059 362 */
giovannivisentini 19:0b65a5813059 363 NFC_StatusTypeDef M24SR::M24SR_GetSession(void) {
giovannivisentini 19:0b65a5813059 364 uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
giovannivisentini 19:0b65a5813059 365
giovannivisentini 19:0b65a5813059 366 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 367 status = M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer);
giovannivisentini 19:0b65a5813059 368 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 369 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 370 return status;
giovannivisentini 19:0b65a5813059 371 }
giovannivisentini 19:0b65a5813059 372
giovannivisentini 19:0b65a5813059 373 /* Insure no access will be done just after open session */
giovannivisentini 19:0b65a5813059 374 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 19:0b65a5813059 375 /* GPO can not be use with KillSession command */
giovannivisentini 19:0b65a5813059 376 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 377
giovannivisentini 19:0b65a5813059 378 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 379 return status;
giovannivisentini 19:0b65a5813059 380 }
giovannivisentini 19:0b65a5813059 381
giovannivisentini 0:969a2be49f41 382 /**
giovannivisentini 0:969a2be49f41 383 * @brief This function sends the SelectApplication command
giovannivisentini 9:9f2e2e68d695 384 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 385 */
giovannivisentini 19:0b65a5813059 386 NFC_StatusTypeDef M24SR::M24SR_SendSelectApplication(void) {
giovannivisentini 0:969a2be49f41 387
giovannivisentini 0:969a2be49f41 388 C_APDU command;
giovannivisentini 19:0b65a5813059 389 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 390 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 391 uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
giovannivisentini 0:969a2be49f41 392 uint8_t uLe = 0x00;
giovannivisentini 19:0b65a5813059 393 uint16_t uP1P2 =0x0400, NbByte;
giovannivisentini 0:969a2be49f41 394
giovannivisentini 0:969a2be49f41 395 /* build the command */
giovannivisentini 0:969a2be49f41 396 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 397 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 398 /* copy the offset */
giovannivisentini 0:969a2be49f41 399 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 400 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 401 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 402 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 403 /* copy the data */
giovannivisentini 0:969a2be49f41 404 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 405 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 406 command.Body.LE = uLe;
giovannivisentini 19:0b65a5813059 407 /* build the I2C command */
giovannivisentini 0:969a2be49f41 408 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,
giovannivisentini 0:969a2be49f41 409 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 410
giovannivisentini 0:969a2be49f41 411 /* send the request */
giovannivisentini 19:0b65a5813059 412 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 413 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 414 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 415 return status;
giovannivisentini 19:0b65a5813059 416 }
giovannivisentini 19:0b65a5813059 417
giovannivisentini 19:0b65a5813059 418 mLastCommandSend=SELECT_APPLICATION;
giovannivisentini 19:0b65a5813059 419
giovannivisentini 19:0b65a5813059 420 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 421 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 422 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 423 return M24SR_ReceiveSelectApplication();
giovannivisentini 19:0b65a5813059 424 else{
giovannivisentini 19:0b65a5813059 425 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 426 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 427 return status;
giovannivisentini 19:0b65a5813059 428 }//if-else
giovannivisentini 19:0b65a5813059 429 }//if
giovannivisentini 19:0b65a5813059 430
giovannivisentini 19:0b65a5813059 431 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 432 }
giovannivisentini 19:0b65a5813059 433
giovannivisentini 19:0b65a5813059 434 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectApplication(void) {
giovannivisentini 19:0b65a5813059 435
giovannivisentini 19:0b65a5813059 436 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 437 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 438
giovannivisentini 19:0b65a5813059 439 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 440
giovannivisentini 19:0b65a5813059 441 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 442 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 443 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 444 return status;
giovannivisentini 19:0b65a5813059 445 }//else
giovannivisentini 0:969a2be49f41 446 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 447 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 448 return status;
giovannivisentini 0:969a2be49f41 449
giovannivisentini 0:969a2be49f41 450 }
giovannivisentini 0:969a2be49f41 451
giovannivisentini 0:969a2be49f41 452
giovannivisentini 0:969a2be49f41 453
giovannivisentini 0:969a2be49f41 454 NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) {
giovannivisentini 0:969a2be49f41 455 if (!nfc_id) {
giovannivisentini 0:969a2be49f41 456 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 457 }
giovannivisentini 0:969a2be49f41 458
giovannivisentini 19:0b65a5813059 459 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 460 mComponentCallback = &mReadIDCallback;
giovannivisentini 19:0b65a5813059 461 mReadIDCallback.readIdOn(nfc_id);
giovannivisentini 0:969a2be49f41 462
giovannivisentini 19:0b65a5813059 463 //start the readID procedure
giovannivisentini 19:0b65a5813059 464 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 465 }
giovannivisentini 0:969a2be49f41 466
giovannivisentini 0:969a2be49f41 467 /**
giovannivisentini 0:969a2be49f41 468 * @brief This function sends the SelectCCFile command
giovannivisentini 9:9f2e2e68d695 469 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 470 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 9:9f2e2e68d695 471 * @retval Status (SW1&SW2) if operation does not complete for another reason.
giovannivisentini 0:969a2be49f41 472 */
giovannivisentini 19:0b65a5813059 473 NFC_StatusTypeDef M24SR::M24SR_SendSelectCCfile(void) {
giovannivisentini 0:969a2be49f41 474 C_APDU command;
giovannivisentini 19:0b65a5813059 475 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 476 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 477 uint8_t pDataOut[] = CC_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 478 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 479 NbByte;
giovannivisentini 0:969a2be49f41 480
giovannivisentini 0:969a2be49f41 481 /* build the command */
giovannivisentini 0:969a2be49f41 482 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 483 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 484 /* copy the offset */
giovannivisentini 0:969a2be49f41 485 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 486 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 487 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 488 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 489 command.Body.pData = pDataOut;
giovannivisentini 7:19fc04b8fec6 490 /* build the I2C command */
giovannivisentini 0:969a2be49f41 491 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 492 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 493
giovannivisentini 0:969a2be49f41 494 /* send the request */
giovannivisentini 19:0b65a5813059 495 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 496 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 497 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 498 return status;
giovannivisentini 19:0b65a5813059 499 }//else
giovannivisentini 19:0b65a5813059 500
giovannivisentini 19:0b65a5813059 501
giovannivisentini 19:0b65a5813059 502 mLastCommandSend=SELECT_CC_FILE;
giovannivisentini 19:0b65a5813059 503
giovannivisentini 19:0b65a5813059 504 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 505 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 506 if(status==NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 507 return M24SR_ReceiveSelectCCfile();
giovannivisentini 19:0b65a5813059 508 else{
giovannivisentini 19:0b65a5813059 509 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 510 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 511 return status;
giovannivisentini 19:0b65a5813059 512 }//if-else
giovannivisentini 19:0b65a5813059 513 }//if
giovannivisentini 0:969a2be49f41 514
giovannivisentini 19:0b65a5813059 515 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 516 }
giovannivisentini 19:0b65a5813059 517
giovannivisentini 19:0b65a5813059 518 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectCCfile(void){
giovannivisentini 19:0b65a5813059 519
giovannivisentini 19:0b65a5813059 520 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 521 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 522
giovannivisentini 19:0b65a5813059 523 mLastCommandSend = NONE;
giovannivisentini 0:969a2be49f41 524
giovannivisentini 19:0b65a5813059 525 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 526 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 527 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 0:969a2be49f41 528 return status;
giovannivisentini 19:0b65a5813059 529 }//else
giovannivisentini 19:0b65a5813059 530 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 531 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 532 return status;
giovannivisentini 19:0b65a5813059 533
giovannivisentini 0:969a2be49f41 534 }
giovannivisentini 0:969a2be49f41 535
giovannivisentini 0:969a2be49f41 536 /**
giovannivisentini 0:969a2be49f41 537 * @brief This function sends the SelectSystemFile command
giovannivisentini 9:9f2e2e68d695 538 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 539 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 540 */
giovannivisentini 19:0b65a5813059 541 NFC_StatusTypeDef M24SR::M24SR_SendSelectSystemfile(void) {
giovannivisentini 0:969a2be49f41 542 C_APDU command;
giovannivisentini 0:969a2be49f41 543
giovannivisentini 0:969a2be49f41 544 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 545 uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 546 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 547 uint16_t uP1P2 =0x000C, NbByte;
giovannivisentini 0:969a2be49f41 548
giovannivisentini 0:969a2be49f41 549 /* build the command */
giovannivisentini 0:969a2be49f41 550 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 551 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 552 /* copy the offset */
giovannivisentini 0:969a2be49f41 553 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 554 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 555 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 556 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 557 command.Body.pData = pDataOut;
giovannivisentini 20:aad5727cb8c6 558 /* build the I²C command */
giovannivisentini 0:969a2be49f41 559 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 560 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 561
giovannivisentini 0:969a2be49f41 562 /* send the request */
giovannivisentini 19:0b65a5813059 563 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 564 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 565 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 566 return status;
giovannivisentini 19:0b65a5813059 567 }//else
giovannivisentini 19:0b65a5813059 568
giovannivisentini 19:0b65a5813059 569 mLastCommandSend=SELECT_SYSTEM_FILE;
giovannivisentini 19:0b65a5813059 570
giovannivisentini 19:0b65a5813059 571 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 572 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 573 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 574 return M24SR_ReceiveSelectSystemfile();
giovannivisentini 19:0b65a5813059 575 else{
giovannivisentini 19:0b65a5813059 576 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 577 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 578 return status;
giovannivisentini 19:0b65a5813059 579 }//if-else
giovannivisentini 19:0b65a5813059 580 }//if
giovannivisentini 0:969a2be49f41 581
giovannivisentini 19:0b65a5813059 582 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 583 }
giovannivisentini 19:0b65a5813059 584
giovannivisentini 19:0b65a5813059 585 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectSystemfile(){
giovannivisentini 19:0b65a5813059 586
giovannivisentini 19:0b65a5813059 587 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 588 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 589
giovannivisentini 19:0b65a5813059 590 mLastCommandSend = NONE;
giovannivisentini 0:969a2be49f41 591
giovannivisentini 19:0b65a5813059 592 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 593 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 594 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 0:969a2be49f41 595 return status;
giovannivisentini 19:0b65a5813059 596 }//else
giovannivisentini 19:0b65a5813059 597 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 598 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 599 return status;
giovannivisentini 19:0b65a5813059 600
giovannivisentini 0:969a2be49f41 601 }
giovannivisentini 0:969a2be49f41 602
giovannivisentini 0:969a2be49f41 603 /**
giovannivisentini 0:969a2be49f41 604 * @brief This function sends the SelectNDEFfile command
giovannivisentini 9:9f2e2e68d695 605 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 606 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 607 */
giovannivisentini 19:0b65a5813059 608 NFC_StatusTypeDef M24SR::M24SR_SendSelectNDEFfile(uint16_t NDEFfileId) {
giovannivisentini 0:969a2be49f41 609 C_APDU command;
giovannivisentini 19:0b65a5813059 610 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 611 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 612 uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) };
giovannivisentini 0:969a2be49f41 613 uint16_t uP1P2 = 0x000C, NbByte;
giovannivisentini 0:969a2be49f41 614
giovannivisentini 0:969a2be49f41 615 /* build the command */
giovannivisentini 0:969a2be49f41 616 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 617 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 618 /* copy the offset */
giovannivisentini 0:969a2be49f41 619 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 620 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 621 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 622 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 623 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 624 /* copy the offset */
giovannivisentini 19:0b65a5813059 625 /* build the I2C command */
giovannivisentini 0:969a2be49f41 626 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 627 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 628
giovannivisentini 0:969a2be49f41 629 /* send the request */
giovannivisentini 19:0b65a5813059 630 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 631 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 632
giovannivisentini 19:0b65a5813059 633 }
giovannivisentini 19:0b65a5813059 634
giovannivisentini 19:0b65a5813059 635 mLastCommandSend=SELECT_NDEF_FILE;
giovannivisentini 19:0b65a5813059 636
giovannivisentini 19:0b65a5813059 637 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 638 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 639 if(status==NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 640 return M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 641 else{
giovannivisentini 19:0b65a5813059 642 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 643 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 19:0b65a5813059 644 return status;
giovannivisentini 19:0b65a5813059 645 }
giovannivisentini 19:0b65a5813059 646 }
giovannivisentini 0:969a2be49f41 647
giovannivisentini 19:0b65a5813059 648 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 649
giovannivisentini 19:0b65a5813059 650 }
giovannivisentini 19:0b65a5813059 651
giovannivisentini 19:0b65a5813059 652 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectNDEFfile(){
giovannivisentini 19:0b65a5813059 653
giovannivisentini 19:0b65a5813059 654 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 655 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 656
giovannivisentini 19:0b65a5813059 657 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 658
giovannivisentini 19:0b65a5813059 659 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 660 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 661 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 0:969a2be49f41 662 return status;
giovannivisentini 19:0b65a5813059 663 }//else
giovannivisentini 19:0b65a5813059 664 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 665 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 19:0b65a5813059 666 return status;
giovannivisentini 0:969a2be49f41 667
giovannivisentini 0:969a2be49f41 668 }
giovannivisentini 0:969a2be49f41 669
giovannivisentini 0:969a2be49f41 670 /**
giovannivisentini 0:969a2be49f41 671 * @brief This function sends a read binary command
giovannivisentini 9:9f2e2e68d695 672 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 673 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 674 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 675 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 676 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 677 */
giovannivisentini 19:0b65a5813059 678 NFC_StatusTypeDef M24SR::M24SR_SendReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 679 uint8_t *pBufferRead) {
giovannivisentini 19:0b65a5813059 680 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 681 if(NbByteToRead>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 682 NbByteToRead=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 683
giovannivisentini 0:969a2be49f41 684 C_APDU command;
giovannivisentini 0:969a2be49f41 685 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 19:0b65a5813059 686 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 687 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 688
giovannivisentini 0:969a2be49f41 689 /* build the command */
giovannivisentini 0:969a2be49f41 690 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 691 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 692 /* copy the offset */
giovannivisentini 0:969a2be49f41 693 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 694 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 695 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 696 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 697
giovannivisentini 0:969a2be49f41 698 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 699 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 700
giovannivisentini 19:0b65a5813059 701 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 702 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 703 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 704 return status;
giovannivisentini 19:0b65a5813059 705 }
giovannivisentini 19:0b65a5813059 706
giovannivisentini 19:0b65a5813059 707 mLastCommandSend=READ;
giovannivisentini 19:0b65a5813059 708 mLastCommandData.data=pBufferRead;
giovannivisentini 19:0b65a5813059 709 mLastCommandData.length=NbByteToRead;
giovannivisentini 20:aad5727cb8c6 710 mLastCommandData.offset=Offset;
giovannivisentini 19:0b65a5813059 711
giovannivisentini 19:0b65a5813059 712 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 713 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 714 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 715 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 716 }else{
giovannivisentini 19:0b65a5813059 717 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 718 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 719 return status;
giovannivisentini 19:0b65a5813059 720 }//if-else
giovannivisentini 19:0b65a5813059 721 }//if
giovannivisentini 19:0b65a5813059 722
giovannivisentini 19:0b65a5813059 723 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 724 }
giovannivisentini 0:969a2be49f41 725
giovannivisentini 19:0b65a5813059 726 NFC_StatusTypeDef M24SR::M24SR_ReceiveReadBinary(){
giovannivisentini 19:0b65a5813059 727
giovannivisentini 19:0b65a5813059 728 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 729 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 730 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 731 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 732
giovannivisentini 19:0b65a5813059 733 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 734
giovannivisentini 19:0b65a5813059 735 status = M24SR_IO_ReceiveI2Cresponse (length + M24SR_STATUSRESPONSE_NBBYTE , uM24SRbuffer );
giovannivisentini 19:0b65a5813059 736 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 737 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 0:969a2be49f41 738 return status;
giovannivisentini 19:0b65a5813059 739 }
giovannivisentini 19:0b65a5813059 740 status = M24SR_IsCorrectCRC16Residue(uM24SRbuffer, length + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 741 if(status != NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 742 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 743 else{
giovannivisentini 19:0b65a5813059 744 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 19:0b65a5813059 745 memcpy(mLastCommandData.data, &uM24SRbuffer[1], length);
giovannivisentini 19:0b65a5813059 746 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 747 }
giovannivisentini 19:0b65a5813059 748 return status;
giovannivisentini 0:969a2be49f41 749
giovannivisentini 0:969a2be49f41 750 }
giovannivisentini 0:969a2be49f41 751
giovannivisentini 0:969a2be49f41 752 /**
giovannivisentini 0:969a2be49f41 753 * @brief This function sends a ST read binary command (no error if access is not inside NDEF file)
giovannivisentini 9:9f2e2e68d695 754 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 755 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 756 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 757 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 758 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 759 */
giovannivisentini 19:0b65a5813059 760 NFC_StatusTypeDef M24SR::M24SR_SendSTReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 761 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 19:0b65a5813059 762 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 763 if(NbByteToRead>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 764 NbByteToRead=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 765
giovannivisentini 0:969a2be49f41 766 C_APDU command;
giovannivisentini 0:969a2be49f41 767 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 19:0b65a5813059 768 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 769 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 770
giovannivisentini 0:969a2be49f41 771 /* build the command */
giovannivisentini 0:969a2be49f41 772 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 773 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 774 /* copy the offset */
giovannivisentini 0:969a2be49f41 775 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 776 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 777 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 778 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 779
giovannivisentini 0:969a2be49f41 780 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 781 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 782
giovannivisentini 19:0b65a5813059 783 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 784 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 785 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 786 return status;
giovannivisentini 19:0b65a5813059 787 }
giovannivisentini 19:0b65a5813059 788
giovannivisentini 19:0b65a5813059 789 mLastCommandSend=READ;
giovannivisentini 19:0b65a5813059 790 mLastCommandData.data=pBufferRead;
giovannivisentini 19:0b65a5813059 791 mLastCommandData.length=NbByteToRead;
giovannivisentini 0:969a2be49f41 792
giovannivisentini 19:0b65a5813059 793 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 794 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 795 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 796 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 797 }else{
giovannivisentini 19:0b65a5813059 798 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 799 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 800 return status;
giovannivisentini 19:0b65a5813059 801 }//if-else
giovannivisentini 19:0b65a5813059 802 }//if
giovannivisentini 0:969a2be49f41 803
giovannivisentini 0:969a2be49f41 804 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 805 }
giovannivisentini 0:969a2be49f41 806
giovannivisentini 0:969a2be49f41 807 /**
giovannivisentini 0:969a2be49f41 808 * @brief This function sends a Update binary command
giovannivisentini 9:9f2e2e68d695 809 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 810 * @param NbByteToWrite number of bytes to write
giovannivisentini 9:9f2e2e68d695 811 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 812 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 813 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 814 */
giovannivisentini 19:0b65a5813059 815 NFC_StatusTypeDef M24SR::M24SR_SendUpdateBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 816 uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
giovannivisentini 19:0b65a5813059 817 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 818 if(NbByteToWrite>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 819 NbByteToWrite=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 820
giovannivisentini 0:969a2be49f41 821 C_APDU command;
giovannivisentini 19:0b65a5813059 822 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 823 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 824 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 825
giovannivisentini 0:969a2be49f41 826 /* build the command */
giovannivisentini 0:969a2be49f41 827 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 828 command.Header.INS = C_APDU_UPDATE_BINARY;
giovannivisentini 0:969a2be49f41 829 /* copy the offset */
giovannivisentini 0:969a2be49f41 830 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 831 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 832 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 833 command.Body.LC = NbByteToWrite;
giovannivisentini 0:969a2be49f41 834 command.Body.pData = pDataToWrite;
giovannivisentini 0:969a2be49f41 835 /* copy the File Id */
giovannivisentini 0:969a2be49f41 836 //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
giovannivisentini 0:969a2be49f41 837 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 838 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 839
giovannivisentini 19:0b65a5813059 840 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 841 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 842 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 843 return status;
giovannivisentini 19:0b65a5813059 844 }
giovannivisentini 19:0b65a5813059 845
giovannivisentini 19:0b65a5813059 846 mLastCommandSend=UPDATE;
giovannivisentini 19:0b65a5813059 847 mLastCommandData.data=pDataToWrite;
giovannivisentini 19:0b65a5813059 848 mLastCommandData.length=NbByteToWrite;
giovannivisentini 19:0b65a5813059 849 mLastCommandData.offset=Offset;
giovannivisentini 19:0b65a5813059 850
giovannivisentini 19:0b65a5813059 851 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 852 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 853 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 854 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 855 }else{
giovannivisentini 19:0b65a5813059 856 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 857 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 858 return status;
giovannivisentini 19:0b65a5813059 859 }//if-else
giovannivisentini 19:0b65a5813059 860 }
giovannivisentini 0:969a2be49f41 861
giovannivisentini 19:0b65a5813059 862 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 863 }
giovannivisentini 19:0b65a5813059 864
giovannivisentini 19:0b65a5813059 865 NFC_StatusTypeDef M24SR::M24SR_ReceiveUpdateBinary() {
giovannivisentini 19:0b65a5813059 866
giovannivisentini 19:0b65a5813059 867 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 868 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 869 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 870 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 871 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 872
giovannivisentini 19:0b65a5813059 873 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 874
giovannivisentini 19:0b65a5813059 875 status= M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer) , respBuffer);
giovannivisentini 19:0b65a5813059 876 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 877 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 878 return status;
giovannivisentini 19:0b65a5813059 879 }
giovannivisentini 19:0b65a5813059 880
giovannivisentini 19:0b65a5813059 881 if (IsSBlock(respBuffer) == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 882 /*check the CRC */
giovannivisentini 19:0b65a5813059 883 status =M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 19:0b65a5813059 884 M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 885 // TODO: why if we check ==NFC_Commandsuccess it fail?
giovannivisentini 0:969a2be49f41 886 if (status != NFC_IO_ERROR_CRC) {
giovannivisentini 0:969a2be49f41 887 /* send the FrameExension response*/
giovannivisentini 19:0b65a5813059 888 status = M24SR_SendFWTExtension(respBuffer[M24SR_OFFSET_PCB + 1]);
giovannivisentini 19:0b65a5813059 889 if(status!=NFC_SUCCESS){ //something get wrong -> abort the update
giovannivisentini 19:0b65a5813059 890 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 891 }//status
giovannivisentini 19:0b65a5813059 892 }//if
giovannivisentini 19:0b65a5813059 893 } else { //isSBlock
giovannivisentini 19:0b65a5813059 894 status = M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 0:969a2be49f41 895 M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 896 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 897 }//if else
giovannivisentini 19:0b65a5813059 898 return status;
giovannivisentini 19:0b65a5813059 899 }//M24SR_ReceiveUpdateBinary
giovannivisentini 0:969a2be49f41 900
giovannivisentini 0:969a2be49f41 901
giovannivisentini 0:969a2be49f41 902 /**
giovannivisentini 0:969a2be49f41 903 * @brief This function sends the Verify command
giovannivisentini 9:9f2e2e68d695 904 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 905 * @param NbPwdByte Number of bytes ( 0x00 or 0x10)
giovannivisentini 9:9f2e2e68d695 906 * @param pPwd pointer to the password
giovannivisentini 9:9f2e2e68d695 907 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 908 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 909 */
giovannivisentini 19:0b65a5813059 910 NFC_StatusTypeDef M24SR::M24SR_SendVerify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 911 const uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 912 C_APDU command;
giovannivisentini 19:0b65a5813059 913 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 914 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 915 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 916
giovannivisentini 0:969a2be49f41 917 /*check the parameters */
giovannivisentini 19:0b65a5813059 918 if ((uPwdId > 0x0003)|| ((NbPwdByte != 0x00) && (NbPwdByte != 0x10))) {
giovannivisentini 19:0b65a5813059 919 getCallback()->onVerifyed(this,NFC_IO_ERROR_PARAMETER);
giovannivisentini 0:969a2be49f41 920 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 921 }
giovannivisentini 0:969a2be49f41 922
giovannivisentini 0:969a2be49f41 923 /* build the command */
giovannivisentini 0:969a2be49f41 924 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 925 command.Header.INS = C_APDU_VERIFY;
giovannivisentini 0:969a2be49f41 926 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 927 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 928 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 9:9f2e2e68d695 929 /* copy the number of bytes of the data field */
giovannivisentini 0:969a2be49f41 930 command.Body.LC = NbPwdByte;
giovannivisentini 0:969a2be49f41 931
giovannivisentini 0:969a2be49f41 932 if (NbPwdByte == 0x10) {
giovannivisentini 0:969a2be49f41 933 /* copy the password */
giovannivisentini 0:969a2be49f41 934 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 935 /* build the I2C command */
giovannivisentini 0:969a2be49f41 936 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
giovannivisentini 0:969a2be49f41 937 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 938 } else {
giovannivisentini 0:969a2be49f41 939 command.Body.pData = NULL;
giovannivisentini 0:969a2be49f41 940 /* build the I2C command */
giovannivisentini 0:969a2be49f41 941 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
giovannivisentini 0:969a2be49f41 942 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 943 }
giovannivisentini 0:969a2be49f41 944
giovannivisentini 0:969a2be49f41 945 /* send the request */
giovannivisentini 19:0b65a5813059 946 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 947 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 948 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 949 return status;
giovannivisentini 19:0b65a5813059 950 }
giovannivisentini 19:0b65a5813059 951 mLastCommandSend=VERIFY;
giovannivisentini 19:0b65a5813059 952 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 953 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 954 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 955 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 956 else{
giovannivisentini 19:0b65a5813059 957 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 958 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 959 return status;
giovannivisentini 19:0b65a5813059 960 }
giovannivisentini 19:0b65a5813059 961 }
giovannivisentini 0:969a2be49f41 962
giovannivisentini 19:0b65a5813059 963 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 964 }
giovannivisentini 19:0b65a5813059 965
giovannivisentini 19:0b65a5813059 966 NFC_StatusTypeDef M24SR::M24SR_ReceiveVerify(){
giovannivisentini 19:0b65a5813059 967 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 968 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 969 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 970
giovannivisentini 19:0b65a5813059 971 status=M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer),respBuffer);
giovannivisentini 19:0b65a5813059 972
giovannivisentini 19:0b65a5813059 973 if(status !=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 974 getCallback()->onVerifyed(this,status);
giovannivisentini 0:969a2be49f41 975 return status;
giovannivisentini 19:0b65a5813059 976 }
giovannivisentini 0:969a2be49f41 977
giovannivisentini 19:0b65a5813059 978 status = M24SR_IsCorrectCRC16Residue(respBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 979 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 980 return status;
giovannivisentini 0:969a2be49f41 981 }
giovannivisentini 0:969a2be49f41 982
giovannivisentini 0:969a2be49f41 983 /**
giovannivisentini 0:969a2be49f41 984 * @brief This function sends the ChangeReferenceData command
giovannivisentini 9:9f2e2e68d695 985 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 986 * @param pPwd pointer to the passwaord
giovannivisentini 9:9f2e2e68d695 987 * @retval Status (SW1&SW2) Satus of the operation to complete.
giovannivisentini 9:9f2e2e68d695 988 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 989 */
giovannivisentini 19:0b65a5813059 990 NFC_StatusTypeDef M24SR::M24SR_SendChangeReferenceData(uint16_t uPwdId,
giovannivisentini 0:969a2be49f41 991 uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 992 C_APDU command;
giovannivisentini 19:0b65a5813059 993 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 994 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 995 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 996
giovannivisentini 0:969a2be49f41 997 /*check the parameters */
giovannivisentini 0:969a2be49f41 998 if (uPwdId > 0x0003) {
giovannivisentini 19:0b65a5813059 999 getCallback()->onChangeReferenceData(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1000 constToPasswordType(uPwdId), pPwd);
giovannivisentini 0:969a2be49f41 1001 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1002 }
giovannivisentini 0:969a2be49f41 1003
giovannivisentini 0:969a2be49f41 1004 /* build the command */
giovannivisentini 0:969a2be49f41 1005 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1006 command.Header.INS = C_APDU_CHANGE;
giovannivisentini 0:969a2be49f41 1007 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1008 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 1009 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 0:969a2be49f41 1010 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 1011 command.Body.LC = M24SR_PASSWORD_NBBYTE;
giovannivisentini 0:969a2be49f41 1012 /* copy the password */
giovannivisentini 0:969a2be49f41 1013 command.Body.pData = pPwd;
giovannivisentini 20:aad5727cb8c6 1014 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1015 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1016 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1017
giovannivisentini 0:969a2be49f41 1018 /* send the request */
giovannivisentini 19:0b65a5813059 1019 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1020 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1021 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1022 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1023 return status;
giovannivisentini 19:0b65a5813059 1024 }
giovannivisentini 19:0b65a5813059 1025
giovannivisentini 19:0b65a5813059 1026 mLastCommandSend = CHANGE_REFERENCE_DATA;
giovannivisentini 19:0b65a5813059 1027 mLastCommandData.data = pPwd;
giovannivisentini 19:0b65a5813059 1028 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1029 mLastCommandData.offset = (uint8_t)uPwdId;
giovannivisentini 0:969a2be49f41 1030
giovannivisentini 19:0b65a5813059 1031 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1032 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1033 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1034 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1035 }else{
giovannivisentini 19:0b65a5813059 1036 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1037 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1038 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1039 return status;
giovannivisentini 19:0b65a5813059 1040 }//if-else
giovannivisentini 19:0b65a5813059 1041 }//if
giovannivisentini 19:0b65a5813059 1042
giovannivisentini 19:0b65a5813059 1043 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1044 }
giovannivisentini 0:969a2be49f41 1045
giovannivisentini 19:0b65a5813059 1046 NFC_StatusTypeDef M24SR::M24SR_ReceiveChangeReferenceData(){
giovannivisentini 19:0b65a5813059 1047 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1048 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1049 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1050
giovannivisentini 19:0b65a5813059 1051 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1052 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 1053
giovannivisentini 19:0b65a5813059 1054 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1055 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1056 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 0:969a2be49f41 1057 return status;
giovannivisentini 19:0b65a5813059 1058 }//else
giovannivisentini 19:0b65a5813059 1059
giovannivisentini 19:0b65a5813059 1060 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1061
giovannivisentini 19:0b65a5813059 1062 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1063 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 19:0b65a5813059 1064 return status;
giovannivisentini 0:969a2be49f41 1065 }
giovannivisentini 0:969a2be49f41 1066
giovannivisentini 0:969a2be49f41 1067 /**
giovannivisentini 0:969a2be49f41 1068 * @brief This function sends the EnableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1069 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1070 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1071 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1072 */
giovannivisentini 19:0b65a5813059 1073 NFC_StatusTypeDef M24SR::M24SR_SendEnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1074 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1075 C_APDU command;
giovannivisentini 19:0b65a5813059 1076 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1077 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1078 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1079
giovannivisentini 0:969a2be49f41 1080 /*check the parameters */
giovannivisentini 0:969a2be49f41 1081 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1082 getCallback()->onEnableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1083 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1084 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1085 }
giovannivisentini 0:969a2be49f41 1086
giovannivisentini 0:969a2be49f41 1087 /* build the command */
giovannivisentini 0:969a2be49f41 1088 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1089 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1090 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1091 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1092 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1093 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1094 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1095 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1096
giovannivisentini 0:969a2be49f41 1097 /* send the request */
giovannivisentini 19:0b65a5813059 1098 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1099 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1100 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1101 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1102 return status;
giovannivisentini 19:0b65a5813059 1103 }//if
giovannivisentini 19:0b65a5813059 1104
giovannivisentini 19:0b65a5813059 1105 mLastCommandSend = ENABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1106 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1107 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1108
giovannivisentini 19:0b65a5813059 1109 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1110 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1111 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1112 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1113 }else{
giovannivisentini 19:0b65a5813059 1114 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1115 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1116 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1117 return status;
giovannivisentini 19:0b65a5813059 1118 }//if-else
giovannivisentini 19:0b65a5813059 1119 }//if
giovannivisentini 0:969a2be49f41 1120
giovannivisentini 19:0b65a5813059 1121 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1122 }
giovannivisentini 19:0b65a5813059 1123
giovannivisentini 19:0b65a5813059 1124 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1125 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1126 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1127 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1128
giovannivisentini 19:0b65a5813059 1129 const PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1130
giovannivisentini 19:0b65a5813059 1131 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1132 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1133 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 0:969a2be49f41 1134 return status;
giovannivisentini 19:0b65a5813059 1135 }//else
giovannivisentini 19:0b65a5813059 1136
giovannivisentini 19:0b65a5813059 1137 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1138
giovannivisentini 19:0b65a5813059 1139 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1140 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1141 return status;
giovannivisentini 0:969a2be49f41 1142 }
giovannivisentini 0:969a2be49f41 1143
giovannivisentini 19:0b65a5813059 1144
giovannivisentini 0:969a2be49f41 1145 /**
giovannivisentini 0:969a2be49f41 1146 * @brief This function sends the DisableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1147 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1148 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1149 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1150 */
giovannivisentini 19:0b65a5813059 1151 NFC_StatusTypeDef M24SR::M24SR_SendDisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1152 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1153 C_APDU command;
giovannivisentini 19:0b65a5813059 1154 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1155 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1156 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1157
giovannivisentini 0:969a2be49f41 1158 /*check the parameters */
giovannivisentini 0:969a2be49f41 1159 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1160 getCallback()->onDisableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1161 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1162 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1163 }
giovannivisentini 0:969a2be49f41 1164
giovannivisentini 0:969a2be49f41 1165 /* build the command */
giovannivisentini 0:969a2be49f41 1166 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1167 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1168 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1169 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1170 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1171 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1172 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1173 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1174
giovannivisentini 0:969a2be49f41 1175 /* send the request */
giovannivisentini 19:0b65a5813059 1176 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1177 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1178 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1179 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1180 return status;
giovannivisentini 19:0b65a5813059 1181 }
giovannivisentini 19:0b65a5813059 1182
giovannivisentini 19:0b65a5813059 1183 mLastCommandSend = DISABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1184 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1185 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1186
giovannivisentini 19:0b65a5813059 1187 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1188 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1189 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1190 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1191 }else{
giovannivisentini 19:0b65a5813059 1192 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1193 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1194 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1195 return status;
giovannivisentini 19:0b65a5813059 1196 }//if-else
giovannivisentini 19:0b65a5813059 1197 }
giovannivisentini 0:969a2be49f41 1198
giovannivisentini 19:0b65a5813059 1199 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1200
giovannivisentini 0:969a2be49f41 1201 }
giovannivisentini 0:969a2be49f41 1202
giovannivisentini 19:0b65a5813059 1203 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1204 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1205 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1206 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1207
giovannivisentini 19:0b65a5813059 1208 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1209
giovannivisentini 19:0b65a5813059 1210 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1211 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1212 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1213 return status;
giovannivisentini 19:0b65a5813059 1214 }//else
giovannivisentini 19:0b65a5813059 1215
giovannivisentini 19:0b65a5813059 1216 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1217
giovannivisentini 19:0b65a5813059 1218 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1219 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1220 return status;
giovannivisentini 19:0b65a5813059 1221 }
giovannivisentini 19:0b65a5813059 1222
giovannivisentini 19:0b65a5813059 1223
giovannivisentini 0:969a2be49f41 1224 /**
giovannivisentini 0:969a2be49f41 1225 * @brief This function sends the EnablePermananentState command
giovannivisentini 9:9f2e2e68d695 1226 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1227 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1228 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1229 */
giovannivisentini 19:0b65a5813059 1230 NFC_StatusTypeDef M24SR::M24SR_SendEnablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1231 C_APDU command;
giovannivisentini 19:0b65a5813059 1232 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1233
giovannivisentini 0:969a2be49f41 1234 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1235 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1236
giovannivisentini 0:969a2be49f41 1237 /*check the parameters */
giovannivisentini 0:969a2be49f41 1238 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1239 getCallback()->onEnablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1240 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1241 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1242 }
giovannivisentini 0:969a2be49f41 1243
giovannivisentini 0:969a2be49f41 1244 /* build the command */
giovannivisentini 0:969a2be49f41 1245 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1246 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1247 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1248 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1249 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1250 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1251 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1252 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1253
giovannivisentini 0:969a2be49f41 1254 /* send the request */
giovannivisentini 19:0b65a5813059 1255 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1256 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1257 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1258 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1259 return status;
giovannivisentini 19:0b65a5813059 1260 }
giovannivisentini 19:0b65a5813059 1261
giovannivisentini 19:0b65a5813059 1262 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1263 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1264 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1265
giovannivisentini 19:0b65a5813059 1266 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1267 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1268 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1269 return M24SR_ReceiveEnablePermanentState();
giovannivisentini 19:0b65a5813059 1270 }else{
giovannivisentini 19:0b65a5813059 1271 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1272 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1273 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1274 return status;
giovannivisentini 19:0b65a5813059 1275 }//if-else
giovannivisentini 19:0b65a5813059 1276 }
giovannivisentini 0:969a2be49f41 1277
giovannivisentini 19:0b65a5813059 1278 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1279 }
giovannivisentini 19:0b65a5813059 1280
giovannivisentini 19:0b65a5813059 1281 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnablePermanentState(){
giovannivisentini 19:0b65a5813059 1282 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1283 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1284 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1285
giovannivisentini 19:0b65a5813059 1286 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1287
giovannivisentini 19:0b65a5813059 1288 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1289 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1290 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1291 return status;
giovannivisentini 19:0b65a5813059 1292 }//else
giovannivisentini 19:0b65a5813059 1293
giovannivisentini 19:0b65a5813059 1294 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1295
giovannivisentini 19:0b65a5813059 1296 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1297 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1298 return status;
giovannivisentini 0:969a2be49f41 1299 }
giovannivisentini 0:969a2be49f41 1300
giovannivisentini 19:0b65a5813059 1301
giovannivisentini 0:969a2be49f41 1302 /**
giovannivisentini 0:969a2be49f41 1303 * @brief This function sends the DisablePermanentState command
giovannivisentini 9:9f2e2e68d695 1304 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1305 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1306 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1307 */
giovannivisentini 19:0b65a5813059 1308 NFC_StatusTypeDef M24SR::M24SR_SendDisablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1309 C_APDU command;
giovannivisentini 19:0b65a5813059 1310 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1311 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1312 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1313
giovannivisentini 0:969a2be49f41 1314 /*check the parameters */
giovannivisentini 0:969a2be49f41 1315 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1316 getCallback()->onDisablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1317 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1318 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1319 }
giovannivisentini 0:969a2be49f41 1320
giovannivisentini 0:969a2be49f41 1321 /* build the command */
giovannivisentini 0:969a2be49f41 1322 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1323 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1324 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1325 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1326 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1327 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1328 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1329 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1330
giovannivisentini 0:969a2be49f41 1331 /* send the request */
giovannivisentini 19:0b65a5813059 1332 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1333 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1334 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1335 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1336 return status;
giovannivisentini 19:0b65a5813059 1337 }
giovannivisentini 19:0b65a5813059 1338
giovannivisentini 19:0b65a5813059 1339 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1340 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1341 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1342
giovannivisentini 19:0b65a5813059 1343 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1344 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1345 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1346 return M24SR_ReceiveDisablePermanentState();
giovannivisentini 19:0b65a5813059 1347 }else{
giovannivisentini 19:0b65a5813059 1348 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1349 getCallback()->onDisablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1350 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1351 return status;
giovannivisentini 19:0b65a5813059 1352 }//if-else
giovannivisentini 19:0b65a5813059 1353 }
giovannivisentini 19:0b65a5813059 1354
giovannivisentini 19:0b65a5813059 1355 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1356 }
giovannivisentini 0:969a2be49f41 1357
giovannivisentini 19:0b65a5813059 1358 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisablePermanentState(){
giovannivisentini 19:0b65a5813059 1359 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1360 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1361 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1362
giovannivisentini 19:0b65a5813059 1363 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1364
giovannivisentini 19:0b65a5813059 1365 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1366 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1367 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1368 return status;
giovannivisentini 19:0b65a5813059 1369 }//else
giovannivisentini 19:0b65a5813059 1370
giovannivisentini 19:0b65a5813059 1371 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1372
giovannivisentini 19:0b65a5813059 1373 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1374 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1375 return status;
giovannivisentini 0:969a2be49f41 1376 }
giovannivisentini 0:969a2be49f41 1377
giovannivisentini 0:969a2be49f41 1378 /**
giovannivisentini 9:9f2e2e68d695 1379 * @brief This function generates an interrupt on GPO pin
giovannivisentini 0:969a2be49f41 1380 * @param None
giovannivisentini 9:9f2e2e68d695 1381 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1382 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1383 */
giovannivisentini 0:969a2be49f41 1384 NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
giovannivisentini 0:969a2be49f41 1385 C_APDU command;
giovannivisentini 0:969a2be49f41 1386
giovannivisentini 0:969a2be49f41 1387 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1388 uint16_t uP1P2 = 0x001E;
giovannivisentini 0:969a2be49f41 1389 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1390 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1391
giovannivisentini 0:969a2be49f41 1392 status = M24SR_ManageI2CGPO(INTERRUPT);
giovannivisentini 0:969a2be49f41 1393
giovannivisentini 0:969a2be49f41 1394 /* build the command */
giovannivisentini 0:969a2be49f41 1395 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1396 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1397 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1398 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1399 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1400 command.Body.LC = 0x00;
giovannivisentini 20:aad5727cb8c6 1401 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1402 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1403 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1404
giovannivisentini 0:969a2be49f41 1405 /* send the request */
giovannivisentini 0:969a2be49f41 1406 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1407 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1408 /* read the response */
giovannivisentini 0:969a2be49f41 1409 errchk(
giovannivisentini 0:969a2be49f41 1410 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1411
giovannivisentini 0:969a2be49f41 1412 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1413
giovannivisentini 0:969a2be49f41 1414 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1415 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1416 else
giovannivisentini 0:969a2be49f41 1417 return status;
giovannivisentini 0:969a2be49f41 1418
giovannivisentini 0:969a2be49f41 1419 }
giovannivisentini 0:969a2be49f41 1420
giovannivisentini 0:969a2be49f41 1421 /**
giovannivisentini 9:9f2e2e68d695 1422 * @brief This function forces GPO pin to low state or high Z
giovannivisentini 9:9f2e2e68d695 1423 * @param uSetOrReset select if GPO must be low (reset) or HiZ
giovannivisentini 9:9f2e2e68d695 1424 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1425 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1426 */
giovannivisentini 0:969a2be49f41 1427 NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
giovannivisentini 0:969a2be49f41 1428 C_APDU command;
giovannivisentini 0:969a2be49f41 1429 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1430 uint16_t uP1P2 = 0x001F;
giovannivisentini 0:969a2be49f41 1431 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1432 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1433
giovannivisentini 0:969a2be49f41 1434 /*check the parameters */
giovannivisentini 0:969a2be49f41 1435 if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
giovannivisentini 0:969a2be49f41 1436 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1437 }
giovannivisentini 0:969a2be49f41 1438
giovannivisentini 0:969a2be49f41 1439 status = M24SR_ManageI2CGPO(STATE_CONTROL);
giovannivisentini 0:969a2be49f41 1440
giovannivisentini 0:969a2be49f41 1441 /* build the command */
giovannivisentini 0:969a2be49f41 1442 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1443 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1444 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1445 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1446 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1447 command.Body.LC = 0x01;
giovannivisentini 0:969a2be49f41 1448 command.Body.pData = &uSetOrReset;
giovannivisentini 0:969a2be49f41 1449 /* copy the data */
giovannivisentini 0:969a2be49f41 1450 //memcpy(command.Body.pData , &uSetOrReset, 0x01 );
giovannivisentini 0:969a2be49f41 1451 //command.Body.LE = 0x00 ;
giovannivisentini 20:aad5727cb8c6 1452 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1453 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1454 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1455
giovannivisentini 0:969a2be49f41 1456 /* send the request */
giovannivisentini 0:969a2be49f41 1457 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1458 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1459 /* read the response */
giovannivisentini 0:969a2be49f41 1460 errchk(
giovannivisentini 0:969a2be49f41 1461 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1462
giovannivisentini 0:969a2be49f41 1463 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1464
giovannivisentini 0:969a2be49f41 1465 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1466 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1467 else
giovannivisentini 0:969a2be49f41 1468 return status;
giovannivisentini 0:969a2be49f41 1469 }
giovannivisentini 0:969a2be49f41 1470
giovannivisentini 7:19fc04b8fec6 1471
giovannivisentini 19:0b65a5813059 1472 NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1473
giovannivisentini 0:969a2be49f41 1474 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1475 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1476 }
giovannivisentini 0:969a2be49f41 1477
giovannivisentini 19:0b65a5813059 1478 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1479 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1480 mManageGPOCallback.setNewGpoConfig(true,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1481
giovannivisentini 19:0b65a5813059 1482 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1483 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1484 }
giovannivisentini 0:969a2be49f41 1485
giovannivisentini 19:0b65a5813059 1486 NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1487
giovannivisentini 19:0b65a5813059 1488 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1489 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1490 }
giovannivisentini 0:969a2be49f41 1491
giovannivisentini 19:0b65a5813059 1492 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1493 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1494 mManageGPOCallback.setNewGpoConfig(false,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1495
giovannivisentini 19:0b65a5813059 1496 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1497 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1498 }
giovannivisentini 0:969a2be49f41 1499
giovannivisentini 0:969a2be49f41 1500 NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
giovannivisentini 0:969a2be49f41 1501 /* Disable RF */
giovannivisentini 0:969a2be49f41 1502 if (OnOffChoice != 0) {
giovannivisentini 0:969a2be49f41 1503 M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
giovannivisentini 0:969a2be49f41 1504 } else {
giovannivisentini 0:969a2be49f41 1505 M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
giovannivisentini 0:969a2be49f41 1506 }
giovannivisentini 0:969a2be49f41 1507 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1508 }
giovannivisentini 0:969a2be49f41 1509
giovannivisentini 0:969a2be49f41 1510 NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1511 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1512 int ret = dev_I2C.write(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1513 if (ret == 0)
giovannivisentini 0:969a2be49f41 1514 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1515 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1516 }
giovannivisentini 0:969a2be49f41 1517
giovannivisentini 0:969a2be49f41 1518 NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1519 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1520 int ret = dev_I2C.read(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1521 if (ret == 0)
giovannivisentini 0:969a2be49f41 1522 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1523
giovannivisentini 0:969a2be49f41 1524 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1525 }
giovannivisentini 0:969a2be49f41 1526
giovannivisentini 0:969a2be49f41 1527 NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
giovannivisentini 0:969a2be49f41 1528
giovannivisentini 0:969a2be49f41 1529 int status = 1;
giovannivisentini 0:969a2be49f41 1530 char buffer;
giovannivisentini 18:10def2fefa8a 1531 while (status != 0) {
giovannivisentini 10:482175f7ae66 1532 status = dev_I2C.read(address, &buffer, 1, false);
giovannivisentini 0:969a2be49f41 1533 }
giovannivisentini 0:969a2be49f41 1534
giovannivisentini 0:969a2be49f41 1535 if (status == 0)
giovannivisentini 0:969a2be49f41 1536 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1537 //else
giovannivisentini 0:969a2be49f41 1538 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1539 }
giovannivisentini 0:969a2be49f41 1540
giovannivisentini 19:0b65a5813059 1541 NFC_StatusTypeDef M24SR::ManageEvent(void){
giovannivisentini 0:969a2be49f41 1542
giovannivisentini 19:0b65a5813059 1543 switch(mLastCommandSend){
giovannivisentini 19:0b65a5813059 1544 case SELECT_APPLICATION:
giovannivisentini 19:0b65a5813059 1545 return M24SR_ReceiveSelectApplication();
giovannivisentini 19:0b65a5813059 1546 case SELECT_CC_FILE:
giovannivisentini 19:0b65a5813059 1547 return M24SR_ReceiveSelectCCfile();
giovannivisentini 19:0b65a5813059 1548 case SELECT_NDEF_FILE:
giovannivisentini 19:0b65a5813059 1549 return M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 1550 case SELECT_SYSTEM_FILE:
giovannivisentini 19:0b65a5813059 1551 return M24SR_ReceiveSelectSystemfile();
giovannivisentini 19:0b65a5813059 1552 case READ:
giovannivisentini 19:0b65a5813059 1553 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 1554 case UPDATE:
giovannivisentini 19:0b65a5813059 1555 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 1556 case VERIFY:
giovannivisentini 19:0b65a5813059 1557 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 1558 case DESELECT:
giovannivisentini 19:0b65a5813059 1559 return M24SR_ReceiveDeselect();
giovannivisentini 19:0b65a5813059 1560 case CHANGE_REFERENCE_DATA:
giovannivisentini 19:0b65a5813059 1561 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1562 case ENABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1563 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1564 case DISABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1565 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 16:b0d62f4b185a 1566
giovannivisentini 19:0b65a5813059 1567 default:
giovannivisentini 19:0b65a5813059 1568 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1569 }//switch
giovannivisentini 19:0b65a5813059 1570 }//manageInterrupt
giovannivisentini 0:969a2be49f41 1571
giovannivisentini 6:96389fb79676 1572 ////////////////////////hight level utility function //////////////////////////
giovannivisentini 6:96389fb79676 1573
giovannivisentini 6:96389fb79676 1574 NFC_StatusTypeDef M24SR::enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 19:0b65a5813059 1575 const uint8_t* pNewPassword) {
giovannivisentini 19:0b65a5813059 1576
giovannivisentini 19:0b65a5813059 1577 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1578 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1579 mChangePasswordRequestStatusCallback.setTask(ReadPwd,pNewPassword);
giovannivisentini 19:0b65a5813059 1580
giovannivisentini 19:0b65a5813059 1581 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1582 }
giovannivisentini 6:96389fb79676 1583
giovannivisentini 6:96389fb79676 1584 NFC_StatusTypeDef M24SR::disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 19:0b65a5813059 1585 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1586 mChangePasswordRequestStatusCallback.setTask(ReadPwd,NULL);
giovannivisentini 19:0b65a5813059 1587
giovannivisentini 19:0b65a5813059 1588 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1589 }
giovannivisentini 6:96389fb79676 1590
giovannivisentini 6:96389fb79676 1591 NFC_StatusTypeDef M24SR::enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1592 uint8_t* pNewPassword) {
giovannivisentini 19:0b65a5813059 1593 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1594 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1595 mChangePasswordRequestStatusCallback.setTask(WritePwd,pNewPassword);
giovannivisentini 19:0b65a5813059 1596
giovannivisentini 19:0b65a5813059 1597 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1598 }
giovannivisentini 6:96389fb79676 1599
giovannivisentini 6:96389fb79676 1600 NFC_StatusTypeDef M24SR::disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 19:0b65a5813059 1601 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1602 mChangePasswordRequestStatusCallback.setTask(WritePwd,NULL);
giovannivisentini 19:0b65a5813059 1603
giovannivisentini 19:0b65a5813059 1604 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1605 }
giovannivisentini 6:96389fb79676 1606
giovannivisentini 6:96389fb79676 1607 NFC_StatusTypeDef M24SR::disableAllPassword(const uint8_t* pSuperUserPassword){
giovannivisentini 20:aad5727cb8c6 1608 mComponentCallback = &mRemoveAllPasswordCallback;
giovannivisentini 19:0b65a5813059 1609 return Verify(M24SR::I2CPwd, 0x10, pSuperUserPassword);
giovannivisentini 6:96389fb79676 1610 }
giovannivisentini 6:96389fb79676 1611
giovannivisentini 6:96389fb79676 1612 NFC_StatusTypeDef M24SR::enableReadOnly(const uint8_t* pCurrentWritePassword){
giovannivisentini 6:96389fb79676 1613
giovannivisentini 19:0b65a5813059 1614 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1615 //disable write = read only
giovannivisentini 19:0b65a5813059 1616 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,false);
giovannivisentini 19:0b65a5813059 1617
giovannivisentini 19:0b65a5813059 1618 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1619 }
giovannivisentini 6:96389fb79676 1620
giovannivisentini 6:96389fb79676 1621 NFC_StatusTypeDef M24SR::disableReadOnly() {
giovannivisentini 19:0b65a5813059 1622 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1623 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,true);
giovannivisentini 19:0b65a5813059 1624 return Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD);
giovannivisentini 6:96389fb79676 1625 }
giovannivisentini 6:96389fb79676 1626
giovannivisentini 6:96389fb79676 1627
giovannivisentini 6:96389fb79676 1628 NFC_StatusTypeDef M24SR::enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1629
giovannivisentini 19:0b65a5813059 1630 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1631 //disable read = enable write only
giovannivisentini 19:0b65a5813059 1632 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,false);
giovannivisentini 19:0b65a5813059 1633
giovannivisentini 19:0b65a5813059 1634 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1635
giovannivisentini 6:96389fb79676 1636 }
giovannivisentini 6:96389fb79676 1637
giovannivisentini 6:96389fb79676 1638 NFC_StatusTypeDef M24SR::disableWriteOnly() {
giovannivisentini 19:0b65a5813059 1639 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1640 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,true);
giovannivisentini 19:0b65a5813059 1641 return Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD);
giovannivisentini 6:96389fb79676 1642 }
giovannivisentini 6:96389fb79676 1643
giovannivisentini 0:969a2be49f41 1644 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/