This is a driver needed by NFCEEPROOM constructor for the ST ST25DV NFC chip.

Dependents:   mbed-os-example-nfc-EEPROM

Committer:
apalmieri
Date:
Tue Jan 28 15:54:19 2020 +0000
Revision:
0:dd89565c6276
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apalmieri 0:dd89565c6276 1 /**
apalmieri 0:dd89565c6276 2 ******************************************************************************
apalmieri 0:dd89565c6276 3 * @file m24sr_driver.cpp
apalmieri 0:dd89565c6276 4 * @author ST Central Labs
apalmieri 0:dd89565c6276 5 * @brief This file provides a set of functions to interface with the M24SR
apalmieri 0:dd89565c6276 6 * device.
apalmieri 0:dd89565c6276 7 ******************************************************************************
apalmieri 0:dd89565c6276 8 * @attention
apalmieri 0:dd89565c6276 9 *
apalmieri 0:dd89565c6276 10 * <h2><center>&copy; COPYRIGHT(c) 2018 STMicroelectronics</center></h2>
apalmieri 0:dd89565c6276 11 *
apalmieri 0:dd89565c6276 12 * Redistribution and use in source and binary forms, with or without modification,
apalmieri 0:dd89565c6276 13 * are permitted provided that the following conditions are met:
apalmieri 0:dd89565c6276 14 * 1. Redistributions of source code must retain the above copyright notice,
apalmieri 0:dd89565c6276 15 * this list of conditions and the following disclaimer.
apalmieri 0:dd89565c6276 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
apalmieri 0:dd89565c6276 17 * this list of conditions and the following disclaimer in the documentation
apalmieri 0:dd89565c6276 18 * and/or other materials provided with the distribution.
apalmieri 0:dd89565c6276 19 * 3. Neither the name of STMicroelectronics nor the names of its contributors
apalmieri 0:dd89565c6276 20 * may be used to endorse or promote products derived from this software
apalmieri 0:dd89565c6276 21 * without specific prior written permission.
apalmieri 0:dd89565c6276 22 *
apalmieri 0:dd89565c6276 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
apalmieri 0:dd89565c6276 24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
apalmieri 0:dd89565c6276 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
apalmieri 0:dd89565c6276 26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
apalmieri 0:dd89565c6276 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
apalmieri 0:dd89565c6276 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
apalmieri 0:dd89565c6276 29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
apalmieri 0:dd89565c6276 30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
apalmieri 0:dd89565c6276 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
apalmieri 0:dd89565c6276 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
apalmieri 0:dd89565c6276 33 *
apalmieri 0:dd89565c6276 34 ******************************************************************************
apalmieri 0:dd89565c6276 35 */
apalmieri 0:dd89565c6276 36
apalmieri 0:dd89565c6276 37 #include <st25dv_driver.h>
apalmieri 0:dd89565c6276 38 #include "Callback.h"
apalmieri 0:dd89565c6276 39
apalmieri 0:dd89565c6276 40 namespace mbed {
apalmieri 0:dd89565c6276 41 namespace nfc {
apalmieri 0:dd89565c6276 42 namespace vendor {
apalmieri 0:dd89565c6276 43 namespace ST {
apalmieri 0:dd89565c6276 44
apalmieri 0:dd89565c6276 45 ST25dvDriver::ST25dvDriver(PinName i2c_data_pin,
apalmieri 0:dd89565c6276 46 PinName i2c_clock_pin,
apalmieri 0:dd89565c6276 47 PinName led1_pin,
apalmieri 0:dd89565c6276 48 PinName led2_pin,
apalmieri 0:dd89565c6276 49 PinName led3_pin,
apalmieri 0:dd89565c6276 50 PinName lpd_pin,
apalmieri 0:dd89565c6276 51 PinName gpo_pin)
apalmieri 0:dd89565c6276 52 : _i2c_channel(i2c_data_pin, i2c_clock_pin),
apalmieri 0:dd89565c6276 53 _led1_pin(led1_pin),
apalmieri 0:dd89565c6276 54 _led2_pin(led2_pin),
apalmieri 0:dd89565c6276 55 _led3_pin(led3_pin),
apalmieri 0:dd89565c6276 56 _lpd_pin(lpd_pin),
apalmieri 0:dd89565c6276 57 _gpo_pin(gpo_pin),
apalmieri 0:dd89565c6276 58 _ndef_size(MAX_NDEF_SIZE),
apalmieri 0:dd89565c6276 59 _is_device_inited(false),
apalmieri 0:dd89565c6276 60 _is_session_started(false) {
apalmieri 0:dd89565c6276 61 /* driver requires valid pin names */
apalmieri 0:dd89565c6276 62 MBED_ASSERT(i2c_data_pin != NC);
apalmieri 0:dd89565c6276 63 MBED_ASSERT(i2c_clock_pin != NC);
apalmieri 0:dd89565c6276 64 MBED_ASSERT(led1_pin != NC);
apalmieri 0:dd89565c6276 65 MBED_ASSERT(led2_pin != NC);
apalmieri 0:dd89565c6276 66 MBED_ASSERT(led3_pin != NC);
apalmieri 0:dd89565c6276 67 MBED_ASSERT(lpd_pin != NC);
apalmieri 0:dd89565c6276 68 MBED_ASSERT(gpo_pin != NC);
apalmieri 0:dd89565c6276 69 }
apalmieri 0:dd89565c6276 70
apalmieri 0:dd89565c6276 71 int ST25dvDriver::begin(void) {
apalmieri 0:dd89565c6276 72 int ret = 0;
apalmieri 0:dd89565c6276 73
apalmieri 0:dd89565c6276 74 // Light some leds
apalmieri 0:dd89565c6276 75 ledOn(_led1_pin);
apalmieri 0:dd89565c6276 76 wait_us( 300000 );
apalmieri 0:dd89565c6276 77 ledOn(_led2_pin);
apalmieri 0:dd89565c6276 78
apalmieri 0:dd89565c6276 79 /* NFCTAG Init */
apalmieri 0:dd89565c6276 80 ret = NFCTAG_Init();
apalmieri 0:dd89565c6276 81 if(ret != NFCTAG_OK)
apalmieri 0:dd89565c6276 82 return ret;
apalmieri 0:dd89565c6276 83
apalmieri 0:dd89565c6276 84 /* Reset MBEN Dynamic */
apalmieri 0:dd89565c6276 85 NFCTAG_GetExtended_Drv()->ResetMBEN_Dyn( &_i2c_channel );
apalmieri 0:dd89565c6276 86
apalmieri 0:dd89565c6276 87 if( NfcType5_NDEFDetection() != NDEF_OK ) {
apalmieri 0:dd89565c6276 88 printf("NDEF not detected\r\n");
apalmieri 0:dd89565c6276 89
apalmieri 0:dd89565c6276 90 CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
apalmieri 0:dd89565c6276 91 CCFileStruct.Version = NFCT5_VERSION_V1_0;
apalmieri 0:dd89565c6276 92 CCFileStruct.MemorySize = ( ST25DV_MAX_SIZE / 8 ) & 0xFF;
apalmieri 0:dd89565c6276 93 CCFileStruct.TT5Tag = 0x05;
apalmieri 0:dd89565c6276 94
apalmieri 0:dd89565c6276 95 /* Init of the Type Tag 5 component */
apalmieri 0:dd89565c6276 96 ret = NfcType5_TT5Init();
apalmieri 0:dd89565c6276 97 if (ret != NDEF_OK)
apalmieri 0:dd89565c6276 98 return ret;
apalmieri 0:dd89565c6276 99
apalmieri 0:dd89565c6276 100 } else {
apalmieri 0:dd89565c6276 101 printf("NDEF detected\r\n");
apalmieri 0:dd89565c6276 102 }
apalmieri 0:dd89565c6276 103
apalmieri 0:dd89565c6276 104 ledOff( _led1_pin );
apalmieri 0:dd89565c6276 105 wait_us( 300000 );
apalmieri 0:dd89565c6276 106 ledOff( _led2_pin );
apalmieri 0:dd89565c6276 107 wait_us( 300000 );
apalmieri 0:dd89565c6276 108 ledOff( _led3_pin );
apalmieri 0:dd89565c6276 109 wait_us( 300000 );
apalmieri 0:dd89565c6276 110 return NFCTAG_OK;
apalmieri 0:dd89565c6276 111 }
apalmieri 0:dd89565c6276 112
apalmieri 0:dd89565c6276 113 int ST25dvDriver::read_data(uint32_t address, uint8_t* bytes, size_t count) {
apalmieri 0:dd89565c6276 114
apalmieri 0:dd89565c6276 115 (void) address;
apalmieri 0:dd89565c6276 116 (void) count;
apalmieri 0:dd89565c6276 117 int ret = NfcType5_ReadNDEF((uint8_t*)bytes);
apalmieri 0:dd89565c6276 118
apalmieri 0:dd89565c6276 119 if (ret != NDEF_OK) {
apalmieri 0:dd89565c6276 120 return ret;
apalmieri 0:dd89565c6276 121 }
apalmieri 0:dd89565c6276 122 return NFCTAG_OK;
apalmieri 0:dd89565c6276 123 }
apalmieri 0:dd89565c6276 124
apalmieri 0:dd89565c6276 125 int ST25dvDriver::write_data(uint32_t address, const uint8_t* bytes, size_t count) {
apalmieri 0:dd89565c6276 126
apalmieri 0:dd89565c6276 127 (void) address;
apalmieri 0:dd89565c6276 128 int ret = NfcType5_WriteNDEF(count, (uint8_t*)bytes);
apalmieri 0:dd89565c6276 129
apalmieri 0:dd89565c6276 130 if (ret != NDEF_OK) {
apalmieri 0:dd89565c6276 131 return ret;
apalmieri 0:dd89565c6276 132 }
apalmieri 0:dd89565c6276 133 return NFCTAG_OK;
apalmieri 0:dd89565c6276 134 }
apalmieri 0:dd89565c6276 135
apalmieri 0:dd89565c6276 136 int ST25dvDriver::get_size(void) {
apalmieri 0:dd89565c6276 137 int ret = NfcType5_GetLength(&_ndef_size);
apalmieri 0:dd89565c6276 138
apalmieri 0:dd89565c6276 139 if (ret != NDEF_OK) {
apalmieri 0:dd89565c6276 140 return ret;
apalmieri 0:dd89565c6276 141 }
apalmieri 0:dd89565c6276 142 return NFCTAG_OK;
apalmieri 0:dd89565c6276 143 }
apalmieri 0:dd89565c6276 144
apalmieri 0:dd89565c6276 145 int ST25dvDriver::set_size(size_t count) {
apalmieri 0:dd89565c6276 146 int ret = NfcType5_SetLength(count);
apalmieri 0:dd89565c6276 147
apalmieri 0:dd89565c6276 148 if (ret != NDEF_OK) {
apalmieri 0:dd89565c6276 149 return ret;
apalmieri 0:dd89565c6276 150 }
apalmieri 0:dd89565c6276 151 return NFCTAG_OK;
apalmieri 0:dd89565c6276 152 }
apalmieri 0:dd89565c6276 153
apalmieri 0:dd89565c6276 154 NFCTAG_StatusTypeDef ST25dvDriver::NFCTAG_Init(void) {
apalmieri 0:dd89565c6276 155
apalmieri 0:dd89565c6276 156 uint8_t nfctag_id;
apalmieri 0:dd89565c6276 157
apalmieri 0:dd89565c6276 158 if( !_is_device_inited )
apalmieri 0:dd89565c6276 159 {
apalmieri 0:dd89565c6276 160 /* ST25DV Init */
apalmieri 0:dd89565c6276 161 if( St25Dv_i2c_Drv.Init(&_i2c_channel, &_lpd_pin) != NFCTAG_OK )
apalmieri 0:dd89565c6276 162 {
apalmieri 0:dd89565c6276 163 return NFCTAG_ERROR;
apalmieri 0:dd89565c6276 164 }
apalmieri 0:dd89565c6276 165
apalmieri 0:dd89565c6276 166
apalmieri 0:dd89565c6276 167 St25Dv_i2c_Drv.ReadID(&nfctag_id, &_i2c_channel);
apalmieri 0:dd89565c6276 168
apalmieri 0:dd89565c6276 169 /* Check if it is the wanted chip */
apalmieri 0:dd89565c6276 170 if( (nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) )
apalmieri 0:dd89565c6276 171 {
apalmieri 0:dd89565c6276 172 _is_device_inited = true;
apalmieri 0:dd89565c6276 173 Nfctag_Drv = &St25Dv_i2c_Drv;
apalmieri 0:dd89565c6276 174 Nfctag_Drv->pData = &St25Dv_i2c_ExtDrv;
apalmieri 0:dd89565c6276 175 }
apalmieri 0:dd89565c6276 176 else
apalmieri 0:dd89565c6276 177 {
apalmieri 0:dd89565c6276 178 Nfctag_Drv = NULL;
apalmieri 0:dd89565c6276 179 _is_device_inited = false;
apalmieri 0:dd89565c6276 180 return NFCTAG_ERROR;
apalmieri 0:dd89565c6276 181 }
apalmieri 0:dd89565c6276 182 }
apalmieri 0:dd89565c6276 183
apalmieri 0:dd89565c6276 184 return NFCTAG_OK;
apalmieri 0:dd89565c6276 185 }
apalmieri 0:dd89565c6276 186
apalmieri 0:dd89565c6276 187
apalmieri 0:dd89565c6276 188 NFCTAG_StatusTypeDef ST25dvDriver::NFCTAG_ReadData(uint8_t * const pData, const uint16_t TarAddr, const uint16_t Size) {
apalmieri 0:dd89565c6276 189
apalmieri 0:dd89565c6276 190 if ( Nfctag_Drv->ReadData == NULL )
apalmieri 0:dd89565c6276 191 {
apalmieri 0:dd89565c6276 192 return NFCTAG_ERROR;
apalmieri 0:dd89565c6276 193 }
apalmieri 0:dd89565c6276 194
apalmieri 0:dd89565c6276 195 return Nfctag_Drv->ReadData( pData, TarAddr, Size, &_i2c_channel );
apalmieri 0:dd89565c6276 196 }
apalmieri 0:dd89565c6276 197
apalmieri 0:dd89565c6276 198
apalmieri 0:dd89565c6276 199 NFCTAG_StatusTypeDef ST25dvDriver::NFCTAG_WriteData(const uint8_t * const pData, const uint16_t TarAddr, const uint16_t Size) {
apalmieri 0:dd89565c6276 200
apalmieri 0:dd89565c6276 201 if ( Nfctag_Drv->WriteData == NULL )
apalmieri 0:dd89565c6276 202 {
apalmieri 0:dd89565c6276 203 return NFCTAG_ERROR;
apalmieri 0:dd89565c6276 204 }
apalmieri 0:dd89565c6276 205
apalmieri 0:dd89565c6276 206 return Nfctag_Drv->WriteData( pData, TarAddr, Size, &_i2c_channel );
apalmieri 0:dd89565c6276 207 }
apalmieri 0:dd89565c6276 208
apalmieri 0:dd89565c6276 209 uint32_t ST25dvDriver::NFCTAG_GetByteSize(void)
apalmieri 0:dd89565c6276 210 {
apalmieri 0:dd89565c6276 211 ST25DV_MEM_SIZE mem_size;
apalmieri 0:dd89565c6276 212 ((NFCTAG_ExtDrvTypeDef *)Nfctag_Drv->pData)->ReadMemSize( &mem_size, &_i2c_channel );
apalmieri 0:dd89565c6276 213 return (mem_size.BlockSize+1) * (mem_size.Mem_Size+1);
apalmieri 0:dd89565c6276 214 }
apalmieri 0:dd89565c6276 215
apalmieri 0:dd89565c6276 216 /**
apalmieri 0:dd89565c6276 217 * @brief Give extended features for component
apalmieri 0:dd89565c6276 218 * @param None
apalmieri 0:dd89565c6276 219 * @retval address of the Extended Component Structure
apalmieri 0:dd89565c6276 220 */
apalmieri 0:dd89565c6276 221 NFCTAG_ExtDrvTypeDef* ST25dvDriver::NFCTAG_GetExtended_Drv(void)
apalmieri 0:dd89565c6276 222 {
apalmieri 0:dd89565c6276 223 return (NFCTAG_ExtDrvTypeDef *)Nfctag_Drv->pData;
apalmieri 0:dd89565c6276 224 }
apalmieri 0:dd89565c6276 225
apalmieri 0:dd89565c6276 226 /**
apalmieri 0:dd89565c6276 227 * @brief This function light on selected Led
apalmieri 0:dd89565c6276 228 * @param led : Led to be lit on
apalmieri 0:dd89565c6276 229 * @retval None
apalmieri 0:dd89565c6276 230 */
apalmieri 0:dd89565c6276 231 void ST25dvDriver::ledOn(DigitalOut led) {
apalmieri 0:dd89565c6276 232 printf("ledOn\r\n");
apalmieri 0:dd89565c6276 233 led.write(1);
apalmieri 0:dd89565c6276 234 }
apalmieri 0:dd89565c6276 235
apalmieri 0:dd89565c6276 236 /**
apalmieri 0:dd89565c6276 237 * @brief This function light off selected Led
apalmieri 0:dd89565c6276 238 * @param led : Led to be lit off
apalmieri 0:dd89565c6276 239 * @retval None
apalmieri 0:dd89565c6276 240 */
apalmieri 0:dd89565c6276 241
apalmieri 0:dd89565c6276 242 void ST25dvDriver::ledOff(DigitalOut led) {
apalmieri 0:dd89565c6276 243 led.write(0);
apalmieri 0:dd89565c6276 244 }
apalmieri 0:dd89565c6276 245
apalmieri 0:dd89565c6276 246 /**
apalmieri 0:dd89565c6276 247 * @brief This function detects a NDEF message in a Type 5 Tag.
apalmieri 0:dd89565c6276 248 * @details It first detects the Capability Container and then look for the NDEF TLV.
apalmieri 0:dd89565c6276 249 * The `CCfileStruct` global variable is updated accordingly with what is detected.
apalmieri 0:dd89565c6276 250 * @retval NDEF_OK NDEF message Tag Type 5 detected.
apalmieri 0:dd89565c6276 251 * @retval NDEF_ERROR_NOT_FORMATED Device is not a NFC Tag Type 5 Tag.
apalmieri 0:dd89565c6276 252 */
apalmieri 0:dd89565c6276 253 uint16_t ST25dvDriver::NfcType5_NDEFDetection(void)
apalmieri 0:dd89565c6276 254 {
apalmieri 0:dd89565c6276 255 uint8_t acc_buffer[8];
apalmieri 0:dd89565c6276 256 TT5_TLV_t tlv_detect;
apalmieri 0:dd89565c6276 257 uint16_t status;
apalmieri 0:dd89565c6276 258 uint32_t memory_size;
apalmieri 0:dd89565c6276 259
apalmieri 0:dd89565c6276 260 CCFileStruct.State = TT5_NO_NDEF;
apalmieri 0:dd89565c6276 261
apalmieri 0:dd89565c6276 262 /* Read CCFile */
apalmieri 0:dd89565c6276 263 status = NfcType5_ReadCCFile( acc_buffer );
apalmieri 0:dd89565c6276 264
apalmieri 0:dd89565c6276 265 if( status != NDEF_OK )
apalmieri 0:dd89565c6276 266 {
apalmieri 0:dd89565c6276 267 return status;
apalmieri 0:dd89565c6276 268 }
apalmieri 0:dd89565c6276 269
apalmieri 0:dd89565c6276 270 /* Check Byte 0 is equal to magic number */
apalmieri 0:dd89565c6276 271 if( ( acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE ) && ( acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE ) )
apalmieri 0:dd89565c6276 272 {
apalmieri 0:dd89565c6276 273 return NDEF_ERROR_NOT_FORMATTED;
apalmieri 0:dd89565c6276 274 }
apalmieri 0:dd89565c6276 275 /* Check Version number */
apalmieri 0:dd89565c6276 276 else if( ( (acc_buffer[1]&0xFC) != 0x40 ) )
apalmieri 0:dd89565c6276 277 {
apalmieri 0:dd89565c6276 278 return NDEF_ERROR_NOT_FORMATTED;
apalmieri 0:dd89565c6276 279 }
apalmieri 0:dd89565c6276 280
apalmieri 0:dd89565c6276 281 /* Check if CCFile is on 4 Bytes or 8 Bytes */
apalmieri 0:dd89565c6276 282 if( acc_buffer[2] == 0x00 )
apalmieri 0:dd89565c6276 283 {
apalmieri 0:dd89565c6276 284 /* Update CCFIle structure */
apalmieri 0:dd89565c6276 285 CCFileStruct.MemorySize = 0x0;
apalmieri 0:dd89565c6276 286 CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6];
apalmieri 0:dd89565c6276 287 CCFileStruct.ExtMemorySize = ( CCFileStruct.ExtMemorySize << 8 ) | acc_buffer[7];
apalmieri 0:dd89565c6276 288 memory_size = CCFileStruct.ExtMemorySize;
apalmieri 0:dd89565c6276 289 CCFileStruct.NDEF_offset = 8;
apalmieri 0:dd89565c6276 290 }
apalmieri 0:dd89565c6276 291 else
apalmieri 0:dd89565c6276 292 {
apalmieri 0:dd89565c6276 293 /* Update CCFIle structure */
apalmieri 0:dd89565c6276 294 CCFileStruct.MemorySize = acc_buffer[2];
apalmieri 0:dd89565c6276 295 CCFileStruct.ExtMemorySize = 0x0;
apalmieri 0:dd89565c6276 296 memory_size = CCFileStruct.MemorySize;
apalmieri 0:dd89565c6276 297 CCFileStruct.NDEF_offset = 4;
apalmieri 0:dd89565c6276 298 }
apalmieri 0:dd89565c6276 299
apalmieri 0:dd89565c6276 300 /* Update CCFIle structure */
apalmieri 0:dd89565c6276 301 CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0];
apalmieri 0:dd89565c6276 302 CCFileStruct.Version = acc_buffer[1];
apalmieri 0:dd89565c6276 303 CCFileStruct.TT5Tag = acc_buffer[3];
apalmieri 0:dd89565c6276 304
apalmieri 0:dd89565c6276 305 /* Search for position of NDEF TLV in memory and tag status */
apalmieri 0:dd89565c6276 306 while( ( NFCTAG_ReadData( (uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t) ) == NFCTAG_OK ) && ( CCFileStruct.NDEF_offset < memory_size ) )
apalmieri 0:dd89565c6276 307 {
apalmieri 0:dd89565c6276 308 /* Detect first NDEF Message in memory */
apalmieri 0:dd89565c6276 309 if( tlv_detect.Type == NFCT5_NDEF_MSG_TLV )
apalmieri 0:dd89565c6276 310 {
apalmieri 0:dd89565c6276 311 if( tlv_detect.Length == 0x00 )
apalmieri 0:dd89565c6276 312 {
apalmieri 0:dd89565c6276 313 CCFileStruct.State = TT5_INITIALIZED;
apalmieri 0:dd89565c6276 314 }
apalmieri 0:dd89565c6276 315 else
apalmieri 0:dd89565c6276 316 {
apalmieri 0:dd89565c6276 317 if( CCFileStruct.Version & 0x3 )
apalmieri 0:dd89565c6276 318 {
apalmieri 0:dd89565c6276 319 CCFileStruct.State = TT5_READ;
apalmieri 0:dd89565c6276 320 }
apalmieri 0:dd89565c6276 321 else
apalmieri 0:dd89565c6276 322 {
apalmieri 0:dd89565c6276 323 CCFileStruct.State = TT5_READ_WRITE;
apalmieri 0:dd89565c6276 324 }
apalmieri 0:dd89565c6276 325 }
apalmieri 0:dd89565c6276 326 return NDEF_OK;
apalmieri 0:dd89565c6276 327 }
apalmieri 0:dd89565c6276 328 /* If Proprietary NDEF jump to end of proprietary message */
apalmieri 0:dd89565c6276 329 else if( tlv_detect.Type == NFCT5_PROPRIETARY_TLV )
apalmieri 0:dd89565c6276 330 {
apalmieri 0:dd89565c6276 331 if( tlv_detect.Length == NFCT5_3_BYTES_L_TLV )
apalmieri 0:dd89565c6276 332 {
apalmieri 0:dd89565c6276 333 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16;
apalmieri 0:dd89565c6276 334 continue;
apalmieri 0:dd89565c6276 335 }
apalmieri 0:dd89565c6276 336 else
apalmieri 0:dd89565c6276 337 {
apalmieri 0:dd89565c6276 338 CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length;
apalmieri 0:dd89565c6276 339 continue;
apalmieri 0:dd89565c6276 340 }
apalmieri 0:dd89565c6276 341 }
apalmieri 0:dd89565c6276 342 /* if Terminator no NDEF detected */
apalmieri 0:dd89565c6276 343 else if( tlv_detect.Type == NFCT5_TERMINATOR_TLV )
apalmieri 0:dd89565c6276 344 {
apalmieri 0:dd89565c6276 345 return NDEF_ERROR_NOT_FORMATTED;
apalmieri 0:dd89565c6276 346 }
apalmieri 0:dd89565c6276 347
apalmieri 0:dd89565c6276 348 CCFileStruct.NDEF_offset++;
apalmieri 0:dd89565c6276 349 }
apalmieri 0:dd89565c6276 350
apalmieri 0:dd89565c6276 351 return NDEF_ERROR_NOT_FORMATTED;
apalmieri 0:dd89565c6276 352 }
apalmieri 0:dd89565c6276 353
apalmieri 0:dd89565c6276 354 /**
apalmieri 0:dd89565c6276 355 * @brief This function initializes the Capability Container and an empty NDEF message in a NFC Tag.
apalmieri 0:dd89565c6276 356 * @details The Capability Container content is defined by the global variable `CCFileStruct`.
apalmieri 0:dd89565c6276 357 * @retval NDEF_ERROR The Tag has not been initialized.
apalmieri 0:dd89565c6276 358 * @retval NDEF_OK The Tag has been successfully initialized.
apalmieri 0:dd89565c6276 359 */
apalmieri 0:dd89565c6276 360 uint16_t ST25dvDriver::NfcType5_TT5Init(void)
apalmieri 0:dd89565c6276 361 {
apalmieri 0:dd89565c6276 362 NFCTAG_StatusTypeDef ret_value = NFCTAG_OK;
apalmieri 0:dd89565c6276 363 uint16_t status;
apalmieri 0:dd89565c6276 364 uint8_t accbuffer[8];
apalmieri 0:dd89565c6276 365 uint8_t cdata;
apalmieri 0:dd89565c6276 366
apalmieri 0:dd89565c6276 367 /* Prepare buffer to update CCFile */
apalmieri 0:dd89565c6276 368 accbuffer[0] = CCFileStruct.MagicNumber;
apalmieri 0:dd89565c6276 369 accbuffer[1] = CCFileStruct.Version;
apalmieri 0:dd89565c6276 370 accbuffer[2] = CCFileStruct.MemorySize;
apalmieri 0:dd89565c6276 371 accbuffer[3] = CCFileStruct.TT5Tag;
apalmieri 0:dd89565c6276 372 CCFileStruct.NDEF_offset = 0x04;
apalmieri 0:dd89565c6276 373
apalmieri 0:dd89565c6276 374 /* If extended memory prepare the length bytes */
apalmieri 0:dd89565c6276 375 if( CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE )
apalmieri 0:dd89565c6276 376 {
apalmieri 0:dd89565c6276 377 accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8);
apalmieri 0:dd89565c6276 378 accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF);
apalmieri 0:dd89565c6276 379 CCFileStruct.NDEF_offset = 0x08;
apalmieri 0:dd89565c6276 380 }
apalmieri 0:dd89565c6276 381
apalmieri 0:dd89565c6276 382 /* Update CCFile */
apalmieri 0:dd89565c6276 383 status = NfcType5_WriteCCFile( accbuffer );
apalmieri 0:dd89565c6276 384
apalmieri 0:dd89565c6276 385
apalmieri 0:dd89565c6276 386 if( status != NDEF_OK )
apalmieri 0:dd89565c6276 387 {
apalmieri 0:dd89565c6276 388 return status;
apalmieri 0:dd89565c6276 389 }
apalmieri 0:dd89565c6276 390
apalmieri 0:dd89565c6276 391 /* Update NDEF TLV for INITIALIZED state */
apalmieri 0:dd89565c6276 392 /* Update T */
apalmieri 0:dd89565c6276 393 cdata = NFCT5_NDEF_MSG_TLV;
apalmieri 0:dd89565c6276 394 ret_value = NFCTAG_WriteData( &cdata, CCFileStruct.NDEF_offset, 1 );
apalmieri 0:dd89565c6276 395 if( ret_value != NFCTAG_OK )
apalmieri 0:dd89565c6276 396 {
apalmieri 0:dd89565c6276 397 return NDEF_ERROR;
apalmieri 0:dd89565c6276 398 }
apalmieri 0:dd89565c6276 399
apalmieri 0:dd89565c6276 400 /* Update L */
apalmieri 0:dd89565c6276 401 cdata = 0x00;
apalmieri 0:dd89565c6276 402 ret_value = NFCTAG_WriteData( &cdata, (CCFileStruct.NDEF_offset + 1), 1 );
apalmieri 0:dd89565c6276 403 if( ret_value != NFCTAG_OK )
apalmieri 0:dd89565c6276 404 {
apalmieri 0:dd89565c6276 405 return NDEF_ERROR;
apalmieri 0:dd89565c6276 406 }
apalmieri 0:dd89565c6276 407
apalmieri 0:dd89565c6276 408 return NDEF_OK;
apalmieri 0:dd89565c6276 409 }
apalmieri 0:dd89565c6276 410
apalmieri 0:dd89565c6276 411 /**
apalmieri 0:dd89565c6276 412 * @brief This functions writes the Capability Container in the NFC Tag.
apalmieri 0:dd89565c6276 413 * @param pCCBuffer Pointer on the buffer containnig the Capability Container.
apalmieri 0:dd89565c6276 414 * @retval NDEF_ERROR Error when writing the Tag.
apalmieri 0:dd89565c6276 415 * @retval NDEF_OK The CC has been successfully written.
apalmieri 0:dd89565c6276 416 */
apalmieri 0:dd89565c6276 417 uint16_t ST25dvDriver::NfcType5_WriteCCFile( const uint8_t * const pCCBuffer )
apalmieri 0:dd89565c6276 418 {
apalmieri 0:dd89565c6276 419 NFCTAG_StatusTypeDef ret_value;
apalmieri 0:dd89565c6276 420
apalmieri 0:dd89565c6276 421 /* Write first block of CCFile */
apalmieri 0:dd89565c6276 422 ret_value = NFCTAG_WriteData( pCCBuffer, 0x00, 0x4 );
apalmieri 0:dd89565c6276 423
apalmieri 0:dd89565c6276 424 /* If extended memory writes the next 4 bytes */
apalmieri 0:dd89565c6276 425 if( (pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK) )
apalmieri 0:dd89565c6276 426 {
apalmieri 0:dd89565c6276 427 ret_value = NFCTAG_WriteData( pCCBuffer + 4, 0x04, 4 );
apalmieri 0:dd89565c6276 428 }
apalmieri 0:dd89565c6276 429
apalmieri 0:dd89565c6276 430 if( ret_value != NFCTAG_OK )
apalmieri 0:dd89565c6276 431 {
apalmieri 0:dd89565c6276 432 return NDEF_ERROR;
apalmieri 0:dd89565c6276 433 }
apalmieri 0:dd89565c6276 434
apalmieri 0:dd89565c6276 435 return NDEF_OK;
apalmieri 0:dd89565c6276 436 }
apalmieri 0:dd89565c6276 437
apalmieri 0:dd89565c6276 438 /**
apalmieri 0:dd89565c6276 439 * @brief This functions reads the Capability Container from the NFC Tag.
apalmieri 0:dd89565c6276 440 * @param pCCBuffer Pointer on the buffer used to store the CC.
apalmieri 0:dd89565c6276 441 * @retval NDEF_ERROR Error when reading the Tag.
apalmieri 0:dd89565c6276 442 * @retval NDEF_OK The CC has been successfully read.
apalmieri 0:dd89565c6276 443 */
apalmieri 0:dd89565c6276 444 uint16_t ST25dvDriver::NfcType5_ReadCCFile( uint8_t * const pCCBuffer )
apalmieri 0:dd89565c6276 445 {
apalmieri 0:dd89565c6276 446 NFCTAG_StatusTypeDef ret_value;
apalmieri 0:dd89565c6276 447
apalmieri 0:dd89565c6276 448 /* Read 4 bytes of CC File */
apalmieri 0:dd89565c6276 449 ret_value = NFCTAG_ReadData( pCCBuffer, 0x00, 4 );
apalmieri 0:dd89565c6276 450
apalmieri 0:dd89565c6276 451 /* If extended memory reads the next 4 bytes */
apalmieri 0:dd89565c6276 452 if( (pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK) )
apalmieri 0:dd89565c6276 453 {
apalmieri 0:dd89565c6276 454 ret_value = NFCTAG_ReadData( pCCBuffer + 4, 0x04, 4 );
apalmieri 0:dd89565c6276 455 }
apalmieri 0:dd89565c6276 456
apalmieri 0:dd89565c6276 457 if( ret_value != NFCTAG_OK )
apalmieri 0:dd89565c6276 458 {
apalmieri 0:dd89565c6276 459 return NDEF_ERROR;
apalmieri 0:dd89565c6276 460 }
apalmieri 0:dd89565c6276 461
apalmieri 0:dd89565c6276 462 return NDEF_OK;
apalmieri 0:dd89565c6276 463 }
apalmieri 0:dd89565c6276 464
apalmieri 0:dd89565c6276 465 /**
apalmieri 0:dd89565c6276 466 * @brief This function reads the data stored in the NDEF message.
apalmieri 0:dd89565c6276 467 * @param pData Pointer on the buffer used to store the read data.
apalmieri 0:dd89565c6276 468 * @retval NDEF_ERROR_MEMORY_INTERNAL The buffer is too small for the NDEF message.
apalmieri 0:dd89565c6276 469 * @retval NDEF_ERROR_NOT_FORMATED No Capability Container detected.
apalmieri 0:dd89565c6276 470 * @retval NDEF_ERROR Error when reading the NDEF message.
apalmieri 0:dd89565c6276 471 * @retval NDEF_OK NDEF message successfully read.
apalmieri 0:dd89565c6276 472 */
apalmieri 0:dd89565c6276 473 uint16_t ST25dvDriver::NfcType5_ReadNDEF( uint8_t* pData )
apalmieri 0:dd89565c6276 474 {
apalmieri 0:dd89565c6276 475 uint16_t status = NDEF_ERROR;
apalmieri 0:dd89565c6276 476 TT5_TLV_t tlv;
apalmieri 0:dd89565c6276 477 uint8_t tlv_size = 0;
apalmieri 0:dd89565c6276 478 uint16_t DataLength;
apalmieri 0:dd89565c6276 479
apalmieri 0:dd89565c6276 480 /* Detect NDEF message in memory */
apalmieri 0:dd89565c6276 481 status = NfcType5_NDEFDetection();
apalmieri 0:dd89565c6276 482 if( status != NDEF_OK )
apalmieri 0:dd89565c6276 483 {
apalmieri 0:dd89565c6276 484 return status;
apalmieri 0:dd89565c6276 485 }
apalmieri 0:dd89565c6276 486
apalmieri 0:dd89565c6276 487 /* Read TL of Type 5 */
apalmieri 0:dd89565c6276 488 status = NFCTAG_ReadData( (uint8_t*)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t) );
apalmieri 0:dd89565c6276 489 if( status != NDEF_OK )
apalmieri 0:dd89565c6276 490 {
apalmieri 0:dd89565c6276 491 return status;
apalmieri 0:dd89565c6276 492 }
apalmieri 0:dd89565c6276 493
apalmieri 0:dd89565c6276 494 /* Check if L is on 3 or 1 byte and update length in buffer */
apalmieri 0:dd89565c6276 495 if( tlv.Length == NFCT5_3_BYTES_L_TLV )
apalmieri 0:dd89565c6276 496 {
apalmieri 0:dd89565c6276 497 tlv_size = 4;
apalmieri 0:dd89565c6276 498 DataLength = ((tlv.Length16 >> 8)&0xff) | ((tlv.Length16&0xff)<<8);
apalmieri 0:dd89565c6276 499 }
apalmieri 0:dd89565c6276 500 else
apalmieri 0:dd89565c6276 501 {
apalmieri 0:dd89565c6276 502 tlv_size = 2;
apalmieri 0:dd89565c6276 503 DataLength = tlv.Length;
apalmieri 0:dd89565c6276 504 }
apalmieri 0:dd89565c6276 505 /* If too many data to write return error */
apalmieri 0:dd89565c6276 506 if( DataLength > NDEF_MAX_SIZE )
apalmieri 0:dd89565c6276 507 {
apalmieri 0:dd89565c6276 508 return NDEF_ERROR_MEMORY_INTERNAL;
apalmieri 0:dd89565c6276 509 }
apalmieri 0:dd89565c6276 510
apalmieri 0:dd89565c6276 511 /* Check CC file is in the correct mode to proceed */
apalmieri 0:dd89565c6276 512 if( CCFileStruct.State == TT5_INITIALIZED )
apalmieri 0:dd89565c6276 513 {
apalmieri 0:dd89565c6276 514 return NDEF_ERROR;
apalmieri 0:dd89565c6276 515 }
apalmieri 0:dd89565c6276 516
apalmieri 0:dd89565c6276 517 if( DataLength > 0 )
apalmieri 0:dd89565c6276 518 {
apalmieri 0:dd89565c6276 519 /* Read NDEF */
apalmieri 0:dd89565c6276 520 if( NFCTAG_ReadData( (pData), CCFileStruct.NDEF_offset + tlv_size, DataLength ) != NFCTAG_OK )
apalmieri 0:dd89565c6276 521 {
apalmieri 0:dd89565c6276 522 return NDEF_ERROR;
apalmieri 0:dd89565c6276 523 }
apalmieri 0:dd89565c6276 524 }
apalmieri 0:dd89565c6276 525
apalmieri 0:dd89565c6276 526 return NDEF_OK;
apalmieri 0:dd89565c6276 527 }
apalmieri 0:dd89565c6276 528
apalmieri 0:dd89565c6276 529 /**
apalmieri 0:dd89565c6276 530 * @brief This function writes a NDEF message in the NFC Tag.
apalmieri 0:dd89565c6276 531 * @param Length Number of bytes to write.
apalmieri 0:dd89565c6276 532 * @param pData Pointer on the buffer to copy.
apalmieri 0:dd89565c6276 533 * @retval NDEF_ERROR_MEMORY_INTERNAL Memory size is too small for the data.
apalmieri 0:dd89565c6276 534 * @retval NDEF_ERROR_NOT_FORMATED No Capability Container detected.
apalmieri 0:dd89565c6276 535 * @retval NDEF_ERROR Error when writing the Tag.
apalmieri 0:dd89565c6276 536 * @retval NDEF_OK The data has been successfully written.
apalmieri 0:dd89565c6276 537 */
apalmieri 0:dd89565c6276 538 uint16_t ST25dvDriver::NfcType5_WriteNDEF( uint16_t Length, uint8_t *pData )
apalmieri 0:dd89565c6276 539 {
apalmieri 0:dd89565c6276 540 uint8_t tlv_size;
apalmieri 0:dd89565c6276 541 uint32_t offset;
apalmieri 0:dd89565c6276 542 uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV;
apalmieri 0:dd89565c6276 543
apalmieri 0:dd89565c6276 544 if(Length >= 0xFF)
apalmieri 0:dd89565c6276 545 {
apalmieri 0:dd89565c6276 546 tlv_size = 4;
apalmieri 0:dd89565c6276 547 } else {
apalmieri 0:dd89565c6276 548 tlv_size = 2;
apalmieri 0:dd89565c6276 549 }
apalmieri 0:dd89565c6276 550
apalmieri 0:dd89565c6276 551 offset = CCFileStruct.NDEF_offset + tlv_size;
apalmieri 0:dd89565c6276 552
apalmieri 0:dd89565c6276 553 /* Continue write TLV data to EEPROM */
apalmieri 0:dd89565c6276 554 if(NFCTAG_WriteData( pData , offset, Length ) != NFCTAG_OK )
apalmieri 0:dd89565c6276 555 return NDEF_ERROR;
apalmieri 0:dd89565c6276 556
apalmieri 0:dd89565c6276 557 offset +=Length;
apalmieri 0:dd89565c6276 558
apalmieri 0:dd89565c6276 559 /* Write Terminator TLV */
apalmieri 0:dd89565c6276 560 if(NFCTAG_WriteData( &NfcT5_Terminator, offset, sizeof(NfcT5_Terminator) ) != NFCTAG_OK)
apalmieri 0:dd89565c6276 561 return NDEF_ERROR;
apalmieri 0:dd89565c6276 562
apalmieri 0:dd89565c6276 563 return NDEF_OK;
apalmieri 0:dd89565c6276 564 }
apalmieri 0:dd89565c6276 565
apalmieri 0:dd89565c6276 566 uint16_t ST25dvDriver::NfcType5_SetLength(uint16_t Length)
apalmieri 0:dd89565c6276 567 {
apalmieri 0:dd89565c6276 568 TT5_TLV_t tlv;
apalmieri 0:dd89565c6276 569 uint8_t tlv_size;
apalmieri 0:dd89565c6276 570 uint32_t offset;
apalmieri 0:dd89565c6276 571 uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV;
apalmieri 0:dd89565c6276 572
apalmieri 0:dd89565c6276 573 uint32_t max_length = NFCTAG_GetByteSize() /* Memory size */
apalmieri 0:dd89565c6276 574 - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */
apalmieri 0:dd89565c6276 575 - sizeof(NfcT5_Terminator) /* - Terminator TLV */
apalmieri 0:dd89565c6276 576 - CCFileStruct.NDEF_offset; /* - CCfile length */
apalmieri 0:dd89565c6276 577
apalmieri 0:dd89565c6276 578 /* If too many data to write return error */
apalmieri 0:dd89565c6276 579 if( Length > max_length )
apalmieri 0:dd89565c6276 580 {
apalmieri 0:dd89565c6276 581 return NDEF_ERROR_MEMORY_TAG;
apalmieri 0:dd89565c6276 582 }
apalmieri 0:dd89565c6276 583
apalmieri 0:dd89565c6276 584 /* Detect NDEF message in memory */
apalmieri 0:dd89565c6276 585 if( NfcType5_NDEFDetection() != NDEF_OK )
apalmieri 0:dd89565c6276 586 {
apalmieri 0:dd89565c6276 587 return NDEF_ERROR;
apalmieri 0:dd89565c6276 588 }
apalmieri 0:dd89565c6276 589
apalmieri 0:dd89565c6276 590 /* Prepare TLV */
apalmieri 0:dd89565c6276 591 tlv.Type = NFCT5_NDEF_MSG_TLV;
apalmieri 0:dd89565c6276 592 if(Length >= 0xFF)
apalmieri 0:dd89565c6276 593 {
apalmieri 0:dd89565c6276 594 tlv.Length = NFCT5_3_BYTES_L_TLV;
apalmieri 0:dd89565c6276 595 tlv.Length16 = ((Length&0xff)<<8) | ((Length>>8)&0xff) ;
apalmieri 0:dd89565c6276 596 tlv_size = 4;
apalmieri 0:dd89565c6276 597
apalmieri 0:dd89565c6276 598 } else {
apalmieri 0:dd89565c6276 599 tlv.Length = Length;
apalmieri 0:dd89565c6276 600 tlv_size = 2;
apalmieri 0:dd89565c6276 601 }
apalmieri 0:dd89565c6276 602
apalmieri 0:dd89565c6276 603 offset = CCFileStruct.NDEF_offset;
apalmieri 0:dd89565c6276 604 /* Start write TLV to EEPROM */
apalmieri 0:dd89565c6276 605 if(NFCTAG_WriteData( (uint8_t*)&tlv, offset, tlv_size )!= NFCTAG_OK)
apalmieri 0:dd89565c6276 606 return NDEF_ERROR;
apalmieri 0:dd89565c6276 607
apalmieri 0:dd89565c6276 608 return NDEF_OK;
apalmieri 0:dd89565c6276 609 }
apalmieri 0:dd89565c6276 610
apalmieri 0:dd89565c6276 611 /**
apalmieri 0:dd89565c6276 612 * @brief This function reads and return the size of the NDEF message in the NFC tag.
apalmieri 0:dd89565c6276 613 * @param Length Pointer on the NDEF size to be returned.
apalmieri 0:dd89565c6276 614 * @retval NDEF_ERROR_NOT_FORMATED Device is not a NFC Tag Type 5 Tag.
apalmieri 0:dd89565c6276 615 * @retval NDEF_ERROR The NDEF message size has not been read.
apalmieri 0:dd89565c6276 616 * @retval NDEF_OK The NDEF message size has been retrieved.
apalmieri 0:dd89565c6276 617 */
apalmieri 0:dd89565c6276 618 uint16_t ST25dvDriver::NfcType5_GetLength(uint16_t* Length)
apalmieri 0:dd89565c6276 619 {
apalmieri 0:dd89565c6276 620
apalmieri 0:dd89565c6276 621 uint16_t status = NDEF_ERROR;
apalmieri 0:dd89565c6276 622 TT5_TLV_t tlv;
apalmieri 0:dd89565c6276 623
apalmieri 0:dd89565c6276 624 /* Detect NDEF message in memory */
apalmieri 0:dd89565c6276 625 status = NfcType5_NDEFDetection();
apalmieri 0:dd89565c6276 626 if( status != NDEF_OK )
apalmieri 0:dd89565c6276 627 {
apalmieri 0:dd89565c6276 628 return status;
apalmieri 0:dd89565c6276 629 }
apalmieri 0:dd89565c6276 630
apalmieri 0:dd89565c6276 631 /* Read TL of Type 5 */
apalmieri 0:dd89565c6276 632 status = NFCTAG_ReadData( (uint8_t*)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t) );
apalmieri 0:dd89565c6276 633 if( status != NFCTAG_OK )
apalmieri 0:dd89565c6276 634 {
apalmieri 0:dd89565c6276 635 return NDEF_ERROR;
apalmieri 0:dd89565c6276 636 }
apalmieri 0:dd89565c6276 637
apalmieri 0:dd89565c6276 638 if(tlv.Length != NFCT5_3_BYTES_L_TLV)
apalmieri 0:dd89565c6276 639 {
apalmieri 0:dd89565c6276 640 *Length = tlv.Length;
apalmieri 0:dd89565c6276 641 } else {
apalmieri 0:dd89565c6276 642 *Length = ((tlv.Length16 >> 8)&0xff) | ((tlv.Length16 & 0xff) << 8);
apalmieri 0:dd89565c6276 643 }
apalmieri 0:dd89565c6276 644
apalmieri 0:dd89565c6276 645 return NDEF_OK;
apalmieri 0:dd89565c6276 646 }
apalmieri 0:dd89565c6276 647
apalmieri 0:dd89565c6276 648 } //ST
apalmieri 0:dd89565c6276 649 } //vendor
apalmieri 0:dd89565c6276 650 } //nfc
apalmieri 0:dd89565c6276 651 } //mbed
apalmieri 0:dd89565c6276 652
apalmieri 0:dd89565c6276 653 mbed::nfc::NFCEEPROMDriver* greentea_nfc_EEPROM_driver_get_instance()
apalmieri 0:dd89565c6276 654 {
apalmieri 0:dd89565c6276 655 static mbed::nfc::vendor::ST::ST25dvDriver instance;
apalmieri 0:dd89565c6276 656 return &instance;
apalmieri 0:dd89565c6276 657 }
apalmieri 0:dd89565c6276 658
apalmieri 0:dd89565c6276 659 /******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/