1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2012 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 "tags_defs.h" 30 #include "tags_int.h" 31 #include "rw_api.h" 32 33 /* Proprietary definitions for HR0 and HR1 */ 34 #define RW_T1T_HR0_HI_NIB 0xF0 /* HI NIB Tag */ 35 #define RW_T1T_IS_JEWEL64 0x20 /* Jewel 64 Tag */ 36 #define RW_T1T_IS_JEWEL 0x00 /* Jewel Tag */ 37 #define RW_T1T_IS_TOPAZ 0x10 /* TOPAZ Tag */ 38 #define RW_T1T_IS_TOPAZ96 0x11 /* TOPAZ96 Tag */ 39 #define RW_T1T_IS_TOPAZ512 0x12 /* TOPAZ512 Tag */ 40 #define RW_T1T_HR1_MIN 0x49 /* Supports dynamic commands on static tag if HR1 > 0x49 */ 41 42 #define RW_T1T_MAX_MEM_TLVS 0x05 /* Maximum supported Memory control TLVS in the tag */ 43 #define RW_T1T_MAX_LOCK_TLVS 0x05 /* Maximum supported Lock control TLVS in the tag */ 44 #define RW_T1T_MAX_LOCK_BYTES 0x1E /* Maximum supported dynamic lock bytes */ 45 46 /* State of the Tag as interpreted by RW */ 47 #define RW_T1_TAG_ATTRB_UNKNOWN 0x00 /* TAG State is unknown to RW */ 48 #define RW_T1_TAG_ATTRB_INITIALIZED 0x01 /* TAG is in INITIALIZED state */ 49 #define RW_T1_TAG_ATTRB_INITIALIZED_NDEF 0x02 /* TAG is in INITIALIZED state and has NDEF tlv with len=0 */ 50 #define RW_T1_TAG_ATTRB_READ_ONLY 0x03 /* TAG is in READ ONLY state */ 51 #define RW_T1_TAG_ATTRB_READ_WRITE 0x04 /* TAG is in READ WRITE state */ 52 53 #define RW_T1T_LOCK_NOT_UPDATED 0x00 /* Lock not yet set as part of SET TAG RO op */ 54 #define RW_T1T_LOCK_UPDATE_INITIATED 0x01 /* Sent command to set the Lock bytes */ 55 #define RW_T1T_LOCK_UPDATED 0x02 /* Lock bytes are set */ 56 typedef UINT8 tRW_T1T_LOCK_STATUS; 57 58 /* States */ 59 #define RW_T1T_STATE_NOT_ACTIVATED 0x00 /* Tag not activated and or response not received for RID */ 60 #define RW_T1T_STATE_IDLE 0x01 /* T1 Tag activated and ready to perform rw operation on Tag*/ 61 #define RW_T1T_STATE_READ 0x02 /* waiting rsp for read command sent to tag */ 62 #define RW_T1T_STATE_WRITE 0x03 /* waiting rsp for write command sent to tag */ 63 #define RW_T1T_STATE_TLV_DETECT 0x04 /* performing TLV detection procedure */ 64 #define RW_T1T_STATE_READ_NDEF 0x05 /* performing read NDEF procedure */ 65 #define RW_T1T_STATE_WRITE_NDEF 0x06 /* performing update NDEF procedure */ 66 #define RW_T1T_STATE_SET_TAG_RO 0x07 /* Setting Tag as read only tag */ 67 #define RW_T1T_STATE_CHECK_PRESENCE 0x08 /* Check if Tag is still present */ 68 #define RW_T1T_STATE_FORMAT_TAG 0x09 /* Format T1 Tag */ 69 70 /* Sub states */ 71 #define RW_T1T_SUBSTATE_NONE 0x00 /* Default substate */ 72 73 /* Sub states in RW_T1T_STATE_TLV_DETECT state */ 74 #define RW_T1T_SUBSTATE_WAIT_TLV_DETECT 0x01 /* waiting for the detection of a tlv in a tag */ 75 #define RW_T1T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN 0x02 /* waiting for finding the len field is 1 or 3 bytes long */ 76 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN0 0x03 /* waiting for extracting len field value */ 77 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_LEN1 0x04 /* waiting for extracting len field value */ 78 #define RW_T1T_SUBSTATE_WAIT_READ_TLV_VALUE 0x05 /* waiting for extracting value field in the TLV */ 79 #define RW_T1T_SUBSTATE_WAIT_READ_LOCKS 0x06 /* waiting for reading dynamic locks in the TLV */ 80 81 /* Sub states in RW_T1T_STATE_WRITE_NDEF state */ 82 #define RW_T1T_SUBSTATE_WAIT_READ_NDEF_BLOCK 0x07 /* waiting for response of reading a block that will be partially updated */ 83 #define RW_T1T_SUBSTATE_WAIT_INVALIDATE_NDEF 0x08 /* waiting for response of invalidating NDEF Msg */ 84 #define RW_T1T_SUBSTATE_WAIT_NDEF_WRITE 0x09 /* waiting for response of writing a part of NDEF Msg */ 85 #define RW_T1T_SUBSTATE_WAIT_NDEF_UPDATED 0x0A /* waiting for response of writing last part of NDEF Msg */ 86 #define RW_T1T_SUBSTATE_WAIT_VALIDATE_NDEF 0x0B /* waiting for response of validating NDEF Msg */ 87 88 /* Sub states in RW_T1T_STATE_SET_TAG_RO state */ 89 #define RW_T1T_SUBSTATE_WAIT_SET_CC_RWA_RO 0x0C /* waiting for response of setting CC-RWA to read only */ 90 #define RW_T1T_SUBSTATE_WAIT_SET_ST_LOCK_BITS 0x0D /* waiting for response of setting all static lock bits */ 91 #define RW_T1T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS 0x0E /* waiting for response of setting all dynamic lock bits */ 92 93 /* Sub states in RW_T1T_STATE_FORMAT_TAG state */ 94 #define RW_T1T_SUBSTATE_WAIT_SET_CC 0x0F /* waiting for response to format/set capability container */ 95 #define RW_T1T_SUBSTATE_WAIT_SET_NULL_NDEF 0x10 /* waiting for response to format/set NULL NDEF */ 96 97 98 typedef struct 99 { 100 UINT16 offset; /* Offset of the lock byte in the Tag */ 101 UINT8 num_bits; /* Number of lock bits in the lock byte */ 102 UINT8 bytes_locked_per_bit; /* No. of tag bytes gets locked by a bit in this byte */ 103 } tRW_T1T_LOCK_INFO; 104 105 typedef struct 106 { 107 UINT16 offset; /* Reserved bytes offset taken from Memory control TLV */ 108 UINT8 num_bytes; /* Number of reserved bytes as per the TLV */ 109 }tRW_T1T_RES_INFO; 110 111 typedef struct 112 { 113 UINT8 tlv_index; /* Index of Lock control tlv that points to this address*/ 114 UINT8 byte_index; /* Index of Lock byte pointed by the TLV */ 115 UINT8 lock_byte; /* Value in the lock byte */ 116 tRW_T1T_LOCK_STATUS lock_status; /* Indicates if it is modifed to set tag as Read only */ 117 BOOLEAN b_lock_read; /* Is the lock byte is already read from tag */ 118 } tRW_T1T_LOCK; 119 120 typedef struct 121 { 122 UINT8 addr; /* ADD/ADD8/ADDS field value */ 123 UINT8 op_code; /* Command sent */ 124 UINT8 rsp_len; /* expected length of the response */ 125 UINT8 pend_retx_rsp; /* Number of pending rsps to retransmission on prev cmd */ 126 } tRW_T1T_PREV_CMD_RSP_INFO; 127 128 #if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 129 #define T1T_BUFFER_SIZE T1T_STATIC_SIZE /* Buffer 0-E block, for easier tlv operation */ 130 #else 131 #define T1T_BUFFER_SIZE T1T_UID_LEN /* Buffer UID */ 132 #endif 133 134 /* RW Type 1 Tag control blocks */ 135 typedef struct 136 { 137 UINT8 hr[T1T_HR_LEN]; /* Header ROM byte 0 - 0x1y,Header ROM byte 1 - 0x00 */ 138 UINT8 mem[T1T_SEGMENT_SIZE]; /* Tag contents of block 0 or from block 0-E */ 139 tT1T_CMD_RSP_INFO *p_cmd_rsp_info; /* Pointer to Command rsp info of last sent command */ 140 UINT8 state; /* Current state of RW module */ 141 UINT8 tag_attribute; /* Present state of the Tag as interpreted by RW */ 142 BT_HDR *p_cur_cmd_buf; /* Buffer to hold cur sent command for retransmission */ 143 UINT8 addr; /* ADD/ADD8/ADDS value */ 144 tRW_T1T_PREV_CMD_RSP_INFO prev_cmd_rsp_info; /* Information about previous sent command if retx */ 145 TIMER_LIST_ENT timer; /* timer to set timelimit for the response to command */ 146 BOOLEAN b_update; /* Tag header updated */ 147 BOOLEAN b_rseg; /* Segment 0 read from tag */ 148 BOOLEAN b_hard_lock; /* Hard lock the tag as part of config tag to Read only */ 149 #if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 150 UINT8 segment; /* Current Tag segment */ 151 UINT8 substate; /* Current substate of RW module */ 152 UINT16 work_offset; /* Working byte offset */ 153 UINT8 ndef_first_block[T1T_BLOCK_SIZE]; /* Buffer for ndef first block */ 154 UINT8 ndef_final_block[T1T_BLOCK_SIZE]; /* Buffer for ndef last block */ 155 UINT8 *p_ndef_buffer; /* Buffer to store ndef message */ 156 UINT16 new_ndef_msg_len; /* Lenght of new updating NDEF Message */ 157 UINT8 block_read; /* Last read Block */ 158 UINT8 write_byte; /* Index of last written byte */ 159 UINT8 tlv_detect; /* TLV type under detection */ 160 UINT16 ndef_msg_offset; /* The offset on Tag where first NDEF message is present*/ 161 UINT16 ndef_msg_len; /* Lenght of NDEF Message */ 162 UINT16 max_ndef_msg_len; /* Maximum size of NDEF that can be written on the tag */ 163 UINT16 ndef_header_offset; /* The offset on Tag where first NDEF tlv is present */ 164 UINT8 ndef_block_written; /* Last block where NDEF bytes are written */ 165 UINT8 num_ndef_finalblock; /* Block number where NDEF's last byte will be present */ 166 UINT8 num_lock_tlvs; /* Number of lcok tlvs detected in the tag */ 167 tRW_T1T_LOCK_INFO lock_tlv[RW_T1T_MAX_LOCK_TLVS]; /* Information retrieved from lock control tlv */ 168 UINT8 num_lockbytes; /* Number of dynamic lock bytes present in the tag */ 169 tRW_T1T_LOCK lockbyte[RW_T1T_MAX_LOCK_BYTES]; /* Dynamic Lock byte information */ 170 UINT8 num_mem_tlvs; /* Number of memory tlvs detected in the tag */ 171 tRW_T1T_RES_INFO mem_tlv[RW_T1T_MAX_MEM_TLVS]; /* Information retrieved from mem tlv */ 172 UINT8 attr_seg; /* Tag segment for which attributes are prepared */ 173 UINT8 lock_attr_seg; /* Tag segment for which lock attributes are prepared */ 174 UINT8 attr[T1T_BLOCKS_PER_SEGMENT]; /* byte information - Reserved/lock/otp or data */ 175 UINT8 lock_attr[T1T_BLOCKS_PER_SEGMENT]; /* byte information - read only or read write */ 176 #endif 177 } tRW_T1T_CB; 178 179 /* Mifare Ultalight/ Ultralight Family blank tag version block settings */ 180 #define T2T_MIFARE_VERSION_BLOCK 0x04 /* Block where version number of the tag is stored */ 181 #define T2T_MIFARE_ULTRALIGHT_VER_NO 0xFFFF /* Blank Ultralight tag - Block 4 (byte 0, byte 1) */ 182 #define T2T_MIFARE_ULTRALIGHT_FAMILY_VER_NO 0x0200 /* Blank Ultralight family tag - Block 4 (byte 0, byte 1) */ 183 184 /* Infineon my-d move / my-d blank tag uid block settings */ 185 #define T2T_INFINEON_VERSION_BLOCK 0x00 186 #define T2T_INFINEON_MYD_MOVE_LEAN 0x0570 187 #define T2T_INFINEON_MYD_MOVE 0x0530 188 189 #define T2T_BRCM_VERSION_BLOCK 0x00 190 #define T2T_BRCM_STATIC_MEM 0x2E01 191 #define T2T_BRCM_DYNAMIC_MEM 0x2E02 192 193 /* CC2 value on MiFare ULC tag */ 194 #define T2T_MIFARE_ULC_TMS 0x12 195 /* Possible corrupt cc2 value range on MiFare ULC tags */ 196 #define T2T_INVALID_CC_TMS_VAL0 0x10 197 #define T2T_INVALID_CC_TMS_VAL1 0x1F 198 199 #define T2T_NDEF_NOT_DETECTED 0x00 200 #define T2T_NDEF_DETECTED 0x01 201 #define T2T_NDEF_READ 0x02 202 203 #define T2T_MAX_NDEF_OFFSET 128 /* Max offset of an NDEF message in a T2 tag */ 204 #define T2T_MAX_RESERVED_BYTES_IN_TAG 0x64 205 #define T2T_MAX_LOCK_BYTES_IN_TAG 0x64 206 207 #define RW_T2T_MAX_MEM_TLVS 0x05 /* Maximum supported Memory control TLVS in the tag */ 208 #define RW_T2T_MAX_LOCK_TLVS 0x05 /* Maximum supported Lock control TLVS in the tag */ 209 #define RW_T2T_MAX_LOCK_BYTES 0x1E /* Maximum supported dynamic lock bytes */ 210 #define RW_T2T_SEGMENT_BYTES 128 211 #define RW_T2T_SEGMENT_SIZE 16 212 213 #define RW_T2T_LOCK_NOT_UPDATED 0x00 /* Lock not yet set as part of SET TAG RO op */ 214 #define RW_T2T_LOCK_UPDATE_INITIATED 0x01 /* Sent command to set the Lock bytes */ 215 #define RW_T2T_LOCK_UPDATED 0x02 /* Lock bytes are set */ 216 typedef UINT8 tRW_T2T_LOCK_STATUS; 217 218 219 /* States */ 220 #define RW_T2T_STATE_NOT_ACTIVATED 0x00 /* Tag not activated */ 221 #define RW_T2T_STATE_IDLE 0x01 /* T1 Tag activated and ready to perform rw operation on Tag*/ 222 #define RW_T2T_STATE_READ 0x02 /* waiting response for read command sent to tag */ 223 #define RW_T2T_STATE_WRITE 0x03 /* waiting response for write command sent to tag */ 224 #define RW_T2T_STATE_SELECT_SECTOR 0x04 /* Waiting response for sector select command */ 225 #define RW_T2T_STATE_DETECT_TLV 0x05 /* Detecting Lock/Memory/NDEF/Proprietary TLV in the Tag */ 226 #define RW_T2T_STATE_READ_NDEF 0x06 /* Performing NDEF Read procedure */ 227 #define RW_T2T_STATE_WRITE_NDEF 0x07 /* Performing NDEF Write procedure */ 228 #define RW_T2T_STATE_SET_TAG_RO 0x08 /* Setting Tag as Read only tag */ 229 #define RW_T2T_STATE_CHECK_PRESENCE 0x09 /* Check if Tag is still present */ 230 #define RW_T2T_STATE_FORMAT_TAG 0x0A /* Format the tag */ 231 232 /* rw_t2t_read/rw_t2t_write takes care of sector change if the block to read/write is in a different sector 233 * Next Substate should be assigned to control variable 'substate' before calling these function for State Machine to 234 * move back to the particular substate after Sector change is completed and read/write command is sent on new sector */ 235 236 /* Sub states */ 237 #define RW_T2T_SUBSTATE_NONE 0x00 238 239 /* Sub states in RW_T2T_STATE_SELECT_SECTOR state */ 240 #define RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR_SUPPORT 0x01 /* waiting for response of sector select CMD 1 */ 241 #define RW_T2T_SUBSTATE_WAIT_SELECT_SECTOR 0x02 /* waiting for response of sector select CMD 2 */ 242 243 /* Sub states in RW_T1T_STATE_DETECT_XXX state */ 244 #define RW_T2T_SUBSTATE_WAIT_READ_CC 0x03 /* waiting for the detection of a tlv in a tag */ 245 #define RW_T2T_SUBSTATE_WAIT_TLV_DETECT 0x04 /* waiting for the detection of a tlv in a tag */ 246 #define RW_T2T_SUBSTATE_WAIT_FIND_LEN_FIELD_LEN 0x05 /* waiting for finding the len field is 1 or 3 bytes long */ 247 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN0 0x06 /* waiting for extracting len field value */ 248 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_LEN1 0x07 /* waiting for extracting len field value */ 249 #define RW_T2T_SUBSTATE_WAIT_READ_TLV_VALUE 0x08 /* waiting for extracting value field in the TLV */ 250 #define RW_T2T_SUBSTATE_WAIT_READ_LOCKS 0x09 /* waiting for reading dynamic locks in the TLV */ 251 252 /* Sub states in RW_T2T_STATE_WRITE_NDEF state */ 253 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_FIRST_BLOCK 0x0A /* waiting for rsp to reading the block where NDEF starts */ 254 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_LAST_BLOCK 0x0B /* waiting for rsp to reading block where new NDEF Msg ends */ 255 #define RW_T2T_SUBSTATE_WAIT_READ_TERM_TLV_BLOCK 0x0C /* waiting for rsp to reading block where Trm tlv gets added*/ 256 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_NEXT_BLOCK 0x0D /* waiting for rsp to reading block where nxt NDEF write */ 257 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_NEXT_BLOCK 0x0E /* waiting for rsp to writting NDEF block */ 258 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LAST_BLOCK 0x0F /* waiting for rsp to last NDEF block write cmd */ 259 #define RW_T2T_SUBSTATE_WAIT_READ_NDEF_LEN_BLOCK 0x10 /* waiting for rsp to reading NDEF len field block */ 260 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_BLOCK 0x11 /* waiting for rsp of updating first NDEF len field block */ 261 #define RW_T2T_SUBSTATE_WAIT_WRITE_NDEF_LEN_NEXT_BLOCK 0x12 /* waiting for rsp of updating next NDEF len field block */ 262 #define RW_T2T_SUBSTATE_WAIT_WRITE_TERM_TLV_CMPLT 0x13 /* waiting for rsp to writing to Terminator tlv */ 263 264 /* Sub states in RW_T2T_STATE_FORMAT_TAG state */ 265 #define RW_T2T_SUBSTATE_WAIT_READ_VERSION_INFO 0x14 266 #define RW_T2T_SUBSTATE_WAIT_SET_CC 0x15 /* waiting for response to format/set capability container */ 267 #define RW_T2T_SUBSTATE_WAIT_SET_LOCK_TLV 0x16 268 #define RW_T2T_SUBSTATE_WAIT_SET_NULL_NDEF 0x17 /* waiting for response to format/set NULL NDEF */ 269 270 /* Sub states in RW_T2T_STATE_SET_TAG_RO state */ 271 #define RW_T2T_SUBSTATE_WAIT_SET_CC_RO 0x19 /* waiting for response to set CC3 to RO */ 272 #define RW_T2T_SUBSTATE_WAIT_READ_DYN_LOCK_BYTE_BLOCK 0x1A /* waiting for response to read dynamic lock bytes block */ 273 #define RW_T2T_SUBSTATE_WAIT_SET_DYN_LOCK_BITS 0x1B /* waiting for response to set dynamic lock bits */ 274 #define RW_T2T_SUBSTATE_WAIT_SET_ST_LOCK_BITS 0x1C /* waiting for response to set static lock bits */ 275 276 typedef struct 277 { 278 UINT16 offset; /* Offset of the lock byte in the Tag */ 279 UINT8 num_bits; /* Number of lock bits in the lock byte */ 280 UINT8 bytes_locked_per_bit; /* No. of tag bytes gets locked by a bit in this byte */ 281 } tRW_T2T_LOCK_INFO; 282 283 typedef struct 284 { 285 UINT16 offset; /* Reserved bytes offset taken from Memory control TLV */ 286 UINT8 num_bytes; /* Number of reserved bytes as per the TLV */ 287 }tRW_T2T_RES_INFO; 288 289 typedef struct 290 { 291 UINT8 tlv_index; /* Index of Lock control tlv that points to this address */ 292 UINT8 byte_index; /* Index of Lock byte pointed by the TLV */ 293 UINT8 lock_byte; /* Value in the lock byte */ 294 tRW_T2T_LOCK_STATUS lock_status; /* Indicates if it is modifed to set tag as Read only */ 295 BOOLEAN b_lock_read; /* Is the lock byte is already read from tag */ 296 } tRW_T2T_LOCK; 297 298 /* RW Type 2 Tag control block */ 299 typedef struct 300 { 301 UINT8 state; /* Reader/writer state */ 302 UINT8 substate; /* Reader/write substate in NDEF write state */ 303 UINT8 prev_substate; /* Substate of the tag before moving to different sector */ 304 UINT8 sector; /* Sector number that is selected */ 305 UINT8 select_sector; /* Sector number that is expected to get selected */ 306 UINT8 tag_hdr[T2T_READ_DATA_LEN]; /* T2T Header blocks */ 307 UINT8 tag_data[T2T_READ_DATA_LEN]; /* T2T Block 4 - 7 data */ 308 UINT8 ndef_status; /* The current status of NDEF Write operation */ 309 UINT16 block_read; /* Read block */ 310 UINT16 block_written; /* Written block */ 311 tT2T_CMD_RSP_INFO *p_cmd_rsp_info; /* Pointer to Command rsp info of last sent command */ 312 BT_HDR *p_cur_cmd_buf; /* Copy of current command, for retx/send after sector change */ 313 BT_HDR *p_sec_cmd_buf; /* Copy of command, to send after sector change */ 314 TIMER_LIST_ENT t2_timer; /* timeout for each API call */ 315 BOOLEAN b_read_hdr; /* Tag header read from tag */ 316 BOOLEAN b_read_data; /* Tag data block read from tag */ 317 BOOLEAN b_hard_lock; /* Hard lock the tag as part of config tag to Read only */ 318 #if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 319 UINT8 found_tlv; /* The Tlv found while searching a particular TLV */ 320 UINT8 tlv_detect; /* TLV type under detection */ 321 UINT8 num_lock_tlvs; /* Number of lcok tlvs detected in the tag */ 322 UINT8 attr_seg; /* Tag segment for which attributes are prepared */ 323 UINT8 lock_attr_seg; /* Tag segment for which lock attributes are prepared */ 324 UINT8 segment; /* Current operating segment */ 325 UINT8 ndef_final_block[T2T_BLOCK_SIZE]; /* Buffer for ndef last block */ 326 UINT8 num_mem_tlvs; /* Number of memory tlvs detected in the tag */ 327 UINT8 num_lockbytes; /* Number of dynamic lock bytes present in the tag */ 328 UINT8 attr[RW_T2T_SEGMENT_SIZE]; /* byte information - Reserved/lock/otp or data */ 329 UINT8 lock_attr[RW_T2T_SEGMENT_SIZE]; /* byte information - read only or read write */ 330 UINT8 tlv_value[3]; /* Read value field of TLV */ 331 UINT8 ndef_first_block[T2T_BLOCK_LEN]; /* NDEF TLV Header block */ 332 UINT8 ndef_read_block[T2T_BLOCK_LEN]; /* Buffer to hold read before write block */ 333 UINT8 ndef_last_block[T2T_BLOCK_LEN]; /* Terminator TLV block after NDEF Write operation */ 334 UINT8 terminator_tlv_block[T2T_BLOCK_LEN];/* Terminator TLV Block */ 335 UINT16 ndef_last_block_num; /* Block where last byte of updating ndef message will exist */ 336 UINT16 ndef_read_block_num; /* Block read during NDEF Write to avoid overwritting res bytes */ 337 UINT16 bytes_count; /* No. of bytes remaining to collect during tlv detect */ 338 UINT16 terminator_byte_index; /* The offset of the tag where terminator tlv may be added */ 339 UINT16 work_offset; /* Working byte offset */ 340 UINT16 ndef_header_offset; 341 UINT16 ndef_msg_offset; /* Offset on Tag where first NDEF message is present */ 342 UINT16 ndef_msg_len; /* Lenght of NDEF Message */ 343 UINT16 max_ndef_msg_len; /* Maximum size of NDEF that can be written on the tag */ 344 UINT16 new_ndef_msg_len; /* Lenght of new updating NDEF Message */ 345 UINT16 ndef_write_block; 346 UINT16 prop_msg_len; /* Proprietary tlv length */ 347 UINT8 *p_new_ndef_buffer; /* Pointer to updating NDEF Message */ 348 UINT8 *p_ndef_buffer; /* Pointer to NDEF Message */ 349 tRW_T2T_LOCK_INFO lock_tlv[RW_T2T_MAX_LOCK_TLVS]; /* Information retrieved from lock control tlv */ 350 tRW_T2T_LOCK lockbyte[RW_T2T_MAX_LOCK_BYTES]; /* Dynamic Lock byte information */ 351 tRW_T2T_RES_INFO mem_tlv[RW_T2T_MAX_MEM_TLVS]; /* Information retrieved from mem tlv */ 352 #endif 353 } tRW_T2T_CB; 354 355 /* Type 3 Tag control block */ 356 typedef UINT8 tRW_T3T_RW_STATE; 357 358 typedef struct 359 { 360 tNFC_STATUS status; 361 UINT8 version; /* Ver: peer version */ 362 UINT8 nbr; /* NBr: number of blocks that can be read using one Check command */ 363 UINT8 nbw; /* Nbw: number of blocks that can be written using one Update command */ 364 UINT16 nmaxb; /* Nmaxb: maximum number of blocks available for NDEF data */ 365 UINT8 writef; /* WriteFlag: 00h if writing data finished; 0Fh if writing data in progress */ 366 UINT8 rwflag; /* RWFlag: 00h NDEF is read-only; 01h if read/write available */ 367 UINT32 ln; /* Ln: actual size of stored NDEF data (in bytes) */ 368 } tRW_T3T_DETECT; 369 370 /* RW_T3T control block flags */ 371 #define RW_T3T_FL_IS_FINAL_NDEF_SEGMENT 0x01 /* The final command for completing the NDEF read/write */ 372 #define RW_T3T_FL_W4_PRESENCE_CHECK_POLL_RSP 0x02 /* Waiting for POLL response for presence check */ 373 #define RW_T3T_FL_W4_GET_SC_POLL_RSP 0x04 /* Waiting for POLL response for RW_T3tGetSystemCodes */ 374 #define RW_T3T_FL_W4_NDEF_DETECT_POLL_RSP 0x08 /* Waiting for POLL response for RW_T3tDetectNDef */ 375 #define RW_T3T_FL_W4_FMT_FELICA_LITE_POLL_RSP 0x10 /* Waiting for POLL response for RW_T3tFormat */ 376 377 typedef struct 378 { 379 UINT32 cur_tout; /* Current command timeout */ 380 tRW_T3T_RW_STATE rw_state; /* Reader/writer state */ 381 UINT8 rw_substate; 382 UINT8 cur_cmd; /* Current command being executed */ 383 BT_HDR *p_cur_cmd_buf; /* Copy of current command, for retransmission */ 384 TIMER_LIST_ENT timer; /* timeout for waiting for response */ 385 TIMER_LIST_ENT poll_timer; /* timeout for waiting for response */ 386 387 tRW_T3T_DETECT ndef_attrib; /* T3T NDEF attribute information */ 388 389 UINT32 ndef_msg_len; /* Length of ndef message to send */ 390 UINT32 ndef_msg_bytes_sent; /* Length of ndef message sent so far */ 391 UINT8 *ndef_msg; /* Buffer for outgoing NDEF message */ 392 UINT32 ndef_rx_readlen; /* Number of bytes read in current CHECK command */ 393 UINT32 ndef_rx_offset; /* Length of ndef message read so far */ 394 395 UINT8 num_system_codes; /* System codes detected */ 396 UINT16 system_codes[T3T_MAX_SYSTEM_CODES]; 397 398 UINT8 peer_nfcid2[NCI_NFCID2_LEN]; 399 UINT8 cur_poll_rc; /* RC used in current POLL command */ 400 401 UINT8 flags; /* Flags see RW_T3T_FL_* */ 402 } tRW_T3T_CB; 403 404 405 /* 406 ** Type 4 Tag 407 */ 408 409 /* Max data size using a single ReadBinary. 2 bytes are for status bytes */ 410 #define RW_T4T_MAX_DATA_PER_READ (NFC_RW_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_DATA_HDR_SIZE - T4T_RSP_STATUS_WORDS_SIZE) 411 412 /* Max data size using a single UpdateBinary. 6 bytes are for CLA, INS, P1, P2, Lc */ 413 #define RW_T4T_MAX_DATA_PER_WRITE (NFC_RW_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_MSG_OFFSET_SIZE - NCI_DATA_HDR_SIZE - T4T_CMD_MAX_HDR_SIZE) 414 415 416 417 /* Mandatory NDEF file control */ 418 typedef struct 419 { 420 UINT16 file_id; /* File Identifier */ 421 UINT16 max_file_size; /* Max NDEF file size */ 422 UINT8 read_access; /* read access condition */ 423 UINT8 write_access; /* write access condition */ 424 } tRW_T4T_NDEF_FC; 425 426 /* Capability Container */ 427 typedef struct 428 { 429 UINT16 cclen; /* the size of this capability container */ 430 UINT8 version; /* the mapping specification version */ 431 UINT16 max_le; /* the max data size by a single ReadBinary */ 432 UINT16 max_lc; /* the max data size by a single UpdateBinary */ 433 tRW_T4T_NDEF_FC ndef_fc; /* Mandatory NDEF file control */ 434 } tRW_T4T_CC; 435 436 typedef UINT8 tRW_T4T_RW_STATE; 437 typedef UINT8 tRW_T4T_RW_SUBSTATE; 438 439 /* Type 4 Tag Control Block */ 440 typedef struct 441 { 442 tRW_T4T_RW_STATE state; /* main state */ 443 tRW_T4T_RW_SUBSTATE sub_state; /* sub state */ 444 UINT8 version; /* currently effective version */ 445 TIMER_LIST_ENT timer; /* timeout for each API call */ 446 447 UINT16 ndef_length; /* length of NDEF data */ 448 UINT8 *p_update_data; /* pointer of data to update */ 449 UINT16 rw_length; /* remaining bytes to read/write */ 450 UINT16 rw_offset; /* remaining offset to read/write */ 451 BT_HDR *p_data_to_free; /* GKI buffet to delete after done */ 452 453 tRW_T4T_CC cc_file; /* Capability Container File */ 454 455 #define RW_T4T_NDEF_STATUS_NDEF_DETECTED 0x01 /* NDEF has been detected */ 456 #define RW_T4T_NDEF_STATUS_NDEF_READ_ONLY 0x02 /* NDEF file is read-only */ 457 458 UINT8 ndef_status; /* bitmap for NDEF status */ 459 460 UINT16 max_read_size; /* max reading size per a command */ 461 UINT16 max_update_size; /* max updating size per a command */ 462 } tRW_T4T_CB; 463 464 /* RW retransmission statistics */ 465 #if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 466 typedef struct 467 { 468 UINT32 start_tick; /* System tick count at activation */ 469 UINT32 bytes_sent; /* Total bytes sent since activation */ 470 UINT32 bytes_received; /* Total bytes received since activation */ 471 UINT32 num_ops; /* Number of operations since activation */ 472 UINT32 num_retries; /* Number of retranmissions since activation */ 473 UINT32 num_crc; /* Number of crc failures */ 474 UINT32 num_trans_err; /* Number of transmission error notifications */ 475 UINT32 num_fail; /* Number of aborts (failures after retries) */ 476 } tRW_STATS; 477 #endif /* RW_STATS_INCLUDED */ 478 479 /* ISO 15693 RW Control Block */ 480 typedef UINT8 tRW_I93_RW_STATE; 481 typedef UINT8 tRW_I93_RW_SUBSTATE; 482 483 #define RW_I93_FLAG_READ_ONLY 0x01 /* tag is read-only */ 484 #define RW_I93_FLAG_READ_MULTI_BLOCK 0x02 /* tag supports read multi block */ 485 #define RW_I93_FLAG_RESET_DSFID 0x04 /* need to reset DSFID for formatting */ 486 #define RW_I93_FLAG_RESET_AFI 0x08 /* need to reset AFI for formatting */ 487 488 #define RW_I93_TLV_DETECT_STATE_TYPE 0x01 /* searching for type */ 489 #define RW_I93_TLV_DETECT_STATE_LENGTH_1 0x02 /* searching for the first byte of length */ 490 #define RW_I93_TLV_DETECT_STATE_LENGTH_2 0x03 /* searching for the second byte of length */ 491 #define RW_I93_TLV_DETECT_STATE_LENGTH_3 0x04 /* searching for the third byte of length */ 492 #define RW_I93_TLV_DETECT_STATE_VALUE 0x05 /* reading value field */ 493 494 enum 495 { 496 RW_I93_ICODE_SLI, /* ICODE SLI, SLIX */ 497 RW_I93_ICODE_SLI_S, /* ICODE SLI-S, SLIX-S */ 498 RW_I93_ICODE_SLI_L, /* ICODE SLI-L, SLIX-L */ 499 RW_I93_TAG_IT_HF_I_PLUS_INLAY, /* Tag-it HF-I Plus Inlay */ 500 RW_I93_TAG_IT_HF_I_PLUS_CHIP, /* Tag-it HF-I Plus Chip */ 501 RW_I93_TAG_IT_HF_I_STD_CHIP_INLAY, /* Tag-it HF-I Standard Chip/Inlyas */ 502 RW_I93_TAG_IT_HF_I_PRO_CHIP_INLAY, /* Tag-it HF-I Pro Chip/Inlyas */ 503 RW_I93_UNKNOWN_PRODUCT /* Unknwon product version */ 504 }; 505 506 typedef struct 507 { 508 tRW_I93_RW_STATE state; /* main state */ 509 tRW_I93_RW_SUBSTATE sub_state; /* sub state */ 510 TIMER_LIST_ENT timer; /* timeout for each sent command */ 511 UINT8 sent_cmd; /* last sent command */ 512 513 UINT8 info_flags; /* information flags */ 514 UINT8 uid[I93_UID_BYTE_LEN]; /* UID of currently activated */ 515 UINT8 dsfid; /* DSFID if I93_INFO_FLAG_DSFID */ 516 UINT8 afi; /* AFI if I93_INFO_FLAG_AFI */ 517 UINT8 block_size; /* block size of tag, in bytes */ 518 UINT16 num_block; /* number of blocks in tag */ 519 UINT8 ic_reference; /* IC Reference of tag */ 520 UINT8 product_version; /* tag product version */ 521 522 UINT8 intl_flags; /* flags for internal information */ 523 524 UINT8 tlv_detect_state; /* TLV detecting state */ 525 UINT8 tlv_type; /* currently detected type */ 526 UINT16 tlv_length; /* currently detected length */ 527 528 UINT16 ndef_tlv_start_offset; /* offset of first byte of NDEF TLV */ 529 UINT16 ndef_tlv_last_offset; /* offset of last byte of NDEF TLV */ 530 UINT16 max_ndef_length; /* max NDEF length the tag contains */ 531 UINT16 ndef_length; /* length of NDEF data */ 532 533 UINT8 *p_update_data; /* pointer of data to update */ 534 UINT16 rw_length; /* bytes to read/write */ 535 UINT16 rw_offset; /* offset to read/write */ 536 } tRW_I93_CB; 537 538 /* RW memory control blocks */ 539 typedef union 540 { 541 tRW_T1T_CB t1t; 542 tRW_T2T_CB t2t; 543 tRW_T3T_CB t3t; 544 tRW_T4T_CB t4t; 545 tRW_I93_CB i93; 546 } tRW_TCB; 547 548 /* RW control blocks */ 549 typedef struct 550 { 551 tRW_TCB tcb; 552 tRW_CBACK *p_cback; 553 UINT32 cur_retry; /* Retry count for the current operation */ 554 #if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 555 tRW_STATS stats; 556 #endif /* RW_STATS_INCLUDED */ 557 UINT8 trace_level; 558 } tRW_CB; 559 560 561 /***************************************************************************** 562 ** EXTERNAL FUNCTION DECLARATIONS 563 *****************************************************************************/ 564 565 #ifdef __cplusplus 566 extern "C" { 567 #endif 568 569 /* Global NFC data */ 570 #if NFC_DYNAMIC_MEMORY == FALSE 571 NFC_API extern tRW_CB rw_cb; 572 #else 573 NFC_API extern tRW_CB *rw_cb_ptr; 574 #define rw_cb (*rw_cb_ptr) 575 #endif 576 577 /* from .c */ 578 579 #if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 580 extern tRW_EVENT rw_t1t_handle_rsp (const tT1T_CMD_RSP_INFO * p_info, BOOLEAN *p_notify, UINT8 *p_data, tNFC_STATUS *p_status); 581 extern tRW_EVENT rw_t1t_info_to_event (const tT1T_CMD_RSP_INFO * p_info); 582 #else 583 #define rw_t1t_handle_rsp(p, a, b, c) t1t_info_to_evt (p) 584 #define rw_t1t_info_to_event(p) t1t_info_to_evt (p) 585 #endif 586 587 extern void rw_init (void); 588 extern tNFC_STATUS rw_t1t_select (UINT8 hr[T1T_HR_LEN], UINT8 uid[T1T_CMD_UID_LEN]); 589 extern tNFC_STATUS rw_t1t_send_dyn_cmd (UINT8 opcode, UINT8 add, UINT8 *p_dat); 590 extern tNFC_STATUS rw_t1t_send_static_cmd (UINT8 opcode, UINT8 add, UINT8 dat); 591 extern void rw_t1t_process_timeout (TIMER_LIST_ENT *p_tle); 592 extern void rw_t1t_handle_op_complete (void); 593 594 #if (defined (RW_NDEF_INCLUDED) && (RW_NDEF_INCLUDED == TRUE)) 595 extern tRW_EVENT rw_t2t_info_to_event (const tT2T_CMD_RSP_INFO *p_info); 596 extern void rw_t2t_handle_rsp (UINT8 *p_data); 597 #else 598 #define rw_t2t_info_to_event(p) t2t_info_to_evt (p) 599 #define rw_t2t_handle_rsp(p) 600 #endif 601 602 extern tNFC_STATUS rw_t2t_sector_change (UINT8 sector); 603 extern tNFC_STATUS rw_t2t_read (UINT16 block); 604 extern tNFC_STATUS rw_t2t_write (UINT16 block, UINT8 *p_write_data); 605 extern void rw_t2t_process_timeout (TIMER_LIST_ENT *p_tle); 606 extern tNFC_STATUS rw_t2t_select (void); 607 void rw_t2t_handle_op_complete (void); 608 609 extern void rw_t3t_process_timeout (TIMER_LIST_ENT *p_tle); 610 extern tNFC_STATUS rw_t3t_select (UINT8 peer_nfcid2[NCI_RF_F_UID_LEN], UINT8 mrti_check, UINT8 mrti_update); 611 void rw_t3t_handle_nci_poll_ntf (UINT8 nci_status, UINT8 num_responses, UINT8 sensf_res_buf_size, UINT8 *p_sensf_res_buf); 612 613 extern tNFC_STATUS rw_t4t_select (void); 614 extern void rw_t4t_process_timeout (TIMER_LIST_ENT *p_tle); 615 616 extern tNFC_STATUS rw_i93_select (void); 617 extern void rw_i93_process_timeout (TIMER_LIST_ENT *p_tle); 618 619 #if (defined (RW_STATS_INCLUDED) && (RW_STATS_INCLUDED == TRUE)) 620 /* Internal fcns for statistics (from rw_main.c) */ 621 void rw_main_reset_stats (void); 622 void rw_main_update_tx_stats (UINT32 bytes_tx, BOOLEAN is_retry); 623 void rw_main_update_rx_stats (UINT32 bytes_rx); 624 void rw_main_update_crc_error_stats (void); 625 void rw_main_update_trans_error_stats (void); 626 void rw_main_update_fail_stats (void); 627 void rw_main_log_stats (void); 628 #endif /* RW_STATS_INCLUDED */ 629 630 #ifdef __cplusplus 631 } 632 #endif 633 634 #endif /* RW_INT_H_ */ 635