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:
Wed Feb 03 08:52:54 2016 +0000
Revision:
25:caa16fd0e50b
Parent:
24:9f98eafa2d39
Child:
26:2090378b0b51
update docs

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 23:d07138541feb 57 * default password, also used to enable super user mode through 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 25:caa16fd0e50b 76
giovannivisentini 25:caa16fd0e50b 77 /** call the fCall function 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 25:caa16fd0e50b 152 * @brief This functions creates an I block command according to the structures CommandStructure and 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 23:d07138541feb 284 errchk(M24SR_ForceSession())
giovannivisentini 19:0b65a5813059 285 //leave the gpo always up
giovannivisentini 19:0b65a5813059 286 errchk(M24SR_ManageI2CGPO(DEFAULT_GPO_STATUS))
giovannivisentini 21:ccc4f3fed4b3 287 errchk(M24SR_ManageRFGPO(DEFAULT_GPO_STATUS))
giovannivisentini 19:0b65a5813059 288 //close the session
giovannivisentini 19:0b65a5813059 289 errchk(M24SR_Deselect())
giovannivisentini 19:0b65a5813059 290 mGpoEventInterrupt.enable_irq();
giovannivisentini 19:0b65a5813059 291 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 292 }
giovannivisentini 0:969a2be49f41 293
giovannivisentini 19:0b65a5813059 294
giovannivisentini 0:969a2be49f41 295 /**
giovannivisentini 0:969a2be49f41 296 * @brief This function sends the KillSession command to the M24SR device
giovannivisentini 0:969a2be49f41 297 * @param None
giovannivisentini 9:9f2e2e68d695 298 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 299 */
giovannivisentini 23:d07138541feb 300 NFC_StatusTypeDef M24SR::M24SR_ForceSession(void) {
giovannivisentini 0:969a2be49f41 301 uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
giovannivisentini 19:0b65a5813059 302 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 303 status = M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer);
giovannivisentini 19:0b65a5813059 304 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 305 mCallback->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 306 return status;
giovannivisentini 19:0b65a5813059 307 }
giovannivisentini 0:969a2be49f41 308
giovannivisentini 0:969a2be49f41 309 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 310 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 311 /* GPO can not be use with KillSession command */
giovannivisentini 19:0b65a5813059 312 status = M24SR_IO_PollI2C();
giovannivisentini 0:969a2be49f41 313
giovannivisentini 19:0b65a5813059 314 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 315 return status;
giovannivisentini 19:0b65a5813059 316
giovannivisentini 0:969a2be49f41 317 }
giovannivisentini 0:969a2be49f41 318
giovannivisentini 0:969a2be49f41 319 /**
giovannivisentini 0:969a2be49f41 320 * @brief This function sends the Deselect command (S-Block format)
giovannivisentini 9:9f2e2e68d695 321 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 322 */
giovannivisentini 0:969a2be49f41 323 NFC_StatusTypeDef M24SR::M24SR_Deselect(void) {
giovannivisentini 0:969a2be49f41 324 uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND;
giovannivisentini 19:0b65a5813059 325 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 326 /* send the request */
giovannivisentini 19:0b65a5813059 327 status = M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer);
giovannivisentini 19:0b65a5813059 328 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 329 getCallback()->onDeselect(this,status);
giovannivisentini 19:0b65a5813059 330 }
giovannivisentini 19:0b65a5813059 331
giovannivisentini 19:0b65a5813059 332 mLastCommandSend=DESELECT;
giovannivisentini 0:969a2be49f41 333
giovannivisentini 19:0b65a5813059 334 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 335 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 336 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 337 return M24SR_ReceiveDeselect();
giovannivisentini 19:0b65a5813059 338 else{
giovannivisentini 19:0b65a5813059 339 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 340 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 341 return status;
giovannivisentini 19:0b65a5813059 342 }//if-else
giovannivisentini 19:0b65a5813059 343
giovannivisentini 19:0b65a5813059 344 }
giovannivisentini 0:969a2be49f41 345
giovannivisentini 0:969a2be49f41 346 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 347 }
giovannivisentini 0:969a2be49f41 348
giovannivisentini 19:0b65a5813059 349 NFC_StatusTypeDef M24SR::M24SR_ReceiveDeselect(void){
giovannivisentini 19:0b65a5813059 350 uint8_t pBuffer[4];
giovannivisentini 19:0b65a5813059 351 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 352 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer);
giovannivisentini 19:0b65a5813059 353 getCallback()->onDeselect(this,status);
giovannivisentini 19:0b65a5813059 354 return status;
giovannivisentini 19:0b65a5813059 355 }
giovannivisentini 19:0b65a5813059 356
giovannivisentini 19:0b65a5813059 357
giovannivisentini 19:0b65a5813059 358
giovannivisentini 19:0b65a5813059 359 /**
giovannivisentini 19:0b65a5813059 360 * @brief This function sends the GetSession command to the M24SR device
giovannivisentini 19:0b65a5813059 361 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 19:0b65a5813059 362 * @retval Status (SW1&SW2) if operation does not complete.
giovannivisentini 19:0b65a5813059 363 */
giovannivisentini 19:0b65a5813059 364 NFC_StatusTypeDef M24SR::M24SR_GetSession(void) {
giovannivisentini 19:0b65a5813059 365 uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
giovannivisentini 19:0b65a5813059 366
giovannivisentini 19:0b65a5813059 367 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 368 status = M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer);
giovannivisentini 19:0b65a5813059 369 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 370 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 371 return status;
giovannivisentini 19:0b65a5813059 372 }
giovannivisentini 19:0b65a5813059 373
giovannivisentini 19:0b65a5813059 374 /* Insure no access will be done just after open session */
giovannivisentini 19:0b65a5813059 375 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 19:0b65a5813059 376 /* GPO can not be use with KillSession command */
giovannivisentini 19:0b65a5813059 377 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 378
giovannivisentini 19:0b65a5813059 379 getCallback()->onSessionOpen(this,status);
giovannivisentini 19:0b65a5813059 380 return status;
giovannivisentini 19:0b65a5813059 381 }
giovannivisentini 19:0b65a5813059 382
giovannivisentini 0:969a2be49f41 383 /**
giovannivisentini 0:969a2be49f41 384 * @brief This function sends the SelectApplication command
giovannivisentini 9:9f2e2e68d695 385 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 386 */
giovannivisentini 19:0b65a5813059 387 NFC_StatusTypeDef M24SR::M24SR_SendSelectApplication(void) {
giovannivisentini 0:969a2be49f41 388
giovannivisentini 0:969a2be49f41 389 C_APDU command;
giovannivisentini 19:0b65a5813059 390 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 391 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 392 uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
giovannivisentini 0:969a2be49f41 393 uint8_t uLe = 0x00;
giovannivisentini 19:0b65a5813059 394 uint16_t uP1P2 =0x0400, NbByte;
giovannivisentini 0:969a2be49f41 395
giovannivisentini 0:969a2be49f41 396 /* build the command */
giovannivisentini 0:969a2be49f41 397 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 398 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 399 /* copy the offset */
giovannivisentini 0:969a2be49f41 400 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 401 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 402 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 403 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 404 /* copy the data */
giovannivisentini 0:969a2be49f41 405 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 406 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 407 command.Body.LE = uLe;
giovannivisentini 19:0b65a5813059 408 /* build the I2C command */
giovannivisentini 0:969a2be49f41 409 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,
giovannivisentini 0:969a2be49f41 410 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 411
giovannivisentini 0:969a2be49f41 412 /* send the request */
giovannivisentini 19:0b65a5813059 413 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 414 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 415 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 416 return status;
giovannivisentini 19:0b65a5813059 417 }
giovannivisentini 19:0b65a5813059 418
giovannivisentini 19:0b65a5813059 419 mLastCommandSend=SELECT_APPLICATION;
giovannivisentini 19:0b65a5813059 420
giovannivisentini 19:0b65a5813059 421 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 422 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 423 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 424 return M24SR_ReceiveSelectApplication();
giovannivisentini 19:0b65a5813059 425 else{
giovannivisentini 19:0b65a5813059 426 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 427 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 428 return status;
giovannivisentini 19:0b65a5813059 429 }//if-else
giovannivisentini 19:0b65a5813059 430 }//if
giovannivisentini 19:0b65a5813059 431
giovannivisentini 19:0b65a5813059 432 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 433 }
giovannivisentini 19:0b65a5813059 434
giovannivisentini 19:0b65a5813059 435 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectApplication(void) {
giovannivisentini 19:0b65a5813059 436
giovannivisentini 19:0b65a5813059 437 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 438 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 439
giovannivisentini 19:0b65a5813059 440 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 441
giovannivisentini 19:0b65a5813059 442 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 443 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 444 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 445 return status;
giovannivisentini 19:0b65a5813059 446 }//else
giovannivisentini 0:969a2be49f41 447 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 448 getCallback()->onSelectedApplication(this,status);
giovannivisentini 19:0b65a5813059 449 return status;
giovannivisentini 0:969a2be49f41 450
giovannivisentini 0:969a2be49f41 451 }
giovannivisentini 0:969a2be49f41 452
giovannivisentini 0:969a2be49f41 453
giovannivisentini 0:969a2be49f41 454
giovannivisentini 0:969a2be49f41 455 NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) {
giovannivisentini 0:969a2be49f41 456 if (!nfc_id) {
giovannivisentini 0:969a2be49f41 457 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 458 }
giovannivisentini 0:969a2be49f41 459
giovannivisentini 19:0b65a5813059 460 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 461 mComponentCallback = &mReadIDCallback;
giovannivisentini 19:0b65a5813059 462 mReadIDCallback.readIdOn(nfc_id);
giovannivisentini 0:969a2be49f41 463
giovannivisentini 19:0b65a5813059 464 //start the readID procedure
giovannivisentini 19:0b65a5813059 465 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 466 }
giovannivisentini 0:969a2be49f41 467
giovannivisentini 0:969a2be49f41 468 /**
giovannivisentini 0:969a2be49f41 469 * @brief This function sends the SelectCCFile command
giovannivisentini 9:9f2e2e68d695 470 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 471 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 9:9f2e2e68d695 472 * @retval Status (SW1&SW2) if operation does not complete for another reason.
giovannivisentini 0:969a2be49f41 473 */
giovannivisentini 19:0b65a5813059 474 NFC_StatusTypeDef M24SR::M24SR_SendSelectCCfile(void) {
giovannivisentini 0:969a2be49f41 475 C_APDU command;
giovannivisentini 19:0b65a5813059 476 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 477 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 478 uint8_t pDataOut[] = CC_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 479 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 480 NbByte;
giovannivisentini 0:969a2be49f41 481
giovannivisentini 0:969a2be49f41 482 /* build the command */
giovannivisentini 0:969a2be49f41 483 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 484 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 485 /* copy the offset */
giovannivisentini 0:969a2be49f41 486 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 487 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 488 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 489 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 490 command.Body.pData = pDataOut;
giovannivisentini 7:19fc04b8fec6 491 /* build the I2C command */
giovannivisentini 0:969a2be49f41 492 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 493 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 494
giovannivisentini 0:969a2be49f41 495 /* send the request */
giovannivisentini 19:0b65a5813059 496 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 497 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 498 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 499 return status;
giovannivisentini 19:0b65a5813059 500 }//else
giovannivisentini 19:0b65a5813059 501
giovannivisentini 19:0b65a5813059 502
giovannivisentini 19:0b65a5813059 503 mLastCommandSend=SELECT_CC_FILE;
giovannivisentini 19:0b65a5813059 504
giovannivisentini 19:0b65a5813059 505 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 506 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 507 if(status==NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 508 return M24SR_ReceiveSelectCCfile();
giovannivisentini 19:0b65a5813059 509 else{
giovannivisentini 19:0b65a5813059 510 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 511 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 512 return status;
giovannivisentini 19:0b65a5813059 513 }//if-else
giovannivisentini 19:0b65a5813059 514 }//if
giovannivisentini 0:969a2be49f41 515
giovannivisentini 19:0b65a5813059 516 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 517 }
giovannivisentini 19:0b65a5813059 518
giovannivisentini 19:0b65a5813059 519 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectCCfile(void){
giovannivisentini 19:0b65a5813059 520
giovannivisentini 19:0b65a5813059 521 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 522 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 523
giovannivisentini 19:0b65a5813059 524 mLastCommandSend = NONE;
giovannivisentini 0:969a2be49f41 525
giovannivisentini 19:0b65a5813059 526 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 527 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 528 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 0:969a2be49f41 529 return status;
giovannivisentini 19:0b65a5813059 530 }//else
giovannivisentini 19:0b65a5813059 531 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 532 getCallback()->onSelectedCCFile(this,status);
giovannivisentini 19:0b65a5813059 533 return status;
giovannivisentini 19:0b65a5813059 534
giovannivisentini 0:969a2be49f41 535 }
giovannivisentini 0:969a2be49f41 536
giovannivisentini 0:969a2be49f41 537 /**
giovannivisentini 0:969a2be49f41 538 * @brief This function sends the SelectSystemFile command
giovannivisentini 9:9f2e2e68d695 539 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 540 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 541 */
giovannivisentini 19:0b65a5813059 542 NFC_StatusTypeDef M24SR::M24SR_SendSelectSystemfile(void) {
giovannivisentini 0:969a2be49f41 543 C_APDU command;
giovannivisentini 0:969a2be49f41 544
giovannivisentini 0:969a2be49f41 545 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 546 uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 547 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 548 uint16_t uP1P2 =0x000C, NbByte;
giovannivisentini 0:969a2be49f41 549
giovannivisentini 0:969a2be49f41 550 /* build the command */
giovannivisentini 0:969a2be49f41 551 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 552 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 553 /* copy the offset */
giovannivisentini 0:969a2be49f41 554 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 555 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 556 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 557 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 558 command.Body.pData = pDataOut;
giovannivisentini 20:aad5727cb8c6 559 /* build the I²C command */
giovannivisentini 0:969a2be49f41 560 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 561 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 562
giovannivisentini 0:969a2be49f41 563 /* send the request */
giovannivisentini 19:0b65a5813059 564 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 565 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 566 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 567 return status;
giovannivisentini 19:0b65a5813059 568 }//else
giovannivisentini 19:0b65a5813059 569
giovannivisentini 19:0b65a5813059 570 mLastCommandSend=SELECT_SYSTEM_FILE;
giovannivisentini 19:0b65a5813059 571
giovannivisentini 19:0b65a5813059 572 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 573 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 574 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 575 return M24SR_ReceiveSelectSystemfile();
giovannivisentini 19:0b65a5813059 576 else{
giovannivisentini 19:0b65a5813059 577 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 578 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 579 return status;
giovannivisentini 19:0b65a5813059 580 }//if-else
giovannivisentini 19:0b65a5813059 581 }//if
giovannivisentini 0:969a2be49f41 582
giovannivisentini 19:0b65a5813059 583 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 584 }
giovannivisentini 19:0b65a5813059 585
giovannivisentini 19:0b65a5813059 586 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectSystemfile(){
giovannivisentini 19:0b65a5813059 587
giovannivisentini 19:0b65a5813059 588 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 589 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 590
giovannivisentini 19:0b65a5813059 591 mLastCommandSend = NONE;
giovannivisentini 0:969a2be49f41 592
giovannivisentini 19:0b65a5813059 593 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 594 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 595 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 0:969a2be49f41 596 return status;
giovannivisentini 19:0b65a5813059 597 }//else
giovannivisentini 19:0b65a5813059 598 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 599 getCallback()->onSelectedSystemFile(this,status);
giovannivisentini 19:0b65a5813059 600 return status;
giovannivisentini 19:0b65a5813059 601
giovannivisentini 0:969a2be49f41 602 }
giovannivisentini 0:969a2be49f41 603
giovannivisentini 0:969a2be49f41 604 /**
giovannivisentini 0:969a2be49f41 605 * @brief This function sends the SelectNDEFfile command
giovannivisentini 9:9f2e2e68d695 606 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 607 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 608 */
giovannivisentini 19:0b65a5813059 609 NFC_StatusTypeDef M24SR::M24SR_SendSelectNDEFfile(uint16_t NDEFfileId) {
giovannivisentini 0:969a2be49f41 610 C_APDU command;
giovannivisentini 19:0b65a5813059 611 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 612 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 613 uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) };
giovannivisentini 0:969a2be49f41 614 uint16_t uP1P2 = 0x000C, NbByte;
giovannivisentini 0:969a2be49f41 615
giovannivisentini 0:969a2be49f41 616 /* build the command */
giovannivisentini 0:969a2be49f41 617 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 618 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 619 /* copy the offset */
giovannivisentini 0:969a2be49f41 620 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 621 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 622 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 623 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 624 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 625 /* copy the offset */
giovannivisentini 19:0b65a5813059 626 /* build the I2C command */
giovannivisentini 0:969a2be49f41 627 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 628 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 629
giovannivisentini 0:969a2be49f41 630 /* send the request */
giovannivisentini 19:0b65a5813059 631 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 632 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 633
giovannivisentini 19:0b65a5813059 634 }
giovannivisentini 19:0b65a5813059 635
giovannivisentini 19:0b65a5813059 636 mLastCommandSend=SELECT_NDEF_FILE;
giovannivisentini 19:0b65a5813059 637
giovannivisentini 19:0b65a5813059 638 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 639 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 640 if(status==NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 641 return M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 642 else{
giovannivisentini 19:0b65a5813059 643 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 644 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 19:0b65a5813059 645 return status;
giovannivisentini 19:0b65a5813059 646 }
giovannivisentini 19:0b65a5813059 647 }
giovannivisentini 0:969a2be49f41 648
giovannivisentini 19:0b65a5813059 649 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 650
giovannivisentini 19:0b65a5813059 651 }
giovannivisentini 19:0b65a5813059 652
giovannivisentini 19:0b65a5813059 653 NFC_StatusTypeDef M24SR::M24SR_ReceiveSelectNDEFfile(){
giovannivisentini 19:0b65a5813059 654
giovannivisentini 19:0b65a5813059 655 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 656 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 657
giovannivisentini 19:0b65a5813059 658 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 659
giovannivisentini 19:0b65a5813059 660 status = M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn);
giovannivisentini 19:0b65a5813059 661 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 662 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 0:969a2be49f41 663 return status;
giovannivisentini 19:0b65a5813059 664 }//else
giovannivisentini 19:0b65a5813059 665 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 19:0b65a5813059 666 getCallback()->onSelectedNDEFFile(this,status);
giovannivisentini 19:0b65a5813059 667 return status;
giovannivisentini 0:969a2be49f41 668
giovannivisentini 0:969a2be49f41 669 }
giovannivisentini 0:969a2be49f41 670
giovannivisentini 0:969a2be49f41 671 /**
giovannivisentini 0:969a2be49f41 672 * @brief This function sends a read binary command
giovannivisentini 9:9f2e2e68d695 673 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 674 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 675 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 676 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 677 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 678 */
giovannivisentini 19:0b65a5813059 679 NFC_StatusTypeDef M24SR::M24SR_SendReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 680 uint8_t *pBufferRead) {
giovannivisentini 19:0b65a5813059 681 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 682 if(NbByteToRead>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 683 NbByteToRead=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 684
giovannivisentini 0:969a2be49f41 685 C_APDU command;
giovannivisentini 0:969a2be49f41 686 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 19:0b65a5813059 687 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 688 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 689
giovannivisentini 0:969a2be49f41 690 /* build the command */
giovannivisentini 0:969a2be49f41 691 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 692 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 693 /* copy the offset */
giovannivisentini 0:969a2be49f41 694 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 695 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 696 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 697 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 698
giovannivisentini 0:969a2be49f41 699 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 700 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 701
giovannivisentini 19:0b65a5813059 702 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 703 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 704 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 705 return status;
giovannivisentini 19:0b65a5813059 706 }
giovannivisentini 19:0b65a5813059 707
giovannivisentini 19:0b65a5813059 708 mLastCommandSend=READ;
giovannivisentini 19:0b65a5813059 709 mLastCommandData.data=pBufferRead;
giovannivisentini 19:0b65a5813059 710 mLastCommandData.length=NbByteToRead;
giovannivisentini 20:aad5727cb8c6 711 mLastCommandData.offset=Offset;
giovannivisentini 19:0b65a5813059 712
giovannivisentini 19:0b65a5813059 713 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 714 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 715 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 716 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 717 }else{
giovannivisentini 19:0b65a5813059 718 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 719 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 720 return status;
giovannivisentini 19:0b65a5813059 721 }//if-else
giovannivisentini 19:0b65a5813059 722 }//if
giovannivisentini 19:0b65a5813059 723
giovannivisentini 19:0b65a5813059 724 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 725 }
giovannivisentini 0:969a2be49f41 726
giovannivisentini 19:0b65a5813059 727 NFC_StatusTypeDef M24SR::M24SR_ReceiveReadBinary(){
giovannivisentini 19:0b65a5813059 728
giovannivisentini 19:0b65a5813059 729 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 730 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 731 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 732 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 733
giovannivisentini 19:0b65a5813059 734 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 735
giovannivisentini 19:0b65a5813059 736 status = M24SR_IO_ReceiveI2Cresponse (length + M24SR_STATUSRESPONSE_NBBYTE , uM24SRbuffer );
giovannivisentini 19:0b65a5813059 737 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 738 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 0:969a2be49f41 739 return status;
giovannivisentini 19:0b65a5813059 740 }
giovannivisentini 19:0b65a5813059 741 status = M24SR_IsCorrectCRC16Residue(uM24SRbuffer, length + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 742 if(status != NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 743 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 744 else{
giovannivisentini 19:0b65a5813059 745 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 19:0b65a5813059 746 memcpy(mLastCommandData.data, &uM24SRbuffer[1], length);
giovannivisentini 19:0b65a5813059 747 getCallback()->onReadByte(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 748 }
giovannivisentini 19:0b65a5813059 749 return status;
giovannivisentini 0:969a2be49f41 750
giovannivisentini 0:969a2be49f41 751 }
giovannivisentini 0:969a2be49f41 752
giovannivisentini 0:969a2be49f41 753 /**
giovannivisentini 0:969a2be49f41 754 * @brief This function sends a ST read binary command (no error if access is not inside NDEF file)
giovannivisentini 9:9f2e2e68d695 755 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 756 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 757 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 758 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 759 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 760 */
giovannivisentini 19:0b65a5813059 761 NFC_StatusTypeDef M24SR::M24SR_SendSTReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 762 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 19:0b65a5813059 763 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 764 if(NbByteToRead>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 765 NbByteToRead=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 766
giovannivisentini 0:969a2be49f41 767 C_APDU command;
giovannivisentini 0:969a2be49f41 768 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 19:0b65a5813059 769 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 770 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 771
giovannivisentini 0:969a2be49f41 772 /* build the command */
giovannivisentini 0:969a2be49f41 773 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 774 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 775 /* copy the offset */
giovannivisentini 0:969a2be49f41 776 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 777 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 778 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 779 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 780
giovannivisentini 0:969a2be49f41 781 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 782 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 783
giovannivisentini 19:0b65a5813059 784 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 785 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 786 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 787 return status;
giovannivisentini 19:0b65a5813059 788 }
giovannivisentini 19:0b65a5813059 789
giovannivisentini 19:0b65a5813059 790 mLastCommandSend=READ;
giovannivisentini 19:0b65a5813059 791 mLastCommandData.data=pBufferRead;
giovannivisentini 19:0b65a5813059 792 mLastCommandData.length=NbByteToRead;
giovannivisentini 0:969a2be49f41 793
giovannivisentini 19:0b65a5813059 794 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 795 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 796 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 797 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 798 }else{
giovannivisentini 19:0b65a5813059 799 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 800 getCallback()->onReadByte(this,status,Offset,pBufferRead,NbByteToRead);
giovannivisentini 19:0b65a5813059 801 return status;
giovannivisentini 19:0b65a5813059 802 }//if-else
giovannivisentini 19:0b65a5813059 803 }//if
giovannivisentini 0:969a2be49f41 804
giovannivisentini 0:969a2be49f41 805 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 806 }
giovannivisentini 0:969a2be49f41 807
giovannivisentini 0:969a2be49f41 808 /**
giovannivisentini 0:969a2be49f41 809 * @brief This function sends a Update binary command
giovannivisentini 9:9f2e2e68d695 810 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 811 * @param NbByteToWrite number of bytes to write
giovannivisentini 9:9f2e2e68d695 812 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 813 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 814 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 815 */
giovannivisentini 19:0b65a5813059 816 NFC_StatusTypeDef M24SR::M24SR_SendUpdateBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 817 uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
giovannivisentini 19:0b65a5813059 818 //clamp the buffer to the max size
giovannivisentini 19:0b65a5813059 819 if(NbByteToWrite>M24SR_MAX_BYTE_OPERATION_LENGHT)
giovannivisentini 19:0b65a5813059 820 NbByteToWrite=M24SR_MAX_BYTE_OPERATION_LENGHT;
giovannivisentini 19:0b65a5813059 821
giovannivisentini 0:969a2be49f41 822 C_APDU command;
giovannivisentini 19:0b65a5813059 823 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 824 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 825 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 826
giovannivisentini 0:969a2be49f41 827 /* build the command */
giovannivisentini 0:969a2be49f41 828 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 829 command.Header.INS = C_APDU_UPDATE_BINARY;
giovannivisentini 0:969a2be49f41 830 /* copy the offset */
giovannivisentini 0:969a2be49f41 831 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 832 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 833 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 834 command.Body.LC = NbByteToWrite;
giovannivisentini 0:969a2be49f41 835 command.Body.pData = pDataToWrite;
giovannivisentini 0:969a2be49f41 836 /* copy the File Id */
giovannivisentini 0:969a2be49f41 837 //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
giovannivisentini 0:969a2be49f41 838 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 839 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 840
giovannivisentini 19:0b65a5813059 841 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 842 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 843 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 844 return status;
giovannivisentini 19:0b65a5813059 845 }
giovannivisentini 19:0b65a5813059 846
giovannivisentini 19:0b65a5813059 847 mLastCommandSend=UPDATE;
giovannivisentini 19:0b65a5813059 848 mLastCommandData.data=pDataToWrite;
giovannivisentini 19:0b65a5813059 849 mLastCommandData.length=NbByteToWrite;
giovannivisentini 19:0b65a5813059 850 mLastCommandData.offset=Offset;
giovannivisentini 19:0b65a5813059 851
giovannivisentini 19:0b65a5813059 852 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 853 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 854 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 855 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 856 }else{
giovannivisentini 19:0b65a5813059 857 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 858 getCallback()->onUpdatedBinary(this,status,Offset,pDataToWrite,NbByteToWrite);
giovannivisentini 19:0b65a5813059 859 return status;
giovannivisentini 19:0b65a5813059 860 }//if-else
giovannivisentini 19:0b65a5813059 861 }
giovannivisentini 0:969a2be49f41 862
giovannivisentini 19:0b65a5813059 863 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 864 }
giovannivisentini 19:0b65a5813059 865
giovannivisentini 19:0b65a5813059 866 NFC_StatusTypeDef M24SR::M24SR_ReceiveUpdateBinary() {
giovannivisentini 19:0b65a5813059 867
giovannivisentini 19:0b65a5813059 868 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 869 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 870 const uint16_t length = mLastCommandData.length;
giovannivisentini 19:0b65a5813059 871 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 872 const uint16_t offset = mLastCommandData.offset;
giovannivisentini 19:0b65a5813059 873
giovannivisentini 19:0b65a5813059 874 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 875
giovannivisentini 19:0b65a5813059 876 status= M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer) , respBuffer);
giovannivisentini 19:0b65a5813059 877 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 878 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 879 return status;
giovannivisentini 19:0b65a5813059 880 }
giovannivisentini 19:0b65a5813059 881
giovannivisentini 19:0b65a5813059 882 if (IsSBlock(respBuffer) == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 883 /*check the CRC */
giovannivisentini 19:0b65a5813059 884 status =M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 19:0b65a5813059 885 M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 886 // TODO: why if we check ==NFC_Commandsuccess it fail?
giovannivisentini 0:969a2be49f41 887 if (status != NFC_IO_ERROR_CRC) {
giovannivisentini 0:969a2be49f41 888 /* send the FrameExension response*/
giovannivisentini 19:0b65a5813059 889 status = M24SR_SendFWTExtension(respBuffer[M24SR_OFFSET_PCB + 1]);
giovannivisentini 19:0b65a5813059 890 if(status!=NFC_SUCCESS){ //something get wrong -> abort the update
giovannivisentini 19:0b65a5813059 891 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 892 }//status
giovannivisentini 19:0b65a5813059 893 }//if
giovannivisentini 19:0b65a5813059 894 } else { //isSBlock
giovannivisentini 19:0b65a5813059 895 status = M24SR_IsCorrectCRC16Residue(respBuffer,
giovannivisentini 0:969a2be49f41 896 M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 897 getCallback()->onUpdatedBinary(this,status,offset,data,length);
giovannivisentini 19:0b65a5813059 898 }//if else
giovannivisentini 19:0b65a5813059 899 return status;
giovannivisentini 19:0b65a5813059 900 }//M24SR_ReceiveUpdateBinary
giovannivisentini 0:969a2be49f41 901
giovannivisentini 0:969a2be49f41 902
giovannivisentini 0:969a2be49f41 903 /**
giovannivisentini 0:969a2be49f41 904 * @brief This function sends the Verify command
giovannivisentini 9:9f2e2e68d695 905 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 906 * @param NbPwdByte Number of bytes ( 0x00 or 0x10)
giovannivisentini 9:9f2e2e68d695 907 * @param pPwd pointer to the password
giovannivisentini 9:9f2e2e68d695 908 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 909 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 910 */
giovannivisentini 19:0b65a5813059 911 NFC_StatusTypeDef M24SR::M24SR_SendVerify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 912 const uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 913 C_APDU command;
giovannivisentini 19:0b65a5813059 914 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 915 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 916 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 917
giovannivisentini 0:969a2be49f41 918 /*check the parameters */
giovannivisentini 19:0b65a5813059 919 if ((uPwdId > 0x0003)|| ((NbPwdByte != 0x00) && (NbPwdByte != 0x10))) {
giovannivisentini 24:9f98eafa2d39 920 getCallback()->onVerified(this,NFC_IO_ERROR_PARAMETER,constToPasswordType(uPwdId),pPwd);
giovannivisentini 0:969a2be49f41 921 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 922 }
giovannivisentini 0:969a2be49f41 923
giovannivisentini 0:969a2be49f41 924 /* build the command */
giovannivisentini 0:969a2be49f41 925 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 926 command.Header.INS = C_APDU_VERIFY;
giovannivisentini 0:969a2be49f41 927 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 928 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 929 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 9:9f2e2e68d695 930 /* copy the number of bytes of the data field */
giovannivisentini 0:969a2be49f41 931 command.Body.LC = NbPwdByte;
giovannivisentini 0:969a2be49f41 932
giovannivisentini 0:969a2be49f41 933 if (NbPwdByte == 0x10) {
giovannivisentini 0:969a2be49f41 934 /* copy the password */
giovannivisentini 0:969a2be49f41 935 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 936 /* build the I2C command */
giovannivisentini 0:969a2be49f41 937 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
giovannivisentini 0:969a2be49f41 938 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 939 } else {
giovannivisentini 0:969a2be49f41 940 command.Body.pData = NULL;
giovannivisentini 0:969a2be49f41 941 /* build the I2C command */
giovannivisentini 0:969a2be49f41 942 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
giovannivisentini 0:969a2be49f41 943 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 944 }
giovannivisentini 0:969a2be49f41 945
giovannivisentini 0:969a2be49f41 946 /* send the request */
giovannivisentini 19:0b65a5813059 947 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 948 if(status!=NFC_SUCCESS){
giovannivisentini 24:9f98eafa2d39 949 getCallback()->onVerified(this,status,constToPasswordType(uPwdId),pPwd);
giovannivisentini 19:0b65a5813059 950 return status;
giovannivisentini 19:0b65a5813059 951 }
giovannivisentini 19:0b65a5813059 952 mLastCommandSend=VERIFY;
giovannivisentini 21:ccc4f3fed4b3 953
giovannivisentini 21:ccc4f3fed4b3 954 mLastCommandData.data=(uint8_t*)pPwd;
giovannivisentini 21:ccc4f3fed4b3 955 mLastCommandData.offset=uPwdId;
giovannivisentini 21:ccc4f3fed4b3 956
giovannivisentini 19:0b65a5813059 957 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 958 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 959 if(status == NFC_SUCCESS)
giovannivisentini 19:0b65a5813059 960 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 961 else{
giovannivisentini 19:0b65a5813059 962 mLastCommandSend = NONE;
giovannivisentini 24:9f98eafa2d39 963 getCallback()->onVerified(this,status,constToPasswordType(uPwdId),pPwd);
giovannivisentini 19:0b65a5813059 964 return status;
giovannivisentini 19:0b65a5813059 965 }
giovannivisentini 19:0b65a5813059 966 }
giovannivisentini 0:969a2be49f41 967
giovannivisentini 19:0b65a5813059 968 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 969 }
giovannivisentini 19:0b65a5813059 970
giovannivisentini 19:0b65a5813059 971 NFC_StatusTypeDef M24SR::M24SR_ReceiveVerify(){
giovannivisentini 19:0b65a5813059 972 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 973 uint8_t respBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 974 mLastCommandSend=NONE;
giovannivisentini 19:0b65a5813059 975
giovannivisentini 21:ccc4f3fed4b3 976 const uint8_t *data = mLastCommandData.data;
giovannivisentini 21:ccc4f3fed4b3 977 const PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 21:ccc4f3fed4b3 978
giovannivisentini 19:0b65a5813059 979 status=M24SR_IO_ReceiveI2Cresponse (sizeof(respBuffer),respBuffer);
giovannivisentini 19:0b65a5813059 980
giovannivisentini 19:0b65a5813059 981 if(status !=NFC_SUCCESS){
giovannivisentini 24:9f98eafa2d39 982 getCallback()->onVerified(this,status,type,data);
giovannivisentini 0:969a2be49f41 983 return status;
giovannivisentini 19:0b65a5813059 984 }
giovannivisentini 0:969a2be49f41 985
giovannivisentini 19:0b65a5813059 986 status = M24SR_IsCorrectCRC16Residue(respBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 24:9f98eafa2d39 987 getCallback()->onVerified(this,status,type,data);
giovannivisentini 19:0b65a5813059 988 return status;
giovannivisentini 0:969a2be49f41 989 }
giovannivisentini 0:969a2be49f41 990
giovannivisentini 0:969a2be49f41 991 /**
giovannivisentini 0:969a2be49f41 992 * @brief This function sends the ChangeReferenceData command
giovannivisentini 9:9f2e2e68d695 993 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 994 * @param pPwd pointer to the passwaord
giovannivisentini 9:9f2e2e68d695 995 * @retval Status (SW1&SW2) Satus of the operation to complete.
giovannivisentini 9:9f2e2e68d695 996 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 997 */
giovannivisentini 19:0b65a5813059 998 NFC_StatusTypeDef M24SR::M24SR_SendChangeReferenceData(uint16_t uPwdId,
giovannivisentini 0:969a2be49f41 999 uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 1000 C_APDU command;
giovannivisentini 19:0b65a5813059 1001 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1002 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1003 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1004
giovannivisentini 0:969a2be49f41 1005 /*check the parameters */
giovannivisentini 0:969a2be49f41 1006 if (uPwdId > 0x0003) {
giovannivisentini 19:0b65a5813059 1007 getCallback()->onChangeReferenceData(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1008 constToPasswordType(uPwdId), pPwd);
giovannivisentini 0:969a2be49f41 1009 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1010 }
giovannivisentini 0:969a2be49f41 1011
giovannivisentini 0:969a2be49f41 1012 /* build the command */
giovannivisentini 0:969a2be49f41 1013 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1014 command.Header.INS = C_APDU_CHANGE;
giovannivisentini 0:969a2be49f41 1015 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1016 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 1017 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 0:969a2be49f41 1018 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 1019 command.Body.LC = M24SR_PASSWORD_NBBYTE;
giovannivisentini 0:969a2be49f41 1020 /* copy the password */
giovannivisentini 0:969a2be49f41 1021 command.Body.pData = pPwd;
giovannivisentini 20:aad5727cb8c6 1022 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1023 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1024 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1025
giovannivisentini 0:969a2be49f41 1026 /* send the request */
giovannivisentini 19:0b65a5813059 1027 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1028 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1029 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1030 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1031 return status;
giovannivisentini 19:0b65a5813059 1032 }
giovannivisentini 19:0b65a5813059 1033
giovannivisentini 19:0b65a5813059 1034 mLastCommandSend = CHANGE_REFERENCE_DATA;
giovannivisentini 19:0b65a5813059 1035 mLastCommandData.data = pPwd;
giovannivisentini 19:0b65a5813059 1036 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1037 mLastCommandData.offset = (uint8_t)uPwdId;
giovannivisentini 0:969a2be49f41 1038
giovannivisentini 19:0b65a5813059 1039 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1040 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1041 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1042 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1043 }else{
giovannivisentini 19:0b65a5813059 1044 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1045 getCallback()->onChangeReferenceData(this,status,
giovannivisentini 19:0b65a5813059 1046 constToPasswordType(uPwdId), pPwd);
giovannivisentini 19:0b65a5813059 1047 return status;
giovannivisentini 19:0b65a5813059 1048 }//if-else
giovannivisentini 19:0b65a5813059 1049 }//if
giovannivisentini 19:0b65a5813059 1050
giovannivisentini 19:0b65a5813059 1051 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1052 }
giovannivisentini 0:969a2be49f41 1053
giovannivisentini 19:0b65a5813059 1054 NFC_StatusTypeDef M24SR::M24SR_ReceiveChangeReferenceData(){
giovannivisentini 19:0b65a5813059 1055 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1056 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1057 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1058
giovannivisentini 19:0b65a5813059 1059 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1060 uint8_t *data = mLastCommandData.data;
giovannivisentini 19:0b65a5813059 1061
giovannivisentini 19:0b65a5813059 1062 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1063 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1064 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 0:969a2be49f41 1065 return status;
giovannivisentini 19:0b65a5813059 1066 }//else
giovannivisentini 19:0b65a5813059 1067
giovannivisentini 19:0b65a5813059 1068 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1069
giovannivisentini 19:0b65a5813059 1070 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1071 getCallback()->onChangeReferenceData(this,status,type,data);
giovannivisentini 19:0b65a5813059 1072 return status;
giovannivisentini 0:969a2be49f41 1073 }
giovannivisentini 0:969a2be49f41 1074
giovannivisentini 0:969a2be49f41 1075 /**
giovannivisentini 0:969a2be49f41 1076 * @brief This function sends the EnableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1077 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1078 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1079 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1080 */
giovannivisentini 19:0b65a5813059 1081 NFC_StatusTypeDef M24SR::M24SR_SendEnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1082 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1083 C_APDU command;
giovannivisentini 19:0b65a5813059 1084 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1085 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1086 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1087
giovannivisentini 0:969a2be49f41 1088 /*check the parameters */
giovannivisentini 0:969a2be49f41 1089 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1090 getCallback()->onEnableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1091 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1092 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1093 }
giovannivisentini 0:969a2be49f41 1094
giovannivisentini 0:969a2be49f41 1095 /* build the command */
giovannivisentini 0:969a2be49f41 1096 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1097 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1098 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1099 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1100 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1101 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1102 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1103 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1104
giovannivisentini 0:969a2be49f41 1105 /* send the request */
giovannivisentini 19:0b65a5813059 1106 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1107 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1108 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1109 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1110 return status;
giovannivisentini 19:0b65a5813059 1111 }//if
giovannivisentini 19:0b65a5813059 1112
giovannivisentini 19:0b65a5813059 1113 mLastCommandSend = ENABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1114 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1115 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1116
giovannivisentini 19:0b65a5813059 1117 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1118 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1119 if(status == NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1120 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1121 }else{
giovannivisentini 19:0b65a5813059 1122 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1123 getCallback()->onEnableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1124 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1125 return status;
giovannivisentini 19:0b65a5813059 1126 }//if-else
giovannivisentini 19:0b65a5813059 1127 }//if
giovannivisentini 0:969a2be49f41 1128
giovannivisentini 19:0b65a5813059 1129 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1130 }
giovannivisentini 19:0b65a5813059 1131
giovannivisentini 19:0b65a5813059 1132 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1133 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1134 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1135 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1136
giovannivisentini 19:0b65a5813059 1137 const PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1138
giovannivisentini 19:0b65a5813059 1139 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1140 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1141 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 0:969a2be49f41 1142 return status;
giovannivisentini 19:0b65a5813059 1143 }//else
giovannivisentini 19:0b65a5813059 1144
giovannivisentini 19:0b65a5813059 1145 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1146
giovannivisentini 19:0b65a5813059 1147 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1148 getCallback()->onEnableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1149 return status;
giovannivisentini 0:969a2be49f41 1150 }
giovannivisentini 0:969a2be49f41 1151
giovannivisentini 19:0b65a5813059 1152
giovannivisentini 0:969a2be49f41 1153 /**
giovannivisentini 0:969a2be49f41 1154 * @brief This function sends the DisableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 1155 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1156 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1157 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1158 */
giovannivisentini 19:0b65a5813059 1159 NFC_StatusTypeDef M24SR::M24SR_SendDisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 1160 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1161 C_APDU command;
giovannivisentini 19:0b65a5813059 1162 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1163 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1164 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1165
giovannivisentini 0:969a2be49f41 1166 /*check the parameters */
giovannivisentini 0:969a2be49f41 1167 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1168 getCallback()->onDisableVerificationRequirement(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1169 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1170 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1171 }
giovannivisentini 0:969a2be49f41 1172
giovannivisentini 0:969a2be49f41 1173 /* build the command */
giovannivisentini 0:969a2be49f41 1174 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 1175 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1176 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1177 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1178 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1179 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1180 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1181 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1182
giovannivisentini 0:969a2be49f41 1183 /* send the request */
giovannivisentini 19:0b65a5813059 1184 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1185 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1186 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1187 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1188 return status;
giovannivisentini 19:0b65a5813059 1189 }
giovannivisentini 19:0b65a5813059 1190
giovannivisentini 19:0b65a5813059 1191 mLastCommandSend = DISABLE_VERIFICATION_REQUIREMENT;
giovannivisentini 19:0b65a5813059 1192 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1193 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1194
giovannivisentini 19:0b65a5813059 1195 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1196 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1197 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1198 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1199 }else{
giovannivisentini 19:0b65a5813059 1200 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1201 getCallback()->onDisableVerificationRequirement(this,status,
giovannivisentini 19:0b65a5813059 1202 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1203 return status;
giovannivisentini 19:0b65a5813059 1204 }//if-else
giovannivisentini 19:0b65a5813059 1205 }
giovannivisentini 0:969a2be49f41 1206
giovannivisentini 19:0b65a5813059 1207 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1208
giovannivisentini 0:969a2be49f41 1209 }
giovannivisentini 0:969a2be49f41 1210
giovannivisentini 19:0b65a5813059 1211 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisableVerificationRequirement(){
giovannivisentini 19:0b65a5813059 1212 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1213 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1214 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1215
giovannivisentini 19:0b65a5813059 1216 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1217
giovannivisentini 19:0b65a5813059 1218 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1219 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1220 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1221 return status;
giovannivisentini 19:0b65a5813059 1222 }//else
giovannivisentini 19:0b65a5813059 1223
giovannivisentini 19:0b65a5813059 1224 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1225
giovannivisentini 19:0b65a5813059 1226 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1227 getCallback()->onDisableVerificationRequirement(this,status,type);
giovannivisentini 19:0b65a5813059 1228 return status;
giovannivisentini 19:0b65a5813059 1229 }
giovannivisentini 19:0b65a5813059 1230
giovannivisentini 19:0b65a5813059 1231
giovannivisentini 0:969a2be49f41 1232 /**
giovannivisentini 0:969a2be49f41 1233 * @brief This function sends the EnablePermananentState command
giovannivisentini 9:9f2e2e68d695 1234 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1235 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1236 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1237 */
giovannivisentini 19:0b65a5813059 1238 NFC_StatusTypeDef M24SR::M24SR_SendEnablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1239 C_APDU command;
giovannivisentini 19:0b65a5813059 1240 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1241
giovannivisentini 0:969a2be49f41 1242 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1243 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1244
giovannivisentini 0:969a2be49f41 1245 /*check the parameters */
giovannivisentini 0:969a2be49f41 1246 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1247 getCallback()->onEnablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1248 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1249 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1250 }
giovannivisentini 0:969a2be49f41 1251
giovannivisentini 0:969a2be49f41 1252 /* build the command */
giovannivisentini 0:969a2be49f41 1253 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1254 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 1255 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1256 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1257 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1258 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1259 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1260 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1261
giovannivisentini 0:969a2be49f41 1262 /* send the request */
giovannivisentini 19:0b65a5813059 1263 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1264 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1265 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1266 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1267 return status;
giovannivisentini 19:0b65a5813059 1268 }
giovannivisentini 19:0b65a5813059 1269
giovannivisentini 19:0b65a5813059 1270 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1271 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1272 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 19:0b65a5813059 1273
giovannivisentini 19:0b65a5813059 1274 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1275 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1276 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1277 return M24SR_ReceiveEnablePermanentState();
giovannivisentini 19:0b65a5813059 1278 }else{
giovannivisentini 19:0b65a5813059 1279 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1280 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1281 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1282 return status;
giovannivisentini 19:0b65a5813059 1283 }//if-else
giovannivisentini 19:0b65a5813059 1284 }
giovannivisentini 0:969a2be49f41 1285
giovannivisentini 19:0b65a5813059 1286 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1287 }
giovannivisentini 19:0b65a5813059 1288
giovannivisentini 19:0b65a5813059 1289 NFC_StatusTypeDef M24SR::M24SR_ReceiveEnablePermanentState(){
giovannivisentini 19:0b65a5813059 1290 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1291 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1292 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1293
giovannivisentini 19:0b65a5813059 1294 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1295
giovannivisentini 19:0b65a5813059 1296 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1297 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1298 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1299 return status;
giovannivisentini 19:0b65a5813059 1300 }//else
giovannivisentini 19:0b65a5813059 1301
giovannivisentini 19:0b65a5813059 1302 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1303
giovannivisentini 19:0b65a5813059 1304 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1305 getCallback()->onEnablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1306 return status;
giovannivisentini 0:969a2be49f41 1307 }
giovannivisentini 0:969a2be49f41 1308
giovannivisentini 19:0b65a5813059 1309
giovannivisentini 0:969a2be49f41 1310 /**
giovannivisentini 0:969a2be49f41 1311 * @brief This function sends the DisablePermanentState command
giovannivisentini 9:9f2e2e68d695 1312 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 1313 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1314 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1315 */
giovannivisentini 19:0b65a5813059 1316 NFC_StatusTypeDef M24SR::M24SR_SendDisablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 1317 C_APDU command;
giovannivisentini 19:0b65a5813059 1318 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 1319 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1320 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1321
giovannivisentini 0:969a2be49f41 1322 /*check the parameters */
giovannivisentini 0:969a2be49f41 1323 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 19:0b65a5813059 1324 getCallback()->onDisablePermanentState(this,NFC_IO_ERROR_PARAMETER,
giovannivisentini 19:0b65a5813059 1325 constToPasswordType(uReadOrWrite));
giovannivisentini 0:969a2be49f41 1326 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1327 }
giovannivisentini 0:969a2be49f41 1328
giovannivisentini 0:969a2be49f41 1329 /* build the command */
giovannivisentini 0:969a2be49f41 1330 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1331 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 1332 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1333 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 1334 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 20:aad5727cb8c6 1335 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1336 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 1337 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1338
giovannivisentini 0:969a2be49f41 1339 /* send the request */
giovannivisentini 19:0b65a5813059 1340 status = M24SR_IO_SendI2Ccommand(NbByte, pBuffer);
giovannivisentini 19:0b65a5813059 1341 if(status != NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1342 getCallback()->onEnablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1343 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1344 return status;
giovannivisentini 19:0b65a5813059 1345 }
giovannivisentini 19:0b65a5813059 1346
giovannivisentini 19:0b65a5813059 1347 mLastCommandSend = ENABLE_PERMANET_STATE;
giovannivisentini 19:0b65a5813059 1348 //use the offset filed for store the pwd id;
giovannivisentini 19:0b65a5813059 1349 mLastCommandData.offset = (uint8_t)uReadOrWrite;
giovannivisentini 0:969a2be49f41 1350
giovannivisentini 19:0b65a5813059 1351 if(mCommunicationType==M24SR::SYNC){
giovannivisentini 19:0b65a5813059 1352 status = M24SR_IO_PollI2C();
giovannivisentini 19:0b65a5813059 1353 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1354 return M24SR_ReceiveDisablePermanentState();
giovannivisentini 19:0b65a5813059 1355 }else{
giovannivisentini 19:0b65a5813059 1356 mLastCommandSend = NONE;
giovannivisentini 19:0b65a5813059 1357 getCallback()->onDisablePermanentState(this,status,
giovannivisentini 19:0b65a5813059 1358 constToPasswordType(uReadOrWrite));
giovannivisentini 19:0b65a5813059 1359 return status;
giovannivisentini 19:0b65a5813059 1360 }//if-else
giovannivisentini 19:0b65a5813059 1361 }
giovannivisentini 19:0b65a5813059 1362
giovannivisentini 19:0b65a5813059 1363 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1364 }
giovannivisentini 0:969a2be49f41 1365
giovannivisentini 19:0b65a5813059 1366 NFC_StatusTypeDef M24SR::M24SR_ReceiveDisablePermanentState(){
giovannivisentini 19:0b65a5813059 1367 NFC_StatusTypeDef status;
giovannivisentini 19:0b65a5813059 1368 //TODO the size is 3?
giovannivisentini 19:0b65a5813059 1369 uint8_t rensponseBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 19:0b65a5813059 1370
giovannivisentini 19:0b65a5813059 1371 PasswordType_t type = constToPasswordType(mLastCommandData.offset);
giovannivisentini 19:0b65a5813059 1372
giovannivisentini 19:0b65a5813059 1373 status =M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , rensponseBuffer );
giovannivisentini 19:0b65a5813059 1374 if(status!=NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 1375 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 0:969a2be49f41 1376 return status;
giovannivisentini 19:0b65a5813059 1377 }//else
giovannivisentini 19:0b65a5813059 1378
giovannivisentini 19:0b65a5813059 1379 status = M24SR_IsCorrectCRC16Residue(rensponseBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 19:0b65a5813059 1380
giovannivisentini 19:0b65a5813059 1381 status = (status == NFC_COMMAND_SUCCESS) ? NFC_SUCCESS : status;
giovannivisentini 19:0b65a5813059 1382 getCallback()->onDisablePermanentState(this,status,type);
giovannivisentini 19:0b65a5813059 1383 return status;
giovannivisentini 0:969a2be49f41 1384 }
giovannivisentini 0:969a2be49f41 1385
giovannivisentini 0:969a2be49f41 1386 /**
giovannivisentini 9:9f2e2e68d695 1387 * @brief This function generates an interrupt on GPO pin
giovannivisentini 0:969a2be49f41 1388 * @param None
giovannivisentini 9:9f2e2e68d695 1389 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1390 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1391 */
giovannivisentini 0:969a2be49f41 1392 NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
giovannivisentini 0:969a2be49f41 1393 C_APDU command;
giovannivisentini 0:969a2be49f41 1394
giovannivisentini 0:969a2be49f41 1395 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1396 uint16_t uP1P2 = 0x001E;
giovannivisentini 0:969a2be49f41 1397 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1398 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1399
giovannivisentini 0:969a2be49f41 1400 status = M24SR_ManageI2CGPO(INTERRUPT);
giovannivisentini 0:969a2be49f41 1401
giovannivisentini 0:969a2be49f41 1402 /* build the command */
giovannivisentini 0:969a2be49f41 1403 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1404 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1405 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1406 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1407 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1408 command.Body.LC = 0x00;
giovannivisentini 20:aad5727cb8c6 1409 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1410 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1411 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1412
giovannivisentini 0:969a2be49f41 1413 /* send the request */
giovannivisentini 0:969a2be49f41 1414 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1415 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1416 /* read the response */
giovannivisentini 0:969a2be49f41 1417 errchk(
giovannivisentini 0:969a2be49f41 1418 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1419
giovannivisentini 0:969a2be49f41 1420 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1421
giovannivisentini 0:969a2be49f41 1422 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1423 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1424 else
giovannivisentini 0:969a2be49f41 1425 return status;
giovannivisentini 0:969a2be49f41 1426
giovannivisentini 0:969a2be49f41 1427 }
giovannivisentini 0:969a2be49f41 1428
giovannivisentini 0:969a2be49f41 1429 /**
giovannivisentini 9:9f2e2e68d695 1430 * @brief This function forces GPO pin to low state or high Z
giovannivisentini 9:9f2e2e68d695 1431 * @param uSetOrReset select if GPO must be low (reset) or HiZ
giovannivisentini 9:9f2e2e68d695 1432 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 1433 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 1434 */
giovannivisentini 0:969a2be49f41 1435 NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
giovannivisentini 0:969a2be49f41 1436 C_APDU command;
giovannivisentini 0:969a2be49f41 1437 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1438 uint16_t uP1P2 = 0x001F;
giovannivisentini 0:969a2be49f41 1439 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1440 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1441
giovannivisentini 0:969a2be49f41 1442 /*check the parameters */
giovannivisentini 0:969a2be49f41 1443 if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
giovannivisentini 0:969a2be49f41 1444 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1445 }
giovannivisentini 0:969a2be49f41 1446
giovannivisentini 0:969a2be49f41 1447 status = M24SR_ManageI2CGPO(STATE_CONTROL);
giovannivisentini 0:969a2be49f41 1448
giovannivisentini 0:969a2be49f41 1449 /* build the command */
giovannivisentini 0:969a2be49f41 1450 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1451 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1452 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1453 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1454 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1455 command.Body.LC = 0x01;
giovannivisentini 0:969a2be49f41 1456 command.Body.pData = &uSetOrReset;
giovannivisentini 0:969a2be49f41 1457 /* copy the data */
giovannivisentini 0:969a2be49f41 1458 //memcpy(command.Body.pData , &uSetOrReset, 0x01 );
giovannivisentini 0:969a2be49f41 1459 //command.Body.LE = 0x00 ;
giovannivisentini 20:aad5727cb8c6 1460 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1461 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1462 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1463
giovannivisentini 0:969a2be49f41 1464 /* send the request */
giovannivisentini 0:969a2be49f41 1465 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 19:0b65a5813059 1466 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 1467 /* read the response */
giovannivisentini 0:969a2be49f41 1468 errchk(
giovannivisentini 0:969a2be49f41 1469 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1470
giovannivisentini 0:969a2be49f41 1471 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1472
giovannivisentini 0:969a2be49f41 1473 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1474 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1475 else
giovannivisentini 0:969a2be49f41 1476 return status;
giovannivisentini 0:969a2be49f41 1477 }
giovannivisentini 0:969a2be49f41 1478
giovannivisentini 7:19fc04b8fec6 1479
giovannivisentini 19:0b65a5813059 1480 NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1481
giovannivisentini 0:969a2be49f41 1482 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1483 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1484 }
giovannivisentini 0:969a2be49f41 1485
giovannivisentini 19:0b65a5813059 1486 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1487 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1488 mManageGPOCallback.setNewGpoConfig(true,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1489
giovannivisentini 19:0b65a5813059 1490 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1491 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1492 }
giovannivisentini 0:969a2be49f41 1493
giovannivisentini 19:0b65a5813059 1494 NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(NFC_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1495
giovannivisentini 19:0b65a5813059 1496 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1497 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1498 }
giovannivisentini 0:969a2be49f41 1499
giovannivisentini 19:0b65a5813059 1500 //enable the callback for change the gpo
giovannivisentini 19:0b65a5813059 1501 mComponentCallback = &mManageGPOCallback;
giovannivisentini 19:0b65a5813059 1502 mManageGPOCallback.setNewGpoConfig(false,GPO_I2Cconfig);
giovannivisentini 0:969a2be49f41 1503
giovannivisentini 19:0b65a5813059 1504 //start the manageGPO procedure
giovannivisentini 19:0b65a5813059 1505 return M24SR_SendSelectApplication();
giovannivisentini 0:969a2be49f41 1506 }
giovannivisentini 0:969a2be49f41 1507
giovannivisentini 0:969a2be49f41 1508 NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
giovannivisentini 0:969a2be49f41 1509 /* Disable RF */
giovannivisentini 0:969a2be49f41 1510 if (OnOffChoice != 0) {
giovannivisentini 0:969a2be49f41 1511 M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
giovannivisentini 0:969a2be49f41 1512 } else {
giovannivisentini 0:969a2be49f41 1513 M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
giovannivisentini 0:969a2be49f41 1514 }
giovannivisentini 0:969a2be49f41 1515 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1516 }
giovannivisentini 0:969a2be49f41 1517
giovannivisentini 0:969a2be49f41 1518 NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1519 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1520 int ret = dev_I2C.write(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1521 if (ret == 0)
giovannivisentini 0:969a2be49f41 1522 return NFC_SUCCESS;
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_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1527 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1528 int ret = dev_I2C.read(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1529 if (ret == 0)
giovannivisentini 0:969a2be49f41 1530 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1531
giovannivisentini 0:969a2be49f41 1532 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1533 }
giovannivisentini 0:969a2be49f41 1534
giovannivisentini 0:969a2be49f41 1535 NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
giovannivisentini 0:969a2be49f41 1536
giovannivisentini 0:969a2be49f41 1537 int status = 1;
giovannivisentini 0:969a2be49f41 1538 char buffer;
giovannivisentini 18:10def2fefa8a 1539 while (status != 0) {
giovannivisentini 10:482175f7ae66 1540 status = dev_I2C.read(address, &buffer, 1, false);
giovannivisentini 0:969a2be49f41 1541 }
giovannivisentini 0:969a2be49f41 1542
giovannivisentini 0:969a2be49f41 1543 if (status == 0)
giovannivisentini 0:969a2be49f41 1544 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1545 //else
giovannivisentini 0:969a2be49f41 1546 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1547 }
giovannivisentini 0:969a2be49f41 1548
giovannivisentini 19:0b65a5813059 1549 NFC_StatusTypeDef M24SR::ManageEvent(void){
giovannivisentini 0:969a2be49f41 1550
giovannivisentini 19:0b65a5813059 1551 switch(mLastCommandSend){
giovannivisentini 19:0b65a5813059 1552 case SELECT_APPLICATION:
giovannivisentini 19:0b65a5813059 1553 return M24SR_ReceiveSelectApplication();
giovannivisentini 19:0b65a5813059 1554 case SELECT_CC_FILE:
giovannivisentini 19:0b65a5813059 1555 return M24SR_ReceiveSelectCCfile();
giovannivisentini 19:0b65a5813059 1556 case SELECT_NDEF_FILE:
giovannivisentini 19:0b65a5813059 1557 return M24SR_ReceiveSelectNDEFfile();
giovannivisentini 19:0b65a5813059 1558 case SELECT_SYSTEM_FILE:
giovannivisentini 19:0b65a5813059 1559 return M24SR_ReceiveSelectSystemfile();
giovannivisentini 19:0b65a5813059 1560 case READ:
giovannivisentini 19:0b65a5813059 1561 return M24SR_ReceiveReadBinary();
giovannivisentini 19:0b65a5813059 1562 case UPDATE:
giovannivisentini 19:0b65a5813059 1563 return M24SR_ReceiveUpdateBinary();
giovannivisentini 19:0b65a5813059 1564 case VERIFY:
giovannivisentini 19:0b65a5813059 1565 return M24SR_ReceiveVerify();
giovannivisentini 19:0b65a5813059 1566 case DESELECT:
giovannivisentini 19:0b65a5813059 1567 return M24SR_ReceiveDeselect();
giovannivisentini 19:0b65a5813059 1568 case CHANGE_REFERENCE_DATA:
giovannivisentini 19:0b65a5813059 1569 return M24SR_ReceiveChangeReferenceData();
giovannivisentini 19:0b65a5813059 1570 case ENABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1571 return M24SR_ReceiveEnableVerificationRequirement();
giovannivisentini 19:0b65a5813059 1572 case DISABLE_VERIFICATION_REQUIREMENT:
giovannivisentini 19:0b65a5813059 1573 return M24SR_ReceiveDisableVerificationRequirement();
giovannivisentini 16:b0d62f4b185a 1574
giovannivisentini 19:0b65a5813059 1575 default:
giovannivisentini 19:0b65a5813059 1576 return NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 1577 }//switch
giovannivisentini 19:0b65a5813059 1578 }//manageInterrupt
giovannivisentini 0:969a2be49f41 1579
giovannivisentini 6:96389fb79676 1580
giovannivisentini 0:969a2be49f41 1581 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/