mbed OS 5 example application using X-NUCLEO-NFC02A1

Dependencies:   NDefLib X_NUCLEO_NFC02A1

Fork of HelloWorld_NFC02A1 by ST

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****/