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

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

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

Introduction

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

Firmware Library

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

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Oct 27 07:38:00 2016 +0000
Revision:
28:e0d4ffa90f8b
Parent:
27:3881985097bb
manage the case of pins configured as "Not Connected"

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