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

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

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

Introduction

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

Firmware Library

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

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Fri Jan 22 09:04:51 2016 +0000
Revision:
18:10def2fefa8a
Parent:
17:c750fff4a096
Child:
19:0b65a5813059
remove unused code and register the exeption only when needed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:969a2be49f41 1 /**
giovannivisentini 0:969a2be49f41 2 ******************************************************************************
giovannivisentini 0:969a2be49f41 3 * @file m24sr_class.cpp
giovannivisentini 6:96389fb79676 4 * @author ST Central Labs
giovannivisentini 9:9f2e2e68d695 5 * @version V1.0.0
giovannivisentini 6:96389fb79676 6 * @date 05 Nov 2015
giovannivisentini 0:969a2be49f41 7 * @brief This file provides a set of functions to interface with the M24SR
giovannivisentini 0:969a2be49f41 8 * device.
giovannivisentini 0:969a2be49f41 9 ******************************************************************************
giovannivisentini 0:969a2be49f41 10 * @attention
giovannivisentini 0:969a2be49f41 11 *
giovannivisentini 0:969a2be49f41 12 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
giovannivisentini 0:969a2be49f41 13 *
giovannivisentini 0:969a2be49f41 14 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 0:969a2be49f41 15 * are permitted provided that the following conditions are met:
giovannivisentini 0:969a2be49f41 16 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 0:969a2be49f41 17 * this list of conditions and the following disclaimer.
giovannivisentini 0:969a2be49f41 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 0:969a2be49f41 19 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 0:969a2be49f41 20 * and/or other materials provided with the distribution.
giovannivisentini 0:969a2be49f41 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 0:969a2be49f41 22 * may be used to endorse or promote products derived from this software
giovannivisentini 0:969a2be49f41 23 * without specific prior written permission.
giovannivisentini 0:969a2be49f41 24 *
giovannivisentini 0:969a2be49f41 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 0:969a2be49f41 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 0:969a2be49f41 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 0:969a2be49f41 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 0:969a2be49f41 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 0:969a2be49f41 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 0:969a2be49f41 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 0:969a2be49f41 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 0:969a2be49f41 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 0:969a2be49f41 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 0:969a2be49f41 35 *
giovannivisentini 0:969a2be49f41 36 ******************************************************************************
giovannivisentini 0:969a2be49f41 37 */
giovannivisentini 0:969a2be49f41 38
giovannivisentini 0:969a2be49f41 39
giovannivisentini 0:969a2be49f41 40
giovannivisentini 0:969a2be49f41 41 /* Includes ------------------------------------------------------------------*/
giovannivisentini 0:969a2be49f41 42 #include "m24sr_class.h"
giovannivisentini 0:969a2be49f41 43 #include "m24sr.h"
giovannivisentini 16:b0d62f4b185a 44 #ifdef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 45 #undef GPIO_PIN_RESET
giovannivisentini 16:b0d62f4b185a 46 #endif
giovannivisentini 16:b0d62f4b185a 47 #define GPIO_PIN_RESET (0)
giovannivisentini 0:969a2be49f41 48
giovannivisentini 16:b0d62f4b185a 49 #ifdef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 50 #undef GPIO_PIN_SET
giovannivisentini 16:b0d62f4b185a 51 #endif
giovannivisentini 13:840a9c7f90b9 52 #define GPIO_PIN_SET (1)
giovannivisentini 13:840a9c7f90b9 53
giovannivisentini 0:969a2be49f41 54 /**
giovannivisentini 9:9f2e2e68d695 55 * default password, also used to enable super user mode throught the I2C channel
giovannivisentini 0:969a2be49f41 56 */
giovannivisentini 0:969a2be49f41 57 const uint8_t M24SR::DEFAULT_PASSWORD[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
giovannivisentini 0:969a2be49f41 58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
giovannivisentini 0:969a2be49f41 59
giovannivisentini 0:969a2be49f41 60 /** @addtogroup M24SR_Driver
giovannivisentini 0:969a2be49f41 61 * @{
giovannivisentini 0:969a2be49f41 62 * @brief <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b>
giovannivisentini 0:969a2be49f41 63 */
giovannivisentini 0:969a2be49f41 64
giovannivisentini 0:969a2be49f41 65 /** @defgroup drv_M24SR
giovannivisentini 0:969a2be49f41 66 * @{
giovannivisentini 0:969a2be49f41 67 * @brief This file contains the driver which implements all the M24SR commands.
giovannivisentini 0:969a2be49f41 68 */
giovannivisentini 0:969a2be49f41 69
giovannivisentini 0:969a2be49f41 70 #ifndef errchk
giovannivisentini 0:969a2be49f41 71
giovannivisentini 9:9f2e2e68d695 72 /** value returned by the NFC chip when a command is successfully completed */
giovannivisentini 0:969a2be49f41 73 #define NFC_COMMAND_SUCCESS 0x9000
giovannivisentini 0:969a2be49f41 74
giovannivisentini 7:19fc04b8fec6 75 /** call the fCall funtion and check that the return status is NFC_SUCCESS,
giovannivisentini 0:969a2be49f41 76 * otherwise return the error status*/
giovannivisentini 16:b0d62f4b185a 77 //printf("call status: %x\n\r",status);
giovannivisentini 0:969a2be49f41 78 #define errchk(fCall) {\
giovannivisentini 0:969a2be49f41 79 const NFC_StatusTypeDef status = (fCall); \
giovannivisentini 0:969a2be49f41 80 if((status!=NFC_SUCCESS)) \
giovannivisentini 0:969a2be49f41 81 return status; \
giovannivisentini 0:969a2be49f41 82 }\
giovannivisentini 0:969a2be49f41 83
giovannivisentini 0:969a2be49f41 84 #endif
giovannivisentini 0:969a2be49f41 85
giovannivisentini 0:969a2be49f41 86 /**
giovannivisentini 0:969a2be49f41 87 * @brief This function updates the CRC
giovannivisentini 0:969a2be49f41 88 * @param None
giovannivisentini 0:969a2be49f41 89 * @retval None
giovannivisentini 0:969a2be49f41 90 */
giovannivisentini 4:cb1b4304a93e 91 static uint16_t M24SR_UpdateCrc(uint8_t ch, uint16_t *lpwCrc) {
giovannivisentini 0:969a2be49f41 92 ch = (ch ^ (uint8_t) ((*lpwCrc) & 0x00FF));
giovannivisentini 0:969a2be49f41 93 ch = (ch ^ (ch << 4));
giovannivisentini 0:969a2be49f41 94 *lpwCrc = (*lpwCrc >> 8) ^ ((uint16_t) ch << 8) ^ ((uint16_t) ch << 3)
giovannivisentini 0:969a2be49f41 95 ^ ((uint16_t) ch >> 4);
giovannivisentini 0:969a2be49f41 96
giovannivisentini 0:969a2be49f41 97 return (*lpwCrc);
giovannivisentini 0:969a2be49f41 98 }
giovannivisentini 0:969a2be49f41 99
giovannivisentini 0:969a2be49f41 100 /**
giovannivisentini 0:969a2be49f41 101 * @brief This function returns the CRC 16
giovannivisentini 0:969a2be49f41 102 * @param Data : pointer on the data used to compute the CRC16
giovannivisentini 9:9f2e2e68d695 103 * @param Length : number of bytes of the data
giovannivisentini 0:969a2be49f41 104 * @retval CRC16
giovannivisentini 0:969a2be49f41 105 */
giovannivisentini 4:cb1b4304a93e 106 static uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) {
giovannivisentini 0:969a2be49f41 107 uint8_t chBlock;
giovannivisentini 0:969a2be49f41 108 uint16_t wCrc = 0x6363; // ITU-V.41
giovannivisentini 0:969a2be49f41 109
giovannivisentini 0:969a2be49f41 110 do {
giovannivisentini 0:969a2be49f41 111 chBlock = *Data++;
giovannivisentini 0:969a2be49f41 112 M24SR_UpdateCrc(chBlock, &wCrc);
giovannivisentini 0:969a2be49f41 113 } while (--Length);
giovannivisentini 0:969a2be49f41 114
giovannivisentini 0:969a2be49f41 115 return wCrc;
giovannivisentini 0:969a2be49f41 116 }
giovannivisentini 0:969a2be49f41 117
giovannivisentini 0:969a2be49f41 118 /**
giovannivisentini 0:969a2be49f41 119 * @brief This function computes the CRC16 residue as defined by CRC ISO/IEC 13239
giovannivisentini 9:9f2e2e68d695 120 * @param DataIn : input data
giovannivisentini 0:969a2be49f41 121 * @param Length : Number of bits of DataIn
giovannivisentini 0:969a2be49f41 122 * @retval Status (SW1&SW2) : CRC16 residue is correct
giovannivisentini 0:969a2be49f41 123 * @retval M24SR_ERROR_CRC : CRC16 residue is false
giovannivisentini 0:969a2be49f41 124 */
giovannivisentini 4:cb1b4304a93e 125 static NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue(uint8_t *DataIn, uint8_t Length) {
giovannivisentini 0:969a2be49f41 126 uint16_t ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 127
giovannivisentini 0:969a2be49f41 128 /* check the CRC16 Residue */
giovannivisentini 0:969a2be49f41 129 if (Length != 0)
giovannivisentini 0:969a2be49f41 130 ResCRC = M24SR_ComputeCrc(DataIn, Length);
giovannivisentini 0:969a2be49f41 131
giovannivisentini 0:969a2be49f41 132 if (ResCRC == 0x0000) {
giovannivisentini 0:969a2be49f41 133 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 134 return (NFC_StatusTypeDef) (((DataIn[Length - UB_STATUS_OFFSET] << 8)
giovannivisentini 0:969a2be49f41 135 & 0xFF00) | (DataIn[Length - LB_STATUS_OFFSET] & 0x00FF));
giovannivisentini 0:969a2be49f41 136 } else {
giovannivisentini 0:969a2be49f41 137 ResCRC = 0x0000;
giovannivisentini 0:969a2be49f41 138 ResCRC = M24SR_ComputeCrc(DataIn, 5);
giovannivisentini 0:969a2be49f41 139 if (ResCRC != 0x0000) {
giovannivisentini 0:969a2be49f41 140 /* Bad CRC */
giovannivisentini 0:969a2be49f41 141 return NFC_IO_ERROR_CRC;
giovannivisentini 0:969a2be49f41 142 } else {
giovannivisentini 0:969a2be49f41 143 /* Good CRC, but error status from M24SR */
giovannivisentini 0:969a2be49f41 144 return (NFC_StatusTypeDef) (((DataIn[1] << 8) & 0xFF00)
giovannivisentini 0:969a2be49f41 145 | (DataIn[2] & 0x00FF));
giovannivisentini 0:969a2be49f41 146 }
giovannivisentini 0:969a2be49f41 147 }
giovannivisentini 0:969a2be49f41 148 }
giovannivisentini 0:969a2be49f41 149
giovannivisentini 0:969a2be49f41 150 /**
giovannivisentini 0:969a2be49f41 151 * @brief This functions creates an I block command according to the structures CommandStructure and data->command.
giovannivisentini 9:9f2e2e68d695 152 * @param Command : structure which contains the field of the different parameters
giovannivisentini 9:9f2e2e68d695 153 * @param CommandStructure : structure of the command
giovannivisentini 9:9f2e2e68d695 154 * @param NbByte : number of bytes of the command
giovannivisentini 9:9f2e2e68d695 155 * @param pCommand : pointer to the command created
giovannivisentini 0:969a2be49f41 156 */
giovannivisentini 4:cb1b4304a93e 157 static void M24SR_BuildIBlockCommand(uint16_t CommandStructure, C_APDU *Command,
giovannivisentini 0:969a2be49f41 158 uint8_t uDIDbyte, uint16_t *NbByte, uint8_t *pCommand) {
giovannivisentini 0:969a2be49f41 159 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 160 static uint8_t BlockNumber = 0x01;
giovannivisentini 0:969a2be49f41 161
giovannivisentini 0:969a2be49f41 162 (*NbByte) = 0;
giovannivisentini 0:969a2be49f41 163
giovannivisentini 0:969a2be49f41 164 /* add the PCD byte */
giovannivisentini 0:969a2be49f41 165 if ((CommandStructure & M24SR_PCB_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 166 /* toggle the block number */
giovannivisentini 0:969a2be49f41 167 BlockNumber = TOGGLE(BlockNumber);
giovannivisentini 0:969a2be49f41 168 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 169 pCommand[(*NbByte)++] = 0x02 | BlockNumber;
giovannivisentini 0:969a2be49f41 170 }
giovannivisentini 0:969a2be49f41 171
giovannivisentini 0:969a2be49f41 172 /* add the DID byte */
giovannivisentini 0:969a2be49f41 173 if ((BlockNumber & M24SR_DID_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 174 /* Add the I block byte */
giovannivisentini 0:969a2be49f41 175 pCommand[(*NbByte)++] = uDIDbyte;
giovannivisentini 0:969a2be49f41 176 }
giovannivisentini 0:969a2be49f41 177
giovannivisentini 0:969a2be49f41 178 /* add the Class byte */
giovannivisentini 0:969a2be49f41 179 if ((CommandStructure & M24SR_CLA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 180 pCommand[(*NbByte)++] = Command->Header.CLA;
giovannivisentini 0:969a2be49f41 181 }
giovannivisentini 0:969a2be49f41 182 /* add the instruction byte byte */
giovannivisentini 0:969a2be49f41 183 if ((CommandStructure & M24SR_INS_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 184 pCommand[(*NbByte)++] = Command->Header.INS;
giovannivisentini 0:969a2be49f41 185 }
giovannivisentini 0:969a2be49f41 186 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 187 if ((CommandStructure & M24SR_P1_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 188 pCommand[(*NbByte)++] = Command->Header.P1;
giovannivisentini 0:969a2be49f41 189 }
giovannivisentini 0:969a2be49f41 190 /* add the Selection Mode byte */
giovannivisentini 0:969a2be49f41 191 if ((CommandStructure & M24SR_P2_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 192 pCommand[(*NbByte)++] = Command->Header.P2;
giovannivisentini 0:969a2be49f41 193 }
giovannivisentini 0:969a2be49f41 194 /* add Data field lengthbyte */
giovannivisentini 0:969a2be49f41 195 if ((CommandStructure & M24SR_LC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 196 pCommand[(*NbByte)++] = Command->Body.LC;
giovannivisentini 0:969a2be49f41 197 }
giovannivisentini 0:969a2be49f41 198 /* add Data field */
giovannivisentini 0:969a2be49f41 199 if ((CommandStructure & M24SR_DATA_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 200 memcpy(&(pCommand[(*NbByte)]), Command->Body.pData, Command->Body.LC);
giovannivisentini 0:969a2be49f41 201 (*NbByte) += Command->Body.LC;
giovannivisentini 0:969a2be49f41 202 }
giovannivisentini 0:969a2be49f41 203 /* add Le field */
giovannivisentini 0:969a2be49f41 204 if ((CommandStructure & M24SR_LE_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 205 pCommand[(*NbByte)++] = Command->Body.LE;
giovannivisentini 0:969a2be49f41 206 }
giovannivisentini 0:969a2be49f41 207 /* add CRC field */
giovannivisentini 0:969a2be49f41 208 if ((CommandStructure & M24SR_CRC_NEEDED) != 0) {
giovannivisentini 0:969a2be49f41 209 uCRC16 = M24SR_ComputeCrc(pCommand, (uint8_t) (*NbByte));
giovannivisentini 0:969a2be49f41 210 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 211 pCommand[(*NbByte)++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 212 pCommand[(*NbByte)++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 213 }
giovannivisentini 0:969a2be49f41 214
giovannivisentini 0:969a2be49f41 215 }
giovannivisentini 0:969a2be49f41 216
giovannivisentini 0:969a2be49f41 217
giovannivisentini 0:969a2be49f41 218 /**
giovannivisentini 9:9f2e2e68d695 219 * @brief This function returns M24SR_STATUS_SUCCESS if the pBuffer is an s-block
giovannivisentini 9:9f2e2e68d695 220 * @param pBuffer : pointer to the data
giovannivisentini 7:19fc04b8fec6 221 * @retval NFC_SUCCESS : the data is a S-Block
giovannivisentini 7:19fc04b8fec6 222 * @retval NFC_ERROR : the data is not a S-Block
giovannivisentini 0:969a2be49f41 223 */
giovannivisentini 0:969a2be49f41 224 static NFC_StatusTypeDef IsSBlock(uint8_t *pBuffer) {
giovannivisentini 0:969a2be49f41 225
giovannivisentini 0:969a2be49f41 226 if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) {
giovannivisentini 0:969a2be49f41 227 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 228 } else {
giovannivisentini 0:969a2be49f41 229 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 230 }
giovannivisentini 0:969a2be49f41 231
giovannivisentini 0:969a2be49f41 232 }
giovannivisentini 0:969a2be49f41 233
giovannivisentini 0:969a2be49f41 234 /**
giovannivisentini 0:969a2be49f41 235 * @brief This function sends the FWT extension command (S-Block format)
giovannivisentini 0:969a2be49f41 236 * @param FWTbyte : FWT value
giovannivisentini 9:9f2e2e68d695 237 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 238 */
giovannivisentini 0:969a2be49f41 239 NFC_StatusTypeDef M24SR::M24SR_FWTExtension(uint8_t FWTbyte) {
giovannivisentini 0:969a2be49f41 240 uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 241 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 242 uint8_t NthByte = 0;
giovannivisentini 0:969a2be49f41 243 uint16_t uCRC16;
giovannivisentini 0:969a2be49f41 244
giovannivisentini 0:969a2be49f41 245 /* create the response */
giovannivisentini 0:969a2be49f41 246 pBuffer[NthByte++] = 0xF2;
giovannivisentini 0:969a2be49f41 247 pBuffer[NthByte++] = FWTbyte;
giovannivisentini 0:969a2be49f41 248 /* compute the CRC */
giovannivisentini 0:969a2be49f41 249 uCRC16 = M24SR_ComputeCrc(pBuffer, 0x02);
giovannivisentini 0:969a2be49f41 250 /* append the CRC16 */
giovannivisentini 0:969a2be49f41 251 pBuffer[NthByte++] = GETLSB(uCRC16);
giovannivisentini 0:969a2be49f41 252 pBuffer[NthByte++] = GETMSB(uCRC16);
giovannivisentini 0:969a2be49f41 253
giovannivisentini 0:969a2be49f41 254 /* send the request */
giovannivisentini 0:969a2be49f41 255 errchk(M24SR_IO_SendI2Ccommand(NthByte, pBuffer));
giovannivisentini 0:969a2be49f41 256 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 257 /* read the response */
giovannivisentini 0:969a2be49f41 258 errchk(
giovannivisentini 0:969a2be49f41 259 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 260
giovannivisentini 0:969a2be49f41 261 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 262
giovannivisentini 0:969a2be49f41 263 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 264 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 265 else
giovannivisentini 0:969a2be49f41 266 return status;
giovannivisentini 0:969a2be49f41 267 }
giovannivisentini 0:969a2be49f41 268
giovannivisentini 0:969a2be49f41 269 /**
giovannivisentini 0:969a2be49f41 270 * @brief This function sends the KillSession command to the M24SR device
giovannivisentini 0:969a2be49f41 271 * @param None
giovannivisentini 9:9f2e2e68d695 272 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 273 */
giovannivisentini 0:969a2be49f41 274 NFC_StatusTypeDef M24SR::M24SR_KillSession(void) {
giovannivisentini 0:969a2be49f41 275 uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
giovannivisentini 0:969a2be49f41 276
giovannivisentini 0:969a2be49f41 277 errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
giovannivisentini 0:969a2be49f41 278
giovannivisentini 0:969a2be49f41 279 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 280 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 281 /* GPO can not be use with KillSession command */
giovannivisentini 0:969a2be49f41 282 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 283
giovannivisentini 0:969a2be49f41 284 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 285 }
giovannivisentini 0:969a2be49f41 286
giovannivisentini 0:969a2be49f41 287 /**
giovannivisentini 0:969a2be49f41 288 * @brief This function sends the Deselect command (S-Block format)
giovannivisentini 9:9f2e2e68d695 289 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 290 */
giovannivisentini 0:969a2be49f41 291 NFC_StatusTypeDef M24SR::M24SR_Deselect(void) {
giovannivisentini 0:969a2be49f41 292 uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND;
giovannivisentini 0:969a2be49f41 293
giovannivisentini 0:969a2be49f41 294 /* send the request */
giovannivisentini 0:969a2be49f41 295 errchk(M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer));
giovannivisentini 0:969a2be49f41 296
giovannivisentini 0:969a2be49f41 297 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 298 /* flush the M24SR buffer */
giovannivisentini 0:969a2be49f41 299 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer));
giovannivisentini 0:969a2be49f41 300
giovannivisentini 0:969a2be49f41 301 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 302 }
giovannivisentini 0:969a2be49f41 303
giovannivisentini 0:969a2be49f41 304 /**
giovannivisentini 0:969a2be49f41 305 * @brief This function sends the SelectApplication command
giovannivisentini 9:9f2e2e68d695 306 * @return NFC_SUCCESS if no errors
giovannivisentini 0:969a2be49f41 307 */
giovannivisentini 0:969a2be49f41 308 NFC_StatusTypeDef M24SR::M24SR_SelectApplication(void) {
giovannivisentini 0:969a2be49f41 309
giovannivisentini 0:969a2be49f41 310 C_APDU command;
giovannivisentini 0:969a2be49f41 311 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 312 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 313 uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
giovannivisentini 0:969a2be49f41 314 uint8_t uLe = 0x00;
giovannivisentini 0:969a2be49f41 315 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 316 uint16_t uP1P2 =0x0400,
giovannivisentini 0:969a2be49f41 317 NbByte;
giovannivisentini 0:969a2be49f41 318
giovannivisentini 0:969a2be49f41 319 /* build the command */
giovannivisentini 0:969a2be49f41 320 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 321 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 322 /* copy the offset */
giovannivisentini 0:969a2be49f41 323 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 324 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 325 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 326 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 327 /* copy the data */
giovannivisentini 0:969a2be49f41 328 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 329 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 330 command.Body.LE = uLe;
giovannivisentini 0:969a2be49f41 331 /* build the I²C command */
giovannivisentini 0:969a2be49f41 332 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,
giovannivisentini 0:969a2be49f41 333 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 334
giovannivisentini 0:969a2be49f41 335 /* send the request */
giovannivisentini 0:969a2be49f41 336 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 337 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 338 /* read the response */
giovannivisentini 0:969a2be49f41 339 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 16:b0d62f4b185a 340
giovannivisentini 0:969a2be49f41 341 status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 16:b0d62f4b185a 342 //printf("M24SR_IsCorrectCRC16Residue %x\r\n",status);
giovannivisentini 0:969a2be49f41 343
giovannivisentini 0:969a2be49f41 344 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 345 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 346 else
giovannivisentini 0:969a2be49f41 347 return status;
giovannivisentini 0:969a2be49f41 348
giovannivisentini 0:969a2be49f41 349 }
giovannivisentini 0:969a2be49f41 350
giovannivisentini 0:969a2be49f41 351 /**
giovannivisentini 0:969a2be49f41 352 * @brief This function initialize the M24SR device
giovannivisentini 0:969a2be49f41 353 * @retval None
giovannivisentini 0:969a2be49f41 354 */
giovannivisentini 15:67e136b6921d 355 NFC_StatusTypeDef M24SR::M24SR_Init(M24SR_InitTypeDef *notUsed) {
giovannivisentini 0:969a2be49f41 356 (void) notUsed;
giovannivisentini 18:10def2fefa8a 357 //until we don't set the gpo usage, just do a polling on the
giovannivisentini 18:10def2fefa8a 358 //i2c read
giovannivisentini 18:10def2fefa8a 359 M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING);
giovannivisentini 18:10def2fefa8a 360 //force to open a i2c session
giovannivisentini 0:969a2be49f41 361 errchk(M24SR_KillSession())
giovannivisentini 18:10def2fefa8a 362 //ask to set the gpo low when the answer is ready, so we can use
giovannivisentini 18:10def2fefa8a 363 //the interrupt for polling
giovannivisentini 0:969a2be49f41 364 errchk(M24SR_ManageI2CGPO(I2C_ANSWER_READY))
giovannivisentini 18:10def2fefa8a 365 //close the session
giovannivisentini 0:969a2be49f41 366 errchk(M24SR_Deselect())
giovannivisentini 0:969a2be49f41 367
giovannivisentini 0:969a2be49f41 368 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 369 }
giovannivisentini 0:969a2be49f41 370
giovannivisentini 0:969a2be49f41 371 NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) {
giovannivisentini 0:969a2be49f41 372 if (!nfc_id) {
giovannivisentini 0:969a2be49f41 373 return NFC_ERROR;
giovannivisentini 0:969a2be49f41 374 }
giovannivisentini 0:969a2be49f41 375
giovannivisentini 0:969a2be49f41 376 errchk(M24SR_SelectApplication())
giovannivisentini 0:969a2be49f41 377
giovannivisentini 0:969a2be49f41 378 return M24SR_ReadBinary(0x0011, 1, nfc_id);
giovannivisentini 0:969a2be49f41 379 }
giovannivisentini 0:969a2be49f41 380
giovannivisentini 0:969a2be49f41 381 /**
giovannivisentini 0:969a2be49f41 382 * @brief This function sends the GetSession command to the M24SR device
giovannivisentini 9:9f2e2e68d695 383 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 384 * @retval Status (SW1&SW2) if operation does not complete.
giovannivisentini 0:969a2be49f41 385 */
giovannivisentini 0:969a2be49f41 386 NFC_StatusTypeDef M24SR::M24SR_GetSession(void) {
giovannivisentini 0:969a2be49f41 387 uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
giovannivisentini 0:969a2be49f41 388
giovannivisentini 0:969a2be49f41 389 errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
giovannivisentini 0:969a2be49f41 390
giovannivisentini 0:969a2be49f41 391 /* Insure no access will be done just after open session */
giovannivisentini 0:969a2be49f41 392 /* The only way here is to poll I2C to know when M24SR is ready */
giovannivisentini 0:969a2be49f41 393 /* GPO can not be use with GetSession command */
giovannivisentini 0:969a2be49f41 394 errchk(M24SR_IO_PollI2C());
giovannivisentini 0:969a2be49f41 395
giovannivisentini 0:969a2be49f41 396 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 397
giovannivisentini 0:969a2be49f41 398 }
giovannivisentini 0:969a2be49f41 399
giovannivisentini 0:969a2be49f41 400 /**
giovannivisentini 0:969a2be49f41 401 * @brief This function sends the SelectCCFile command
giovannivisentini 9:9f2e2e68d695 402 * @retval NFC_SUCCESS the function is successful.
giovannivisentini 9:9f2e2e68d695 403 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 9:9f2e2e68d695 404 * @retval Status (SW1&SW2) if operation does not complete for another reason.
giovannivisentini 0:969a2be49f41 405 */
giovannivisentini 0:969a2be49f41 406 NFC_StatusTypeDef M24SR::M24SR_SelectCCfile(void) {
giovannivisentini 0:969a2be49f41 407 C_APDU command;
giovannivisentini 0:969a2be49f41 408
giovannivisentini 0:969a2be49f41 409 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 410 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 411 uint8_t pDataOut[] = CC_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 412 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 413 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 414 NbByte;
giovannivisentini 0:969a2be49f41 415
giovannivisentini 0:969a2be49f41 416 /* build the command */
giovannivisentini 0:969a2be49f41 417 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 418 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 419 /* copy the offset */
giovannivisentini 0:969a2be49f41 420 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 421 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 422 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 423 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 424 command.Body.pData = pDataOut;
giovannivisentini 7:19fc04b8fec6 425 /* build the I2C command */
giovannivisentini 0:969a2be49f41 426 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 427 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 428
giovannivisentini 0:969a2be49f41 429 /* send the request */
giovannivisentini 0:969a2be49f41 430 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 431 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 432 /* read the response */
giovannivisentini 0:969a2be49f41 433 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 434
giovannivisentini 0:969a2be49f41 435 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 436
giovannivisentini 0:969a2be49f41 437 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 438 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 439 else
giovannivisentini 0:969a2be49f41 440 return status;
giovannivisentini 0:969a2be49f41 441 }
giovannivisentini 0:969a2be49f41 442
giovannivisentini 0:969a2be49f41 443 /**
giovannivisentini 0:969a2be49f41 444 * @brief This function sends the SelectSystemFile command
giovannivisentini 9:9f2e2e68d695 445 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 446 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 447 */
giovannivisentini 0:969a2be49f41 448 NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile(void) {
giovannivisentini 0:969a2be49f41 449 C_APDU command;
giovannivisentini 0:969a2be49f41 450
giovannivisentini 0:969a2be49f41 451 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 452 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 453 uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
giovannivisentini 0:969a2be49f41 454 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 455 uint16_t uP1P2 =0x000C,
giovannivisentini 0:969a2be49f41 456 NbByte;
giovannivisentini 0:969a2be49f41 457
giovannivisentini 0:969a2be49f41 458 /* build the command */
giovannivisentini 0:969a2be49f41 459 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 460 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 461 /* copy the offset */
giovannivisentini 0:969a2be49f41 462 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 463 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 464 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 465 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 466 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 467 /* build the I²C command */
giovannivisentini 0:969a2be49f41 468 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 469 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 470
giovannivisentini 0:969a2be49f41 471 /* send the request */
giovannivisentini 0:969a2be49f41 472 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 473 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 474 /* read the response */
giovannivisentini 0:969a2be49f41 475 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 476
giovannivisentini 0:969a2be49f41 477 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 478
giovannivisentini 0:969a2be49f41 479 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 480 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 481 else
giovannivisentini 0:969a2be49f41 482 return status;
giovannivisentini 0:969a2be49f41 483 }
giovannivisentini 0:969a2be49f41 484
giovannivisentini 0:969a2be49f41 485 /**
giovannivisentini 0:969a2be49f41 486 * @brief This function sends the SelectNDEFfile command
giovannivisentini 9:9f2e2e68d695 487 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 488 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 489 */
giovannivisentini 0:969a2be49f41 490 NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile(uint16_t NDEFfileId) {
giovannivisentini 0:969a2be49f41 491 C_APDU command;
giovannivisentini 0:969a2be49f41 492 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 493 uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
giovannivisentini 0:969a2be49f41 494 uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) };
giovannivisentini 0:969a2be49f41 495 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 496 uint16_t uP1P2 = 0x000C, NbByte;
giovannivisentini 0:969a2be49f41 497
giovannivisentini 0:969a2be49f41 498 /* build the command */
giovannivisentini 0:969a2be49f41 499 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 500 command.Header.INS = C_APDU_SELECT_FILE;
giovannivisentini 0:969a2be49f41 501 /* copy the offset */
giovannivisentini 0:969a2be49f41 502 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 503 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 504 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 505 command.Body.LC = sizeof(pDataOut);
giovannivisentini 0:969a2be49f41 506 command.Body.pData = pDataOut;
giovannivisentini 0:969a2be49f41 507 /* copy the offset */
giovannivisentini 0:969a2be49f41 508 /* build the I²C command */
giovannivisentini 0:969a2be49f41 509 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 510 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 511
giovannivisentini 0:969a2be49f41 512 /* send the request */
giovannivisentini 0:969a2be49f41 513 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 514 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 515 /* read the response */
giovannivisentini 0:969a2be49f41 516 errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
giovannivisentini 0:969a2be49f41 517
giovannivisentini 0:969a2be49f41 518 status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
giovannivisentini 0:969a2be49f41 519 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 520 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 521 else
giovannivisentini 0:969a2be49f41 522 return status;
giovannivisentini 0:969a2be49f41 523
giovannivisentini 0:969a2be49f41 524 }
giovannivisentini 0:969a2be49f41 525
giovannivisentini 0:969a2be49f41 526 /**
giovannivisentini 0:969a2be49f41 527 * @brief This function sends a read binary command
giovannivisentini 9:9f2e2e68d695 528 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 529 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 530 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 531 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 532 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 533 */
giovannivisentini 0:969a2be49f41 534 NFC_StatusTypeDef M24SR::M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
giovannivisentini 0:969a2be49f41 535 uint8_t *pBufferRead) {
giovannivisentini 0:969a2be49f41 536 C_APDU command;
giovannivisentini 0:969a2be49f41 537 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 538 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 539 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 540
giovannivisentini 0:969a2be49f41 541 /* build the command */
giovannivisentini 0:969a2be49f41 542 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 543 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 544 /* copy the offset */
giovannivisentini 0:969a2be49f41 545 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 546 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 547 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 548 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 549
giovannivisentini 0:969a2be49f41 550 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 551 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 552
giovannivisentini 0:969a2be49f41 553 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 554 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 555 errchk(
giovannivisentini 0:969a2be49f41 556 M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 557
giovannivisentini 0:969a2be49f41 558 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 559 NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 560 if(status != NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 561 return status;
giovannivisentini 0:969a2be49f41 562 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 0:969a2be49f41 563 memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
giovannivisentini 0:969a2be49f41 564 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 565
giovannivisentini 0:969a2be49f41 566 }
giovannivisentini 0:969a2be49f41 567
giovannivisentini 0:969a2be49f41 568 /**
giovannivisentini 0:969a2be49f41 569 * @brief This function sends a ST read binary command (no error if access is not inside NDEF file)
giovannivisentini 9:9f2e2e68d695 570 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 571 * @param NbByteToRead number of bytes to read
giovannivisentini 9:9f2e2e68d695 572 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 573 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 574 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 575 */
giovannivisentini 0:969a2be49f41 576 NFC_StatusTypeDef M24SR::M24SR_STReadBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 577 uint8_t NbByteToRead, uint8_t *pBufferRead) {
giovannivisentini 0:969a2be49f41 578 C_APDU command;
giovannivisentini 0:969a2be49f41 579 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 580 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 581 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 582
giovannivisentini 0:969a2be49f41 583 /* build the command */
giovannivisentini 0:969a2be49f41 584 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 585 command.Header.INS = C_APDU_READ_BINARY;
giovannivisentini 0:969a2be49f41 586 /* copy the offset */
giovannivisentini 0:969a2be49f41 587 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 588 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 589 /* copy the number of byte to read */
giovannivisentini 0:969a2be49f41 590 command.Body.LE = NbByteToRead;
giovannivisentini 0:969a2be49f41 591
giovannivisentini 0:969a2be49f41 592 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 593 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 594
giovannivisentini 0:969a2be49f41 595 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 596 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 597 errchk(
giovannivisentini 0:969a2be49f41 598 M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 599
giovannivisentini 0:969a2be49f41 600 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 601 NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 602
giovannivisentini 0:969a2be49f41 603 if(status != NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 604 return status;
giovannivisentini 0:969a2be49f41 605 /* retrieve the data without SW1 & SW2 as provided as return value of the function */
giovannivisentini 0:969a2be49f41 606 memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
giovannivisentini 0:969a2be49f41 607 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 608 }
giovannivisentini 0:969a2be49f41 609
giovannivisentini 0:969a2be49f41 610 /**
giovannivisentini 0:969a2be49f41 611 * @brief This function sends a Update binary command
giovannivisentini 9:9f2e2e68d695 612 * @param Offset first byte to read
giovannivisentini 9:9f2e2e68d695 613 * @param NbByteToWrite number of bytes to write
giovannivisentini 9:9f2e2e68d695 614 * @param pBufferRead pointer to the buffer read from the M24SR device
giovannivisentini 9:9f2e2e68d695 615 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 616 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 617 */
giovannivisentini 0:969a2be49f41 618 NFC_StatusTypeDef M24SR::M24SR_UpdateBinary(uint16_t Offset,
giovannivisentini 0:969a2be49f41 619 uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
giovannivisentini 0:969a2be49f41 620 //TODO check the length of the data to write
giovannivisentini 0:969a2be49f41 621 C_APDU command;
giovannivisentini 0:969a2be49f41 622
giovannivisentini 0:969a2be49f41 623 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 624 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 625 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 626
giovannivisentini 0:969a2be49f41 627 /* build the command */
giovannivisentini 0:969a2be49f41 628 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 629 command.Header.INS = C_APDU_UPDATE_BINARY;
giovannivisentini 0:969a2be49f41 630 /* copy the offset */
giovannivisentini 0:969a2be49f41 631 command.Header.P1 = GETMSB(Offset);
giovannivisentini 0:969a2be49f41 632 command.Header.P2 = GETLSB(Offset);
giovannivisentini 0:969a2be49f41 633 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 634 command.Body.LC = NbByteToWrite;
giovannivisentini 0:969a2be49f41 635 command.Body.pData = pDataToWrite;
giovannivisentini 0:969a2be49f41 636 /* copy the File Id */
giovannivisentini 0:969a2be49f41 637 //memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
giovannivisentini 0:969a2be49f41 638 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 639 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 640
giovannivisentini 0:969a2be49f41 641 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 642 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 643 errchk(
giovannivisentini 0:969a2be49f41 644 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 645 /* if the response is a Watiting frame extenstion request */
giovannivisentini 0:969a2be49f41 646
giovannivisentini 0:969a2be49f41 647 if (IsSBlock(pBuffer) == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 648 /*check the CRC */
giovannivisentini 0:969a2be49f41 649 status =M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 650 M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 651 // TODO: why if we check ==NFC_Commandsuccess it fail?
giovannivisentini 0:969a2be49f41 652 if (status != NFC_IO_ERROR_CRC) {
giovannivisentini 0:969a2be49f41 653 /* send the FrameExension response*/
giovannivisentini 0:969a2be49f41 654 errchk(M24SR_FWTExtension(pBuffer[M24SR_OFFSET_PCB + 1]));
giovannivisentini 0:969a2be49f41 655 }else
giovannivisentini 0:969a2be49f41 656 return status;
giovannivisentini 0:969a2be49f41 657 } else {
giovannivisentini 0:969a2be49f41 658 status = M24SR_IsCorrectCRC16Residue(pBuffer,
giovannivisentini 0:969a2be49f41 659 M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 660 if(status!=NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 661 return status;
giovannivisentini 0:969a2be49f41 662 }
giovannivisentini 0:969a2be49f41 663
giovannivisentini 0:969a2be49f41 664 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 665
giovannivisentini 0:969a2be49f41 666 }
giovannivisentini 0:969a2be49f41 667
giovannivisentini 0:969a2be49f41 668 /**
giovannivisentini 0:969a2be49f41 669 * @brief This function sends the Verify command
giovannivisentini 9:9f2e2e68d695 670 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 671 * @param NbPwdByte Number of bytes ( 0x00 or 0x10)
giovannivisentini 9:9f2e2e68d695 672 * @param pPwd pointer to the password
giovannivisentini 9:9f2e2e68d695 673 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 674 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 675 */
giovannivisentini 0:969a2be49f41 676 NFC_StatusTypeDef M24SR::M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte,
giovannivisentini 0:969a2be49f41 677 const uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 678 C_APDU command;
giovannivisentini 0:969a2be49f41 679
giovannivisentini 0:969a2be49f41 680 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 681 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 682 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 683
giovannivisentini 0:969a2be49f41 684 /*check the parameters */
giovannivisentini 0:969a2be49f41 685 if (uPwdId > 0x0003) {
giovannivisentini 0:969a2be49f41 686 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 687 }
giovannivisentini 0:969a2be49f41 688 if ((NbPwdByte != 0x00) && (NbPwdByte != 0x10)) {
giovannivisentini 0:969a2be49f41 689 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 690 }
giovannivisentini 0:969a2be49f41 691
giovannivisentini 0:969a2be49f41 692 /* build the command */
giovannivisentini 0:969a2be49f41 693 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 694 command.Header.INS = C_APDU_VERIFY;
giovannivisentini 0:969a2be49f41 695 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 696 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 697 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 9:9f2e2e68d695 698 /* copy the number of bytes of the data field */
giovannivisentini 0:969a2be49f41 699 command.Body.LC = NbPwdByte;
giovannivisentini 0:969a2be49f41 700
giovannivisentini 0:969a2be49f41 701 if (NbPwdByte == 0x10) {
giovannivisentini 0:969a2be49f41 702 /* copy the password */
giovannivisentini 0:969a2be49f41 703 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 704 /* build the I2C command */
giovannivisentini 0:969a2be49f41 705 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
giovannivisentini 0:969a2be49f41 706 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 707 } else {
giovannivisentini 0:969a2be49f41 708 command.Body.pData = NULL;
giovannivisentini 0:969a2be49f41 709 /* build the I2C command */
giovannivisentini 0:969a2be49f41 710 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
giovannivisentini 0:969a2be49f41 711 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 712 }
giovannivisentini 0:969a2be49f41 713
giovannivisentini 0:969a2be49f41 714 /* send the request */
giovannivisentini 0:969a2be49f41 715 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 716 /* wait for answer ready */
giovannivisentini 0:969a2be49f41 717 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 718 /* read the response */
giovannivisentini 0:969a2be49f41 719 errchk(
giovannivisentini 0:969a2be49f41 720 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 721
giovannivisentini 0:969a2be49f41 722 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 723 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 724 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 725 else
giovannivisentini 0:969a2be49f41 726 return status;
giovannivisentini 0:969a2be49f41 727
giovannivisentini 0:969a2be49f41 728 }
giovannivisentini 0:969a2be49f41 729
giovannivisentini 0:969a2be49f41 730 /**
giovannivisentini 0:969a2be49f41 731 * @brief This function sends the ChangeReferenceData command
giovannivisentini 9:9f2e2e68d695 732 * @param uPwdId PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
giovannivisentini 9:9f2e2e68d695 733 * @param pPwd pointer to the passwaord
giovannivisentini 9:9f2e2e68d695 734 * @retval Status (SW1&SW2) Satus of the operation to complete.
giovannivisentini 9:9f2e2e68d695 735 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 736 */
giovannivisentini 0:969a2be49f41 737 NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData(uint16_t uPwdId,
giovannivisentini 0:969a2be49f41 738 uint8_t *pPwd) {
giovannivisentini 0:969a2be49f41 739 C_APDU command;
giovannivisentini 0:969a2be49f41 740 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 741 NFC_StatusTypeDef status;
giovannivisentini 0:969a2be49f41 742 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 743
giovannivisentini 0:969a2be49f41 744 /*check the parameters */
giovannivisentini 0:969a2be49f41 745 if (uPwdId > 0x0003) {
giovannivisentini 0:969a2be49f41 746 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 747 }
giovannivisentini 0:969a2be49f41 748
giovannivisentini 0:969a2be49f41 749 /* build the command */
giovannivisentini 0:969a2be49f41 750 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 751 command.Header.INS = C_APDU_CHANGE;
giovannivisentini 0:969a2be49f41 752 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 753 command.Header.P1 = GETMSB(uPwdId);
giovannivisentini 0:969a2be49f41 754 command.Header.P2 = GETLSB(uPwdId);
giovannivisentini 0:969a2be49f41 755 /* copy the number of byte of the data field */
giovannivisentini 0:969a2be49f41 756 command.Body.LC = M24SR_PASSWORD_NBBYTE;
giovannivisentini 0:969a2be49f41 757 /* copy the password */
giovannivisentini 0:969a2be49f41 758 command.Body.pData = pPwd;
giovannivisentini 0:969a2be49f41 759 /* build the I²C command */
giovannivisentini 0:969a2be49f41 760 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 761 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 762
giovannivisentini 0:969a2be49f41 763 /* send the request */
giovannivisentini 0:969a2be49f41 764 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 765 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 766 /* read the response */
giovannivisentini 0:969a2be49f41 767 errchk(
giovannivisentini 0:969a2be49f41 768 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 769
giovannivisentini 0:969a2be49f41 770 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 771
giovannivisentini 0:969a2be49f41 772 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 773 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 774 else
giovannivisentini 0:969a2be49f41 775 return status;
giovannivisentini 0:969a2be49f41 776 }
giovannivisentini 0:969a2be49f41 777
giovannivisentini 0:969a2be49f41 778 /**
giovannivisentini 0:969a2be49f41 779 * @brief This function sends the EnableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 780 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 781 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 782 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 783 */
giovannivisentini 0:969a2be49f41 784 NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement(
giovannivisentini 0:969a2be49f41 785 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 786 C_APDU command;
giovannivisentini 0:969a2be49f41 787 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 788 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 789 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 790
giovannivisentini 0:969a2be49f41 791 /*check the parameters */
giovannivisentini 0:969a2be49f41 792 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 793 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 794 }
giovannivisentini 0:969a2be49f41 795
giovannivisentini 0:969a2be49f41 796 /* build the command */
giovannivisentini 0:969a2be49f41 797 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 798 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 799 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 800 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 801 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 802 /* build the I²C command */
giovannivisentini 0:969a2be49f41 803 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 804 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 805
giovannivisentini 0:969a2be49f41 806 /* send the request */
giovannivisentini 0:969a2be49f41 807 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 808 /* The right access to be updated in EEPROM need at least 6ms */
giovannivisentini 0:969a2be49f41 809 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 810 /* read the response */
giovannivisentini 0:969a2be49f41 811 errchk(
giovannivisentini 0:969a2be49f41 812 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 813
giovannivisentini 0:969a2be49f41 814 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 815 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 816 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 817 else
giovannivisentini 0:969a2be49f41 818 return status;
giovannivisentini 0:969a2be49f41 819 }
giovannivisentini 0:969a2be49f41 820
giovannivisentini 0:969a2be49f41 821 /**
giovannivisentini 0:969a2be49f41 822 * @brief This function sends the DisableVerificationRequirement command
giovannivisentini 9:9f2e2e68d695 823 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 824 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 825 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 826 */
giovannivisentini 0:969a2be49f41 827 NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement(
giovannivisentini 0:969a2be49f41 828 uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 829 C_APDU command;
giovannivisentini 0:969a2be49f41 830 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 831 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 832 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 833
giovannivisentini 0:969a2be49f41 834 /*check the parameters */
giovannivisentini 0:969a2be49f41 835 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 836 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 837 }
giovannivisentini 0:969a2be49f41 838
giovannivisentini 0:969a2be49f41 839 /* build the command */
giovannivisentini 0:969a2be49f41 840 command.Header.CLA = C_APDU_CLA_DEFAULT;
giovannivisentini 0:969a2be49f41 841 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 842 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 843 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 844 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 845 /* build the I²C command */
giovannivisentini 0:969a2be49f41 846 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 847 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 848
giovannivisentini 0:969a2be49f41 849 /* send the request */
giovannivisentini 0:969a2be49f41 850 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 851 /* The right access to be updated in EEPROM need at least 6ms */
giovannivisentini 0:969a2be49f41 852 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 853 /* read the response */
giovannivisentini 0:969a2be49f41 854 errchk(
giovannivisentini 0:969a2be49f41 855 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 856
giovannivisentini 0:969a2be49f41 857 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 858
giovannivisentini 0:969a2be49f41 859 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 860 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 861 else
giovannivisentini 0:969a2be49f41 862 return status;
giovannivisentini 0:969a2be49f41 863
giovannivisentini 0:969a2be49f41 864 }
giovannivisentini 0:969a2be49f41 865
giovannivisentini 0:969a2be49f41 866 /**
giovannivisentini 0:969a2be49f41 867 * @brief This function sends the EnablePermananentState command
giovannivisentini 9:9f2e2e68d695 868 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 869 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 870 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 871 */
giovannivisentini 0:969a2be49f41 872 NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 873 C_APDU command;
giovannivisentini 0:969a2be49f41 874
giovannivisentini 0:969a2be49f41 875 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 876 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 877 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 878
giovannivisentini 0:969a2be49f41 879 /*check the parameters */
giovannivisentini 0:969a2be49f41 880 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 881 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 882 }
giovannivisentini 0:969a2be49f41 883
giovannivisentini 0:969a2be49f41 884 /* build the command */
giovannivisentini 0:969a2be49f41 885 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 886 command.Header.INS = C_APDU_ENABLE;
giovannivisentini 0:969a2be49f41 887 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 888 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 889 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 890 /* build the I²C command */
giovannivisentini 0:969a2be49f41 891 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 892 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 893
giovannivisentini 0:969a2be49f41 894 /* send the request */
giovannivisentini 0:969a2be49f41 895 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 896 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 897 /* read the response */
giovannivisentini 0:969a2be49f41 898 errchk(
giovannivisentini 0:969a2be49f41 899 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 900
giovannivisentini 0:969a2be49f41 901 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 902 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 903 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 904 else
giovannivisentini 0:969a2be49f41 905 return status;
giovannivisentini 0:969a2be49f41 906 }
giovannivisentini 0:969a2be49f41 907
giovannivisentini 0:969a2be49f41 908 /**
giovannivisentini 0:969a2be49f41 909 * @brief This function sends the DisablePermanentState command
giovannivisentini 9:9f2e2e68d695 910 * @param uReadOrWrite enable the read or write protection ( 0x0001 : Read or 0x0002 : Write )
giovannivisentini 9:9f2e2e68d695 911 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 912 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 913 */
giovannivisentini 0:969a2be49f41 914 NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState(uint16_t uReadOrWrite) {
giovannivisentini 0:969a2be49f41 915 C_APDU command;
giovannivisentini 0:969a2be49f41 916
giovannivisentini 0:969a2be49f41 917 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 918 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 919 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 920
giovannivisentini 0:969a2be49f41 921 /*check the parameters */
giovannivisentini 0:969a2be49f41 922 if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
giovannivisentini 0:969a2be49f41 923 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 924 }
giovannivisentini 0:969a2be49f41 925
giovannivisentini 0:969a2be49f41 926 /* build the command */
giovannivisentini 0:969a2be49f41 927 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 928 command.Header.INS = C_APDU_DISABLE;
giovannivisentini 0:969a2be49f41 929 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 930 command.Header.P1 = GETMSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 931 command.Header.P2 = GETLSB(uReadOrWrite);
giovannivisentini 0:969a2be49f41 932 /* build the I²C command */
giovannivisentini 0:969a2be49f41 933 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
giovannivisentini 0:969a2be49f41 934 uDIDbyte, &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 935
giovannivisentini 0:969a2be49f41 936 /* send the request */
giovannivisentini 0:969a2be49f41 937 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 938 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 939 /* read the response */
giovannivisentini 0:969a2be49f41 940 errchk(
giovannivisentini 0:969a2be49f41 941 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 942
giovannivisentini 0:969a2be49f41 943 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 944
giovannivisentini 0:969a2be49f41 945 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 946 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 947 else
giovannivisentini 0:969a2be49f41 948 return status;
giovannivisentini 0:969a2be49f41 949 }
giovannivisentini 0:969a2be49f41 950
giovannivisentini 0:969a2be49f41 951 /**
giovannivisentini 9:9f2e2e68d695 952 * @brief This function generates an interrupt on GPO pin
giovannivisentini 0:969a2be49f41 953 * @param None
giovannivisentini 9:9f2e2e68d695 954 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 955 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 956 */
giovannivisentini 0:969a2be49f41 957 NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
giovannivisentini 0:969a2be49f41 958 C_APDU command;
giovannivisentini 0:969a2be49f41 959
giovannivisentini 0:969a2be49f41 960 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 961 uint16_t uP1P2 = 0x001E;
giovannivisentini 0:969a2be49f41 962 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 963 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 964
giovannivisentini 0:969a2be49f41 965 status = M24SR_ManageI2CGPO(INTERRUPT);
giovannivisentini 0:969a2be49f41 966
giovannivisentini 0:969a2be49f41 967 /* build the command */
giovannivisentini 0:969a2be49f41 968 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 969 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 970 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 971 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 972 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 973 command.Body.LC = 0x00;
giovannivisentini 0:969a2be49f41 974 /* build the I²C command */
giovannivisentini 0:969a2be49f41 975 M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 976 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 977
giovannivisentini 0:969a2be49f41 978 /* send the request */
giovannivisentini 0:969a2be49f41 979 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 980 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 981 /* read the response */
giovannivisentini 0:969a2be49f41 982 errchk(
giovannivisentini 0:969a2be49f41 983 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 984
giovannivisentini 0:969a2be49f41 985 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 986
giovannivisentini 0:969a2be49f41 987 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 988 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 989 else
giovannivisentini 0:969a2be49f41 990 return status;
giovannivisentini 0:969a2be49f41 991
giovannivisentini 0:969a2be49f41 992 }
giovannivisentini 0:969a2be49f41 993
giovannivisentini 0:969a2be49f41 994 /**
giovannivisentini 9:9f2e2e68d695 995 * @brief This function forces GPO pin to low state or high Z
giovannivisentini 9:9f2e2e68d695 996 * @param uSetOrReset select if GPO must be low (reset) or HiZ
giovannivisentini 9:9f2e2e68d695 997 * @retval Status (SW1&SW2) Status of the operation to complete.
giovannivisentini 9:9f2e2e68d695 998 * @retval M24SR_ERROR_I2CTIMEOUT I2C timeout occurred.
giovannivisentini 0:969a2be49f41 999 */
giovannivisentini 0:969a2be49f41 1000 NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
giovannivisentini 0:969a2be49f41 1001 C_APDU command;
giovannivisentini 0:969a2be49f41 1002 uint8_t *pBuffer = uM24SRbuffer;
giovannivisentini 0:969a2be49f41 1003 uint16_t uP1P2 = 0x001F;
giovannivisentini 0:969a2be49f41 1004 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1005 uint16_t NbByte;
giovannivisentini 0:969a2be49f41 1006
giovannivisentini 0:969a2be49f41 1007 /*check the parameters */
giovannivisentini 0:969a2be49f41 1008 if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
giovannivisentini 0:969a2be49f41 1009 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1010 }
giovannivisentini 0:969a2be49f41 1011
giovannivisentini 0:969a2be49f41 1012 status = M24SR_ManageI2CGPO(STATE_CONTROL);
giovannivisentini 0:969a2be49f41 1013
giovannivisentini 0:969a2be49f41 1014 /* build the command */
giovannivisentini 0:969a2be49f41 1015 command.Header.CLA = C_APDU_CLA_ST;
giovannivisentini 0:969a2be49f41 1016 command.Header.INS = C_APDU_INTERRUPT;
giovannivisentini 0:969a2be49f41 1017 /* copy the Password Id */
giovannivisentini 0:969a2be49f41 1018 command.Header.P1 = GETMSB(uP1P2);
giovannivisentini 0:969a2be49f41 1019 command.Header.P2 = GETLSB(uP1P2);
giovannivisentini 0:969a2be49f41 1020 command.Body.LC = 0x01;
giovannivisentini 0:969a2be49f41 1021 command.Body.pData = &uSetOrReset;
giovannivisentini 0:969a2be49f41 1022 /* copy the data */
giovannivisentini 0:969a2be49f41 1023 //memcpy(command.Body.pData , &uSetOrReset, 0x01 );
giovannivisentini 0:969a2be49f41 1024 //command.Body.LE = 0x00 ;
giovannivisentini 0:969a2be49f41 1025 /* build the I²C command */
giovannivisentini 0:969a2be49f41 1026 M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
giovannivisentini 0:969a2be49f41 1027 &NbByte, pBuffer);
giovannivisentini 0:969a2be49f41 1028
giovannivisentini 0:969a2be49f41 1029 /* send the request */
giovannivisentini 0:969a2be49f41 1030 errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
giovannivisentini 0:969a2be49f41 1031 errchk(M24SR_IO_IsAnswerReady());
giovannivisentini 0:969a2be49f41 1032 /* read the response */
giovannivisentini 0:969a2be49f41 1033 errchk(
giovannivisentini 0:969a2be49f41 1034 M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
giovannivisentini 0:969a2be49f41 1035
giovannivisentini 0:969a2be49f41 1036 status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
giovannivisentini 0:969a2be49f41 1037
giovannivisentini 0:969a2be49f41 1038 if(status == NFC_COMMAND_SUCCESS)
giovannivisentini 0:969a2be49f41 1039 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1040 else
giovannivisentini 0:969a2be49f41 1041 return status;
giovannivisentini 0:969a2be49f41 1042 }
giovannivisentini 0:969a2be49f41 1043
giovannivisentini 7:19fc04b8fec6 1044
giovannivisentini 0:969a2be49f41 1045 NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(M24SR_GPO_MGMT GPO_I2Cconfig) {
giovannivisentini 0:969a2be49f41 1046 uint8_t GPO_config = 0;
giovannivisentini 0:969a2be49f41 1047
giovannivisentini 0:969a2be49f41 1048 if (GPO_I2Cconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1049 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1050 }
giovannivisentini 0:969a2be49f41 1051
giovannivisentini 0:969a2be49f41 1052 errchk(M24SR_SelectApplication());
giovannivisentini 0:969a2be49f41 1053
giovannivisentini 0:969a2be49f41 1054 errchk(M24SR_SelectSystemfile());
giovannivisentini 0:969a2be49f41 1055
giovannivisentini 0:969a2be49f41 1056 errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
giovannivisentini 18:10def2fefa8a 1057 errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD));
giovannivisentini 18:10def2fefa8a 1058
giovannivisentini 0:969a2be49f41 1059 /* Update only GPO purpose for I2C */
giovannivisentini 0:969a2be49f41 1060 GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig;
giovannivisentini 18:10def2fefa8a 1061
giovannivisentini 0:969a2be49f41 1062 errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)));
giovannivisentini 18:10def2fefa8a 1063
giovannivisentini 18:10def2fefa8a 1064 /* if we use the gpo for know when the asnwer is ready,
giovannivisentini 18:10def2fefa8a 1065 we can use the interrupt for do the polling, otherwise just wait on the
giovannivisentini 18:10def2fefa8a 1066 i2c read */
giovannivisentini 0:969a2be49f41 1067 if (GPO_I2Cconfig == I2C_ANSWER_READY)
giovannivisentini 0:969a2be49f41 1068 M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO);
giovannivisentini 18:10def2fefa8a 1069 else
giovannivisentini 18:10def2fefa8a 1070 M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING);
giovannivisentini 0:969a2be49f41 1071
giovannivisentini 0:969a2be49f41 1072 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1073 }
giovannivisentini 0:969a2be49f41 1074
giovannivisentini 0:969a2be49f41 1075 NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(M24SR_GPO_MGMT GPO_RFconfig) {
giovannivisentini 0:969a2be49f41 1076 uint8_t GPO_config;
giovannivisentini 0:969a2be49f41 1077
giovannivisentini 0:969a2be49f41 1078 if (GPO_RFconfig > STATE_CONTROL) {
giovannivisentini 0:969a2be49f41 1079 return NFC_IO_ERROR_PARAMETER;
giovannivisentini 0:969a2be49f41 1080 }
giovannivisentini 0:969a2be49f41 1081
giovannivisentini 0:969a2be49f41 1082 errchk(M24SR_SelectApplication())
giovannivisentini 0:969a2be49f41 1083 errchk(M24SR_SelectSystemfile())
giovannivisentini 0:969a2be49f41 1084 errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
giovannivisentini 0:969a2be49f41 1085
giovannivisentini 0:969a2be49f41 1086 /* Update only GPO purpose for I2C */
giovannivisentini 0:969a2be49f41 1087 GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig << 4);
giovannivisentini 0:969a2be49f41 1088
giovannivisentini 0:969a2be49f41 1089 errchk(M24SR_SelectSystemfile())
giovannivisentini 0:969a2be49f41 1090 errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD))
giovannivisentini 0:969a2be49f41 1091 errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)))
giovannivisentini 0:969a2be49f41 1092
giovannivisentini 0:969a2be49f41 1093 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1094 }
giovannivisentini 0:969a2be49f41 1095
giovannivisentini 0:969a2be49f41 1096 NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
giovannivisentini 0:969a2be49f41 1097 /* Disable RF */
giovannivisentini 0:969a2be49f41 1098 if (OnOffChoice != 0) {
giovannivisentini 0:969a2be49f41 1099 M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
giovannivisentini 0:969a2be49f41 1100 } else {
giovannivisentini 0:969a2be49f41 1101 M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
giovannivisentini 0:969a2be49f41 1102 }
giovannivisentini 0:969a2be49f41 1103 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1104 }
giovannivisentini 0:969a2be49f41 1105
giovannivisentini 0:969a2be49f41 1106 NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1107 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1108 int ret = dev_I2C.write(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1109 if (ret == 0)
giovannivisentini 0:969a2be49f41 1110 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1111 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1112 }
giovannivisentini 0:969a2be49f41 1113
giovannivisentini 0:969a2be49f41 1114 NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
giovannivisentini 0:969a2be49f41 1115 uint8_t *pBuffer) {
giovannivisentini 10:482175f7ae66 1116 int ret = dev_I2C.read(address, (char*) pBuffer, NbByte);
giovannivisentini 0:969a2be49f41 1117 if (ret == 0)
giovannivisentini 0:969a2be49f41 1118 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1119
giovannivisentini 0:969a2be49f41 1120 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1121 }
giovannivisentini 0:969a2be49f41 1122
giovannivisentini 0:969a2be49f41 1123 NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
giovannivisentini 0:969a2be49f41 1124
giovannivisentini 0:969a2be49f41 1125 int status = 1;
giovannivisentini 0:969a2be49f41 1126 char buffer;
giovannivisentini 18:10def2fefa8a 1127 while (status != 0) {
giovannivisentini 10:482175f7ae66 1128 status = dev_I2C.read(address, &buffer, 1, false);
giovannivisentini 0:969a2be49f41 1129 }
giovannivisentini 0:969a2be49f41 1130
giovannivisentini 0:969a2be49f41 1131 if (status == 0)
giovannivisentini 0:969a2be49f41 1132 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1133 //else
giovannivisentini 0:969a2be49f41 1134 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1135 }
giovannivisentini 0:969a2be49f41 1136
giovannivisentini 0:969a2be49f41 1137 NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void) {
giovannivisentini 18:10def2fefa8a 1138
giovannivisentini 0:969a2be49f41 1139 switch (syncMode) {
giovannivisentini 0:969a2be49f41 1140 case M24SR_WAITINGTIME_POLLING:
giovannivisentini 0:969a2be49f41 1141 return M24SR_IO_PollI2C();
giovannivisentini 0:969a2be49f41 1142
giovannivisentini 0:969a2be49f41 1143 case M24SR_INTERRUPT_GPO:
giovannivisentini 0:969a2be49f41 1144
giovannivisentini 18:10def2fefa8a 1145 while (!interruptIsFired ){
giovannivisentini 18:10def2fefa8a 1146 __WFE();
giovannivisentini 18:10def2fefa8a 1147 }//while
giovannivisentini 18:10def2fefa8a 1148 interruptIsFired = false;
giovannivisentini 16:b0d62f4b185a 1149
giovannivisentini 0:969a2be49f41 1150 return NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 1151
giovannivisentini 0:969a2be49f41 1152 default:
giovannivisentini 0:969a2be49f41 1153 return NFC_IO_ERROR_I2CTIMEOUT;
giovannivisentini 0:969a2be49f41 1154 }
giovannivisentini 0:969a2be49f41 1155
giovannivisentini 0:969a2be49f41 1156 }
giovannivisentini 0:969a2be49f41 1157
giovannivisentini 6:96389fb79676 1158 ////////////////////////hight level utility function //////////////////////////
giovannivisentini 6:96389fb79676 1159
giovannivisentini 6:96389fb79676 1160 NFC_StatusTypeDef M24SR::enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1161 const uint8_t* pNewPassword) {
giovannivisentini 6:96389fb79676 1162 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1163 /* Set new password */
giovannivisentini 6:96389fb79676 1164 errchk(ChangeReferenceData(M24SR::ReadPwd, pNewPassword));
giovannivisentini 6:96389fb79676 1165 return EnableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1166 }
giovannivisentini 6:96389fb79676 1167
giovannivisentini 6:96389fb79676 1168 NFC_StatusTypeDef M24SR::disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1169 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1170 return DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1171 }
giovannivisentini 6:96389fb79676 1172
giovannivisentini 6:96389fb79676 1173 NFC_StatusTypeDef M24SR::enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 6:96389fb79676 1174 uint8_t* pNewPassword) {
giovannivisentini 6:96389fb79676 1175 /* check we have the good password */
giovannivisentini 6:96389fb79676 1176 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1177 /* Set new password */
giovannivisentini 6:96389fb79676 1178 errchk(ChangeReferenceData(M24SR::WritePwd, pNewPassword));
giovannivisentini 6:96389fb79676 1179 return EnableVerificationRequirement(M24SR::WritePwd);
giovannivisentini 6:96389fb79676 1180 }
giovannivisentini 6:96389fb79676 1181
giovannivisentini 6:96389fb79676 1182 NFC_StatusTypeDef M24SR::disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1183 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1184 return(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1185 }
giovannivisentini 6:96389fb79676 1186
giovannivisentini 6:96389fb79676 1187 NFC_StatusTypeDef M24SR::disableAllPassword(const uint8_t* pSuperUserPassword){
giovannivisentini 6:96389fb79676 1188 errchk(Verify(M24SR::I2CPwd, 0x10, pSuperUserPassword));
giovannivisentini 6:96389fb79676 1189
giovannivisentini 6:96389fb79676 1190 errchk(DisablePermanentState(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1191 errchk(DisablePermanentState(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1192
giovannivisentini 6:96389fb79676 1193 errchk(DisableVerificationRequirement(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1194 errchk(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1195
giovannivisentini 6:96389fb79676 1196 /* reset password */
giovannivisentini 6:96389fb79676 1197 errchk(ChangeReferenceData(M24SR::ReadPwd, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1198 return(ChangeReferenceData(M24SR::WritePwd, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1199 }
giovannivisentini 6:96389fb79676 1200
giovannivisentini 6:96389fb79676 1201 NFC_StatusTypeDef M24SR::enableReadOnly(const uint8_t* pCurrentWritePassword){
giovannivisentini 6:96389fb79676 1202
giovannivisentini 6:96389fb79676 1203 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1204 /* lock write to have read only */
giovannivisentini 6:96389fb79676 1205 return EnablePermanentState(M24SR::WritePwd);
giovannivisentini 6:96389fb79676 1206 }
giovannivisentini 6:96389fb79676 1207
giovannivisentini 6:96389fb79676 1208 NFC_StatusTypeDef M24SR::disableReadOnly() {
giovannivisentini 6:96389fb79676 1209
giovannivisentini 6:96389fb79676 1210 errchk(Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1211 /* disable write protection to disable read only mode */
giovannivisentini 6:96389fb79676 1212 errchk(DisablePermanentState(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1213 return(DisableVerificationRequirement(M24SR::WritePwd));
giovannivisentini 6:96389fb79676 1214 }
giovannivisentini 6:96389fb79676 1215
giovannivisentini 6:96389fb79676 1216
giovannivisentini 6:96389fb79676 1217 NFC_StatusTypeDef M24SR::enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 6:96389fb79676 1218
giovannivisentini 6:96389fb79676 1219 errchk(Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword));
giovannivisentini 6:96389fb79676 1220 /* disable read access and keep write */
giovannivisentini 6:96389fb79676 1221 return(EnablePermanentState(M24SR::ReadPwd));
giovannivisentini 6:96389fb79676 1222
giovannivisentini 6:96389fb79676 1223 }
giovannivisentini 6:96389fb79676 1224
giovannivisentini 6:96389fb79676 1225 NFC_StatusTypeDef M24SR::disableWriteOnly() {
giovannivisentini 6:96389fb79676 1226
giovannivisentini 6:96389fb79676 1227 errchk(Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD));
giovannivisentini 6:96389fb79676 1228 /* disable write only -> enable write acces */
giovannivisentini 6:96389fb79676 1229 errchk(DisablePermanentState(M24SR::ReadPwd))
giovannivisentini 6:96389fb79676 1230 return DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 6:96389fb79676 1231 }
giovannivisentini 6:96389fb79676 1232
giovannivisentini 0:969a2be49f41 1233 /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/