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:
Tue Aug 30 09:18:50 2016 +0000
Revision:
1:11ae12d41082
Child:
2:6f1b1f7f8d12
NDefLib middle-ware library ported on HelloWorld_NFC02A1. Now NFC02A1 using the same middle-ware library as NFC01A1.

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