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

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Fri Sep 30 12:33:20 2016 +0000
Revision:
27:3881985097bb
Parent:
26:2090378b0b51
Child:
28:e0d4ffa90f8b
use ST_INTERFACES instead of internal Nfc_class.h

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