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:
rosarium
Date:
Thu Sep 29 05:48:12 2016 +0000
Revision:
3:6d76c75e3eb4
Parent:
0:71bff5ad0a49
Child:
4:0287f5476fe0
Bug fix for write message routine

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
rosarium 0:71bff5ad0a49 5 * @version V1.0.0
rosarium 0:71bff5ad0a49 6 * @date 30 Aug 2016
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 /* Do not include length bytes */
rosarium 0:71bff5ad0a49 100 DataSize -= FIRST_RECORD_OFFSET;
rosarium 0:71bff5ad0a49 101
rosarium 0:71bff5ad0a49 102 /* If too many data to write return error */
rosarium 0:71bff5ad0a49 103 if( DataSize > NDEF_MAX_SIZE )
rosarium 0:71bff5ad0a49 104 {
rosarium 0:71bff5ad0a49 105 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 0:71bff5ad0a49 106 }
rosarium 0:71bff5ad0a49 107
rosarium 0:71bff5ad0a49 108 /* Detect NDEF message in memory */
rosarium 0:71bff5ad0a49 109 status = NfcType5_NDEFDetection( );
rosarium 0:71bff5ad0a49 110 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 111 {
rosarium 0:71bff5ad0a49 112 return status;
rosarium 0:71bff5ad0a49 113 }
rosarium 0:71bff5ad0a49 114
rosarium 0:71bff5ad0a49 115 /* Read TL of Type 5 */
rosarium 0:71bff5ad0a49 116 status = NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect);
rosarium 0:71bff5ad0a49 117 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 118 {
rosarium 0:71bff5ad0a49 119 return status;
rosarium 0:71bff5ad0a49 120 }
rosarium 0:71bff5ad0a49 121
rosarium 0:71bff5ad0a49 122 /* Check if L is on 3 or 1 byte and update length in buffer */
rosarium 0:71bff5ad0a49 123 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 124 {
rosarium 0:71bff5ad0a49 125 pData[0] = atlv_detect[2];
rosarium 0:71bff5ad0a49 126 pData[1] = atlv_detect[3];
rosarium 0:71bff5ad0a49 127 index += 4;
rosarium 0:71bff5ad0a49 128 }
rosarium 0:71bff5ad0a49 129 else
rosarium 0:71bff5ad0a49 130 {
rosarium 0:71bff5ad0a49 131 pData[0] = 0x00;
rosarium 0:71bff5ad0a49 132 pData[1] = atlv_detect[1];
rosarium 0:71bff5ad0a49 133 index += 2;
rosarium 0:71bff5ad0a49 134 }
rosarium 0:71bff5ad0a49 135
rosarium 0:71bff5ad0a49 136 /* Check CC file is in the correct mode to proceed */
rosarium 0:71bff5ad0a49 137 if( CCFileStruct.State == TT5_INITIALIZED )
rosarium 0:71bff5ad0a49 138 {
rosarium 0:71bff5ad0a49 139 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 140 }
rosarium 0:71bff5ad0a49 141
rosarium 0:71bff5ad0a49 142 if( ((Offset == 0) && (DataSize > 0)) || (Offset > 0) )
rosarium 0:71bff5ad0a49 143 {
rosarium 0:71bff5ad0a49 144 /* Read NDEF */
rosarium 0:71bff5ad0a49 145 if( NDefReadByte(CCFileStruct.NDEF_offset + index + Offset, DataSize, (pData + FIRST_RECORD_OFFSET)) != NFC_OK )
rosarium 0:71bff5ad0a49 146 {
rosarium 0:71bff5ad0a49 147 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 148 }
rosarium 0:71bff5ad0a49 149 }
rosarium 0:71bff5ad0a49 150
rosarium 0:71bff5ad0a49 151 return NDEF_OK;
rosarium 0:71bff5ad0a49 152 }
rosarium 0:71bff5ad0a49 153
rosarium 0:71bff5ad0a49 154 /**
rosarium 0:71bff5ad0a49 155 * @brief This function writes data in NDEF file at defined offset.
rosarium 0:71bff5ad0a49 156 * @param Offset : Offset in the NDEF file.
rosarium 0:71bff5ad0a49 157 * @param DataSize : Number of byte to write.
rosarium 0:71bff5ad0a49 158 * @param pData : pointer on buffer to copy.
rosarium 0:71bff5ad0a49 159 * @retval NDEF_ERROR_MEMORY_INTERNAL : Size not compatible with memory.
rosarium 0:71bff5ad0a49 160 * @retval NDEF_ERROR_NOT_FORMATED : CCFile data not supported.
rosarium 0:71bff5ad0a49 161 * @retval NDEF_ERROR : No NDEF in the tag.
rosarium 0:71bff5ad0a49 162 * @retval NDEF_OK : The operation is completed.
rosarium 0:71bff5ad0a49 163 */
rosarium 0:71bff5ad0a49 164 uint16_t NDefNfcTagM24LR::WriteData( uint16_t Offset , uint32_t DataSize , uint8_t *pData )
rosarium 0:71bff5ad0a49 165 {
rosarium 0:71bff5ad0a49 166 uint8_t atlv[4];
rosarium 0:71bff5ad0a49 167 uint8_t index = 0;
rosarium 0:71bff5ad0a49 168 uint16_t NDEF_Size = 0;
rosarium 0:71bff5ad0a49 169 bool status;
rosarium 0:71bff5ad0a49 170
rosarium 0:71bff5ad0a49 171 /* Do not include length bytes */
rosarium 0:71bff5ad0a49 172 DataSize -= FIRST_RECORD_OFFSET;
rosarium 0:71bff5ad0a49 173
rosarium 0:71bff5ad0a49 174 /* If too many data to write return error */
rosarium 0:71bff5ad0a49 175 if( DataSize > NDEF_MAX_SIZE )
rosarium 0:71bff5ad0a49 176 {
rosarium 0:71bff5ad0a49 177 return NDEF_ERROR_MEMORY_INTERNAL;
rosarium 0:71bff5ad0a49 178 }
rosarium 0:71bff5ad0a49 179
rosarium 0:71bff5ad0a49 180 /* Detect NDEF message in memory */
rosarium 0:71bff5ad0a49 181 if( NfcType5_NDEFDetection( ) != NDEF_OK )
rosarium 0:71bff5ad0a49 182 {
rosarium 0:71bff5ad0a49 183 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 184 }
rosarium 0:71bff5ad0a49 185
rosarium 0:71bff5ad0a49 186 /* Extract NDEF Size from buffer */
rosarium 0:71bff5ad0a49 187 NDEF_Size = (uint16_t)(pData[0] << 8);
rosarium 0:71bff5ad0a49 188 NDEF_Size = NDEF_Size | (uint16_t)(pData[1] );
rosarium 0:71bff5ad0a49 189
rosarium 0:71bff5ad0a49 190 /* If entire NDEF is written, update Length of Type 5 */
rosarium 0:71bff5ad0a49 191 if( DataSize == NDEF_Size )
rosarium 0:71bff5ad0a49 192 {
rosarium 0:71bff5ad0a49 193 /* Check if L is on 3 or 1 byte */
rosarium 0:71bff5ad0a49 194 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 195 {
rosarium 0:71bff5ad0a49 196 /* First init L with 0, will be updated at the end */
rosarium 0:71bff5ad0a49 197 atlv[1] = 0x00;
rosarium 0:71bff5ad0a49 198 atlv[2] = 0x00;
rosarium 0:71bff5ad0a49 199 atlv[3] = 0x00;
rosarium 0:71bff5ad0a49 200
rosarium 0:71bff5ad0a49 201 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 202
rosarium 0:71bff5ad0a49 203 index += 4;
rosarium 0:71bff5ad0a49 204 }
rosarium 0:71bff5ad0a49 205 else
rosarium 0:71bff5ad0a49 206 {
rosarium 0:71bff5ad0a49 207 /* First inti L with 0, will be updated at the end */
rosarium 0:71bff5ad0a49 208 atlv[1] = 0x00;
rosarium 0:71bff5ad0a49 209
rosarium 0:71bff5ad0a49 210 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 211
rosarium 0:71bff5ad0a49 212 index += 2;
rosarium 0:71bff5ad0a49 213 }
rosarium 0:71bff5ad0a49 214 }
rosarium 0:71bff5ad0a49 215
rosarium 0:71bff5ad0a49 216 /* Start write NDEF message to EEPROM */
rosarium 0:71bff5ad0a49 217 status = NDefWriteByte( (pData + FIRST_RECORD_OFFSET), DataSize, CCFileStruct.NDEF_offset + index + Offset);
rosarium 0:71bff5ad0a49 218 if( status != NFC_OK )
rosarium 0:71bff5ad0a49 219 {
rosarium 0:71bff5ad0a49 220 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 221 }
rosarium 0:71bff5ad0a49 222
rosarium 0:71bff5ad0a49 223 /* If entire NDEF is written, update Length of Type 5 */
rosarium 0:71bff5ad0a49 224 if( DataSize == NDEF_Size )
rosarium 0:71bff5ad0a49 225 {
rosarium 0:71bff5ad0a49 226 /* Check if L is on 3 or 1 byte */
rosarium 0:71bff5ad0a49 227 if( NDEF_Size >= NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 228 {
rosarium 0:71bff5ad0a49 229 /* Update Length value */
rosarium 0:71bff5ad0a49 230 atlv[1] = NFCT5_3_BYTES_L_TLV;
rosarium 0:71bff5ad0a49 231 atlv[2] = pData[0];
rosarium 0:71bff5ad0a49 232 atlv[3] = pData[1];
rosarium 0:71bff5ad0a49 233
rosarium 0:71bff5ad0a49 234 status = NDefWriteByte( (atlv + 1), 3, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 235 }
rosarium 0:71bff5ad0a49 236 else
rosarium 0:71bff5ad0a49 237 {
rosarium 0:71bff5ad0a49 238 /* Update Length value */
rosarium 0:71bff5ad0a49 239 atlv[1] = pData[1];
rosarium 0:71bff5ad0a49 240
rosarium 0:71bff5ad0a49 241 status = NDefWriteByte( (atlv + 1), 1, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 242 }
rosarium 0:71bff5ad0a49 243
rosarium 0:71bff5ad0a49 244 /* Write Terminator TLV */
rosarium 0:71bff5ad0a49 245 atlv[0] = NFCT5_TERMINATOR_TLV;
rosarium 0:71bff5ad0a49 246 status = NDefWriteByte( atlv, 1, CCFileStruct.NDEF_offset + index + NDEF_Size);
rosarium 0:71bff5ad0a49 247 }
rosarium 0:71bff5ad0a49 248
rosarium 0:71bff5ad0a49 249 return NDEF_OK;
rosarium 0:71bff5ad0a49 250 }
rosarium 0:71bff5ad0a49 251
rosarium 0:71bff5ad0a49 252 /**
rosarium 0:71bff5ad0a49 253 * @brief This functions writes CCFile in EEPROM.
rosarium 0:71bff5ad0a49 254 * @Param pCCBuffer : pointer on the buffer containnig CC file.
rosarium 0:71bff5ad0a49 255 * @retval NFCTAG status.
rosarium 0:71bff5ad0a49 256 */
rosarium 0:71bff5ad0a49 257 uint16_t NDefNfcTagM24LR::NfcType5_WriteCCFile( const uint8_t * const pCCBuffer )
rosarium 0:71bff5ad0a49 258 {
rosarium 0:71bff5ad0a49 259 bool ret_value;
rosarium 0:71bff5ad0a49 260
rosarium 0:71bff5ad0a49 261 /* Write first block of CCFile */
rosarium 0:71bff5ad0a49 262 ret_value = NDefWriteByte( pCCBuffer, 0x4, 0x00);
rosarium 0:71bff5ad0a49 263
rosarium 0:71bff5ad0a49 264 /* If extended memory writes the next 4 bytes */
rosarium 0:71bff5ad0a49 265 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_OK) )
rosarium 0:71bff5ad0a49 266 {
rosarium 0:71bff5ad0a49 267 ret_value = NDefWriteByte( pCCBuffer + 4, 4, 0x04);
rosarium 0:71bff5ad0a49 268 }
rosarium 0:71bff5ad0a49 269
rosarium 0:71bff5ad0a49 270 if( ret_value != NFC_OK )
rosarium 0:71bff5ad0a49 271 {
rosarium 0:71bff5ad0a49 272 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 273 }
rosarium 0:71bff5ad0a49 274
rosarium 0:71bff5ad0a49 275 return NDEF_OK;
rosarium 0:71bff5ad0a49 276 }
rosarium 0:71bff5ad0a49 277
rosarium 0:71bff5ad0a49 278
rosarium 0:71bff5ad0a49 279
rosarium 0:71bff5ad0a49 280
rosarium 0:71bff5ad0a49 281 uint16_t NDefNfcTagM24LR::NfcType5_ReadCCFile( uint8_t * const pCCBuffer )
rosarium 0:71bff5ad0a49 282 {
rosarium 0:71bff5ad0a49 283 bool ret_value;
rosarium 0:71bff5ad0a49 284
rosarium 0:71bff5ad0a49 285 /* Read 4 bytes of CC File */
rosarium 0:71bff5ad0a49 286 ret_value = NDefReadByte(0x00, 4, pCCBuffer);
rosarium 0:71bff5ad0a49 287
rosarium 0:71bff5ad0a49 288 /* If extended memory reads the next 4 bytes */
rosarium 0:71bff5ad0a49 289 if( (pCCBuffer[2] == 0x00) && (ret_value == NFC_OK) )
rosarium 0:71bff5ad0a49 290 {
rosarium 0:71bff5ad0a49 291 ret_value = NDefReadByte(0x04, 4, pCCBuffer + 4 );
rosarium 0:71bff5ad0a49 292 }
rosarium 0:71bff5ad0a49 293
rosarium 0:71bff5ad0a49 294 if( ret_value != NFC_OK )
rosarium 0:71bff5ad0a49 295 {
rosarium 0:71bff5ad0a49 296 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 297 }
rosarium 0:71bff5ad0a49 298
rosarium 0:71bff5ad0a49 299 return NDEF_OK;
rosarium 0:71bff5ad0a49 300 }
rosarium 0:71bff5ad0a49 301 uint16_t NDefNfcTagM24LR::NfcType5_TT5Init( void )
rosarium 0:71bff5ad0a49 302 {
rosarium 0:71bff5ad0a49 303 bool ret_value = NFC_OK;
rosarium 0:71bff5ad0a49 304 uint16_t status;
rosarium 0:71bff5ad0a49 305 uint8_t accbuffer[8];
rosarium 0:71bff5ad0a49 306 uint8_t cdata;
rosarium 0:71bff5ad0a49 307
rosarium 0:71bff5ad0a49 308 /* Prepare buffer to update CCFile */
rosarium 0:71bff5ad0a49 309 accbuffer[0] = CCFileStruct.MagicNumber;
rosarium 0:71bff5ad0a49 310 accbuffer[1] = CCFileStruct.Version;
rosarium 0:71bff5ad0a49 311 accbuffer[2] = CCFileStruct.MemorySize;
rosarium 0:71bff5ad0a49 312 accbuffer[3] = CCFileStruct.TT5Tag;
rosarium 0:71bff5ad0a49 313 CCFileStruct.NDEF_offset = 0x04;
rosarium 0:71bff5ad0a49 314
rosarium 0:71bff5ad0a49 315 /* If extended memory prepare the length bytes */
rosarium 0:71bff5ad0a49 316 if( CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE )
rosarium 0:71bff5ad0a49 317 {
rosarium 0:71bff5ad0a49 318 accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8);
rosarium 0:71bff5ad0a49 319 accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF);
rosarium 0:71bff5ad0a49 320 CCFileStruct.NDEF_offset = 0x08;
rosarium 0:71bff5ad0a49 321 }
rosarium 0:71bff5ad0a49 322
rosarium 0:71bff5ad0a49 323 /* Update CCFile */
rosarium 0:71bff5ad0a49 324 status = NfcType5_WriteCCFile( accbuffer );
rosarium 0:71bff5ad0a49 325 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 326 {
rosarium 0:71bff5ad0a49 327 return status;
rosarium 0:71bff5ad0a49 328 }
rosarium 0:71bff5ad0a49 329
rosarium 0:71bff5ad0a49 330 /* Update NDEF TLV for INITIALIZED state */
rosarium 0:71bff5ad0a49 331 /* Update T */
rosarium 0:71bff5ad0a49 332 cdata = NFCT5_NDEF_MSG_TLV;
rosarium 0:71bff5ad0a49 333 ret_value = NDefWriteByte( &cdata, 1, CCFileStruct.NDEF_offset);
rosarium 0:71bff5ad0a49 334 if( ret_value != NFC_OK )
rosarium 0:71bff5ad0a49 335 {
rosarium 0:71bff5ad0a49 336 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 337 }
rosarium 0:71bff5ad0a49 338
rosarium 0:71bff5ad0a49 339 /* Update L */
rosarium 0:71bff5ad0a49 340 cdata = 0x00;
rosarium 0:71bff5ad0a49 341 ret_value = NDefWriteByte( &cdata, 1, (CCFileStruct.NDEF_offset + 1));
rosarium 0:71bff5ad0a49 342 if( ret_value != NFC_OK )
rosarium 0:71bff5ad0a49 343 {
rosarium 0:71bff5ad0a49 344 return NDEF_ERROR;
rosarium 0:71bff5ad0a49 345 }
rosarium 0:71bff5ad0a49 346
rosarium 0:71bff5ad0a49 347 return NDEF_OK;
rosarium 0:71bff5ad0a49 348 }
rosarium 0:71bff5ad0a49 349
rosarium 0:71bff5ad0a49 350
rosarium 0:71bff5ad0a49 351 uint16_t NDefNfcTagM24LR::NfcType5_NDEFDetection( void )
rosarium 0:71bff5ad0a49 352 {
rosarium 0:71bff5ad0a49 353 uint8_t acc_buffer[8];
rosarium 0:71bff5ad0a49 354 uint8_t atlv_detect[4];
rosarium 0:71bff5ad0a49 355 uint16_t status;
rosarium 0:71bff5ad0a49 356 uint32_t memory_size;
rosarium 0:71bff5ad0a49 357
rosarium 0:71bff5ad0a49 358 CCFileStruct.State = TT5_NO_NDEF;
rosarium 0:71bff5ad0a49 359
rosarium 0:71bff5ad0a49 360 /* Read CCFile */
rosarium 0:71bff5ad0a49 361 status = NfcType5_ReadCCFile( acc_buffer );
rosarium 0:71bff5ad0a49 362 if( status != NDEF_OK )
rosarium 0:71bff5ad0a49 363 {
rosarium 0:71bff5ad0a49 364 return status;
rosarium 0:71bff5ad0a49 365 }
rosarium 0:71bff5ad0a49 366
rosarium 0:71bff5ad0a49 367 /* Check Byte 0 is equal to magic number */
rosarium 0:71bff5ad0a49 368 if( ( acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE ) && ( acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE ) )
rosarium 0:71bff5ad0a49 369 {
rosarium 0:71bff5ad0a49 370 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 371 }
rosarium 0:71bff5ad0a49 372 /* Check Version number */
rosarium 0:71bff5ad0a49 373 else if( ( (acc_buffer[1]&0xFC) != 0x40 ) )
rosarium 0:71bff5ad0a49 374 {
rosarium 0:71bff5ad0a49 375 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 376 }
rosarium 0:71bff5ad0a49 377
rosarium 0:71bff5ad0a49 378 /* Check if CCFile is on 4 Bytes or 8 Bytes */
rosarium 0:71bff5ad0a49 379 if( acc_buffer[2] == 0x00 )
rosarium 0:71bff5ad0a49 380 {
rosarium 0:71bff5ad0a49 381 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 382 CCFileStruct.MemorySize = 0x0;
rosarium 0:71bff5ad0a49 383 CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6];
rosarium 0:71bff5ad0a49 384 CCFileStruct.ExtMemorySize = ( CCFileStruct.ExtMemorySize << 8 ) | acc_buffer[7];
rosarium 0:71bff5ad0a49 385 memory_size = CCFileStruct.ExtMemorySize;
rosarium 0:71bff5ad0a49 386 CCFileStruct.NDEF_offset = 8;
rosarium 0:71bff5ad0a49 387 }
rosarium 0:71bff5ad0a49 388 else
rosarium 0:71bff5ad0a49 389 {
rosarium 0:71bff5ad0a49 390 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 391 CCFileStruct.MemorySize = acc_buffer[2];
rosarium 0:71bff5ad0a49 392 CCFileStruct.ExtMemorySize = 0x0;
rosarium 0:71bff5ad0a49 393 memory_size = CCFileStruct.MemorySize;
rosarium 0:71bff5ad0a49 394 CCFileStruct.NDEF_offset = 4;
rosarium 0:71bff5ad0a49 395 }
rosarium 0:71bff5ad0a49 396
rosarium 0:71bff5ad0a49 397 /* Update CCFIle structure */
rosarium 0:71bff5ad0a49 398 CCFileStruct.MagicNumber = acc_buffer[0];
rosarium 0:71bff5ad0a49 399 CCFileStruct.Version = acc_buffer[1];
rosarium 0:71bff5ad0a49 400 CCFileStruct.TT5Tag = acc_buffer[3];
rosarium 0:71bff5ad0a49 401
rosarium 0:71bff5ad0a49 402 /* Search for position of NDEF TLV in memory and tag status */
rosarium 0:71bff5ad0a49 403 while( ( NDefReadByte(CCFileStruct.NDEF_offset, 4, atlv_detect) == NFC_OK ) && ( CCFileStruct.NDEF_offset < memory_size ) )
rosarium 0:71bff5ad0a49 404 {
rosarium 0:71bff5ad0a49 405 /* Detect first NDEF Message in memory */
rosarium 0:71bff5ad0a49 406 if( atlv_detect[0] == NFCT5_NDEF_MSG_TLV )
rosarium 0:71bff5ad0a49 407 {
rosarium 0:71bff5ad0a49 408 if( atlv_detect[1] == 0x00 )
rosarium 0:71bff5ad0a49 409 {
rosarium 0:71bff5ad0a49 410 CCFileStruct.State = TT5_INITIALIZED;
rosarium 0:71bff5ad0a49 411 }
rosarium 0:71bff5ad0a49 412 else
rosarium 0:71bff5ad0a49 413 {
rosarium 0:71bff5ad0a49 414 if( CCFileStruct.Version & 0x3 )
rosarium 0:71bff5ad0a49 415 {
rosarium 0:71bff5ad0a49 416 CCFileStruct.State = TT5_READ;
rosarium 0:71bff5ad0a49 417 }
rosarium 0:71bff5ad0a49 418 else
rosarium 0:71bff5ad0a49 419 {
rosarium 0:71bff5ad0a49 420 CCFileStruct.State = TT5_READ_WRITE;
rosarium 0:71bff5ad0a49 421 }
rosarium 0:71bff5ad0a49 422 }
rosarium 0:71bff5ad0a49 423 return NDEF_OK;
rosarium 0:71bff5ad0a49 424 }
rosarium 0:71bff5ad0a49 425 /* If Proprietary NDEF jump to end of proprietary message */
rosarium 0:71bff5ad0a49 426 else if( atlv_detect[0] == NFCT5_PROPRIETARY_TLV )
rosarium 0:71bff5ad0a49 427 {
rosarium 0:71bff5ad0a49 428 if( atlv_detect[1] == NFCT5_3_BYTES_L_TLV )
rosarium 0:71bff5ad0a49 429 {
rosarium 0:71bff5ad0a49 430 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + ( (uint32_t)atlv_detect[2] << 8 ) + atlv_detect[3];
rosarium 0:71bff5ad0a49 431 continue;
rosarium 0:71bff5ad0a49 432 }
rosarium 0:71bff5ad0a49 433 else
rosarium 0:71bff5ad0a49 434 {
rosarium 0:71bff5ad0a49 435 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + atlv_detect[1];
rosarium 0:71bff5ad0a49 436 continue;
rosarium 0:71bff5ad0a49 437 }
rosarium 0:71bff5ad0a49 438 }
rosarium 0:71bff5ad0a49 439 /* if Terminator no NDEF detected */
rosarium 0:71bff5ad0a49 440 else if( atlv_detect[0] == NFCT5_TERMINATOR_TLV )
rosarium 0:71bff5ad0a49 441 {
rosarium 0:71bff5ad0a49 442 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 443 }
rosarium 0:71bff5ad0a49 444
rosarium 0:71bff5ad0a49 445 CCFileStruct.NDEF_offset++;
rosarium 0:71bff5ad0a49 446 }
rosarium 0:71bff5ad0a49 447
rosarium 0:71bff5ad0a49 448 return NDEF_ERROR_NOT_FORMATED;
rosarium 0:71bff5ad0a49 449 }
rosarium 0:71bff5ad0a49 450
rosarium 0:71bff5ad0a49 451 bool NDefNfcTagM24LR::openSession(bool force) {
rosarium 0:71bff5ad0a49 452 bool status;
rosarium 0:71bff5ad0a49 453
rosarium 0:71bff5ad0a49 454 status = NfcType5_NDEFDetection();
rosarium 0:71bff5ad0a49 455
rosarium 0:71bff5ad0a49 456 if ( status == NFC_SUCCESS )
rosarium 0:71bff5ad0a49 457 {
rosarium 0:71bff5ad0a49 458 CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
rosarium 0:71bff5ad0a49 459 CCFileStruct.Version = NFCT5_VERSION_V1_0;
rosarium 0:71bff5ad0a49 460 CCFileStruct.MemorySize = ( M24LR_MAX_SIZE / 8 ) & 0xFF;
rosarium 0:71bff5ad0a49 461 CCFileStruct.TT5Tag = 0x05;
rosarium 0:71bff5ad0a49 462 /* Init of the Type Tag 5 component (M24LR) */
rosarium 0:71bff5ad0a49 463 while( NfcType5_TT5Init( ) != NFC_OK );
rosarium 0:71bff5ad0a49 464 }
rosarium 0:71bff5ad0a49 465 mIsSessionOpen = 1;
rosarium 0:71bff5ad0a49 466 return NFC_SUCCESS;
rosarium 0:71bff5ad0a49 467
rosarium 0:71bff5ad0a49 468 }
rosarium 0:71bff5ad0a49 469
rosarium 0:71bff5ad0a49 470 bool NDefNfcTagM24LR::closeSession() {
rosarium 0:71bff5ad0a49 471
rosarium 0:71bff5ad0a49 472 return NFC_SUCCESS;
rosarium 0:71bff5ad0a49 473 }
rosarium 0:71bff5ad0a49 474 bool NDefNfcTagM24LR::writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
rosarium 0:71bff5ad0a49 475 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
rosarium 3:6d76c75e3eb4 476 return WriteData(offset, length, (uint8_t*)buffer);
rosarium 0:71bff5ad0a49 477 }
rosarium 0:71bff5ad0a49 478 bool NDefNfcTagM24LR::readByte(const uint16_t byteOffset, const uint16_t length,
rosarium 0:71bff5ad0a49 479 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
rosarium 0:71bff5ad0a49 480 return ReadData(byteOffset, length, (uint8_t*)buffer);
rosarium 0:71bff5ad0a49 481 }
rosarium 0:71bff5ad0a49 482
rosarium 0:71bff5ad0a49 483 bool NDefNfcTagM24LR::NDefWriteByte(const uint8_t *buffer, uint16_t length,uint16_t offset){
rosarium 0:71bff5ad0a49 484 return mDevice.UpdateBinary(offset, length, (uint8_t*)buffer);
rosarium 0:71bff5ad0a49 485 }
rosarium 0:71bff5ad0a49 486
rosarium 0:71bff5ad0a49 487
rosarium 0:71bff5ad0a49 488 bool NDefNfcTagM24LR::NDefReadByte(const uint16_t byteOffset, const uint16_t length, uint8_t *buffer){
rosarium 0:71bff5ad0a49 489 return mDevice.ReadBinary(byteOffset, length, (uint8_t*)buffer);
rosarium 0:71bff5ad0a49 490 }
rosarium 0:71bff5ad0a49 491
rosarium 0:71bff5ad0a49 492 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/