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

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

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

Introduction

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

Firmware Library

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

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Jan 14 08:41:19 2016 +0000
Revision:
10:482175f7ae66
Parent:
9:9f2e2e68d695
Child:
13:840a9c7f90b9
fix compile error

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