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 14:01:18 2016 +0000
Revision:
19:0b65a5813059
Parent:
18:10def2fefa8a
Child:
20:aad5727cb8c6
add async api

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 0:969a2be49f41 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 19:0b65a5813059 710
giovannivisentini 19:0b65a5813059 711 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 712 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 713 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 714 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 715 }else{
giovannivisentini 19:0b65a5813059 716 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 717 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 718 return status;
giovannivisentini 19:0b65a5813059 719 }//if-else
giovannivisentini 19:0b65a5813059 720 }//if
giovannivisentini 19:0b65a5813059 721
giovannivisentini 19:0b65a5813059 722 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 723 }
giovannivisentini 0:969a2be49f41 724
giovannivisentini 19:0b65a5813059 725 NFC_StatusTypeDef M24SR::M24SR_ReceiveReadBinary(){
giovannivisentini 19:0b65a5813059 726
giovannivisentini 19:0b65a5813059 727 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 728 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 729 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 730 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 731
giovannivisentini 19:0b65a5813059 732 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 733
giovannivisentini 19:0b65a5813059 734 status = M24SR_IO_ReceiveI2Cresponse (length + M24SR_STATUSRESPONSE_NBBYTE , uM24SRbuffer );
giovannivisentini 19:0b65a5813059 735 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 736 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 0:969a2be49f41 737 return status;
giovannivisentini 19:0b65a5813059 738 }
giovannivisentini 19:0b65a5813059 739 status = M24SR_IsCorrectCRC16Residue(uM24SRbuffer, length + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 740 if(status != NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 741 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 742 else{
giovannivisentini 19:0b65a5813059 743 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 19:0b65a5813059 744 memcpy(mLastCommandData.data, &uM24SRbuffer[1], length);
giovannivisentini 19:0b65a5813059 745 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 746 }
giovannivisentini 19:0b65a5813059 747 return status;
giovannivisentini 0:969a2be49f41 748
giovannivisentini 0:969a2be49f41 749 }
giovannivisentini 0:969a2be49f41 750
giovannivisentini 0:969a2be49f41 751 /**
giovannivisentini 0:969a2be49f41 752 * @brief This function sends a ST read binary command (no error if access is not inside NDEF file)
giovannivisentini 9:9f2e2e68d695 753 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 754 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 755 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 756 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 757 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 758 */
giovannivisentini 19:0b65a5813059 759 NFC_StatusTypeDef M24SR::M24SR_SendSTReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 760 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 19:0b65a5813059 761 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 762 if(NbByteToRead>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 763 NbByteToRead=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 764
giovannivisentini 0:969a2be49f41 765 C_APDU command;
giovannivisentini 0:969a2be49f41 766 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 19:0b65a5813059 767 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 768 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 769
giovannivisentini 0:969a2be49f41 770 /* build the command */
giovannivisentini 0:969a2be49f41 771 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 772 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 773 /* copy the offset */
giovannivisentini 0:969a2be49f41 774 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 775 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 776 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 777 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 778
giovannivisentini 0:969a2be49f41 779 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 780 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 781
giovannivisentini 19:0b65a5813059 782 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 783 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 784 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 785 return status;
giovannivisentini 19:0b65a5813059 786 }
giovannivisentini 19:0b65a5813059 787
giovannivisentini 19:0b65a5813059 788 mLastCommandSend=READ;
giovannivisentini 19:0b65a5813059 789 mLastCommandData.data=pBufferRead;
giovannivisentini 19:0b65a5813059 790 mLastCommandData.length=NbByteToRead;
giovannivisentini 0:969a2be49f41 791
giovannivisentini 19:0b65a5813059 792 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 793 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 794 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 795 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 796 }else{
giovannivisentini 19:0b65a5813059 797 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 798 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 799 return status;
giovannivisentini 19:0b65a5813059 800 }//if-else
giovannivisentini 19:0b65a5813059 801 }//if
giovannivisentini 0:969a2be49f41 802
giovannivisentini 0:969a2be49f41 803 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 804 }
giovannivisentini 0:969a2be49f41 805
giovannivisentini 0:969a2be49f41 806 /**
giovannivisentini 0:969a2be49f41 807 * @brief This function sends a Update binary command
giovannivisentini 9:9f2e2e68d695 808 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 809 * @param NbByteToWrite number of bytes to write
giovannivisentini 9:9f2e2e68d695 810 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 811 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 812 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 813 */
giovannivisentini 19:0b65a5813059 814 NFC_StatusTypeDef M24SR::M24SR_SendUpdateBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 815 uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
giovannivisentini 19:0b65a5813059 816 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 817 if(NbByteToWrite>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 818 NbByteToWrite=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 819
giovannivisentini 0:969a2be49f41 820 C_APDU command;
giovannivisentini 19:0b65a5813059 821 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 822 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 823 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 824
giovannivisentini 0:969a2be49f41 825 /* build the command */
giovannivisentini 0:969a2be49f41 826 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 827 command.Header.INS = C_APDU_UPDATE_BINARY;
giovannivisentini 0:969a2be49f41 828 /* copy the offset */
giovannivisentini 0:969a2be49f41 829 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 830 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 831 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 832 command.Body.LC = NbByteToWrite;
giovannivisentini 0:969a2be49f41 833 command.Body.pData = pDataToWrite;
giovannivisentini 0:969a2be49f41 834 /* copy the File Id */
giovannivisentini 0:969a2be49f41 835 //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
giovannivisentini 0:969a2be49f41 836 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 837 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 838
giovannivisentini 19:0b65a5813059 839 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 840 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 841 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 842 return status;
giovannivisentini 19:0b65a5813059 843 }
giovannivisentini 19:0b65a5813059 844
giovannivisentini 19:0b65a5813059 845 mLastCommandSend=UPDATE;
giovannivisentini 19:0b65a5813059 846 mLastCommandData.data=pDataToWrite;
giovannivisentini 19:0b65a5813059 847 mLastCommandData.length=NbByteToWrite;
giovannivisentini 19:0b65a5813059 848 mLastCommandData.offset=Offset;
giovannivisentini 19:0b65a5813059 849
giovannivisentini 19:0b65a5813059 850 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 851 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 852 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 853 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 854 }else{
giovannivisentini 19:0b65a5813059 855 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 856 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 857 return status;
giovannivisentini 19:0b65a5813059 858 }//if-else
giovannivisentini 19:0b65a5813059 859 }
giovannivisentini 0:969a2be49f41 860
giovannivisentini 19:0b65a5813059 861 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 862 }
giovannivisentini 19:0b65a5813059 863
giovannivisentini 19:0b65a5813059 864 NFC_StatusTypeDef M24SR::M24SR_ReceiveUpdateBinary() {
giovannivisentini 19:0b65a5813059 865
giovannivisentini 19:0b65a5813059 866 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 867 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 868 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 869 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 870 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 871
giovannivisentini 19:0b65a5813059 872 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 873
giovannivisentini 19:0b65a5813059 874 status= M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer) , respBuffer);
giovannivisentini 19:0b65a5813059 875 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 876 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 877 return status;
giovannivisentini 19:0b65a5813059 878 }
giovannivisentini 19:0b65a5813059 879
giovannivisentini 19:0b65a5813059 880 if (IsSBlock(respBuffer) == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 881 /*check the CRC */
giovannivisentini 19:0b65a5813059 882 status =M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 19:0b65a5813059 883 M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 884 // TODO: why if we check ==NFC_Commandsuccess it fail?
giovannivisentini 0:969a2be49f41 885 if (status != NFC_IO_ERROR_CRC) {
giovannivisentini 0:969a2be49f41 886 /* send the FrameExension response*/
giovannivisentini 19:0b65a5813059 887 status = M24SR_SendFWTExtension(respBuffer[M24SR_OFFSET_PCB + 1]);
giovannivisentini 19:0b65a5813059 888 if(status!=NFC_SUCCESS){ //something get wrong -> abort the update
giovannivisentini 19:0b65a5813059 889 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 890 }//status
giovannivisentini 19:0b65a5813059 891 }//if
giovannivisentini 19:0b65a5813059 892 } else { //isSBlock
giovannivisentini 19:0b65a5813059 893 status = M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 0:969a2be49f41 894 M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 895 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 896 }//if else
giovannivisentini 19:0b65a5813059 897 return status;
giovannivisentini 19:0b65a5813059 898 }//M24SR_ReceiveUpdateBinary
giovannivisentini 0:969a2be49f41 899
giovannivisentini 0:969a2be49f41 900
giovannivisentini 0:969a2be49f41 901 /**
giovannivisentini 0:969a2be49f41 902 * @brief This function sends the Verify command
giovannivisentini 9:9f2e2e68d695 903 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 904 * @param NbPwdByte Number of bytes ( 0x00 or 0x10)
giovannivisentini 9:9f2e2e68d695 905 * @param pPwd pointer to the password
giovannivisentini 9:9f2e2e68d695 906 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 907 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 908 */
giovannivisentini 19:0b65a5813059 909 NFC_StatusTypeDef M24SR::M24SR_SendVerify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 910 const uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 911 C_APDU command;
giovannivisentini 19:0b65a5813059 912 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 913 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 914 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 915
giovannivisentini 0:969a2be49f41 916 /*check the parameters */
giovannivisentini 19:0b65a5813059 917 if ((uPwdId > 0x0003)|| ((NbPwdByte != 0x00) && (NbPwdByte != 0x10))) {
giovannivisentini 19:0b65a5813059 918 getCallback()->onVerifyed(this,NFC_IO_ERROR_PARAMETER);
giovannivisentini 0:969a2be49f41 919 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 920 }
giovannivisentini 0:969a2be49f41 921
giovannivisentini 0:969a2be49f41 922 /* build the command */
giovannivisentini 0:969a2be49f41 923 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 924 command.Header.INS = C_APDU_VERIFY;
giovannivisentini 0:969a2be49f41 925 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 926 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 927 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 9:9f2e2e68d695 928 /* copy the number of bytes of the data field */
giovannivisentini 0:969a2be49f41 929 command.Body.LC = NbPwdByte;
giovannivisentini 0:969a2be49f41 930
giovannivisentini 0:969a2be49f41 931 if (NbPwdByte == 0x10) {
giovannivisentini 0:969a2be49f41 932 /* copy the password */
giovannivisentini 0:969a2be49f41 933 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 934 /* build the I2C command */
giovannivisentini 0:969a2be49f41 935 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
giovannivisentini 0:969a2be49f41 936 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 937 } else {
giovannivisentini 0:969a2be49f41 938 command.Body.pData = NULL;
giovannivisentini 0:969a2be49f41 939 /* build the I2C command */
giovannivisentini 0:969a2be49f41 940 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
giovannivisentini 0:969a2be49f41 941 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 942 }
giovannivisentini 0:969a2be49f41 943
giovannivisentini 0:969a2be49f41 944 /* send the request */
giovannivisentini 19:0b65a5813059 945 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 946 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 947 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 948 return status;
giovannivisentini 19:0b65a5813059 949 }
giovannivisentini 19:0b65a5813059 950 mLastCommandSend=VERIFY;
giovannivisentini 19:0b65a5813059 951 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 952 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 953 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 954 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 955 else{
giovannivisentini 19:0b65a5813059 956 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 957 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 958 return status;
giovannivisentini 19:0b65a5813059 959 }
giovannivisentini 19:0b65a5813059 960 }
giovannivisentini 0:969a2be49f41 961
giovannivisentini 19:0b65a5813059 962 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 963 }
giovannivisentini 19:0b65a5813059 964
giovannivisentini 19:0b65a5813059 965 NFC_StatusTypeDef M24SR::M24SR_ReceiveVerify(){
giovannivisentini 19:0b65a5813059 966 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 967 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 968 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 969
giovannivisentini 19:0b65a5813059 970 status=M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer),respBuffer);
giovannivisentini 19:0b65a5813059 971
giovannivisentini 19:0b65a5813059 972 if(status !=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 973 getCallback()->onVerifyed(this,status);
giovannivisentini 0:969a2be49f41 974 return status;
giovannivisentini 19:0b65a5813059 975 }
giovannivisentini 0:969a2be49f41 976
giovannivisentini 19:0b65a5813059 977 status = M24SR_IsCorrectCRC16Residue(respBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 978 getCallback()->onVerifyed(this,status);
giovannivisentini 19:0b65a5813059 979 return status;
giovannivisentini 0:969a2be49f41 980 }
giovannivisentini 0:969a2be49f41 981
giovannivisentini 0:969a2be49f41 982 /**
giovannivisentini 0:969a2be49f41 983 * @brief This function sends the ChangeReferenceData command
giovannivisentini 9:9f2e2e68d695 984 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 985 * @param pPwd pointer to the passwaord
giovannivisentini 9:9f2e2e68d695 986 * @retval Status (SW1&SW2) Satus of the operation to complete.
giovannivisentini 9:9f2e2e68d695 987 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 988 */
giovannivisentini 19:0b65a5813059 989 NFC_StatusTypeDef M24SR::M24SR_SendChangeReferenceData(uint16_t uPwdId,
giovannivisentini 0:969a2be49f41 990 uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 991 C_APDU command;
giovannivisentini 19:0b65a5813059 992 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 993 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 994 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 995
giovannivisentini 0:969a2be49f41 996 /*check the parameters */
giovannivisentini 0:969a2be49f41 997 if (uPwdId > 0x0003) {
giovannivisentini 19:0b65a5813059 998 getCallback()->onChangeReferenceData(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 999 constToPasswordType(uPwdId), pPwd);
giovannivisentini 0:969a2be49f41 1000 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1001 }
giovannivisentini 0:969a2be49f41 1002
giovannivisentini 0:969a2be49f41 1003 /* build the command */
giovannivisentini 0:969a2be49f41 1004 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1005 command.Header.INS = C_APDU_CHANGE;
giovannivisentini 0:969a2be49f41 1006 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1007 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 1008 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 0:969a2be49f41 1009 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 1010 command.Body.LC = M24SR_PASSWORD_NBBYTE;
giovannivisentini 0:969a2be49f41 1011 /* copy the password */
giovannivisentini 0:969a2be49f41 1012 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 1013 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1014 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1015 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1016
giovannivisentini 0:969a2be49f41 1017 /* send the request */
giovannivisentini 19:0b65a5813059 1018 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1019 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1020 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1021 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1022 return status;
giovannivisentini 19:0b65a5813059 1023 }
giovannivisentini 19:0b65a5813059 1024
giovannivisentini 19:0b65a5813059 1025 mLastCommandSend = CHANGE_REFERENCE_DATA;
giovannivisentini 19:0b65a5813059 1026 mLastCommandData.data = pPwd;
giovannivisentini 19:0b65a5813059 1027 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1028 mLastCommandData.offset = (uint8_t)uPwdId;
giovannivisentini 0:969a2be49f41 1029
giovannivisentini 19:0b65a5813059 1030 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1031 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1032 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1033 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1034 }else{
giovannivisentini 19:0b65a5813059 1035 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1036 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1037 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1038 return status;
giovannivisentini 19:0b65a5813059 1039 }//if-else
giovannivisentini 19:0b65a5813059 1040 }//if
giovannivisentini 19:0b65a5813059 1041
giovannivisentini 19:0b65a5813059 1042 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1043 }
giovannivisentini 0:969a2be49f41 1044
giovannivisentini 19:0b65a5813059 1045 NFC_StatusTypeDef M24SR::M24SR_ReceiveChangeReferenceData(){
giovannivisentini 19:0b65a5813059 1046 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1047 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1048 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1049
giovannivisentini 19:0b65a5813059 1050 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1051 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 1052
giovannivisentini 19:0b65a5813059 1053 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1054 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1055 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 0:969a2be49f41 1056 return status;
giovannivisentini 19:0b65a5813059 1057 }//else
giovannivisentini 19:0b65a5813059 1058
giovannivisentini 19:0b65a5813059 1059 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1060
giovannivisentini 19:0b65a5813059 1061 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1062 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 19:0b65a5813059 1063 return status;
giovannivisentini 0:969a2be49f41 1064 }
giovannivisentini 0:969a2be49f41 1065
giovannivisentini 0:969a2be49f41 1066 /**
giovannivisentini 0:969a2be49f41 1067 * @brief This function sends the EnableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1068 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1069 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1070 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1071 */
giovannivisentini 19:0b65a5813059 1072 NFC_StatusTypeDef M24SR::M24SR_SendEnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1073 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1074 C_APDU command;
giovannivisentini 19:0b65a5813059 1075 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1076 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1077 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1078
giovannivisentini 0:969a2be49f41 1079 /*check the parameters */
giovannivisentini 0:969a2be49f41 1080 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1081 getCallback()->onEnableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1082 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1083 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1084 }
giovannivisentini 0:969a2be49f41 1085
giovannivisentini 0:969a2be49f41 1086 /* build the command */
giovannivisentini 0:969a2be49f41 1087 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1088 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1089 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1090 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1091 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1092 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1093 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1094 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1095
giovannivisentini 0:969a2be49f41 1096 /* send the request */
giovannivisentini 19:0b65a5813059 1097 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1098 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1099 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1100 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1101 return status;
giovannivisentini 19:0b65a5813059 1102 }//if
giovannivisentini 19:0b65a5813059 1103
giovannivisentini 19:0b65a5813059 1104 mLastCommandSend = ENABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1105 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1106 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1107
giovannivisentini 19:0b65a5813059 1108 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1109 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1110 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1111 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1112 }else{
giovannivisentini 19:0b65a5813059 1113 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1114 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1115 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1116 return status;
giovannivisentini 19:0b65a5813059 1117 }//if-else
giovannivisentini 19:0b65a5813059 1118 }//if
giovannivisentini 0:969a2be49f41 1119
giovannivisentini 19:0b65a5813059 1120 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1121 }
giovannivisentini 19:0b65a5813059 1122
giovannivisentini 19:0b65a5813059 1123 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1124 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1125 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1126 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1127
giovannivisentini 19:0b65a5813059 1128 const PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1129
giovannivisentini 19:0b65a5813059 1130 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1131 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1132 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 0:969a2be49f41 1133 return status;
giovannivisentini 19:0b65a5813059 1134 }//else
giovannivisentini 19:0b65a5813059 1135
giovannivisentini 19:0b65a5813059 1136 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1137
giovannivisentini 19:0b65a5813059 1138 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1139 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1140 return status;
giovannivisentini 0:969a2be49f41 1141 }
giovannivisentini 0:969a2be49f41 1142
giovannivisentini 19:0b65a5813059 1143
giovannivisentini 0:969a2be49f41 1144 /**
giovannivisentini 0:969a2be49f41 1145 * @brief This function sends the DisableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1146 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1147 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1148 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1149 */
giovannivisentini 19:0b65a5813059 1150 NFC_StatusTypeDef M24SR::M24SR_SendDisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1151 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1152 C_APDU command;
giovannivisentini 19:0b65a5813059 1153 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1154 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1155 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1156
giovannivisentini 0:969a2be49f41 1157 /*check the parameters */
giovannivisentini 0:969a2be49f41 1158 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1159 getCallback()->onDisableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1160 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1161 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1162 }
giovannivisentini 0:969a2be49f41 1163
giovannivisentini 0:969a2be49f41 1164 /* build the command */
giovannivisentini 0:969a2be49f41 1165 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1166 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1167 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1168 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1169 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1170 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1171 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1172 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1173
giovannivisentini 0:969a2be49f41 1174 /* send the request */
giovannivisentini 19:0b65a5813059 1175 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1176 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1177 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1178 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1179 return status;
giovannivisentini 19:0b65a5813059 1180 }
giovannivisentini 19:0b65a5813059 1181
giovannivisentini 19:0b65a5813059 1182 mLastCommandSend = DISABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1183 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1184 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1185
giovannivisentini 19:0b65a5813059 1186 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1187 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1188 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1189 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1190 }else{
giovannivisentini 19:0b65a5813059 1191 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1192 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1193 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1194 return status;
giovannivisentini 19:0b65a5813059 1195 }//if-else
giovannivisentini 19:0b65a5813059 1196 }
giovannivisentini 0:969a2be49f41 1197
giovannivisentini 19:0b65a5813059 1198 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1199
giovannivisentini 0:969a2be49f41 1200 }
giovannivisentini 0:969a2be49f41 1201
giovannivisentini 19:0b65a5813059 1202 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1203 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1204 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1205 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1206
giovannivisentini 19:0b65a5813059 1207 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1208
giovannivisentini 19:0b65a5813059 1209 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1210 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1211 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1212 return status;
giovannivisentini 19:0b65a5813059 1213 }//else
giovannivisentini 19:0b65a5813059 1214
giovannivisentini 19:0b65a5813059 1215 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1216
giovannivisentini 19:0b65a5813059 1217 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1218 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1219 return status;
giovannivisentini 19:0b65a5813059 1220 }
giovannivisentini 19:0b65a5813059 1221
giovannivisentini 19:0b65a5813059 1222
giovannivisentini 0:969a2be49f41 1223 /**
giovannivisentini 0:969a2be49f41 1224 * @brief This function sends the EnablePermananentState command
giovannivisentini 9:9f2e2e68d695 1225 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1226 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1227 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1228 */
giovannivisentini 19:0b65a5813059 1229 NFC_StatusTypeDef M24SR::M24SR_SendEnablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1230 C_APDU command;
giovannivisentini 19:0b65a5813059 1231 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1232
giovannivisentini 0:969a2be49f41 1233 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1234 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1235
giovannivisentini 0:969a2be49f41 1236 /*check the parameters */
giovannivisentini 0:969a2be49f41 1237 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1238 getCallback()->onEnablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1239 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1240 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1241 }
giovannivisentini 0:969a2be49f41 1242
giovannivisentini 0:969a2be49f41 1243 /* build the command */
giovannivisentini 0:969a2be49f41 1244 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1245 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1246 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1247 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1248 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1249 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1250 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1251 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1252
giovannivisentini 0:969a2be49f41 1253 /* send the request */
giovannivisentini 19:0b65a5813059 1254 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1255 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1256 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1257 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1258 return status;
giovannivisentini 19:0b65a5813059 1259 }
giovannivisentini 19:0b65a5813059 1260
giovannivisentini 19:0b65a5813059 1261 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1262 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1263 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1264
giovannivisentini 19:0b65a5813059 1265 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1266 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1267 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1268 return M24SR_ReceiveEnablePermanentState();
giovannivisentini 19:0b65a5813059 1269 }else{
giovannivisentini 19:0b65a5813059 1270 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1271 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1272 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1273 return status;
giovannivisentini 19:0b65a5813059 1274 }//if-else
giovannivisentini 19:0b65a5813059 1275 }
giovannivisentini 0:969a2be49f41 1276
giovannivisentini 19:0b65a5813059 1277 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1278 }
giovannivisentini 19:0b65a5813059 1279
giovannivisentini 19:0b65a5813059 1280 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnablePermanentState(){
giovannivisentini 19:0b65a5813059 1281 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1282 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1283 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1284
giovannivisentini 19:0b65a5813059 1285 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1286
giovannivisentini 19:0b65a5813059 1287 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1288 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1289 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1290 return status;
giovannivisentini 19:0b65a5813059 1291 }//else
giovannivisentini 19:0b65a5813059 1292
giovannivisentini 19:0b65a5813059 1293 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1294
giovannivisentini 19:0b65a5813059 1295 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1296 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1297 return status;
giovannivisentini 0:969a2be49f41 1298 }
giovannivisentini 0:969a2be49f41 1299
giovannivisentini 19:0b65a5813059 1300
giovannivisentini 0:969a2be49f41 1301 /**
giovannivisentini 0:969a2be49f41 1302 * @brief This function sends the DisablePermanentState command
giovannivisentini 9:9f2e2e68d695 1303 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1304 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1305 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1306 */
giovannivisentini 19:0b65a5813059 1307 NFC_StatusTypeDef M24SR::M24SR_SendDisablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1308 C_APDU command;
giovannivisentini 19:0b65a5813059 1309 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1310 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1311 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1312
giovannivisentini 0:969a2be49f41 1313 /*check the parameters */
giovannivisentini 0:969a2be49f41 1314 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1315 getCallback()->onDisablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1316 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1317 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1318 }
giovannivisentini 0:969a2be49f41 1319
giovannivisentini 0:969a2be49f41 1320 /* build the command */
giovannivisentini 0:969a2be49f41 1321 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1322 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1323 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1324 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1325 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1326 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1327 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1328 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1329
giovannivisentini 0:969a2be49f41 1330 /* send the request */
giovannivisentini 19:0b65a5813059 1331 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1332 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1333 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1334 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1335 return status;
giovannivisentini 19:0b65a5813059 1336 }
giovannivisentini 19:0b65a5813059 1337
giovannivisentini 19:0b65a5813059 1338 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1339 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1340 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1341
giovannivisentini 19:0b65a5813059 1342 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1343 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1344 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1345 return M24SR_ReceiveDisablePermanentState();
giovannivisentini 19:0b65a5813059 1346 }else{
giovannivisentini 19:0b65a5813059 1347 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1348 getCallback()->onDisablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1349 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1350 return status;
giovannivisentini 19:0b65a5813059 1351 }//if-else
giovannivisentini 19:0b65a5813059 1352 }
giovannivisentini 19:0b65a5813059 1353
giovannivisentini 19:0b65a5813059 1354 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1355 }
giovannivisentini 0:969a2be49f41 1356
giovannivisentini 19:0b65a5813059 1357 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisablePermanentState(){
giovannivisentini 19:0b65a5813059 1358 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1359 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1360 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1361
giovannivisentini 19:0b65a5813059 1362 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1363
giovannivisentini 19:0b65a5813059 1364 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1365 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1366 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1367 return status;
giovannivisentini 19:0b65a5813059 1368 }//else
giovannivisentini 19:0b65a5813059 1369
giovannivisentini 19:0b65a5813059 1370 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1371
giovannivisentini 19:0b65a5813059 1372 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1373 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1374 return status;
giovannivisentini 0:969a2be49f41 1375 }
giovannivisentini 0:969a2be49f41 1376
giovannivisentini 0:969a2be49f41 1377 /**
giovannivisentini 9:9f2e2e68d695 1378 * @brief This function generates an interrupt on GPO pin
giovannivisentini 0:969a2be49f41 1379 * @param None
giovannivisentini 9:9f2e2e68d695 1380 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1381 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1382 */
giovannivisentini 0:969a2be49f41 1383 NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
giovannivisentini 0:969a2be49f41 1384 C_APDU command;
giovannivisentini 0:969a2be49f41 1385
giovannivisentini 0:969a2be49f41 1386 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1387 uint16_t uP1P2 = 0x001E;
giovannivisentini 0:969a2be49f41 1388 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1389 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1390
giovannivisentini 0:969a2be49f41 1391 status = M24SR_ManageI2CGPO(INTERRUPT);
giovannivisentini 0:969a2be49f41 1392
giovannivisentini 0:969a2be49f41 1393 /* build the command */
giovannivisentini 0:969a2be49f41 1394 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1395 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1396 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1397 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1398 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1399 command.Body.LC = 0x00;
giovannivisentini 0:969a2be49f41 1400 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1401 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1402 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1403
giovannivisentini 0:969a2be49f41 1404 /* send the request */
giovannivisentini 0:969a2be49f41 1405 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1406 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1407 /* read the response */
giovannivisentini 0:969a2be49f41 1408 errchk(
giovannivisentini 0:969a2be49f41 1409 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1410
giovannivisentini 0:969a2be49f41 1411 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1412
giovannivisentini 0:969a2be49f41 1413 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1414 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1415 else
giovannivisentini 0:969a2be49f41 1416 return status;
giovannivisentini 0:969a2be49f41 1417
giovannivisentini 0:969a2be49f41 1418 }
giovannivisentini 0:969a2be49f41 1419
giovannivisentini 0:969a2be49f41 1420 /**
giovannivisentini 9:9f2e2e68d695 1421 * @brief This function forces GPO pin to low state or high Z
giovannivisentini 9:9f2e2e68d695 1422 * @param uSetOrReset select if GPO must be low (reset) or HiZ
giovannivisentini 9:9f2e2e68d695 1423 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1424 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1425 */
giovannivisentini 0:969a2be49f41 1426 NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
giovannivisentini 0:969a2be49f41 1427 C_APDU command;
giovannivisentini 0:969a2be49f41 1428 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1429 uint16_t uP1P2 = 0x001F;
giovannivisentini 0:969a2be49f41 1430 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1431 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1432
giovannivisentini 0:969a2be49f41 1433 /*check the parameters */
giovannivisentini 0:969a2be49f41 1434 if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
giovannivisentini 0:969a2be49f41 1435 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1436 }
giovannivisentini 0:969a2be49f41 1437
giovannivisentini 0:969a2be49f41 1438 status = M24SR_ManageI2CGPO(STATE_CONTROL);
giovannivisentini 0:969a2be49f41 1439
giovannivisentini 0:969a2be49f41 1440 /* build the command */
giovannivisentini 0:969a2be49f41 1441 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1442 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1443 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1444 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1445 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1446 command.Body.LC = 0x01;
giovannivisentini 0:969a2be49f41 1447 command.Body.pData = &uSetOrReset;
giovannivisentini 0:969a2be49f41 1448 /* copy the data */
giovannivisentini 0:969a2be49f41 1449 //memcpy(command.Body.pData , &uSetOrReset, 0x01 );
giovannivisentini 0:969a2be49f41 1450 //command.Body.LE = 0x00 ;
giovannivisentini 0:969a2be49f41 1451 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1452 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1453 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1454
giovannivisentini 0:969a2be49f41 1455 /* send the request */
giovannivisentini 0:969a2be49f41 1456 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1457 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1458 /* read the response */
giovannivisentini 0:969a2be49f41 1459 errchk(
giovannivisentini 0:969a2be49f41 1460 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1461
giovannivisentini 0:969a2be49f41 1462 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1463
giovannivisentini 0:969a2be49f41 1464 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1465 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1466 else
giovannivisentini 0:969a2be49f41 1467 return status;
giovannivisentini 0:969a2be49f41 1468 }
giovannivisentini 0:969a2be49f41 1469
giovannivisentini 7:19fc04b8fec6 1470
giovannivisentini 19:0b65a5813059 1471 NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1472
giovannivisentini 0:969a2be49f41 1473 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1474 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1475 }
giovannivisentini 0:969a2be49f41 1476
giovannivisentini 19:0b65a5813059 1477 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1478 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1479 mManageGPOCallback.setNewGpoConfig(true,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1480
giovannivisentini 19:0b65a5813059 1481 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1482 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1483 }
giovannivisentini 0:969a2be49f41 1484
giovannivisentini 19:0b65a5813059 1485 NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1486
giovannivisentini 19:0b65a5813059 1487 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1488 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1489 }
giovannivisentini 0:969a2be49f41 1490
giovannivisentini 19:0b65a5813059 1491 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1492 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1493 mManageGPOCallback.setNewGpoConfig(false,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1494
giovannivisentini 19:0b65a5813059 1495 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1496 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1497 }
giovannivisentini 0:969a2be49f41 1498
giovannivisentini 0:969a2be49f41 1499 NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
giovannivisentini 0:969a2be49f41 1500 /* Disable RF */
giovannivisentini 0:969a2be49f41 1501 if (OnOffChoice != 0) {
giovannivisentini 0:969a2be49f41 1502 M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
giovannivisentini 0:969a2be49f41 1503 } else {
giovannivisentini 0:969a2be49f41 1504 M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
giovannivisentini 0:969a2be49f41 1505 }
giovannivisentini 0:969a2be49f41 1506 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1507 }
giovannivisentini 0:969a2be49f41 1508
giovannivisentini 0:969a2be49f41 1509 NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1510 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1511 int ret = dev_I2C.write(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1512 if (ret == 0)
giovannivisentini 0:969a2be49f41 1513 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1514 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1515 }
giovannivisentini 0:969a2be49f41 1516
giovannivisentini 0:969a2be49f41 1517 NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1518 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1519 int ret = dev_I2C.read(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1520 if (ret == 0)
giovannivisentini 0:969a2be49f41 1521 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1522
giovannivisentini 0:969a2be49f41 1523 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1524 }
giovannivisentini 0:969a2be49f41 1525
giovannivisentini 0:969a2be49f41 1526 NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
giovannivisentini 0:969a2be49f41 1527
giovannivisentini 0:969a2be49f41 1528 int status = 1;
giovannivisentini 0:969a2be49f41 1529 char buffer;
giovannivisentini 18:10def2fefa8a 1530 while (status != 0) {
giovannivisentini 10:482175f7ae66 1531 status = dev_I2C.read(address, &buffer, 1, false);
giovannivisentini 0:969a2be49f41 1532 }
giovannivisentini 0:969a2be49f41 1533
giovannivisentini 0:969a2be49f41 1534 if (status == 0)
giovannivisentini 0:969a2be49f41 1535 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1536 //else
giovannivisentini 0:969a2be49f41 1537 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1538 }
giovannivisentini 0:969a2be49f41 1539
giovannivisentini 19:0b65a5813059 1540 NFC_StatusTypeDef M24SR::ManageEvent(void){
giovannivisentini 0:969a2be49f41 1541
giovannivisentini 19:0b65a5813059 1542 switch(mLastCommandSend){
giovannivisentini 19:0b65a5813059 1543 case SELECT_APPLICATION:
giovannivisentini 19:0b65a5813059 1544 return M24SR_ReceiveSelectApplication();
giovannivisentini 19:0b65a5813059 1545 case SELECT_CC_FILE:
giovannivisentini 19:0b65a5813059 1546 return M24SR_ReceiveSelectCCfile();
giovannivisentini 19:0b65a5813059 1547 case SELECT_NDEF_FILE:
giovannivisentini 19:0b65a5813059 1548 return M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 1549 case SELECT_SYSTEM_FILE:
giovannivisentini 19:0b65a5813059 1550 return M24SR_ReceiveSelectSystemfile();
giovannivisentini 19:0b65a5813059 1551 case READ:
giovannivisentini 19:0b65a5813059 1552 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 1553 case UPDATE:
giovannivisentini 19:0b65a5813059 1554 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 1555 case VERIFY:
giovannivisentini 19:0b65a5813059 1556 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 1557 case DESELECT:
giovannivisentini 19:0b65a5813059 1558 return M24SR_ReceiveDeselect();
giovannivisentini 19:0b65a5813059 1559 case CHANGE_REFERENCE_DATA:
giovannivisentini 19:0b65a5813059 1560 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1561 case ENABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1562 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1563 case DISABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1564 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 16:b0d62f4b185a 1565
giovannivisentini 19:0b65a5813059 1566 default:
giovannivisentini 19:0b65a5813059 1567 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1568 }//switch
giovannivisentini 19:0b65a5813059 1569 }//manageInterrupt
giovannivisentini 0:969a2be49f41 1570
giovannivisentini 6:96389fb79676 1571 ////////////////////////hight level utility function //////////////////////////
giovannivisentini 6:96389fb79676 1572
giovannivisentini 6:96389fb79676 1573 NFC_StatusTypeDef M24SR::enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 19:0b65a5813059 1574 const uint8_t* pNewPassword) {
giovannivisentini 19:0b65a5813059 1575
giovannivisentini 19:0b65a5813059 1576 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1577 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1578 mChangePasswordRequestStatusCallback.setTask(ReadPwd,pNewPassword);
giovannivisentini 19:0b65a5813059 1579
giovannivisentini 19:0b65a5813059 1580 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1581 }
giovannivisentini 6:96389fb79676 1582
giovannivisentini 6:96389fb79676 1583 NFC_StatusTypeDef M24SR::disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 19:0b65a5813059 1584 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1585 mChangePasswordRequestStatusCallback.setTask(ReadPwd,NULL);
giovannivisentini 19:0b65a5813059 1586
giovannivisentini 19:0b65a5813059 1587 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1588 }
giovannivisentini 6:96389fb79676 1589
giovannivisentini 6:96389fb79676 1590 NFC_StatusTypeDef M24SR::enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1591 uint8_t* pNewPassword) {
giovannivisentini 19:0b65a5813059 1592 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1593 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1594 mChangePasswordRequestStatusCallback.setTask(WritePwd,pNewPassword);
giovannivisentini 19:0b65a5813059 1595
giovannivisentini 19:0b65a5813059 1596 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1597 }
giovannivisentini 6:96389fb79676 1598
giovannivisentini 6:96389fb79676 1599 NFC_StatusTypeDef M24SR::disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 19:0b65a5813059 1600 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1601 mChangePasswordRequestStatusCallback.setTask(WritePwd,NULL);
giovannivisentini 19:0b65a5813059 1602
giovannivisentini 19:0b65a5813059 1603 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1604 }
giovannivisentini 6:96389fb79676 1605
giovannivisentini 6:96389fb79676 1606 NFC_StatusTypeDef M24SR::disableAllPassword(const uint8_t* pSuperUserPassword){
giovannivisentini 19:0b65a5813059 1607 mComponentCallback = &mChangePasswordRequestStatusCallback;
giovannivisentini 19:0b65a5813059 1608 return Verify(M24SR::I2CPwd, 0x10, pSuperUserPassword);
giovannivisentini 6:96389fb79676 1609 }
giovannivisentini 6:96389fb79676 1610
giovannivisentini 6:96389fb79676 1611 NFC_StatusTypeDef M24SR::enableReadOnly(const uint8_t* pCurrentWritePassword){
giovannivisentini 6:96389fb79676 1612
giovannivisentini 19:0b65a5813059 1613 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1614 //disable write = read only
giovannivisentini 19:0b65a5813059 1615 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,false);
giovannivisentini 19:0b65a5813059 1616
giovannivisentini 19:0b65a5813059 1617 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1618 }
giovannivisentini 6:96389fb79676 1619
giovannivisentini 6:96389fb79676 1620 NFC_StatusTypeDef M24SR::disableReadOnly() {
giovannivisentini 19:0b65a5813059 1621 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1622 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::WRITE,true);
giovannivisentini 19:0b65a5813059 1623 return Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD);
giovannivisentini 6:96389fb79676 1624 }
giovannivisentini 6:96389fb79676 1625
giovannivisentini 6:96389fb79676 1626
giovannivisentini 6:96389fb79676 1627 NFC_StatusTypeDef M24SR::enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1628
giovannivisentini 19:0b65a5813059 1629 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1630 //disable read = enable write only
giovannivisentini 19:0b65a5813059 1631 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,false);
giovannivisentini 19:0b65a5813059 1632
giovannivisentini 19:0b65a5813059 1633 return Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword);
giovannivisentini 6:96389fb79676 1634
giovannivisentini 6:96389fb79676 1635 }
giovannivisentini 6:96389fb79676 1636
giovannivisentini 6:96389fb79676 1637 NFC_StatusTypeDef M24SR::disableWriteOnly() {
giovannivisentini 19:0b65a5813059 1638 mComponentCallback = &mChangeAccessStateCallback;
giovannivisentini 19:0b65a5813059 1639 mChangeAccessStateCallback.changeAccessState(ChangeAccessStateCallback::READ,true);
giovannivisentini 19:0b65a5813059 1640 return Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD);
giovannivisentini 6:96389fb79676 1641 }
giovannivisentini 6:96389fb79676 1642
giovannivisentini 0:969a2be49f41 1643 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/