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:
Mon Jan 11 12:37:28 2016 +0000
Revision:
7:19fc04b8fec6
Parent:
6:96389fb79676
Child:
9:9f2e2e68d695
update docs

Who changed what in which revision?

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