Complete mbed library/workspace for HelloWorld_NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1 mbed

Fork of HelloWorld_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.

Example Application

This is just a simple "hello world" style program for the X-NUCLEO-NFC02A1 Dynamic NFC Tag Expansion Board. The program writes a URI link to the M24LR dynamic tag using the synchronous programming model. It then reads back the URI from the tag to display it on terminal. The URI can also be retrieved from an NFC enabled smartphone/tablet.

Committer:
rosarium
Date:
Wed Sep 28 11:26:49 2016 +0000
Revision:
2:6f1b1f7f8d12
Parent:
1:11ae12d41082
New Nfc interface file integrated.

Who changed what in which revision?

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