X_NUCLEO_NFC02A1 library for M24LR

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_NFC02A1_mbedOS HelloWorld_NFC02A1laatste HelloWorld_NFC02A1

Fork of X_NUCLEO_NFC02A1 by ST Expansion SW Team

X-NUCLEO-NFC02A1 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-NFC02A1 Dynamic NFC Tag Expansion Board based on M24LR.

Firmware Library

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

Example application

Hello World is a simple application to program and read an URI from the NFC tag.

Committer:
giovannivisentini
Date:
Fri May 19 07:51:32 2017 +0000
Revision:
6:8c1eca41b3a9
Parent:
5:900640bf1cff
Child:
8:7c4cf671960b
update with the ARM mBed coding style

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:71bff5ad0a49 1 /**
rosarium 0:71bff5ad0a49 2 ******************************************************************************
rosarium 0:71bff5ad0a49 3 * @file NdefNfcTagM24LR.cpp
rosarium 0:71bff5ad0a49 4 * @author AMG Central Lab
giovannivisentini 6:8c1eca41b3a9 5 * @version V2.0.0
giovannivisentini 6:8c1eca41b3a9 6 * @date 19 May 2017
rosarium 0:71bff5ad0a49 7 * @brief Wrapper class of the NDefLib library to write/read NDEF messages.
rosarium 0:71bff5ad0a49 8 ******************************************************************************
rosarium 0:71bff5ad0a49 9 * @attention
rosarium 0:71bff5ad0a49 10 *
rosarium 0:71bff5ad0a49 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
rosarium 0:71bff5ad0a49 12 *
rosarium 0:71bff5ad0a49 13 * Redistribution and use in source and binary forms, with or without modification,
rosarium 0:71bff5ad0a49 14 * are permitted provided that the following conditions are met:
rosarium 0:71bff5ad0a49 15 * 1. Redistributions of source code must retain the above copyright notice,
rosarium 0:71bff5ad0a49 16 * this list of conditions and the following disclaimer.
rosarium 0:71bff5ad0a49 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
rosarium 0:71bff5ad0a49 18 * this list of conditions and the following disclaimer in the documentation
rosarium 0:71bff5ad0a49 19 * and/or other materials provided with the distribution.
rosarium 0:71bff5ad0a49 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
rosarium 0:71bff5ad0a49 21 * may be used to endorse or promote products derived from this software
rosarium 0:71bff5ad0a49 22 * without specific prior written permission.
rosarium 0:71bff5ad0a49 23 *
rosarium 0:71bff5ad0a49 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
rosarium 0:71bff5ad0a49 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
rosarium 0:71bff5ad0a49 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rosarium 0:71bff5ad0a49 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
rosarium 0:71bff5ad0a49 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
rosarium 0:71bff5ad0a49 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rosarium 0:71bff5ad0a49 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
rosarium 0:71bff5ad0a49 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
rosarium 0:71bff5ad0a49 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
rosarium 0:71bff5ad0a49 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rosarium 0:71bff5ad0a49 34 *
rosarium 0:71bff5ad0a49 35 ******************************************************************************
rosarium 0:71bff5ad0a49 36 */
rosarium 0:71bff5ad0a49 37
rosarium 0:71bff5ad0a49 38
rosarium 0:71bff5ad0a49 39 #include <cmath>
rosarium 0:71bff5ad0a49 40
rosarium 0:71bff5ad0a49 41 #include "NDefNfcTagM24LR.h"
rosarium 0:71bff5ad0a49 42
rosarium 0:71bff5ad0a49 43
rosarium 0:71bff5ad0a49 44 /* wait 1sec, driver is configured to let 200ms for command to complete */
rosarium 0:71bff5ad0a49 45 /* which is enough for all commands except GetSession if RF session is already opened */
rosarium 0:71bff5ad0a49 46 /* Smartphone generally releases the session within the second, anyway the user can modify this value */
rosarium 0:71bff5ad0a49 47 #define OPENSESSION_NTRIALS 5
rosarium 0:71bff5ad0a49 48
rosarium 0:71bff5ad0a49 49 #define CC_FILE_LENGTH_BYTE 15
rosarium 0:71bff5ad0a49 50
rosarium 0:71bff5ad0a49 51
rosarium 0:71bff5ad0a49 52 #define NFCT5_MAGICNUMBER_E1_CCFILE 0xE1
rosarium 0:71bff5ad0a49 53 #define NFCT5_MAGICNUMBER_E2_CCFILE 0xE2
rosarium 0:71bff5ad0a49 54 #define NFCT5_EXTENDED_CCFILE 0xFF
rosarium 0:71bff5ad0a49 55 #define NFCT5_VERSION_V1_0 0x40
rosarium 0:71bff5ad0a49 56 #define NFCT5_READ_ACCESS 0x0C
rosarium 0:71bff5ad0a49 57 #define NFCT5_WRITE_ACCESS 0x03
rosarium 0:71bff5ad0a49 58
rosarium 0:71bff5ad0a49 59 #define NFCT5_NDEF_MSG_TLV 0x03
rosarium 0:71bff5ad0a49 60 #define NFCT5_PROPRIETARY_TLV 0xFD
rosarium 0:71bff5ad0a49 61 #define NFCT5_TERMINATOR_TLV 0xFE
rosarium 0:71bff5ad0a49 62 #define NFCT5_3_BYTES_L_TLV 0xFF
rosarium 0:71bff5ad0a49 63
rosarium 0:71bff5ad0a49 64
rosarium 0:71bff5ad0a49 65 #define NDEF_MAX_SIZE NFC_DEVICE_MAX_NDEFMEMORY
rosarium 0:71bff5ad0a49 66
rosarium 0:71bff5ad0a49 67 #define NDEF_SIZE_OFFSET 0
rosarium 0:71bff5ad0a49 68 #define FIRST_RECORD_OFFSET 2
rosarium 0:71bff5ad0a49 69
rosarium 0:71bff5ad0a49 70 #ifndef MIN
rosarium 0:71bff5ad0a49 71 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
rosarium 0:71bff5ad0a49 72 #endif
rosarium 0:71bff5ad0a49 73
rosarium 0:71bff5ad0a49 74 #define NFCTAG_4M_SIZE 0x200
rosarium 0:71bff5ad0a49 75 #define NFCTAG_16M_SIZE 0x800
rosarium 0:71bff5ad0a49 76 #define NFCTAG_64M_SIZE 0x2000
rosarium 0:71bff5ad0a49 77
rosarium 0:71bff5ad0a49 78
rosarium 0:71bff5ad0a49 79 #define MAX_NDEF_MEM 0x200
rosarium 0:71bff5ad0a49 80 #define M24LR_MAX_SIZE NFCTAG_4M_SIZE
rosarium 0:71bff5ad0a49 81 #define M24LR_NDEF_MAX_SIZE MIN(M24LR_MAX_SIZE,MAX_NDEF_MEM)
rosarium 0:71bff5ad0a49 82 #define NFC_DEVICE_MAX_NDEFMEMORY M24LR_NDEF_MAX_SIZE
rosarium 0:71bff5ad0a49 83 /**
rosarium 0:71bff5ad0a49 84 * @brief This function read the data stored in NDEF file at defined offset.
rosarium 0:71bff5ad0a49 85 * @param Offset : Offset in the NDEF file.
rosarium 0:71bff5ad0a49 86 * @param DataSize : Number of byte to read.
rosarium 0:71bff5ad0a49 87 * @param pData : pointer on buffer to store read data.
rosarium 0:71bff5ad0a49 88 * @retval NDEF_ERROR_MEMORY_INTERNAL : Size not compatible with memory.
rosarium 0:71bff5ad0a49 89 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported.
rosarium 0:71bff5ad0a49 90 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 0:71bff5ad0a49 91 * @retval NDEF_OK : The operation is completed.
rosarium 0:71bff5ad0a49 92 */
rosarium 0:71bff5ad0a49 93 uint16_t NDefNfcTagM24LR::ReadData( uint16_t Offset , uint16_t DataSize , uint8_t* pData )
rosarium 0:71bff5ad0a49 94 {
rosarium 0:71bff5ad0a49 95 uint16_t status = NDEF_ERROR;
rosarium 0:71bff5ad0a49 96 uint8_t atlv_detect[4];
rosarium 0:71bff5ad0a49 97 uint8_t index = 0;
rosarium 0:71bff5ad0a49 98
rosarium 0:71bff5ad0a49 99 /* If too many data to write return error */
rosarium 0:71bff5ad0a49 100 if( DataSize > NDEF_MAX_SIZE )
rosarium 0:71bff5ad0a49 101 {
rosarium 0:71bff5ad0a49 102 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 0:71bff5ad0a49 103 }
rosarium 0:71bff5ad0a49 104
rosarium 0:71bff5ad0a49 105 /* Detect NDEF message in memory */
rosarium 0:71bff5ad0a49 106 status = NfcType5_NDEFDetection( );
rosarium 0:71bff5ad0a49 107 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 108 {
rosarium 0:71bff5ad0a49 109 return status;
rosarium 0:71bff5ad0a49 110 }
rosarium 0:71bff5ad0a49 111
rosarium 0:71bff5ad0a49 112 /* Read TL of Type 5 */
rosarium 0:71bff5ad0a49 113 status = NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect);
rosarium 0:71bff5ad0a49 114 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 115 {
rosarium 0:71bff5ad0a49 116 return status;
rosarium 0:71bff5ad0a49 117 }
rosarium 0:71bff5ad0a49 118
rosarium 0:71bff5ad0a49 119 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
giovannivisentini 5:900640bf1cff 120 index=2;
giovannivisentini 5:900640bf1cff 121
giovannivisentini 5:900640bf1cff 122 if(Offset==0 && DataSize>=2){
giovannivisentini 5:900640bf1cff 123 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
giovannivisentini 5:900640bf1cff 124 {
giovannivisentini 5:900640bf1cff 125 pData[0] = atlv_detect[2];
giovannivisentini 5:900640bf1cff 126 pData[1] = atlv_detect[3];
giovannivisentini 5:900640bf1cff 127
giovannivisentini 5:900640bf1cff 128 }
giovannivisentini 5:900640bf1cff 129 else
giovannivisentini 5:900640bf1cff 130 {
giovannivisentini 5:900640bf1cff 131 pData[0] = 0x00;
giovannivisentini 5:900640bf1cff 132 pData[1] = atlv_detect[1];
giovannivisentini 5:900640bf1cff 133
giovannivisentini 5:900640bf1cff 134 }
giovannivisentini 5:900640bf1cff 135 DataSize-=2;
giovannivisentini 5:900640bf1cff 136 pData+=2;
rosarium 0:71bff5ad0a49 137 }
giovannivisentini 5:900640bf1cff 138
rosarium 0:71bff5ad0a49 139 /* Check CC file is in the correct mode to proceed */
rosarium 0:71bff5ad0a49 140 if( CCFileStruct.State == TT5_INITIALIZED )
rosarium 0:71bff5ad0a49 141 {
rosarium 0:71bff5ad0a49 142 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 143 }
rosarium 0:71bff5ad0a49 144
giovannivisentini 5:900640bf1cff 145 if(DataSize > 0)
rosarium 0:71bff5ad0a49 146 {
rosarium 0:71bff5ad0a49 147 /* Read NDEF */
giovannivisentini 5:900640bf1cff 148 if( NDefReadByte(CCFileStruct.NDEF_offset + index + Offset, DataSize, pData) != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 149 {
rosarium 0:71bff5ad0a49 150 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 151 }
rosarium 0:71bff5ad0a49 152 }
rosarium 0:71bff5ad0a49 153
rosarium 0:71bff5ad0a49 154 return NDEF_OK;
rosarium 0:71bff5ad0a49 155 }
rosarium 0:71bff5ad0a49 156
rosarium 0:71bff5ad0a49 157 /**
rosarium 0:71bff5ad0a49 158 * @brief This function writes data in NDEF file at defined offset.
rosarium 0:71bff5ad0a49 159 * @param Offset : Offset in the NDEF file.
rosarium 0:71bff5ad0a49 160 * @param DataSize : Number of byte to write.
rosarium 0:71bff5ad0a49 161 * @param pData : pointer on buffer to copy.
rosarium 0:71bff5ad0a49 162 * @retval NDEF_ERROR_MEMORY_INTERNAL : Size not compatible with memory.
rosarium 0:71bff5ad0a49 163 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported.
rosarium 0:71bff5ad0a49 164 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 0:71bff5ad0a49 165 * @retval NDEF_OK : The operation is completed.
rosarium 0:71bff5ad0a49 166 */
rosarium 0:71bff5ad0a49 167 uint16_t NDefNfcTagM24LR::WriteData( uint16_t Offset , uint32_t DataSize , uint8_t *pData )
rosarium 0:71bff5ad0a49 168 {
rosarium 0:71bff5ad0a49 169 uint8_t atlv[4];
rosarium 0:71bff5ad0a49 170 uint8_t index = 0;
rosarium 0:71bff5ad0a49 171 uint16_t NDEF_Size = 0;
rosarium 0:71bff5ad0a49 172 bool status;
rosarium 0:71bff5ad0a49 173
rosarium 0:71bff5ad0a49 174 /* Do not include length bytes */
rosarium 0:71bff5ad0a49 175 DataSize -= FIRST_RECORD_OFFSET;
rosarium 0:71bff5ad0a49 176
rosarium 0:71bff5ad0a49 177 /* If too many data to write return error */
rosarium 0:71bff5ad0a49 178 if( DataSize > NDEF_MAX_SIZE )
rosarium 0:71bff5ad0a49 179 {
rosarium 0:71bff5ad0a49 180 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 0:71bff5ad0a49 181 }
rosarium 0:71bff5ad0a49 182
rosarium 0:71bff5ad0a49 183 /* Detect NDEF message in memory */
rosarium 0:71bff5ad0a49 184 if( NfcType5_NDEFDetection( ) != NDEF_OK )
rosarium 0:71bff5ad0a49 185 {
rosarium 0:71bff5ad0a49 186 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 187 }
rosarium 0:71bff5ad0a49 188
rosarium 0:71bff5ad0a49 189 /* Extract NDEF Size from buffer */
rosarium 0:71bff5ad0a49 190 NDEF_Size = (uint16_t)(pData[0] << 8);
rosarium 0:71bff5ad0a49 191 NDEF_Size = NDEF_Size | (uint16_t)(pData[1] );
rosarium 0:71bff5ad0a49 192
rosarium 0:71bff5ad0a49 193 /* If entire NDEF is written, update Length of Type 5 */
rosarium 0:71bff5ad0a49 194 if( DataSize == NDEF_Size )
rosarium 0:71bff5ad0a49 195 {
rosarium 0:71bff5ad0a49 196 /* Check if L is on 3 or 1 byte */
rosarium 0:71bff5ad0a49 197 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 198 {
rosarium 0:71bff5ad0a49 199 /* First init L with 0, will be updated at the end */
rosarium 0:71bff5ad0a49 200 atlv[1] = 0x00;
rosarium 0:71bff5ad0a49 201 atlv[2] = 0x00;
rosarium 0:71bff5ad0a49 202 atlv[3] = 0x00;
rosarium 0:71bff5ad0a49 203
rosarium 0:71bff5ad0a49 204 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 205
rosarium 0:71bff5ad0a49 206 index += 4;
rosarium 0:71bff5ad0a49 207 }
rosarium 0:71bff5ad0a49 208 else
rosarium 0:71bff5ad0a49 209 {
rosarium 0:71bff5ad0a49 210 /* First inti L with 0, will be updated at the end */
rosarium 0:71bff5ad0a49 211 atlv[1] = 0x00;
rosarium 0:71bff5ad0a49 212
rosarium 0:71bff5ad0a49 213 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 214
rosarium 0:71bff5ad0a49 215 index += 2;
rosarium 0:71bff5ad0a49 216 }
rosarium 0:71bff5ad0a49 217 }
rosarium 0:71bff5ad0a49 218
rosarium 0:71bff5ad0a49 219 /* Start write NDEF message to EEPROM */
rosarium 0:71bff5ad0a49 220 status = NDefWriteByte( (pData + FIRST_RECORD_OFFSET), DataSize, CCFileStruct.NDEF_offset + index + Offset);
rosarium 4:0287f5476fe0 221 if( status != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 222 {
rosarium 0:71bff5ad0a49 223 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 224 }
rosarium 0:71bff5ad0a49 225
rosarium 0:71bff5ad0a49 226 /* If entire NDEF is written, update Length of Type 5 */
rosarium 0:71bff5ad0a49 227 if( DataSize == NDEF_Size )
rosarium 0:71bff5ad0a49 228 {
rosarium 0:71bff5ad0a49 229 /* Check if L is on 3 or 1 byte */
rosarium 0:71bff5ad0a49 230 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 231 {
rosarium 0:71bff5ad0a49 232 /* Update Length value */
rosarium 0:71bff5ad0a49 233 atlv[1] = NFCT5_3_BYTES_L_TLV;
rosarium 0:71bff5ad0a49 234 atlv[2] = pData[0];
rosarium 0:71bff5ad0a49 235 atlv[3] = pData[1];
rosarium 0:71bff5ad0a49 236
rosarium 0:71bff5ad0a49 237 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 238 }
rosarium 0:71bff5ad0a49 239 else
rosarium 0:71bff5ad0a49 240 {
rosarium 0:71bff5ad0a49 241 /* Update Length value */
rosarium 0:71bff5ad0a49 242 atlv[1] = pData[1];
rosarium 0:71bff5ad0a49 243
rosarium 0:71bff5ad0a49 244 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 245 }
rosarium 0:71bff5ad0a49 246
rosarium 0:71bff5ad0a49 247 /* Write Terminator TLV */
rosarium 0:71bff5ad0a49 248 atlv[0] = NFCT5_TERMINATOR_TLV;
rosarium 0:71bff5ad0a49 249 status = NDefWriteByte( atlv, 1, CCFileStruct.NDEF_offset + index + NDEF_Size);
rosarium 0:71bff5ad0a49 250 }
rosarium 0:71bff5ad0a49 251
rosarium 0:71bff5ad0a49 252 return NDEF_OK;
rosarium 0:71bff5ad0a49 253 }
rosarium 0:71bff5ad0a49 254
rosarium 0:71bff5ad0a49 255 /**
rosarium 0:71bff5ad0a49 256 * @brief This functions writes CCFile in EEPROM.
rosarium 0:71bff5ad0a49 257 * @Param pCCBuffer : pointer on the buffer containnig CC file.
rosarium 0:71bff5ad0a49 258 * @retval NFCTAG status.
rosarium 0:71bff5ad0a49 259 */
rosarium 0:71bff5ad0a49 260 uint16_t NDefNfcTagM24LR::NfcType5_WriteCCFile( const uint8_t * const pCCBuffer )
rosarium 0:71bff5ad0a49 261 {
rosarium 0:71bff5ad0a49 262 bool ret_value;
rosarium 0:71bff5ad0a49 263
rosarium 0:71bff5ad0a49 264 /* Write first block of CCFile */
rosarium 0:71bff5ad0a49 265 ret_value = NDefWriteByte( pCCBuffer, 0x4, 0x00);
rosarium 0:71bff5ad0a49 266
rosarium 0:71bff5ad0a49 267 /* If extended memory writes the next 4 bytes */
rosarium 4:0287f5476fe0 268 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_SUCCESS) )
rosarium 0:71bff5ad0a49 269 {
rosarium 0:71bff5ad0a49 270 ret_value = NDefWriteByte( pCCBuffer + 4, 4, 0x04);
rosarium 0:71bff5ad0a49 271 }
rosarium 0:71bff5ad0a49 272
rosarium 4:0287f5476fe0 273 if( ret_value != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 274 {
rosarium 0:71bff5ad0a49 275 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 276 }
rosarium 0:71bff5ad0a49 277
rosarium 0:71bff5ad0a49 278 return NDEF_OK;
rosarium 0:71bff5ad0a49 279 }
rosarium 0:71bff5ad0a49 280
rosarium 0:71bff5ad0a49 281
rosarium 0:71bff5ad0a49 282
rosarium 0:71bff5ad0a49 283
rosarium 0:71bff5ad0a49 284 uint16_t NDefNfcTagM24LR::NfcType5_ReadCCFile( uint8_t * const pCCBuffer )
rosarium 0:71bff5ad0a49 285 {
rosarium 0:71bff5ad0a49 286 bool ret_value;
rosarium 0:71bff5ad0a49 287
rosarium 0:71bff5ad0a49 288 /* Read 4 bytes of CC File */
rosarium 0:71bff5ad0a49 289 ret_value = NDefReadByte(0x00, 4, pCCBuffer);
rosarium 0:71bff5ad0a49 290
rosarium 0:71bff5ad0a49 291 /* If extended memory reads the next 4 bytes */
rosarium 4:0287f5476fe0 292 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_SUCCESS) )
rosarium 0:71bff5ad0a49 293 {
rosarium 0:71bff5ad0a49 294 ret_value = NDefReadByte(0x04, 4, pCCBuffer + 4 );
rosarium 0:71bff5ad0a49 295 }
rosarium 0:71bff5ad0a49 296
rosarium 4:0287f5476fe0 297 if( ret_value != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 298 {
rosarium 0:71bff5ad0a49 299 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 300 }
rosarium 0:71bff5ad0a49 301
rosarium 0:71bff5ad0a49 302 return NDEF_OK;
rosarium 0:71bff5ad0a49 303 }
rosarium 0:71bff5ad0a49 304 uint16_t NDefNfcTagM24LR::NfcType5_TT5Init( void )
rosarium 0:71bff5ad0a49 305 {
rosarium 4:0287f5476fe0 306 bool ret_value ;
rosarium 0:71bff5ad0a49 307 uint16_t status;
rosarium 0:71bff5ad0a49 308 uint8_t accbuffer[8];
rosarium 0:71bff5ad0a49 309 uint8_t cdata;
rosarium 0:71bff5ad0a49 310
rosarium 0:71bff5ad0a49 311 /* Prepare buffer to update CCFile */
rosarium 0:71bff5ad0a49 312 accbuffer[0] = CCFileStruct.MagicNumber;
rosarium 0:71bff5ad0a49 313 accbuffer[1] = CCFileStruct.Version;
rosarium 0:71bff5ad0a49 314 accbuffer[2] = CCFileStruct.MemorySize;
rosarium 0:71bff5ad0a49 315 accbuffer[3] = CCFileStruct.TT5Tag;
rosarium 0:71bff5ad0a49 316 CCFileStruct.NDEF_offset = 0x04;
rosarium 0:71bff5ad0a49 317
rosarium 0:71bff5ad0a49 318 /* If extended memory prepare the length bytes */
rosarium 0:71bff5ad0a49 319 if( CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE )
rosarium 0:71bff5ad0a49 320 {
rosarium 0:71bff5ad0a49 321 accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8);
rosarium 0:71bff5ad0a49 322 accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF);
rosarium 0:71bff5ad0a49 323 CCFileStruct.NDEF_offset = 0x08;
rosarium 0:71bff5ad0a49 324 }
rosarium 0:71bff5ad0a49 325
rosarium 0:71bff5ad0a49 326 /* Update CCFile */
rosarium 0:71bff5ad0a49 327 status = NfcType5_WriteCCFile( accbuffer );
rosarium 0:71bff5ad0a49 328 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 329 {
rosarium 0:71bff5ad0a49 330 return status;
rosarium 0:71bff5ad0a49 331 }
rosarium 0:71bff5ad0a49 332
rosarium 0:71bff5ad0a49 333 /* Update NDEF TLV for INITIALIZED state */
rosarium 0:71bff5ad0a49 334 /* Update T */
rosarium 0:71bff5ad0a49 335 cdata = NFCT5_NDEF_MSG_TLV;
rosarium 0:71bff5ad0a49 336 ret_value = NDefWriteByte( &cdata, 1, CCFileStruct.NDEF_offset);
rosarium 4:0287f5476fe0 337 if( ret_value != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 338 {
rosarium 0:71bff5ad0a49 339 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 340 }
rosarium 0:71bff5ad0a49 341
rosarium 0:71bff5ad0a49 342 /* Update L */
rosarium 0:71bff5ad0a49 343 cdata = 0x00;
rosarium 0:71bff5ad0a49 344 ret_value = NDefWriteByte( &cdata, 1, (CCFileStruct.NDEF_offset + 1));
rosarium 4:0287f5476fe0 345 if( ret_value != NFC_SUCCESS )
rosarium 0:71bff5ad0a49 346 {
rosarium 0:71bff5ad0a49 347 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 348 }
rosarium 0:71bff5ad0a49 349
rosarium 0:71bff5ad0a49 350 return NDEF_OK;
rosarium 0:71bff5ad0a49 351 }
rosarium 0:71bff5ad0a49 352
rosarium 0:71bff5ad0a49 353
rosarium 0:71bff5ad0a49 354 uint16_t NDefNfcTagM24LR::NfcType5_NDEFDetection( void )
rosarium 0:71bff5ad0a49 355 {
rosarium 0:71bff5ad0a49 356 uint8_t acc_buffer[8];
rosarium 0:71bff5ad0a49 357 uint8_t atlv_detect[4];
rosarium 0:71bff5ad0a49 358 uint16_t status;
rosarium 0:71bff5ad0a49 359 uint32_t memory_size;
rosarium 0:71bff5ad0a49 360
rosarium 0:71bff5ad0a49 361 CCFileStruct.State = TT5_NO_NDEF;
rosarium 0:71bff5ad0a49 362
rosarium 0:71bff5ad0a49 363 /* Read CCFile */
rosarium 0:71bff5ad0a49 364 status = NfcType5_ReadCCFile( acc_buffer );
rosarium 0:71bff5ad0a49 365 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 366 {
rosarium 0:71bff5ad0a49 367 return status;
rosarium 0:71bff5ad0a49 368 }
rosarium 0:71bff5ad0a49 369
rosarium 0:71bff5ad0a49 370 /* Check Byte 0 is equal to magic number */
rosarium 0:71bff5ad0a49 371 if( ( acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE ) && ( acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE ) )
rosarium 0:71bff5ad0a49 372 {
rosarium 0:71bff5ad0a49 373 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 374 }
rosarium 0:71bff5ad0a49 375 /* Check Version number */
rosarium 0:71bff5ad0a49 376 else if( ( (acc_buffer[1]&0xFC) != 0x40 ) )
rosarium 0:71bff5ad0a49 377 {
rosarium 0:71bff5ad0a49 378 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 379 }
rosarium 0:71bff5ad0a49 380
rosarium 0:71bff5ad0a49 381 /* Check if CCFile is on 4 Bytes or 8 Bytes */
rosarium 0:71bff5ad0a49 382 if( acc_buffer[2] == 0x00 )
rosarium 0:71bff5ad0a49 383 {
rosarium 0:71bff5ad0a49 384 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 385 CCFileStruct.MemorySize = 0x0;
rosarium 0:71bff5ad0a49 386 CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6];
rosarium 0:71bff5ad0a49 387 CCFileStruct.ExtMemorySize = ( CCFileStruct.ExtMemorySize << 8 ) | acc_buffer[7];
rosarium 0:71bff5ad0a49 388 memory_size = CCFileStruct.ExtMemorySize;
rosarium 0:71bff5ad0a49 389 CCFileStruct.NDEF_offset = 8;
rosarium 0:71bff5ad0a49 390 }
rosarium 0:71bff5ad0a49 391 else
rosarium 0:71bff5ad0a49 392 {
rosarium 0:71bff5ad0a49 393 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 394 CCFileStruct.MemorySize = acc_buffer[2];
rosarium 0:71bff5ad0a49 395 CCFileStruct.ExtMemorySize = 0x0;
rosarium 0:71bff5ad0a49 396 memory_size = CCFileStruct.MemorySize;
rosarium 0:71bff5ad0a49 397 CCFileStruct.NDEF_offset = 4;
rosarium 0:71bff5ad0a49 398 }
rosarium 0:71bff5ad0a49 399
rosarium 0:71bff5ad0a49 400 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 401 CCFileStruct.MagicNumber = acc_buffer[0];
rosarium 0:71bff5ad0a49 402 CCFileStruct.Version = acc_buffer[1];
rosarium 0:71bff5ad0a49 403 CCFileStruct.TT5Tag = acc_buffer[3];
rosarium 0:71bff5ad0a49 404
rosarium 0:71bff5ad0a49 405 /* Search for position of NDEF TLV in memory and tag status */
rosarium 4:0287f5476fe0 406 while( ( NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect) == NFC_SUCCESS ) && ( CCFileStruct.NDEF_offset < memory_size ) )
rosarium 0:71bff5ad0a49 407 {
rosarium 0:71bff5ad0a49 408 /* Detect first NDEF Message in memory */
rosarium 0:71bff5ad0a49 409 if( atlv_detect[0] == NFCT5_NDEF_MSG_TLV )
rosarium 0:71bff5ad0a49 410 {
rosarium 0:71bff5ad0a49 411 if( atlv_detect[1] == 0x00 )
rosarium 0:71bff5ad0a49 412 {
rosarium 0:71bff5ad0a49 413 CCFileStruct.State = TT5_INITIALIZED;
rosarium 0:71bff5ad0a49 414 }
rosarium 0:71bff5ad0a49 415 else
rosarium 0:71bff5ad0a49 416 {
rosarium 0:71bff5ad0a49 417 if( CCFileStruct.Version & 0x3 )
rosarium 0:71bff5ad0a49 418 {
rosarium 0:71bff5ad0a49 419 CCFileStruct.State = TT5_READ;
rosarium 0:71bff5ad0a49 420 }
rosarium 0:71bff5ad0a49 421 else
rosarium 0:71bff5ad0a49 422 {
rosarium 0:71bff5ad0a49 423 CCFileStruct.State = TT5_READ_WRITE;
rosarium 0:71bff5ad0a49 424 }
rosarium 0:71bff5ad0a49 425 }
rosarium 0:71bff5ad0a49 426 return NDEF_OK;
rosarium 0:71bff5ad0a49 427 }
rosarium 0:71bff5ad0a49 428 /* If Proprietary NDEF jump to end of proprietary message */
rosarium 0:71bff5ad0a49 429 else if( atlv_detect[0] == NFCT5_PROPRIETARY_TLV )
rosarium 0:71bff5ad0a49 430 {
rosarium 0:71bff5ad0a49 431 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 432 {
rosarium 0:71bff5ad0a49 433 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + ( (uint32_t)atlv_detect[2] << 8 ) + atlv_detect[3];
rosarium 0:71bff5ad0a49 434 continue;
rosarium 0:71bff5ad0a49 435 }
rosarium 0:71bff5ad0a49 436 else
rosarium 0:71bff5ad0a49 437 {
rosarium 0:71bff5ad0a49 438 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + atlv_detect[1];
rosarium 0:71bff5ad0a49 439 continue;
rosarium 0:71bff5ad0a49 440 }
rosarium 0:71bff5ad0a49 441 }
rosarium 0:71bff5ad0a49 442 /* if Terminator no NDEF detected */
rosarium 0:71bff5ad0a49 443 else if( atlv_detect[0] == NFCT5_TERMINATOR_TLV )
rosarium 0:71bff5ad0a49 444 {
rosarium 0:71bff5ad0a49 445 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 446 }
rosarium 0:71bff5ad0a49 447
rosarium 0:71bff5ad0a49 448 CCFileStruct.NDEF_offset++;
rosarium 0:71bff5ad0a49 449 }
rosarium 0:71bff5ad0a49 450
rosarium 0:71bff5ad0a49 451 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 452 }
rosarium 0:71bff5ad0a49 453
giovannivisentini 6:8c1eca41b3a9 454 bool NDefNfcTagM24LR::open_session(bool force) {
rosarium 4:0287f5476fe0 455 uint16_t status;
rosarium 0:71bff5ad0a49 456
rosarium 0:71bff5ad0a49 457 status = NfcType5_NDEFDetection();
rosarium 0:71bff5ad0a49 458
rosarium 4:0287f5476fe0 459 if ( status != NDEF_OK )
rosarium 0:71bff5ad0a49 460 {
rosarium 0:71bff5ad0a49 461 CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
rosarium 0:71bff5ad0a49 462 CCFileStruct.Version = NFCT5_VERSION_V1_0;
rosarium 0:71bff5ad0a49 463 CCFileStruct.MemorySize = ( M24LR_MAX_SIZE / 8 ) & 0xFF;
rosarium 0:71bff5ad0a49 464 CCFileStruct.TT5Tag = 0x05;
rosarium 0:71bff5ad0a49 465 /* Init of the Type Tag 5 component (M24LR) */
rosarium 4:0287f5476fe0 466 while( NfcType5_TT5Init( ) != NDEF_OK );
rosarium 0:71bff5ad0a49 467 }
rosarium 0:71bff5ad0a49 468 mIsSessionOpen = 1;
rosarium 4:0287f5476fe0 469 return true;
rosarium 0:71bff5ad0a49 470
rosarium 0:71bff5ad0a49 471 }
rosarium 0:71bff5ad0a49 472
giovannivisentini 6:8c1eca41b3a9 473 bool NDefNfcTagM24LR::close_session()
rosarium 4:0287f5476fe0 474 {
rosarium 0:71bff5ad0a49 475
rosarium 4:0287f5476fe0 476 return true;
rosarium 0:71bff5ad0a49 477 }
rosarium 4:0287f5476fe0 478
rosarium 0:71bff5ad0a49 479 bool NDefNfcTagM24LR::writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
rosarium 4:0287f5476fe0 480 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus)
rosarium 4:0287f5476fe0 481 {
rosarium 4:0287f5476fe0 482
rosarium 4:0287f5476fe0 483 if(WriteData(offset, length, (uint8_t*)buffer)== NDEF_OK){
rosarium 4:0287f5476fe0 484 callback(callbackStatus,true,buffer,length);
rosarium 4:0287f5476fe0 485 return true;
rosarium 4:0287f5476fe0 486 }
rosarium 4:0287f5476fe0 487 callback(callbackStatus,false,buffer,length);
rosarium 4:0287f5476fe0 488 return false;
rosarium 4:0287f5476fe0 489 }
rosarium 4:0287f5476fe0 490
rosarium 0:71bff5ad0a49 491 bool NDefNfcTagM24LR::readByte(const uint16_t byteOffset, const uint16_t length,
rosarium 4:0287f5476fe0 492 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus)
rosarium 4:0287f5476fe0 493 {
rosarium 4:0287f5476fe0 494
rosarium 4:0287f5476fe0 495 //first it reads the 2 byte for the length then when it will have the call back it reads the real message
rosarium 4:0287f5476fe0 496 if(ReadData(byteOffset, length, (uint8_t*)buffer)== NDEF_OK){
rosarium 4:0287f5476fe0 497 callback(callbackStatus,true,buffer,length);
rosarium 4:0287f5476fe0 498 return true;
rosarium 4:0287f5476fe0 499 }
rosarium 4:0287f5476fe0 500 callback(callbackStatus,false,buffer,length);
rosarium 4:0287f5476fe0 501 return false;
rosarium 4:0287f5476fe0 502 }
rosarium 0:71bff5ad0a49 503
rosarium 4:0287f5476fe0 504 uint16_t NDefNfcTagM24LR::NDefWriteByte(const uint8_t *buffer, uint16_t length,uint16_t offset){
giovannivisentini 5:900640bf1cff 505 uint16_t status;
giovannivisentini 5:900640bf1cff 506 do{
giovannivisentini 5:900640bf1cff 507 uint8_t writeLength =(uint8_t) std::min<uint16_t>(0xFF,length);
giovannivisentini 6:8c1eca41b3a9 508 status= mDevice.update_binary(offset, writeLength, (uint8_t*)buffer);
giovannivisentini 5:900640bf1cff 509 offset+=writeLength;
giovannivisentini 5:900640bf1cff 510 buffer+=writeLength;
giovannivisentini 5:900640bf1cff 511 length-=writeLength;
giovannivisentini 5:900640bf1cff 512 }while(status==NDEF_OK && length!=0);
giovannivisentini 5:900640bf1cff 513 return status;
rosarium 0:71bff5ad0a49 514 }
rosarium 0:71bff5ad0a49 515
rosarium 0:71bff5ad0a49 516
giovannivisentini 5:900640bf1cff 517 uint16_t NDefNfcTagM24LR::NDefReadByte(uint16_t byteOffset, uint16_t length, uint8_t *buffer){
giovannivisentini 5:900640bf1cff 518 uint16_t status;
giovannivisentini 5:900640bf1cff 519 do{
giovannivisentini 5:900640bf1cff 520 uint8_t readBuffer = (uint8_t)std::min<uint16_t>(0xFF,length);
giovannivisentini 6:8c1eca41b3a9 521 status= mDevice.read_binary(byteOffset, readBuffer, (uint8_t*)buffer);
giovannivisentini 5:900640bf1cff 522 byteOffset+=readBuffer;
giovannivisentini 5:900640bf1cff 523 buffer+=readBuffer;
giovannivisentini 5:900640bf1cff 524 length-=readBuffer;
giovannivisentini 5:900640bf1cff 525 }while(status==NDEF_OK && length!=0);
giovannivisentini 5:900640bf1cff 526 return status;
rosarium 0:71bff5ad0a49 527 }
rosarium 0:71bff5ad0a49 528
rosarium 0:71bff5ad0a49 529 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/