1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2014 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /****************************************************************************** 20 * 21 * This file contains the Near Field Communication (NFC) Reader/Writer mode 22 * related internal function / definitions. 23 * 24 ******************************************************************************/ 25 26 #ifndef RW_INT_H_ 27 #define RW_INT_H_ 28 29 #include "rw_api.h" 30 #include "tags_defs.h" 31 #include "tags_int.h" 32 33 /* Proprietary definitions for HR0 and HR1 */ 34 /* TOPAZ96 Tag */ 35 #define RW_T1T_IS_TOPAZ96 0x11 36 /* TOPAZ512 Tag */ 37 #define RW_T1T_IS_TOPAZ512 0x12 38 /* Supports dynamic commands on static tag if HR1 > 0x49 */ 39 #define RW_T1T_HR1_MIN 0x49 40 41 /* Maximum supported Memory control TLVS in the tag */ 42 #define RW_T1T_MAX_MEM_TLVS 0x05 43 /* Maximum supported Lock control TLVS in the tag */ 44 #define RW_T1T_MAX_LOCK_TLVS 0x05 45 /* Maximum supported dynamic lock bytes */ 46 #define RW_T1T_MAX_LOCK_BYTES 0x1E 47 48 /* State of the Tag as interpreted by RW */ 49 /* TAG State is unknown to RW */ 50 #define RW_T1_TAG_ATTRB_UNKNOWN 0x00 51 /* TAG is in INITIALIZED state */ 52 #define RW_T1_TAG_ATTRB_INITIALIZED 0x01 53 /* TAG is in INITIALIZED state and has NDEF tlv with len=0 */ 54 #define RW_T1_TAG_ATTRB_INITIALIZED_NDEF 0x02 55 /* TAG is in READ ONLY state */ 56 #define RW_T1_TAG_ATTRB_READ_ONLY 0x03 57 /* TAG is in READ WRITE state */ 58 #define RW_T1_TAG_ATTRB_READ_WRITE 0x04 59 60 /* Lock not yet set as part of SET TAG RO op */ 61 #define RW_T1T_LOCK_NOT_UPDATED 0x00 62 /* Sent command to set the Lock bytes */ 63 #define RW_T1T_LOCK_UPDATE_INITIATED 0x01 64 /* Lock bytes are set */ 65 #define RW_T1T_LOCK_UPDATED 0x02 66 typedef uint8_t tRW_T1T_LOCK_STATUS; 67 68 /* States */ 69 /* Tag not activated and or response not received for RID */ 70 #define RW_T1T_STATE_NOT_ACTIVATED 0x00 71 /* T1 Tag activated and ready to perform rw operation on Tag*/ 72 #define RW_T1T_STATE_IDLE 0x01 73 /* waiting rsp for read command sent to tag */ 74 #define RW_T1T_STATE_READ 0x02 75 /* waiting rsp for write command sent to tag */ 76 #define RW_T1T_STATE_WRITE 0x03 77 /* performing TLV detection procedure */ 78 #define RW_T1T_STATE_TLV_DETECT 0x04 79 /* performing read NDEF procedure */ 80 #define RW_T1T_STATE_READ_NDEF 0x05 81 /* performing update NDEF procedure */ 82 #define RW_T1T_STATE_WRITE_NDEF 0x06 83 /* Setting Tag as read only tag */ 84 #define RW_T1T_STATE_SET_TAG_RO 0x07 85 /* Check if Tag is still present */ 86 #define RW_T1T_STATE_CHECK_PRESENCE 0x08 87 /* Format T1 Tag */ 88 #define RW_T1T_STATE_FORMAT_TAG 0x09 89 90 /* Sub states */ 91 /* Default substate */ 92 #define RW_T1T_SUBSTATE_NONE 0x00 93 94 /* Sub states in RW_T1T_STATE_TLV_DETECT state */ 95 /* waiting for the detection of a tlv in a tag */ 96 #define RW_T1T_SUBSTATE_WAIT_TLV_DETECT 0x01 97 /* waiting for finding the len field is 1 or 3 bytes long */ 98 #define RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN 0x02 99 /* waiting for extracting len field value */ 100 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0 0x03 101 /* waiting for extracting len field value */ 102 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1 0x04 103 /* waiting for extracting value field in the TLV */ 104 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE 0x05 105 /* waiting for reading dynamic locks in the TLV */ 106 #define RW_T1T_SUBSTATE_WAIT_READ_LOCKS 0x06 107 108 /* Sub states in RW_T1T_STATE_WRITE_NDEF state */ 109 /* waiting for response of reading a block that will be partially updated */ 110 #define RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK 0x07 111 /* waiting for response of invalidating NDEF Msg */ 112 #define RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF 0x08 113 /* waiting for response of writing a part of NDEF Msg */ 114 #define RW_T1T_SUBSTATE_WAIT_NDEF_WRITE 0x09 115 /* waiting for response of writing last part of NDEF Msg */ 116 #define RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED 0x0A 117 /* waiting for response of validating NDEF Msg */ 118 #define RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF 0x0B 119 120 /* Sub states in RW_T1T_STATE_SET_TAG_RO state */ 121 /* waiting for response of setting CC-RWA to read only */ 122 #define RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO 0x0C 123 /* waiting for response of setting all static lock bits */ 124 #define RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS 0x0D 125 /* waiting for response of setting all dynamic lock bits */ 126 #define RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS 0x0E 127 128 /* Sub states in RW_T1T_STATE_FORMAT_TAG state */ 129 /* waiting for response to format/set capability container */ 130 #define RW_T1T_SUBSTATE_WAIT_SET_CC 0x0F 131 /* waiting for response to format/set NULL NDEF */ 132 #define RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF 0x10 133 134 typedef struct { 135 uint16_t offset; /* Offset of the lock byte in the Tag */ 136 uint8_t num_bits; /* Number of lock bits in the lock byte */ 137 uint8_t bytes_locked_per_bit; /* No. of tag bytes gets locked by a bit in this 138 byte */ 139 } tRW_T1T_LOCK_INFO; 140 141 typedef struct { 142 uint16_t offset; /* Reserved bytes offset taken from Memory control TLV */ 143 uint8_t num_bytes; /* Number of reserved bytes as per the TLV */ 144 } tRW_T1T_RES_INFO; 145 146 typedef struct { 147 uint8_t tlv_index; /* Index of Lock control tlv that points to this address*/ 148 uint8_t byte_index; /* Index of Lock byte pointed by the TLV */ 149 uint8_t lock_byte; /* Value in the lock byte */ 150 tRW_T1T_LOCK_STATUS 151 lock_status; /* Indicates if it is modifed to set tag as Read only */ 152 bool b_lock_read; /* Is the lock byte is already read from tag */ 153 } tRW_T1T_LOCK; 154 155 typedef struct { 156 uint8_t addr; /* ADD/ADD8/ADDS field value */ 157 uint8_t op_code; /* Command sent */ 158 uint8_t rsp_len; /* expected length of the response */ 159 uint8_t 160 pend_retx_rsp; /* Number of pending rsps to retransmission on prev cmd */ 161 } tRW_T1T_PREV_CMD_RSP_INFO; 162 163 #if (RW_NDEF_INCLUDED == TRUE) 164 /* Buffer 0-E block, for easier tlv operation */ 165 #define T1T_BUFFER_SIZE T1T_STATIC_SIZE 166 #else 167 /* Buffer UID */ 168 #define T1T_BUFFER_SIZE T1T_UID_LEN 169 #endif 170 171 /* RW Type 1 Tag control blocks */ 172 typedef struct { 173 uint8_t 174 hr[T1T_HR_LEN]; /* Header ROM byte 0 - 0x1y,Header ROM byte 1 - 0x00 */ 175 uint8_t mem[T1T_SEGMENT_SIZE]; /* Tag contents of block 0 or from block 0-E */ 176 tT1T_CMD_RSP_INFO* 177 p_cmd_rsp_info; /* Pointer to Command rsp info of last sent command */ 178 uint8_t state; /* Current state of RW module */ 179 uint8_t tag_attribute; /* Present state of the Tag as interpreted by RW */ 180 NFC_HDR* 181 p_cur_cmd_buf; /* Buffer to hold cur sent command for retransmission */ 182 uint8_t addr; /* ADD/ADD8/ADDS value */ 183 tRW_T1T_PREV_CMD_RSP_INFO 184 prev_cmd_rsp_info; /* Information about previous sent command if retx */ 185 TIMER_LIST_ENT timer; /* timer to set timelimit for the response to command */ 186 bool b_update; /* Tag header updated */ 187 bool b_rseg; /* Segment 0 read from tag */ 188 bool b_hard_lock; /* Hard lock the tag as part of config tag to Read only */ 189 #if (RW_NDEF_INCLUDED == TRUE) 190 uint8_t segment; /* Current Tag segment */ 191 uint8_t substate; /* Current substate of RW module */ 192 uint16_t work_offset; /* Working byte offset */ 193 uint8_t ndef_first_block[T1T_BLOCK_SIZE]; /* Buffer for ndef first block */ 194 uint8_t ndef_final_block[T1T_BLOCK_SIZE]; /* Buffer for ndef last block */ 195 uint8_t* p_ndef_buffer; /* Buffer to store ndef message */ 196 uint16_t new_ndef_msg_len; /* Lenght of new updating NDEF Message */ 197 uint8_t block_read; /* Last read Block */ 198 uint8_t write_byte; /* Index of last written byte */ 199 uint8_t tlv_detect; /* TLV type under detection */ 200 uint16_t ndef_msg_offset; /* The offset on Tag where first NDEF message is 201 present*/ 202 uint16_t ndef_msg_len; /* Lenght of NDEF Message */ 203 uint16_t 204 max_ndef_msg_len; /* Maximum size of NDEF that can be written on the tag 205 */ 206 uint16_t ndef_header_offset; /* The offset on Tag where first NDEF tlv is 207 present */ 208 uint8_t ndef_block_written; /* Last block where NDEF bytes are written */ 209 uint8_t num_ndef_finalblock; /* Block number where NDEF's last byte will be 210 present */ 211 uint8_t num_lock_tlvs; /* Number of lcok tlvs detected in the tag */ 212 tRW_T1T_LOCK_INFO lock_tlv[RW_T1T_MAX_LOCK_TLVS]; /* Information retrieved 213 from lock control tlv */ 214 uint8_t num_lockbytes; /* Number of dynamic lock bytes present in the tag */ 215 tRW_T1T_LOCK 216 lockbyte[RW_T1T_MAX_LOCK_BYTES]; /* Dynamic Lock byte information */ 217 uint8_t num_mem_tlvs; /* Number of memory tlvs detected in the tag */ 218 tRW_T1T_RES_INFO 219 mem_tlv[RW_T1T_MAX_MEM_TLVS]; /* Information retrieved from mem tlv */ 220 uint8_t attr_seg; /* Tag segment for which attributes are prepared */ 221 uint8_t 222 lock_attr_seg; /* Tag segment for which lock attributes are prepared */ 223 uint8_t 224 attr[T1T_BLOCKS_PER_SEGMENT]; /* byte information - Reserved/lock/otp or 225 data */ 226 uint8_t lock_attr 227 [T1T_BLOCKS_PER_SEGMENT]; /* byte information - read only or read write */ 228 #endif 229 } tRW_T1T_CB; 230 231 /* Mifare Ultalight/ Ultralight Family blank tag version block settings */ 232 /* Block where version number of the tag is stored */ 233 #define T2T_MIFARE_VERSION_BLOCK 0x04 234 /* Blank Ultralight tag - Block 4 (byte 0, byte 1) */ 235 #define T2T_MIFARE_ULTRALIGHT_VER_NO 0xFFFF 236 /* Blank Ultralight family tag - Block 4 (byte 0, byte 1) */ 237 #define T2T_MIFARE_ULTRALIGHT_FAMILY_VER_NO 0x0200 238 239 /* Infineon my-d move / my-d blank tag uid block settings */ 240 #define T2T_INFINEON_VERSION_BLOCK 0x00 241 #define T2T_INFINEON_MYD_MOVE_LEAN 0x0570 242 #define T2T_INFINEON_MYD_MOVE 0x0530 243 244 #define T2T_BRCM_VERSION_BLOCK 0x00 245 #define T2T_BRCM_STATIC_MEM 0x2E01 246 #define T2T_BRCM_DYNAMIC_MEM 0x2E02 247 248 #define T2T_NDEF_NOT_DETECTED 0x00 249 #define T2T_NDEF_DETECTED 0x01 250 #define T2T_NDEF_READ 0x02 251 252 /* Maximum supported Memory control TLVS in the tag */ 253 #define RW_T2T_MAX_MEM_TLVS 0x05 254 /* Maximum supported Lock control TLVS in the tag */ 255 #define RW_T2T_MAX_LOCK_TLVS 0x05 256 /* Maximum supported dynamic lock bytes */ 257 #define RW_T2T_MAX_LOCK_BYTES 0x20 258 #define RW_T2T_SEGMENT_BYTES 128 259 #define RW_T2T_SEGMENT_SIZE 16 260 261 /* Lock not yet set as part of SET TAG RO op */ 262 #define RW_T2T_LOCK_NOT_UPDATED 0x00 263 /* Sent command to set the Lock bytes */ 264 #define RW_T2T_LOCK_UPDATE_INITIATED 0x01 265 /* Lock bytes are set */ 266 #define RW_T2T_LOCK_UPDATED 0x02 267 typedef uint8_t tRW_T2T_LOCK_STATUS; 268 269 /* States */ 270 /* Tag not activated */ 271 #define RW_T2T_STATE_NOT_ACTIVATED 0x00 272 /* T1 Tag activated and ready to perform rw operation on Tag*/ 273 #define RW_T2T_STATE_IDLE 0x01 274 /* waiting response for read command sent to tag */ 275 #define RW_T2T_STATE_READ 0x02 276 /* waiting response for write command sent to tag */ 277 #define RW_T2T_STATE_WRITE 0x03 278 /* Waiting response for sector select command */ 279 #define RW_T2T_STATE_SELECT_SECTOR 0x04 280 /* Detecting Lock/Memory/NDEF/Proprietary TLV in the Tag */ 281 #define RW_T2T_STATE_DETECT_TLV 0x05 282 /* Performing NDEF Read procedure */ 283 #define RW_T2T_STATE_READ_NDEF 0x06 284 /* Performing NDEF Write procedure */ 285 #define RW_T2T_STATE_WRITE_NDEF 0x07 286 /* Setting Tag as Read only tag */ 287 #define RW_T2T_STATE_SET_TAG_RO 0x08 288 /* Check if Tag is still present */ 289 #define RW_T2T_STATE_CHECK_PRESENCE 0x09 290 /* Format the tag */ 291 #define RW_T2T_STATE_FORMAT_TAG 0x0A 292 /* Tag is in HALT State */ 293 #define RW_T2T_STATE_HALT 0x0B 294 295 /* rw_t2t_read/rw_t2t_write takes care of sector change if the block to 296 * read/write is in a different sector 297 * Next Substate should be assigned to control variable 'substate' before 298 * calling these function for State Machine to 299 * move back to the particular substate after Sector change is completed and 300 * read/write command is sent on new sector */ 301 302 /* Sub states */ 303 #define RW_T2T_SUBSTATE_NONE 0x00 304 305 /* Sub states in RW_T2T_STATE_SELECT_SECTOR state */ 306 /* waiting for response of sector select CMD 1 */ 307 #define RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT 0x01 308 /* waiting for response of sector select CMD 2 */ 309 #define RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR 0x02 310 311 /* Sub states in RW_T1T_STATE_DETECT_XXX state */ 312 /* waiting for the detection of a tlv in a tag */ 313 #define RW_T2T_SUBSTATE_WAIT_READ_CC 0x03 314 /* waiting for the detection of a tlv in a tag */ 315 #define RW_T2T_SUBSTATE_WAIT_TLV_DETECT 0x04 316 /* waiting for finding the len field is 1 or 3 bytes long */ 317 #define RW_T2T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN 0x05 318 /* waiting for extracting len field value */ 319 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN0 0x06 320 /* waiting for extracting len field value */ 321 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN1 0x07 322 /* waiting for extracting value field in the TLV */ 323 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE 0x08 324 /* waiting for reading dynamic locks in the TLV */ 325 #define RW_T2T_SUBSTATE_WAIT_READ_LOCKS 0x09 326 327 /* Sub states in RW_T2T_STATE_WRITE_NDEF state */ 328 /* waiting for rsp to reading the block where NDEF starts */ 329 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_FIRST_BLOCK 0x0A 330 /* waiting for rsp to reading block where new NDEF Msg ends */ 331 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_LAST_BLOCK 0x0B 332 /* waiting for rsp to reading block where Trm tlv gets added*/ 333 #define RW_T2T_SUBSTATE_WAIT_READ_TERM_TLV_BLOCK 0x0C 334 /* waiting for rsp to reading block where nxt NDEF write */ 335 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_NEXT_BLOCK 0x0D 336 /* waiting for rsp to writting NDEF block */ 337 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_NEXT_BLOCK 0x0E 338 /* waiting for rsp to last NDEF block write cmd */ 339 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LAST_BLOCK 0x0F 340 /* waiting for rsp to reading NDEF len field block */ 341 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_LEN_BLOCK 0x10 342 /* waiting for rsp of updating first NDEF len field block */ 343 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_BLOCK 0x11 344 /* waiting for rsp of updating next NDEF len field block */ 345 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_NEXT_BLOCK 0x12 346 /* waiting for rsp to writing to Terminator tlv */ 347 #define RW_T2T_SUBSTATE_WAIT_WRITE_TERM_TLV_CMPLT 0x13 348 349 /* Sub states in RW_T2T_STATE_FORMAT_TAG state */ 350 #define RW_T2T_SUBSTATE_WAIT_READ_VERSION_INFO 0x14 351 /* waiting for response to format/set capability container */ 352 #define RW_T2T_SUBSTATE_WAIT_SET_CC 0x15 353 #define RW_T2T_SUBSTATE_WAIT_SET_LOCK_TLV 0x16 354 /* waiting for response to format/set NULL NDEF */ 355 #define RW_T2T_SUBSTATE_WAIT_SET_NULL_NDEF 0x17 356 357 /* Sub states in RW_T2T_STATE_SET_TAG_RO state */ 358 /* waiting for response to set CC3 to RO */ 359 #define RW_T2T_SUBSTATE_WAIT_SET_CC_RO 0x19 360 /* waiting for response to read dynamic lock bytes block */ 361 #define RW_T2T_SUBSTATE_WAIT_READ_DYN_LOCK_BYTE_BLOCK 0x1A 362 /* waiting for response to set dynamic lock bits */ 363 #define RW_T2T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS 0x1B 364 365 typedef struct { 366 uint16_t offset; /* Offset of the lock byte in the Tag */ 367 uint16_t num_bits; /* Number of lock bits in the lock byte */ 368 uint16_t bytes_locked_per_bit; /* No. of tag bytes gets locked by a bit 369 in this byte */ 370 } tRW_T2T_LOCK_INFO; 371 372 typedef struct { 373 uint16_t offset; /* Reserved bytes offset taken from Memory control TLV */ 374 uint16_t num_bytes; /* Number of reserved bytes as per the TLV */ 375 } tRW_T2T_RES_INFO; 376 377 typedef struct { 378 uint8_t tlv_index; /* Index of Lock control tlv that points to this address */ 379 uint8_t byte_index; /* Index of Lock byte pointed by the TLV */ 380 uint8_t lock_byte; /* Value in the lock byte */ 381 tRW_T2T_LOCK_STATUS 382 lock_status; /* Indicates if it is modifed to set tag as Read only */ 383 bool b_lock_read; /* Is the lock byte is already read from tag */ 384 } tRW_T2T_LOCK; 385 386 /* RW Type 2 Tag control block */ 387 typedef struct { 388 uint8_t state; /* Reader/writer state */ 389 uint8_t substate; /* Reader/write substate in NDEF write state */ 390 uint8_t 391 prev_substate; /* Substate of the tag before moving to different sector */ 392 uint8_t sector; /* Sector number that is selected */ 393 uint8_t select_sector; /* Sector number that is expected to get selected */ 394 uint8_t tag_hdr[T2T_READ_DATA_LEN]; /* T2T Header blocks */ 395 uint8_t tag_data[T2T_READ_DATA_LEN]; /* T2T Block 4 - 7 data */ 396 uint8_t ndef_status; /* The current status of NDEF Write operation */ 397 uint16_t block_read; /* Read block */ 398 uint16_t block_written; /* Written block */ 399 tT2T_CMD_RSP_INFO* 400 p_cmd_rsp_info; /* Pointer to Command rsp info of last sent command */ 401 NFC_HDR* p_cur_cmd_buf; /* Copy of current command, for retx/send after sector 402 change */ 403 NFC_HDR* p_sec_cmd_buf; /* Copy of command, to send after sector change */ 404 TIMER_LIST_ENT t2_timer; /* timeout for each API call */ 405 bool b_read_hdr; /* Tag header read from tag */ 406 bool b_read_data; /* Tag data block read from tag */ 407 bool b_hard_lock; /* Hard lock the tag as part of config tag to Read only */ 408 bool check_tag_halt; /* Resent command after NACK rsp to find tag is in HALT 409 State */ 410 #if (RW_NDEF_INCLUDED == TRUE) 411 bool skip_dyn_locks; /* Skip reading dynamic lock bytes from the tag */ 412 uint8_t found_tlv; /* The Tlv found while searching a particular TLV */ 413 uint8_t tlv_detect; /* TLV type under detection */ 414 uint8_t num_lock_tlvs; /* Number of lcok tlvs detected in the tag */ 415 uint8_t attr_seg; /* Tag segment for which attributes are prepared */ 416 uint8_t 417 lock_attr_seg; /* Tag segment for which lock attributes are prepared */ 418 uint8_t segment; /* Current operating segment */ 419 uint8_t ndef_final_block[T2T_BLOCK_SIZE]; /* Buffer for ndef last block */ 420 uint8_t num_mem_tlvs; /* Number of memory tlvs detected in the tag */ 421 uint8_t num_lockbytes; /* Number of dynamic lock bytes present in the tag */ 422 uint8_t attr 423 [RW_T2T_SEGMENT_SIZE]; /* byte information - Reserved/lock/otp or data */ 424 uint8_t lock_attr[RW_T2T_SEGMENT_SIZE]; /* byte information - read only or 425 read write */ 426 uint8_t tlv_value[3]; /* Read value field of TLV */ 427 uint8_t ndef_first_block[T2T_BLOCK_LEN]; /* NDEF TLV Header block */ 428 uint8_t ndef_read_block[T2T_BLOCK_LEN]; /* Buffer to hold read before write 429 block */ 430 uint8_t ndef_last_block[T2T_BLOCK_LEN]; /* Terminator TLV block after NDEF 431 Write operation */ 432 uint8_t terminator_tlv_block[T2T_BLOCK_LEN]; /* Terminator TLV Block */ 433 uint16_t ndef_last_block_num; /* Block where last byte of updating ndef 434 message will exist */ 435 uint16_t ndef_read_block_num; /* Block read during NDEF Write to avoid 436 overwritting res bytes */ 437 uint16_t 438 bytes_count; /* No. of bytes remaining to collect during tlv detect */ 439 uint16_t 440 terminator_byte_index; /* The offset of the tag where terminator tlv may 441 be added */ 442 uint16_t work_offset; /* Working byte offset */ 443 uint16_t ndef_header_offset; 444 uint16_t 445 ndef_msg_offset; /* Offset on Tag where first NDEF message is present */ 446 uint16_t ndef_msg_len; /* Lenght of NDEF Message */ 447 uint16_t 448 max_ndef_msg_len; /* Maximum size of NDEF that can be written on the tag 449 */ 450 uint16_t new_ndef_msg_len; /* Lenght of new updating NDEF Message */ 451 uint16_t ndef_write_block; 452 uint16_t prop_msg_len; /* Proprietary tlv length */ 453 uint8_t* p_new_ndef_buffer; /* Pointer to updating NDEF Message */ 454 uint8_t* p_ndef_buffer; /* Pointer to NDEF Message */ 455 tRW_T2T_LOCK_INFO lock_tlv[RW_T2T_MAX_LOCK_TLVS]; /* Information retrieved 456 from lock control tlv */ 457 tRW_T2T_LOCK 458 lockbyte[RW_T2T_MAX_LOCK_BYTES]; /* Dynamic Lock byte information */ 459 tRW_T2T_RES_INFO 460 mem_tlv[RW_T2T_MAX_MEM_TLVS]; /* Information retrieved from mem tlv */ 461 #endif 462 } tRW_T2T_CB; 463 464 /* Type 3 Tag control block */ 465 typedef uint8_t tRW_T3T_RW_STATE; 466 467 typedef struct { 468 tNFC_STATUS status; 469 uint8_t version; /* Ver: peer version */ 470 uint8_t 471 nbr; /* NBr: number of blocks that can be read using one Check command */ 472 uint8_t nbw; /* Nbw: number of blocks that can be written using one Update 473 command */ 474 uint16_t nmaxb; /* Nmaxb: maximum number of blocks available for NDEF data */ 475 uint8_t writef; /* WriteFlag: 00h if writing data finished; 0Fh if writing 476 data in progress */ 477 uint8_t 478 rwflag; /* RWFlag: 00h NDEF is read-only; 01h if read/write available */ 479 uint32_t ln; /* Ln: actual size of stored NDEF data (in bytes) */ 480 } tRW_T3T_DETECT; 481 482 /* RW_T3T control block flags */ 483 /* The final command for completing the NDEF read/write */ 484 #define RW_T3T_FL_IS_FINAL_NDEF_SEGMENT 0x01 485 /* Waiting for POLL response for presence check */ 486 #define RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP 0x02 487 /* Waiting for POLL response for RW_T3tGetSystemCodes */ 488 #define RW_T3T_FL_W4_GET_SC_POLL_RSP 0x04 489 /* Waiting for POLL response for RW_T3tDetectNDef */ 490 #define RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP 0x08 491 /* Waiting for POLL response for RW_T3tFormat */ 492 #define RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP 0x10 493 /* Waiting for POLL response for RW_T3tSetReadOnly */ 494 #define RW_T3T_FL_W4_SRO_FELICA_LITE_POLL_RSP 0x20 495 /* Waiting for POLL response for RW_T3tPoll */ 496 #define RW_T3T_FL_W4_USER_POLL_RSP 0x40 497 498 typedef struct { 499 uint32_t cur_tout; /* Current command timeout */ 500 /* check timeout is check_tout_a + n * check_tout_b; X is T/t3t * 4^E */ 501 uint32_t check_tout_a; /* Check command timeout (A+1)*X */ 502 uint32_t check_tout_b; /* Check command timeout (B+1)*X */ 503 /* update timeout is update_tout_a + n * update_tout_b; X is T/t3t * 4^E */ 504 uint32_t update_tout_a; /* Update command timeout (A+1)*X */ 505 uint32_t update_tout_b; /* Update command timeout (B+1)*X */ 506 tRW_T3T_RW_STATE rw_state; /* Reader/writer state */ 507 uint8_t rw_substate; 508 uint8_t cur_cmd; /* Current command being executed */ 509 NFC_HDR* p_cur_cmd_buf; /* Copy of current command, for retransmission */ 510 TIMER_LIST_ENT timer; /* timeout for waiting for response */ 511 TIMER_LIST_ENT poll_timer; /* timeout for waiting for response */ 512 513 tRW_T3T_DETECT ndef_attrib; /* T3T NDEF attribute information */ 514 515 uint32_t ndef_msg_len; /* Length of ndef message to send */ 516 uint32_t ndef_msg_bytes_sent; /* Length of ndef message sent so far */ 517 uint8_t* ndef_msg; /* Buffer for outgoing NDEF message */ 518 uint32_t ndef_rx_readlen; /* Number of bytes read in current CHECK command */ 519 uint32_t ndef_rx_offset; /* Length of ndef message read so far */ 520 521 uint8_t num_system_codes; /* System codes detected */ 522 uint16_t system_codes[T3T_MAX_SYSTEM_CODES]; 523 524 uint8_t peer_nfcid2[NCI_NFCID2_LEN]; 525 uint8_t cur_poll_rc; /* RC used in current POLL command */ 526 527 uint8_t flags; /* Flags see RW_T3T_FL_* */ 528 /* Recall System Code used in last T3T polling command */ 529 int32_t cur_active_sc; 530 } tRW_T3T_CB; 531 532 /* 533 ** Type 4 Tag 534 */ 535 536 /* Max data size using a single ReadBinary. 2 bytes are for status bytes */ 537 #define RW_T4T_MAX_DATA_PER_READ \ 538 (NFC_RW_POOL_BUF_SIZE - NFC_HDR_SIZE - NCI_DATA_HDR_SIZE - \ 539 T4T_RSP_STATUS_WORDS_SIZE) 540 541 /* Max data size using a single UpdateBinary. 6 bytes are for CLA, INS, P1, P2, 542 * Lc */ 543 /* Use worst case where Extended Field Coding and ODO format are used */ 544 #define RW_T4T_MAX_DATA_PER_WRITE \ 545 (NFC_RW_POOL_BUF_SIZE - NFC_HDR_SIZE - NCI_MSG_OFFSET_SIZE - \ 546 NCI_DATA_HDR_SIZE - T4T_CMD_MAX_EXT_HDR_SIZE) 547 548 #define RW_T4T_EXT_FIELD_CODING 0x01 549 #define RW_T4T_DDO_LC_FIELD_CODING 0x02 550 551 #define RW_T4T_BER_TLV_LENGTH_1_BYTE 0x01 552 #define RW_T4T_BER_TLV_LENGTH_2_BYTES 0x02 553 #define RW_T4T_BER_TLV_LENGTH_3_BYTES 0x03 554 555 /* Minimum data header in command APDU data: 556 * ODO: 54 00 xxyyzz: tag '54' with 3-byte offset xxyyzz 557 * DDO: 53 Ld {data to be written to the ENDEF File} 558 * Ld (data length) can be 1, 2 or 3 bytes 559 */ 560 #define RW_T4T_ODO_DDO_HEADER_MIN_LENGTH 0x06 /* ODO + tag '53' */ 561 /* Ld encoded on two bytes with '81' tag and N=0 to 255 562 * for data field length coded on one byte */ 563 #define RW_T4T_ODO_DDO_HEADER_2BYTES_LENGTH 8 /* ODO + tag '53' + '81' + N */ 564 /* Mandatory NDEF file control */ 565 typedef struct { 566 uint16_t file_id; /* File Identifier */ 567 uint32_t max_file_size; /* Max NDEF file size */ 568 uint8_t read_access; /* read access condition */ 569 uint8_t write_access; /* write access condition */ 570 uint8_t nlen_size; /* (E)NLEN size (2 or 4 bytes) */ 571 } tRW_T4T_NDEF_FC; 572 573 /* Capability Container */ 574 typedef struct { 575 uint16_t cclen; /* the size of this capability container */ 576 uint8_t version; /* the mapping specification version */ 577 uint16_t max_le; /* the max data size by a single ReadBinary */ 578 uint16_t max_lc; /* the max data size by a single UpdateBinary */ 579 tRW_T4T_NDEF_FC ndef_fc; /* Mandatory NDEF file control */ 580 } tRW_T4T_CC; 581 582 typedef uint8_t tRW_T4T_RW_STATE; 583 typedef uint8_t tRW_T4T_RW_SUBSTATE; 584 585 /* Type 4 Tag Control Block */ 586 typedef struct { 587 tRW_T4T_RW_STATE state; /* main state */ 588 tRW_T4T_RW_SUBSTATE sub_state; /* sub state */ 589 uint8_t version; /* currently effective version */ 590 TIMER_LIST_ENT timer; /* timeout for each API call */ 591 592 uint32_t ndef_length; /* length of NDEF data */ 593 uint8_t* p_update_data; /* pointer of data to update */ 594 uint32_t rw_length; /* remaining bytes to read/write */ 595 uint32_t rw_offset; /* remaining offset to read/write */ 596 597 NFC_HDR* p_data_to_free; /* GKI buffet to delete after done */ 598 599 tRW_T4T_CC cc_file; /* Capability Container File */ 600 601 /* NDEF has been detected */ 602 #define RW_T4T_NDEF_STATUS_NDEF_DETECTED 0x01 603 /* NDEF file is read-only */ 604 #define RW_T4T_NDEF_STATUS_NDEF_READ_ONLY 0x02 605 606 uint8_t ndef_status; /* bitmap for NDEF status */ 607 uint8_t channel; /* channel id: used for read-binary */ 608 609 uint16_t max_read_size; /* max reading size per a command */ 610 uint16_t max_update_size; /* max updating size per a command */ 611 uint16_t card_size; 612 uint8_t card_type; 613 uint8_t intl_flags; /* flags for internal information */ 614 } tRW_T4T_CB; 615 616 /* RW retransmission statistics */ 617 #if (RW_STATS_INCLUDED == TRUE) 618 typedef struct { 619 uint32_t start_tick; /* System tick count at activation */ 620 uint32_t bytes_sent; /* Total bytes sent since activation */ 621 uint32_t bytes_received; /* Total bytes received since activation */ 622 uint32_t num_ops; /* Number of operations since activation */ 623 uint32_t num_retries; /* Number of retranmissions since activation */ 624 uint32_t num_crc; /* Number of crc failures */ 625 uint32_t num_trans_err; /* Number of transmission error notifications */ 626 uint32_t num_fail; /* Number of aborts (failures after retries) */ 627 } tRW_STATS; 628 #endif /* RW_STATS_INCLUDED */ 629 630 /* Mifare Classic RW Control Block */ 631 632 typedef struct { 633 uint16_t block; 634 bool auth; 635 } tRW_MFC_BLOCK; 636 637 #define MFC_NDEF_NOT_DETECTED 0x00 638 #define MFC_NDEF_DETECTED 0x01 639 #define MFC_NDEF_READ 0x02 640 641 typedef uint8_t tRW_MFC_RW_STATE; 642 typedef uint8_t tRW_MFC_RW_SUBSTATE; 643 typedef struct { 644 tRW_MFC_RW_STATE state; /* main state */ 645 tRW_MFC_RW_SUBSTATE substate; /* Reader/write substate in NDEF write state*/ 646 tRW_MFC_RW_SUBSTATE 647 prev_substate; /* Reader/write substate in NDEF write state*/ 648 TIMER_LIST_ENT timer; /* timeout for each API call */ 649 uint8_t uid[4]; 650 uint8_t selres; 651 uint8_t tlv_detect; /* TLV type under detection */ 652 uint16_t ndef_length; /* length of NDEF data */ 653 uint16_t ndef_start_pos; /* NDEF start position */ 654 uint16_t ndef_first_block; /* Frst block containing the NDEF */ 655 uint8_t* p_update_data; /* pointer of data to update */ 656 uint16_t rw_length; /* remaining bytes to read/write */ 657 uint16_t rw_offset; /* remaining offset to read/write */ 658 NFC_HDR* p_data_to_free; /* GKI buffer to delete after done */ 659 tRW_MFC_BLOCK last_block_accessed; 660 tRW_MFC_BLOCK next_block; 661 uint8_t sector_authentified; 662 TIMER_LIST_ENT mfc_timer; /* timeout for each API call */ 663 uint16_t work_offset; /* Working byte offset */ 664 uint8_t* p_ndef_buffer; /* Buffer to store ndef message */ 665 uint16_t current_block; 666 NFC_HDR* p_cur_cmd_buf; /* Copy of current command, for retx/send after sector 667 change */ 668 669 uint8_t ndef_status; /* bitmap for NDEF status */ 670 } tRW_MFC_CB; 671 672 /* ISO 15693 RW Control Block */ 673 typedef uint8_t tRW_I93_RW_STATE; 674 typedef uint8_t tRW_I93_RW_SUBSTATE; 675 676 /* tag is read-only */ 677 #define RW_I93_FLAG_READ_ONLY 0x01 678 /* tag supports read multi block */ 679 #define RW_I93_FLAG_READ_MULTI_BLOCK 0x02 680 /* need to reset DSFID for formatting */ 681 #define RW_I93_FLAG_RESET_DSFID 0x04 682 /* need to reset AFI for formatting */ 683 #define RW_I93_FLAG_RESET_AFI 0x08 684 /* use 2 bytes for number of blocks */ 685 #define RW_I93_FLAG_16BIT_NUM_BLOCK 0x10 686 /* use extended commands */ 687 #define RW_I93_FLAG_EXT_COMMANDS 0x20 688 /* use Special Frame in Write-Alike commands */ 689 #define RW_I93_FLAG_SPECIAL_FRAME 0x40 690 /* use SMS bit in Selected state */ 691 #define RW_I93_FLAG_SELECTED_STATE 0x80 692 693 /* searching for type */ 694 #define RW_I93_TLV_DETECT_STATE_TYPE 0x01 695 /* searching for the first byte of length */ 696 #define RW_I93_TLV_DETECT_STATE_LENGTH_1 0x02 697 /* searching for the second byte of length */ 698 #define RW_I93_TLV_DETECT_STATE_LENGTH_2 0x03 699 /* searching for the third byte of length */ 700 #define RW_I93_TLV_DETECT_STATE_LENGTH_3 0x04 701 /* reading value field */ 702 #define RW_I93_TLV_DETECT_STATE_VALUE 0x05 703 #define RW_I93_GET_SYS_INFO_MEM_INFO 1 704 #define RW_T5T_CC_READ_MEM_INFO 0 705 706 /* capability Container CC Size */ 707 #define RW_I93_CC_SIZE 4 708 709 /* main state */ 710 enum { 711 RW_I93_STATE_NOT_ACTIVATED, /* ISO15693 is not activated */ 712 RW_I93_STATE_IDLE, /* waiting for upper layer API */ 713 RW_I93_STATE_BUSY, /* waiting for response from tag */ 714 715 RW_I93_STATE_DETECT_NDEF, /* performing NDEF detection precedure */ 716 RW_I93_STATE_READ_NDEF, /* performing read NDEF procedure */ 717 RW_I93_STATE_UPDATE_NDEF, /* performing update NDEF procedure */ 718 RW_I93_STATE_FORMAT, /* performing format procedure */ 719 RW_I93_STATE_SET_READ_ONLY, /* performing set read-only procedure */ 720 721 RW_I93_STATE_PRESENCE_CHECK /* checking presence of tag */ 722 }; 723 724 /* sub state */ 725 enum { 726 RW_I93_SUBSTATE_WAIT_UID, /* waiting for response of inventory */ 727 RW_I93_SUBSTATE_WAIT_SYS_INFO, /* waiting for response of get sys info */ 728 RW_I93_SUBSTATE_WAIT_CC, /* waiting for reading CC */ 729 RW_I93_SUBSTATE_WAIT_CC_EXT, /* waiting for reading CC second byte */ 730 RW_I93_SUBSTATE_SEARCH_NDEF_TLV, /* searching NDEF TLV */ 731 RW_I93_SUBSTATE_CHECK_LOCK_STATUS, /* check if any NDEF TLV is locked */ 732 733 RW_I93_SUBSTATE_RESET_LEN, /* set length to 0 to update NDEF TLV */ 734 RW_I93_SUBSTATE_WRITE_NDEF, /* writing NDEF and Terminator TLV */ 735 RW_I93_SUBSTATE_UPDATE_LEN, /* set length into NDEF TLV */ 736 737 RW_I93_SUBSTATE_WAIT_RESET_DSFID_AFI, /* reset DSFID and AFI */ 738 RW_I93_SUBSTATE_CHECK_READ_ONLY, /* check if any block is locked */ 739 RW_I93_SUBSTATE_WRITE_CC_NDEF_TLV, /* write CC and empty NDEF/Terminator TLV 740 */ 741 742 RW_I93_SUBSTATE_WAIT_UPDATE_CC, /* updating CC as read-only */ 743 RW_I93_SUBSTATE_LOCK_NDEF_TLV, /* lock blocks of NDEF TLV */ 744 RW_I93_SUBSTATE_WAIT_LOCK_CC, /* lock block of CC */ 745 RW_I93_SUBSTATE_LOCK_T5T_AREA /* lock blocks of T5T_Area */ 746 }; 747 748 enum { 749 RW_I93_ICODE_SLI, /* ICODE SLI, SLIX */ 750 RW_I93_ICODE_SLI_S, /* ICODE SLI-S, SLIX-S */ 751 RW_I93_ICODE_SLI_L, /* ICODE SLI-L, SLIX-L */ 752 RW_I93_TAG_IT_HF_I_PLUS_INLAY, /* Tag-it HF-I Plus Inlay */ 753 RW_I93_TAG_IT_HF_I_PLUS_CHIP, /* Tag-it HF-I Plus Chip */ 754 RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY, /* Tag-it HF-I Standard Chip/Inlyas */ 755 RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY, /* Tag-it HF-I Pro Chip/Inlyas */ 756 RW_I93_STM_LRI1K, /* STM LRI1K */ 757 RW_I93_STM_LRI2K, /* STM LRI2K */ 758 RW_I93_STM_LRIS2K, /* STM LRIS2K */ 759 RW_I93_STM_LRIS64K, /* STM LRIS64K */ 760 RW_I93_STM_M24LR64_R, /* STM M24LR64-R */ 761 RW_I93_STM_M24LR04E_R, /* STM M24LR04E-R */ 762 RW_I93_STM_M24LR16E_R, /* STM M24LR16E-R */ 763 RW_I93_STM_M24LR16D_W, /* STM M24LR16D-W */ 764 RW_I93_STM_M24LR64E_R, /* STM M24LR64E-R */ 765 RW_I93_STM_ST25DV04K, /* STM ST25DV04K */ 766 RW_I93_STM_ST25DVHIK, /* STM ST25DV 16K OR 64K */ 767 RW_I93_ONS_N36RW02, /* ONS N36RW02 */ 768 RW_I93_ONS_N24RF04, /* ONS N24RF04 */ 769 RW_I93_ONS_N24RF04E, /* ONS N24RF04E */ 770 RW_I93_ONS_N24RF16, /* ONS N24RF16 */ 771 RW_I93_ONS_N24RF16E, /* ONS N24RF16E */ 772 RW_I93_ONS_N24RF64, /* ONS N24RF64 */ 773 RW_I93_ONS_N24RF64E, /* ONS N24RF64E */ 774 RW_I93_UNKNOWN_PRODUCT /* Unknwon product version */ 775 }; 776 777 typedef struct { 778 tRW_I93_RW_STATE state; /* main state */ 779 tRW_I93_RW_SUBSTATE sub_state; /* sub state */ 780 TIMER_LIST_ENT timer; /* timeout for each sent command */ 781 uint8_t sent_cmd; /* last sent command */ 782 uint8_t retry_count; /* number of retry */ 783 NFC_HDR* p_retry_cmd; /* buffer to store cmd sent last */ 784 785 uint8_t info_flags; /* information flags */ 786 uint8_t uid[I93_UID_BYTE_LEN]; /* UID of currently activated */ 787 uint8_t dsfid; /* DSFID if I93_INFO_FLAG_DSFID */ 788 uint8_t afi; /* AFI if I93_INFO_FLAG_AFI */ 789 uint8_t block_size; /* block size of tag, in bytes */ 790 uint16_t num_block; /* number of blocks in tag */ 791 uint8_t ic_reference; /* IC Reference of tag */ 792 uint8_t product_version; /* tag product version */ 793 794 uint8_t intl_flags; /* flags for internal information */ 795 796 uint8_t tlv_detect_state; /* TLV detecting state */ 797 uint8_t tlv_type; /* currently detected type */ 798 uint8_t addr_mode; 799 uint8_t i93_t5t_mode; 800 uint8_t t5t_area_start_block; /* offset of first block of T5T_Area */ 801 uint16_t t5t_area_last_offset; /* offset of last byte of T5T_Area */ 802 803 /* Greedy collection with NDEF Detection data */ 804 uint8_t gre_validity; 805 uint8_t gre_cc_content[8]; 806 uint16_t gre_ndef_tlv_pos; 807 uint16_t gre_ndef_tlv_length; 808 uint16_t tlv_length; /* currently detected length */ 809 810 uint16_t ndef_tlv_start_offset; /* offset of first byte of NDEF TLV */ 811 uint16_t ndef_tlv_last_offset; /* offset of last byte of NDEF TLV */ 812 uint16_t max_ndef_length; /* max NDEF length the tag contains */ 813 uint16_t ndef_length; /* length of NDEF data */ 814 815 uint8_t* p_update_data; /* pointer of data to update */ 816 uint16_t rw_length; /* bytes to read/write */ 817 uint16_t rw_offset; /* offset to read/write */ 818 bool in_pres_check; 819 } tRW_I93_CB; 820 821 /* RW memory control blocks */ 822 typedef union { 823 tRW_T1T_CB t1t; 824 tRW_T2T_CB t2t; 825 tRW_T3T_CB t3t; 826 tRW_T4T_CB t4t; 827 tRW_I93_CB i93; 828 tRW_MFC_CB mfc; 829 } tRW_TCB; 830 831 /* RW callback type */ 832 #define RW_CB_TYPE_UNKNOWN 0 833 #define RW_CB_TYPE_T1T 1 834 #define RW_CB_TYPE_T2T 2 835 #define RW_CB_TYPE_T3T 3 836 #define RW_CB_TYPE_T4T 4 837 #define RW_CB_TYPE_T5T 5 838 #define RW_CB_TYPE_MIFARE 6 839 typedef uint8_t tRW_CB_TYPE; 840 841 /* RW control blocks */ 842 typedef struct { 843 tRW_CB_TYPE tcb_type; 844 tRW_TCB tcb; 845 tRW_CBACK* p_cback; 846 uint32_t cur_retry; /* Retry count for the current operation */ 847 #if (RW_STATS_INCLUDED == TRUE) 848 tRW_STATS stats; 849 #endif /* RW_STATS_INCLUDED */ 850 } tRW_CB; 851 852 /***************************************************************************** 853 ** EXTERNAL FUNCTION DECLARATIONS 854 *****************************************************************************/ 855 856 /* Global NFC data */ 857 extern tRW_CB rw_cb; 858 859 /* from .c */ 860 861 #if (RW_NDEF_INCLUDED == TRUE) 862 extern tRW_EVENT rw_t1t_handle_rsp(const tT1T_CMD_RSP_INFO* p_info, 863 bool* p_notify, uint8_t* p_data, 864 tNFC_STATUS* p_status); 865 extern tRW_EVENT rw_t1t_info_to_event(const tT1T_CMD_RSP_INFO* p_info); 866 #else 867 #define rw_t1t_handle_rsp(p, a, b, c) t1t_info_to_evt(p) 868 #define rw_t1t_info_to_event(p) t1t_info_to_evt(p) 869 #endif 870 871 extern void rw_init(void); 872 extern tNFC_STATUS rw_t1t_select(uint8_t hr[T1T_HR_LEN], 873 uint8_t uid[T1T_CMD_UID_LEN]); 874 extern tNFC_STATUS rw_t1t_send_dyn_cmd(uint8_t opcode, uint8_t add, 875 uint8_t* p_dat); 876 extern tNFC_STATUS rw_t1t_send_static_cmd(uint8_t opcode, uint8_t add, 877 uint8_t dat); 878 extern void rw_t1t_process_timeout(TIMER_LIST_ENT* p_tle); 879 extern void rw_t1t_handle_op_complete(void); 880 881 #if (RW_NDEF_INCLUDED == TRUE) 882 extern tRW_EVENT rw_t2t_info_to_event(const tT2T_CMD_RSP_INFO* p_info); 883 extern void rw_t2t_handle_rsp(uint8_t* p_data); 884 #else 885 #define rw_t2t_info_to_event(p) t2t_info_to_evt(p) 886 #define rw_t2t_handle_rsp(p) 887 #endif 888 889 extern tNFC_STATUS rw_t2t_sector_change(uint8_t sector); 890 extern tNFC_STATUS rw_t2t_read(uint16_t block); 891 extern tNFC_STATUS rw_t2t_write(uint16_t block, uint8_t* p_write_data); 892 extern void rw_t2t_process_timeout(); 893 extern tNFC_STATUS rw_t2t_select(void); 894 void rw_t2t_handle_op_complete(void); 895 896 extern void rw_t3t_process_timeout(TIMER_LIST_ENT* p_tle); 897 extern tNFC_STATUS rw_t3t_select(uint8_t peer_nfcid2[NCI_RF_F_UID_LEN], 898 uint8_t mrti_check, uint8_t mrti_update); 899 void rw_t3t_handle_nci_poll_rsp(uint8_t nci_status); 900 void rw_t3t_handle_nci_poll_ntf(uint8_t nci_status, uint8_t num_responses, 901 uint8_t sensf_res_buf_size, 902 uint8_t* p_sensf_res_buf); 903 904 extern tNFC_STATUS rw_t4t_select(void); 905 extern void rw_t4t_process_timeout(TIMER_LIST_ENT* p_tle); 906 907 extern tNFC_STATUS rw_i93_select(uint8_t* p_uid); 908 extern void rw_i93_process_timeout(TIMER_LIST_ENT* p_tle); 909 extern std::string rw_i93_get_state_name(uint8_t state); 910 extern std::string rw_i93_get_sub_state_name(uint8_t sub_state); 911 extern void rw_t5t_sm_detect_ndef(NFC_HDR*); 912 extern void rw_t5t_sm_update_ndef(NFC_HDR*); 913 extern void rw_t5t_sm_set_read_only(NFC_HDR*); 914 915 extern void rw_t4t_handle_isodep_nak_rsp(uint8_t status, bool is_ntf); 916 917 extern tNFC_STATUS rw_mfc_select(uint8_t selres, uint8_t uid[T1T_CMD_UID_LEN]); 918 extern void rw_mfc_process_timeout(TIMER_LIST_ENT* p_tle); 919 #if (RW_STATS_INCLUDED == TRUE) 920 /* Internal fcns for statistics (from rw_main.c) */ 921 void rw_main_reset_stats(void); 922 void rw_main_update_tx_stats(uint32_t bytes_tx, bool is_retry); 923 void rw_main_update_rx_stats(uint32_t bytes_rx); 924 void rw_main_update_crc_error_stats(void); 925 void rw_main_update_trans_error_stats(void); 926 void rw_main_update_fail_stats(void); 927 void rw_main_log_stats(void); 928 #endif /* RW_STATS_INCLUDED */ 929 930 #endif /* RW_INT_H_ */ 931