1 /****************************************************************************** 2 * 3 * Copyright (C) 2010-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 * 22 * NFA interface for tag Reader/Writer 23 * 24 ******************************************************************************/ 25 #include <string.h> 26 #include "nfa_api.h" 27 #include "nfa_sys.h" 28 #include "nfa_rw_int.h" 29 #include "nfa_sys_int.h" 30 31 /***************************************************************************** 32 ** Constants 33 *****************************************************************************/ 34 35 36 /***************************************************************************** 37 ** APIs 38 *****************************************************************************/ 39 40 /******************************************************************************* 41 ** 42 ** Function NFA_RwDetectNDef 43 ** 44 ** Description Perform the NDEF detection procedure using the appropriate 45 ** method for the currently activated tag. 46 ** 47 ** Upon successful completion of NDEF detection, a 48 ** NFA_NDEF_DETECT_EVT will be sent, to notify the application 49 ** of the NDEF attributes (NDEF total memory size, current 50 ** size, etc.). 51 ** 52 ** It is not mandatory to call this function - NFA_RwReadNDef 53 ** and NFA_RwWriteNDef will perform NDEF detection internally if 54 ** not performed already. This API may be called to get a 55 ** tag's NDEF size before issuing a write-request. 56 ** 57 ** Returns: 58 ** NFA_STATUS_OK if successfully initiated 59 ** NFC_STATUS_REFUSED if tag does not support NDEF 60 ** NFA_STATUS_FAILED otherwise 61 ** 62 *******************************************************************************/ 63 tNFA_STATUS NFA_RwDetectNDef (void) 64 { 65 tNFA_RW_OPERATION *p_msg; 66 67 NFA_TRACE_API0 ("NFA_RwDetectNDef"); 68 69 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 70 { 71 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 72 p_msg->op = NFA_RW_OP_DETECT_NDEF; 73 74 nfa_sys_sendmsg (p_msg); 75 76 return (NFA_STATUS_OK); 77 } 78 79 return (NFA_STATUS_FAILED); 80 } 81 82 /******************************************************************************* 83 ** 84 ** Function NFA_RwReadNDef 85 ** 86 ** Description Read NDEF message from tag. This function will internally 87 ** perform the NDEF detection procedure (if not performed 88 ** previously), and read the NDEF tag data using the 89 ** appropriate method for the currently activated tag. 90 ** 91 ** Upon successful completion of NDEF detection (if performed), 92 ** a NFA_NDEF_DETECT_EVT will be sent, to notify the application 93 ** of the NDEF attributes (NDEF total memory size, current size, 94 ** etc.). 95 ** 96 ** Upon receiving the NDEF message, the message will be sent to 97 ** the handler registered with NFA_RegisterNDefTypeHandler or 98 ** NFA_RequestExclusiveRfControl (if exclusive RF mode is active) 99 ** 100 ** Returns: 101 ** NFA_STATUS_OK if successfully initiated 102 ** NFC_STATUS_REFUSED if tag does not support NDEF 103 ** NFC_STATUS_NOT_INITIALIZED if NULL NDEF was detected on the tag 104 ** NFA_STATUS_FAILED otherwise 105 ** 106 *******************************************************************************/ 107 tNFA_STATUS NFA_RwReadNDef (void) 108 { 109 tNFA_RW_OPERATION *p_msg; 110 111 NFA_TRACE_API0 ("NFA_RwReadNDef"); 112 113 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 114 { 115 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 116 p_msg->op = NFA_RW_OP_READ_NDEF; 117 118 nfa_sys_sendmsg (p_msg); 119 120 return (NFA_STATUS_OK); 121 } 122 123 return (NFA_STATUS_FAILED); 124 } 125 126 127 128 /******************************************************************************* 129 ** 130 ** Function NFA_RwWriteNDef 131 ** 132 ** Description Write NDEF data to the activated tag. This function will 133 ** internally perform NDEF detection if necessary, and write 134 ** the NDEF tag data using the appropriate method for the 135 ** currently activated tag. 136 ** 137 ** When the entire message has been written, or if an error 138 ** occurs, the app will be notified with NFA_WRITE_CPLT_EVT. 139 ** 140 ** p_data needs to be persistent until NFA_WRITE_CPLT_EVT 141 ** 142 ** 143 ** Returns: 144 ** NFA_STATUS_OK if successfully initiated 145 ** NFC_STATUS_REFUSED if tag does not support NDEF/locked 146 ** NFA_STATUS_FAILED otherwise 147 ** 148 *******************************************************************************/ 149 tNFA_STATUS NFA_RwWriteNDef (UINT8 *p_data, UINT32 len) 150 { 151 tNFA_RW_OPERATION *p_msg; 152 153 NFA_TRACE_API2 ("NFA_RwWriteNDef (): ndef p_data=%08x, len: %i", p_data, len); 154 155 /* Validate parameters */ 156 if (p_data == NULL) 157 return (NFA_STATUS_INVALID_PARAM); 158 159 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 160 { 161 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 162 p_msg->op = NFA_RW_OP_WRITE_NDEF; 163 p_msg->params.write_ndef.len = len; 164 p_msg->params.write_ndef.p_data = p_data; 165 nfa_sys_sendmsg (p_msg); 166 167 return (NFA_STATUS_OK); 168 } 169 170 return (NFA_STATUS_FAILED); 171 } 172 173 /***************************************************************************** 174 ** 175 ** Function NFA_RwPresenceCheck 176 ** 177 ** Description Check if the tag is still in the field. 178 ** 179 ** The NFA_RW_PRESENCE_CHECK_EVT w/ status is used to 180 ** indicate presence or non-presence. 181 ** 182 ** option is used only with ISO-DEP protocol 183 ** 184 ** Returns 185 ** NFA_STATUS_OK if successfully initiated 186 ** NFA_STATUS_FAILED otherwise 187 ** 188 *****************************************************************************/ 189 tNFA_STATUS NFA_RwPresenceCheck (tNFA_RW_PRES_CHK_OPTION option) 190 { 191 tNFA_RW_OPERATION *p_msg; 192 193 NFA_TRACE_API0 ("NFA_RwPresenceCheck"); 194 195 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 196 { 197 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 198 p_msg->op = NFA_RW_OP_PRESENCE_CHECK; 199 p_msg->params.option = option; 200 201 nfa_sys_sendmsg (p_msg); 202 203 return (NFA_STATUS_OK); 204 } 205 206 return (NFA_STATUS_FAILED); 207 } 208 209 /***************************************************************************** 210 ** 211 ** Function NFA_RwFormatTag 212 ** 213 ** Description Check if the tag is NDEF Formatable. If yes Format the tag 214 ** 215 ** The NFA_RW_FORMAT_CPLT_EVT w/ status is used to 216 ** indicate if tag is successfully formated or not 217 ** 218 ** Returns 219 ** NFA_STATUS_OK if successfully initiated 220 ** NFA_STATUS_FAILED otherwise 221 ** 222 *****************************************************************************/ 223 tNFA_STATUS NFA_RwFormatTag (void) 224 { 225 tNFA_RW_OPERATION *p_msg; 226 227 NFA_TRACE_API0 ("NFA_RwFormatTag"); 228 229 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16)(sizeof (tNFA_RW_OPERATION)))) != NULL) 230 { 231 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 232 p_msg->op = NFA_RW_OP_FORMAT_TAG; 233 234 nfa_sys_sendmsg (p_msg); 235 236 return (NFA_STATUS_OK); 237 } 238 239 return (NFA_STATUS_FAILED); 240 } 241 242 /******************************************************************************* 243 ** 244 ** Function NFA_RwSetTagReadOnly 245 ** 246 ** Description: 247 ** Sets tag as read only. 248 ** 249 ** When tag is set as read only, or if an error occurs, the app will be 250 ** notified with NFA_SET_TAG_RO_EVT. 251 ** 252 ** Returns: 253 ** NFA_STATUS_OK if successfully initiated 254 ** NFA_STATUS_REJECTED if protocol is not T1/T2/ISO15693 255 ** (or) if hard lock is not requested for protocol ISO15693 256 ** NFA_STATUS_FAILED otherwise 257 ** 258 *******************************************************************************/ 259 tNFA_STATUS NFA_RwSetTagReadOnly (BOOLEAN b_hard_lock) 260 { 261 tNFA_RW_OPERATION *p_msg; 262 tNFC_PROTOCOL protocol = nfa_rw_cb.protocol; 263 264 if ((protocol != NFC_PROTOCOL_T1T) && (protocol != NFC_PROTOCOL_T2T) && (protocol != NFC_PROTOCOL_15693) && (protocol != NFC_PROTOCOL_ISO_DEP) && (protocol != NFC_PROTOCOL_T3T)) 265 { 266 NFA_TRACE_API1 ("NFA_RwSetTagReadOnly (): Cannot Configure as read only for Protocol: %d", protocol); 267 return (NFA_STATUS_REJECTED); 268 } 269 270 if ( (!b_hard_lock && (protocol == NFC_PROTOCOL_15693)) 271 ||(b_hard_lock && (protocol == NFC_PROTOCOL_ISO_DEP)) ) 272 { 273 NFA_TRACE_API2 ("NFA_RwSetTagReadOnly (): Cannot %s for Protocol: %d", b_hard_lock ? "Hard lock" : "Soft lock", protocol); 274 return (NFA_STATUS_REJECTED); 275 } 276 277 NFA_TRACE_API1 ("NFA_RwSetTagReadOnly (): %s", b_hard_lock ? "Hard lock" : "Soft lock"); 278 279 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 280 { 281 /* Fill in tNFA_RW_OPERATION struct */ 282 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 283 p_msg->op = NFA_RW_OP_SET_TAG_RO; 284 p_msg->params.set_readonly.b_hard_lock = b_hard_lock; 285 286 nfa_sys_sendmsg (p_msg); 287 return (NFA_STATUS_OK); 288 } 289 return (NFA_STATUS_FAILED); 290 } 291 292 /******************************************************************************* 293 ** Tag specific APIs 294 ** (note: for Type-4 tags, use NFA_SendRawFrame to exchange APDUs) 295 *******************************************************************************/ 296 297 /******************************************************************************* 298 ** 299 ** Function NFA_RwLocateTlv 300 ** 301 ** Description: 302 ** Search for the Lock/Memory contril TLV on the activated Type1/Type2 tag 303 ** 304 ** Data is returned to the application using the NFA_TLV_DETECT_EVT. When 305 ** search operation has completed, or if an error occurs, the app will be 306 ** notified with NFA_TLV_DETECT_EVT. 307 ** 308 ** Description Perform the TLV detection procedure using the appropriate 309 ** method for the currently activated tag. 310 ** 311 ** Upon successful completion of TLV detection in T1/T2 tag, a 312 ** NFA_TLV_DETECT_EVT will be sent, to notify the application 313 ** of the TLV attributes (total lock/reserved bytes etc.). 314 ** However if the TLV type specified is NDEF then it is same as 315 ** calling NFA_RwDetectNDef and should expect to receive 316 ** NFA_NDEF_DETECT_EVT instead of NFA_TLV_DETECT_EVT 317 ** 318 ** It is not mandatory to call this function - NFA_RwDetectNDef, 319 ** NFA_RwReadNDef and NFA_RwWriteNDef will perform TLV detection 320 ** internally if not performed already. An application may call 321 ** this API to check the a tag/card-emulator's total Reserved/ 322 ** Lock bytes before issuing a write-request. 323 ** 324 ** Returns: 325 ** NFA_STATUS_OK if successfully initiated 326 ** NFC_STATUS_REFUSED if tlv_type is NDEF & tag won't support NDEF 327 ** NFA_STATUS_FAILED otherwise 328 ** 329 *******************************************************************************/ 330 tNFA_STATUS NFA_RwLocateTlv (UINT8 tlv_type) 331 { 332 tNFA_RW_OPERATION *p_msg; 333 334 NFA_TRACE_API0 ("NFA_RwLocateTlv"); 335 336 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 337 { 338 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 339 340 if (tlv_type == TAG_LOCK_CTRL_TLV) 341 { 342 p_msg->op = NFA_RW_OP_DETECT_LOCK_TLV; 343 } 344 else if (tlv_type == TAG_MEM_CTRL_TLV) 345 { 346 p_msg->op = NFA_RW_OP_DETECT_MEM_TLV; 347 } 348 else if (tlv_type == TAG_NDEF_TLV) 349 { 350 p_msg->op = NFA_RW_OP_DETECT_NDEF; 351 } 352 else 353 return (NFA_STATUS_FAILED); 354 355 nfa_sys_sendmsg (p_msg); 356 357 return (NFA_STATUS_OK); 358 } 359 360 return (NFA_STATUS_FAILED); 361 } 362 363 /******************************************************************************* 364 ** 365 ** Function NFA_RwT1tRid 366 ** 367 ** Description: 368 ** Send a RID command to the activated Type 1 tag. 369 ** 370 ** Data is returned to the application using the NFA_DATA_EVT. When the read 371 ** operation has completed, or if an error occurs, the app will be notified with 372 ** NFA_READ_CPLT_EVT. 373 ** 374 ** Returns: 375 ** NFA_STATUS_OK if successfully initiated 376 ** NFA_STATUS_FAILED otherwise 377 ** 378 *******************************************************************************/ 379 tNFA_STATUS NFA_RwT1tRid (void) 380 { 381 tNFA_RW_OPERATION *p_msg; 382 383 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 384 { 385 /* Fill in tNFA_RW_OPERATION struct */ 386 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 387 p_msg->op = NFA_RW_OP_T1T_RID; 388 389 nfa_sys_sendmsg (p_msg); 390 return (NFA_STATUS_OK); 391 } 392 return (NFA_STATUS_FAILED); 393 } 394 395 /******************************************************************************* 396 ** 397 ** Function NFA_RwT1tReadAll 398 ** 399 ** Description: 400 ** Send a RALL command to the activated Type 1 tag. 401 ** 402 ** Data is returned to the application using the NFA_DATA_EVT. When the read 403 ** operation has completed, or if an error occurs, the app will be notified with 404 ** NFA_READ_CPLT_EVT. 405 ** 406 ** Returns: 407 ** NFA_STATUS_OK if successfully initiated 408 ** NFA_STATUS_FAILED otherwise 409 ** 410 *******************************************************************************/ 411 tNFA_STATUS NFA_RwT1tReadAll (void) 412 { 413 tNFA_RW_OPERATION *p_msg; 414 415 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 416 { 417 /* Fill in tNFA_RW_OPERATION struct */ 418 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 419 p_msg->op = NFA_RW_OP_T1T_RALL; 420 421 nfa_sys_sendmsg (p_msg); 422 return (NFA_STATUS_OK); 423 } 424 return (NFA_STATUS_FAILED); 425 } 426 427 /******************************************************************************* 428 ** 429 ** Function NFA_RwT1tRead 430 ** 431 ** Description: 432 ** Send a READ command to the activated Type 1 tag. 433 ** 434 ** Data is returned to the application using the NFA_DATA_EVT. When the read 435 ** operation has completed, or if an error occurs, the app will be notified with 436 ** NFA_READ_CPLT_EVT. 437 ** 438 ** Returns: 439 ** NFA_STATUS_OK if successfully initiated 440 ** NFA_STATUS_FAILED otherwise 441 ** 442 *******************************************************************************/ 443 tNFA_STATUS NFA_RwT1tRead (UINT8 block_number, UINT8 index) 444 { 445 tNFA_RW_OPERATION *p_msg; 446 447 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 448 { 449 /* Fill in tNFA_RW_OPERATION struct */ 450 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 451 p_msg->op = NFA_RW_OP_T1T_READ; 452 p_msg->params.t1t_read.block_number = block_number; 453 p_msg->params.t1t_read.index = index; 454 455 nfa_sys_sendmsg (p_msg); 456 return (NFA_STATUS_OK); 457 } 458 return (NFA_STATUS_FAILED); 459 } 460 461 /******************************************************************************* 462 ** 463 ** Function NFA_RwT1tWrite 464 ** 465 ** Description: 466 ** Send a WRITE command to the activated Type 1 tag. 467 ** 468 ** Data is returned to the application using the NFA_DATA_EVT. When the write 469 ** operation has completed, or if an error occurs, the app will be notified with 470 ** NFA_WRITE_CPLT_EVT. 471 ** 472 ** Returns: 473 ** NFA_STATUS_OK if successfully initiated 474 ** NFA_STATUS_FAILED otherwise 475 ** 476 *******************************************************************************/ 477 tNFA_STATUS NFA_RwT1tWrite (UINT8 block_number, UINT8 index, UINT8 data, BOOLEAN b_erase) 478 { 479 tNFA_RW_OPERATION *p_msg; 480 481 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 482 { 483 /* Fill in tNFA_RW_OPERATION struct */ 484 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 485 p_msg->params.t1t_write.b_erase = b_erase; 486 p_msg->op = NFA_RW_OP_T1T_WRITE; 487 p_msg->params.t1t_write.block_number = block_number; 488 p_msg->params.t1t_write.index = index; 489 p_msg->params.t1t_write.p_block_data[0] = data; 490 491 nfa_sys_sendmsg (p_msg); 492 return (NFA_STATUS_OK); 493 } 494 return (NFA_STATUS_FAILED); 495 } 496 497 /******************************************************************************* 498 ** 499 ** Function NFA_RwT1tReadSeg 500 ** 501 ** Description: 502 ** Send a RSEG command to the activated Type 1 tag. 503 ** 504 ** Data is returned to the application using the NFA_DATA_EVT. When the read 505 ** operation has completed, or if an error occurs, the app will be notified with 506 ** NFA_READ_CPLT_EVT. 507 ** 508 ** Returns: 509 ** NFA_STATUS_OK if successfully initiated 510 ** NFA_STATUS_FAILED otherwise 511 ** 512 *******************************************************************************/ 513 tNFA_STATUS NFA_RwT1tReadSeg (UINT8 segment_number) 514 { 515 tNFA_RW_OPERATION *p_msg; 516 517 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 518 { 519 /* Fill in tNFA_RW_OPERATION struct */ 520 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 521 p_msg->op = NFA_RW_OP_T1T_RSEG; 522 p_msg->params.t1t_read.segment_number = segment_number; 523 524 nfa_sys_sendmsg (p_msg); 525 return (NFA_STATUS_OK); 526 } 527 return (NFA_STATUS_FAILED); 528 } 529 530 /******************************************************************************* 531 ** 532 ** Function NFA_RwT1tRead8 533 ** 534 ** Description: 535 ** Send a READ8 command to the activated Type 1 tag. 536 ** 537 ** Data is returned to the application using the NFA_DATA_EVT. When the read 538 ** operation has completed, or if an error occurs, the app will be notified with 539 ** NFA_READ_CPLT_EVT. 540 ** 541 ** Returns: 542 ** NFA_STATUS_OK if successfully initiated 543 ** NFA_STATUS_FAILED otherwise 544 ** 545 *******************************************************************************/ 546 tNFA_STATUS NFA_RwT1tRead8 (UINT8 block_number) 547 { 548 tNFA_RW_OPERATION *p_msg; 549 550 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 551 { 552 /* Fill in tNFA_RW_OPERATION struct */ 553 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 554 p_msg->op = NFA_RW_OP_T1T_READ8; 555 p_msg->params.t1t_write.block_number = block_number; 556 557 nfa_sys_sendmsg (p_msg); 558 return (NFA_STATUS_OK); 559 } 560 return (NFA_STATUS_FAILED); 561 } 562 563 /******************************************************************************* 564 ** 565 ** Function NFA_RwT1tWrite8 566 ** 567 ** Description: 568 ** Send a WRITE8_E / WRITE8_NE command to the activated Type 1 tag. 569 ** 570 ** Data is returned to the application using the NFA_DATA_EVT. When the read 571 ** operation has completed, or if an error occurs, the app will be notified with 572 ** NFA_READ_CPLT_EVT. 573 ** 574 ** Returns: 575 ** NFA_STATUS_OK if successfully initiated 576 ** NFA_STATUS_FAILED otherwise 577 ** 578 *******************************************************************************/ 579 tNFA_STATUS NFA_RwT1tWrite8 (UINT8 block_number, UINT8 *p_data, BOOLEAN b_erase) 580 { 581 tNFA_RW_OPERATION *p_msg; 582 583 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 584 { 585 /* Fill in tNFA_RW_OPERATION struct */ 586 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 587 p_msg->params.t1t_write.b_erase = b_erase; 588 p_msg->op = NFA_RW_OP_T1T_WRITE8; 589 p_msg->params.t1t_write.block_number = block_number; 590 591 memcpy (p_msg->params.t1t_write.p_block_data,p_data,8); 592 593 nfa_sys_sendmsg (p_msg); 594 return (NFA_STATUS_OK); 595 } 596 return (NFA_STATUS_FAILED); 597 } 598 599 /******************************************************************************* 600 ** 601 ** Function NFA_RwT2tRead 602 ** 603 ** Description: 604 ** Send a READ command to the activated Type 2 tag. 605 ** 606 ** Data is returned to the application using the NFA_DATA_EVT. When the read 607 ** operation has completed, or if an error occurs, the app will be notified with 608 ** NFA_READ_CPLT_EVT. 609 ** 610 ** Returns: 611 ** NFA_STATUS_OK if successfully initiated 612 ** NFA_STATUS_FAILED otherwise 613 ** 614 *******************************************************************************/ 615 tNFA_STATUS NFA_RwT2tRead (UINT8 block_number) 616 { 617 tNFA_RW_OPERATION *p_msg; 618 619 NFA_TRACE_API1 ("NFA_RwT2tRead (): Block to read: %d", block_number); 620 621 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 622 { 623 /* Fill in tNFA_RW_OPERATION struct */ 624 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 625 p_msg->op = NFA_RW_OP_T2T_READ; 626 p_msg->params.t2t_read.block_number = block_number; 627 628 nfa_sys_sendmsg (p_msg); 629 return (NFA_STATUS_OK); 630 } 631 return (NFA_STATUS_FAILED); 632 } 633 634 /******************************************************************************* 635 ** 636 ** Function NFA_RwT2tWrite 637 ** 638 ** Description: 639 ** Send an WRITE command to the activated Type 2 tag. 640 ** 641 ** When the write operation has completed (or if an error occurs), the 642 ** app will be notified with NFA_WRITE_CPLT_EVT. 643 ** 644 ** Returns: 645 ** NFA_STATUS_OK if successfully initiated 646 ** NFA_STATUS_FAILED otherwise 647 ** 648 *******************************************************************************/ 649 tNFA_STATUS NFA_RwT2tWrite (UINT8 block_number, UINT8 *p_data) 650 { 651 tNFA_RW_OPERATION *p_msg; 652 653 NFA_TRACE_API1 ("NFA_RwT2tWrite (): Block to write: %d", block_number); 654 655 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 656 { 657 /* Fill in tNFA_RW_OPERATION struct */ 658 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 659 p_msg->op = NFA_RW_OP_T2T_WRITE; 660 661 p_msg->params.t2t_write.block_number = block_number; 662 663 memcpy (p_msg->params.t2t_write.p_block_data,p_data,4); 664 665 nfa_sys_sendmsg (p_msg); 666 return (NFA_STATUS_OK); 667 } 668 return (NFA_STATUS_FAILED); 669 } 670 671 /******************************************************************************* 672 ** 673 ** Function NFA_RwT2tSectorSelect 674 ** 675 ** Description: 676 ** Send SECTOR SELECT command to the activated Type 2 tag. 677 ** 678 ** When the sector select operation has completed (or if an error occurs), the 679 ** app will be notified with NFA_SECTOR_SELECT_CPLT_EVT. 680 ** 681 ** Returns: 682 ** NFA_STATUS_OK if successfully initiated 683 ** NFA_STATUS_FAILED otherwise 684 ** 685 *******************************************************************************/ 686 tNFA_STATUS NFA_RwT2tSectorSelect (UINT8 sector_number) 687 { 688 tNFA_RW_OPERATION *p_msg; 689 690 NFA_TRACE_API1 ("NFA_RwT2tRead (): sector to select: %d", sector_number); 691 692 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 693 { 694 /* Fill in tNFA_RW_OPERATION struct */ 695 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 696 p_msg->op = NFA_RW_OP_T2T_SECTOR_SELECT; 697 698 p_msg->params.t2t_sector_select.sector_number = sector_number; 699 700 nfa_sys_sendmsg (p_msg); 701 return (NFA_STATUS_OK); 702 } 703 return (NFA_STATUS_FAILED); 704 } 705 706 /******************************************************************************* 707 ** 708 ** Function NFA_RwT3tRead 709 ** 710 ** Description: 711 ** Send a CHECK (read) command to the activated Type 3 tag. 712 ** 713 ** Data is returned to the application using the NFA_DATA_EVT. When the read 714 ** operation has completed, or if an error occurs, the app will be notified with 715 ** NFA_READ_CPLT_EVT. 716 ** 717 ** Returns: 718 ** NFA_STATUS_OK if successfully initiated 719 ** NFA_STATUS_FAILED otherwise 720 ** 721 *******************************************************************************/ 722 tNFA_STATUS NFA_RwT3tRead (UINT8 num_blocks, tNFA_T3T_BLOCK_DESC *t3t_blocks) 723 { 724 tNFA_RW_OPERATION *p_msg; 725 UINT8 *p_block_desc; 726 727 NFA_TRACE_API1 ("NFA_RwT3tRead (): num_blocks to read: %i", num_blocks); 728 729 /* Validate parameters */ 730 if ((num_blocks == 0) || (t3t_blocks == NULL)) 731 return (NFA_STATUS_INVALID_PARAM); 732 733 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC))))) != NULL) 734 { 735 /* point to area after tNFA_RW_OPERATION */ 736 p_block_desc = (UINT8 *) (p_msg+1); 737 738 /* Fill in tNFA_RW_OPERATION struct */ 739 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 740 p_msg->op = NFA_RW_OP_T3T_READ; 741 742 p_msg->params.t3t_read.num_blocks = num_blocks; 743 p_msg->params.t3t_read.p_block_desc = (tNFA_T3T_BLOCK_DESC *) p_block_desc; 744 745 /* Copy block descriptor list */ 746 memcpy (p_block_desc, t3t_blocks, (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC))); 747 748 nfa_sys_sendmsg (p_msg); 749 750 return (NFA_STATUS_OK); 751 } 752 753 return (NFA_STATUS_FAILED); 754 } 755 756 /******************************************************************************* 757 ** 758 ** Function NFA_RwT3tWrite 759 ** 760 ** Description: 761 ** Send an UPDATE (write) command to the activated Type 3 tag. 762 ** 763 ** When the write operation has completed (or if an error occurs), the 764 ** app will be notified with NFA_WRITE_CPLT_EVT. 765 ** 766 ** Returns: 767 ** NFA_STATUS_OK if successfully initiated 768 ** NFA_STATUS_FAILED otherwise 769 ** 770 *******************************************************************************/ 771 tNFA_STATUS NFA_RwT3tWrite (UINT8 num_blocks, tNFA_T3T_BLOCK_DESC *t3t_blocks, UINT8 *p_data) 772 { 773 tNFA_RW_OPERATION *p_msg; 774 UINT8 *p_block_desc, *p_data_area; 775 776 NFA_TRACE_API1 ("NFA_RwT3tWrite (): num_blocks to write: %i", num_blocks); 777 778 /* Validate parameters */ 779 if ((num_blocks == 0) || (t3t_blocks == NULL) | (p_data == NULL)) 780 return (NFA_STATUS_INVALID_PARAM); 781 782 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + (num_blocks * (sizeof (tNFA_T3T_BLOCK_DESC) + 16))))) != NULL) 783 { 784 /* point to block descriptor and data areas after tNFA_RW_OPERATION */ 785 p_block_desc = (UINT8 *) (p_msg+1); 786 p_data_area = p_block_desc + (num_blocks * (sizeof (tNFA_T3T_BLOCK_DESC))); 787 788 /* Fill in tNFA_RW_OPERATION struct */ 789 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 790 p_msg->op = NFA_RW_OP_T3T_WRITE; 791 792 p_msg->params.t3t_write.num_blocks = num_blocks; 793 p_msg->params.t3t_write.p_block_desc = (tNFA_T3T_BLOCK_DESC *) p_block_desc; 794 p_msg->params.t3t_write.p_block_data = p_data_area; 795 796 /* Copy block descriptor list */ 797 memcpy (p_block_desc, t3t_blocks, (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC))); 798 799 /* Copy data */ 800 memcpy (p_data_area, p_data, (num_blocks * 16)); 801 802 nfa_sys_sendmsg (p_msg); 803 804 return (NFA_STATUS_OK); 805 } 806 807 return (NFA_STATUS_FAILED); 808 } 809 810 /******************************************************************************* 811 ** 812 ** Function NFA_RwI93Inventory 813 ** 814 ** Description: 815 ** Send Inventory command to the activated ISO 15693 tag with/without AFI 816 ** If UID is provided then set UID[0]:MSB, ... UID[7]:LSB 817 ** 818 ** When the operation has completed (or if an error occurs), the 819 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 820 ** 821 ** Returns: 822 ** NFA_STATUS_OK if successfully initiated 823 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 824 ** NFA_STATUS_FAILED otherwise 825 ** 826 *******************************************************************************/ 827 tNFA_STATUS NFA_RwI93Inventory (BOOLEAN afi_present, UINT8 afi, UINT8 *p_uid) 828 { 829 tNFA_RW_OPERATION *p_msg; 830 831 NFA_TRACE_API2 ("NFA_RwI93Inventory (): afi_present:%d, AFI: 0x%02X", afi_present, afi); 832 833 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 834 { 835 return (NFA_STATUS_WRONG_PROTOCOL); 836 } 837 838 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 839 { 840 /* Fill in tNFA_RW_OPERATION struct */ 841 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 842 p_msg->op = NFA_RW_OP_I93_INVENTORY; 843 844 p_msg->params.i93_cmd.afi_present = afi_present; 845 p_msg->params.i93_cmd.afi = afi; 846 847 if (p_uid) 848 { 849 p_msg->params.i93_cmd.uid_present = TRUE; 850 memcpy (p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN); 851 } 852 else 853 { 854 p_msg->params.i93_cmd.uid_present = FALSE; 855 } 856 857 nfa_sys_sendmsg (p_msg); 858 859 return (NFA_STATUS_OK); 860 } 861 862 return (NFA_STATUS_FAILED); 863 } 864 865 /******************************************************************************* 866 ** 867 ** Function NFA_RwI93StayQuiet 868 ** 869 ** Description: 870 ** Send Stay Quiet command to the activated ISO 15693 tag. 871 ** 872 ** When the operation has completed (or if an error occurs), the 873 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 874 ** 875 ** Returns: 876 ** NFA_STATUS_OK if successfully initiated 877 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 878 ** NFA_STATUS_FAILED otherwise 879 ** 880 *******************************************************************************/ 881 tNFA_STATUS NFA_RwI93StayQuiet (void) 882 { 883 tNFA_RW_OPERATION *p_msg; 884 885 NFA_TRACE_API0 ("NFA_RwI93StayQuiet ()"); 886 887 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 888 { 889 return (NFA_STATUS_WRONG_PROTOCOL); 890 } 891 892 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 893 { 894 /* Fill in tNFA_RW_OPERATION struct */ 895 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 896 p_msg->op = NFA_RW_OP_I93_STAY_QUIET; 897 898 nfa_sys_sendmsg (p_msg); 899 900 return (NFA_STATUS_OK); 901 } 902 903 return (NFA_STATUS_FAILED); 904 } 905 906 /******************************************************************************* 907 ** 908 ** Function NFA_RwI93ReadSingleBlock 909 ** 910 ** Description: 911 ** Send Read Single Block command to the activated ISO 15693 tag. 912 ** 913 ** Data is returned to the application using the NFA_DATA_EVT. When the read 914 ** operation has completed, or if an error occurs, the app will be notified with 915 ** NFA_I93_CMD_CPLT_EVT. 916 ** 917 ** Returns: 918 ** NFA_STATUS_OK if successfully initiated 919 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 920 ** NFA_STATUS_FAILED otherwise 921 ** 922 *******************************************************************************/ 923 tNFA_STATUS NFA_RwI93ReadSingleBlock (UINT8 block_number) 924 { 925 tNFA_RW_OPERATION *p_msg; 926 927 NFA_TRACE_API1 ("NFA_RwI93ReadSingleBlock (): block_number: 0x%02X", block_number); 928 929 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 930 { 931 return (NFA_STATUS_WRONG_PROTOCOL); 932 } 933 934 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 935 { 936 /* Fill in tNFA_RW_OPERATION struct */ 937 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 938 p_msg->op = NFA_RW_OP_I93_READ_SINGLE_BLOCK; 939 940 p_msg->params.i93_cmd.first_block_number = block_number; 941 942 nfa_sys_sendmsg (p_msg); 943 944 return (NFA_STATUS_OK); 945 } 946 947 return (NFA_STATUS_FAILED); 948 } 949 950 /******************************************************************************* 951 ** 952 ** Function NFA_RwI93WriteSingleBlock 953 ** 954 ** Description: 955 ** Send Write Single Block command to the activated ISO 15693 tag. 956 ** 957 ** When the write operation has completed (or if an error occurs), the 958 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 959 ** 960 ** Returns: 961 ** NFA_STATUS_OK if successfully initiated 962 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 963 ** NFA_STATUS_FAILED otherwise 964 ** 965 *******************************************************************************/ 966 tNFA_STATUS NFA_RwI93WriteSingleBlock (UINT8 block_number, 967 UINT8 *p_data) 968 { 969 tNFA_RW_OPERATION *p_msg; 970 971 NFA_TRACE_API1 ("NFA_RwI93WriteSingleBlock (): block_number: 0x%02X", block_number); 972 973 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 974 { 975 return (NFA_STATUS_WRONG_PROTOCOL); 976 } 977 978 /* we don't know block size of tag */ 979 if ( (nfa_rw_cb.i93_block_size == 0) 980 ||(nfa_rw_cb.i93_num_block == 0) ) 981 { 982 return (NFA_STATUS_FAILED); 983 } 984 985 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + nfa_rw_cb.i93_block_size))) != NULL) 986 { 987 /* Fill in tNFA_RW_OPERATION struct */ 988 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 989 p_msg->op = NFA_RW_OP_I93_WRITE_SINGLE_BLOCK; 990 991 p_msg->params.i93_cmd.first_block_number = block_number; 992 p_msg->params.i93_cmd.p_data = (UINT8*) (p_msg + 1); 993 994 memcpy (p_msg->params.i93_cmd.p_data, p_data, nfa_rw_cb.i93_block_size); 995 996 nfa_sys_sendmsg (p_msg); 997 998 return (NFA_STATUS_OK); 999 } 1000 1001 return (NFA_STATUS_FAILED); 1002 } 1003 1004 /******************************************************************************* 1005 ** 1006 ** Function NFA_RwI93LockBlock 1007 ** 1008 ** Description: 1009 ** Send Lock block command to the activated ISO 15693 tag. 1010 ** 1011 ** When the operation has completed (or if an error occurs), the 1012 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1013 ** 1014 ** Returns: 1015 ** NFA_STATUS_OK if successfully initiated 1016 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1017 ** NFA_STATUS_FAILED otherwise 1018 ** 1019 *******************************************************************************/ 1020 tNFA_STATUS NFA_RwI93LockBlock (UINT8 block_number) 1021 { 1022 tNFA_RW_OPERATION *p_msg; 1023 1024 NFA_TRACE_API1 ("NFA_RwI93LockBlock (): block_number: 0x%02X", block_number); 1025 1026 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1027 { 1028 return (NFA_STATUS_WRONG_PROTOCOL); 1029 } 1030 1031 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1032 { 1033 /* Fill in tNFA_RW_OPERATION struct */ 1034 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1035 p_msg->op = NFA_RW_OP_I93_LOCK_BLOCK; 1036 1037 p_msg->params.i93_cmd.first_block_number = block_number; 1038 1039 nfa_sys_sendmsg (p_msg); 1040 1041 return (NFA_STATUS_OK); 1042 } 1043 1044 return (NFA_STATUS_FAILED); 1045 } 1046 1047 /******************************************************************************* 1048 ** 1049 ** Function NFA_RwI93ReadMultipleBlocks 1050 ** 1051 ** Description: 1052 ** Send Read Multiple Block command to the activated ISO 15693 tag. 1053 ** 1054 ** Data is returned to the application using the NFA_DATA_EVT. When the read 1055 ** operation has completed, or if an error occurs, the app will be notified with 1056 ** NFA_I93_CMD_CPLT_EVT. 1057 ** 1058 ** Returns: 1059 ** NFA_STATUS_OK if successfully initiated 1060 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1061 ** NFA_STATUS_FAILED otherwise 1062 ** 1063 *******************************************************************************/ 1064 tNFA_STATUS NFA_RwI93ReadMultipleBlocks (UINT8 first_block_number, 1065 UINT16 number_blocks) 1066 { 1067 tNFA_RW_OPERATION *p_msg; 1068 1069 NFA_TRACE_API2 ("NFA_RwI93ReadMultipleBlocks(): %d, %d", first_block_number, number_blocks); 1070 1071 if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1072 { 1073 return (NFA_STATUS_WRONG_PROTOCOL); 1074 } 1075 1076 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1077 { 1078 /* Fill in tNFA_RW_OPERATION struct */ 1079 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1080 p_msg->op = NFA_RW_OP_I93_READ_MULTI_BLOCK; 1081 1082 p_msg->params.i93_cmd.first_block_number = first_block_number; 1083 p_msg->params.i93_cmd.number_blocks = number_blocks; 1084 1085 nfa_sys_sendmsg (p_msg); 1086 1087 return (NFA_STATUS_OK); 1088 } 1089 1090 return (NFA_STATUS_FAILED); 1091 } 1092 1093 /******************************************************************************* 1094 ** 1095 ** Function NFA_RwI93WriteMultipleBlocks 1096 ** 1097 ** Description: 1098 ** Send Write Multiple Block command to the activated ISO 15693 tag. 1099 ** 1100 ** When the write operation has completed (or if an error occurs), the 1101 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1102 ** 1103 ** Returns: 1104 ** NFA_STATUS_OK if successfully initiated 1105 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1106 ** NFA_STATUS_FAILED otherwise 1107 ** 1108 *******************************************************************************/ 1109 tNFA_STATUS NFA_RwI93WriteMultipleBlocks (UINT8 first_block_number, 1110 UINT16 number_blocks, 1111 UINT8 *p_data) 1112 { 1113 tNFA_RW_OPERATION *p_msg; 1114 UINT16 data_length; 1115 1116 NFA_TRACE_API2 ("NFA_RwI93WriteMultipleBlocks (): %d, %d", first_block_number, number_blocks); 1117 1118 if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1119 { 1120 return (NFA_STATUS_WRONG_PROTOCOL); 1121 } 1122 1123 /* we don't know block size of tag */ 1124 if ((nfa_rw_cb.i93_block_size == 0) || (nfa_rw_cb.i93_num_block == 0)) 1125 { 1126 return (NFA_STATUS_FAILED); 1127 } 1128 1129 data_length = nfa_rw_cb.i93_block_size * number_blocks; 1130 1131 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + data_length))) != NULL) 1132 { 1133 /* Fill in tNFA_RW_OPERATION struct */ 1134 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1135 p_msg->op = NFA_RW_OP_I93_WRITE_MULTI_BLOCK; 1136 1137 p_msg->params.i93_cmd.first_block_number = first_block_number; 1138 p_msg->params.i93_cmd.number_blocks = number_blocks; 1139 p_msg->params.i93_cmd.p_data = (UINT8*) (p_msg + 1); 1140 1141 memcpy (p_msg->params.i93_cmd.p_data, p_data, data_length); 1142 1143 nfa_sys_sendmsg (p_msg); 1144 1145 return (NFA_STATUS_OK); 1146 } 1147 1148 return (NFA_STATUS_FAILED); 1149 } 1150 1151 /******************************************************************************* 1152 ** 1153 ** Function NFA_RwI93Select 1154 ** 1155 ** Description: 1156 ** Send Select command to the activated ISO 15693 tag. 1157 ** 1158 ** UID[0]: 0xE0, MSB 1159 ** UID[1]: IC Mfg Code 1160 ** ... 1161 ** UID[7]: LSB 1162 ** 1163 ** When the operation has completed (or if an error occurs), the 1164 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1165 ** 1166 ** Returns: 1167 ** NFA_STATUS_OK if successfully initiated 1168 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1169 ** NFA_STATUS_FAILED otherwise 1170 ** 1171 *******************************************************************************/ 1172 tNFA_STATUS NFA_RwI93Select (UINT8 *p_uid) 1173 { 1174 tNFA_RW_OPERATION *p_msg; 1175 1176 NFA_TRACE_API3 ("NFA_RwI93Select (): UID: [%02X%02X%02X...]", *(p_uid), *(p_uid+1), *(p_uid+2)); 1177 1178 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1179 { 1180 return (NFA_STATUS_WRONG_PROTOCOL); 1181 } 1182 1183 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + I93_UID_BYTE_LEN))) != NULL) 1184 { 1185 /* Fill in tNFA_RW_OPERATION struct */ 1186 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1187 p_msg->op = NFA_RW_OP_I93_SELECT; 1188 1189 p_msg->params.i93_cmd.p_data = (UINT8 *) (p_msg + 1); 1190 memcpy (p_msg->params.i93_cmd.p_data, p_uid, I93_UID_BYTE_LEN); 1191 1192 nfa_sys_sendmsg (p_msg); 1193 1194 return (NFA_STATUS_OK); 1195 } 1196 1197 return (NFA_STATUS_FAILED); 1198 } 1199 1200 /******************************************************************************* 1201 ** 1202 ** Function NFA_RwI93ResetToReady 1203 ** 1204 ** Description: 1205 ** Send Reset to ready command to the activated ISO 15693 tag. 1206 ** 1207 ** When the operation has completed (or if an error occurs), the 1208 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1209 ** 1210 ** Returns: 1211 ** NFA_STATUS_OK if successfully initiated 1212 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1213 ** NFA_STATUS_FAILED otherwise 1214 ** 1215 *******************************************************************************/ 1216 tNFA_STATUS NFA_RwI93ResetToReady (void) 1217 { 1218 tNFA_RW_OPERATION *p_msg; 1219 1220 NFA_TRACE_API0 ("NFA_RwI93ResetToReady ()"); 1221 1222 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1223 { 1224 return (NFA_STATUS_WRONG_PROTOCOL); 1225 } 1226 1227 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1228 { 1229 /* Fill in tNFA_RW_OPERATION struct */ 1230 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1231 p_msg->op = NFA_RW_OP_I93_RESET_TO_READY; 1232 1233 nfa_sys_sendmsg (p_msg); 1234 1235 return (NFA_STATUS_OK); 1236 } 1237 1238 return (NFA_STATUS_FAILED); 1239 } 1240 1241 /******************************************************************************* 1242 ** 1243 ** Function NFA_RwI93WriteAFI 1244 ** 1245 ** Description: 1246 ** Send Write AFI command to the activated ISO 15693 tag. 1247 ** 1248 ** When the operation has completed (or if an error occurs), the 1249 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1250 ** 1251 ** Returns: 1252 ** NFA_STATUS_OK if successfully initiated 1253 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1254 ** NFA_STATUS_FAILED otherwise 1255 ** 1256 *******************************************************************************/ 1257 tNFA_STATUS NFA_RwI93WriteAFI (UINT8 afi) 1258 { 1259 tNFA_RW_OPERATION *p_msg; 1260 1261 NFA_TRACE_API1 ("NFA_RwI93WriteAFI (): AFI: 0x%02X", afi); 1262 1263 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1264 { 1265 return (NFA_STATUS_WRONG_PROTOCOL); 1266 } 1267 1268 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1269 { 1270 /* Fill in tNFA_RW_OPERATION struct */ 1271 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1272 p_msg->op = NFA_RW_OP_I93_WRITE_AFI; 1273 1274 p_msg->params.i93_cmd.afi = afi; 1275 1276 nfa_sys_sendmsg (p_msg); 1277 1278 return (NFA_STATUS_OK); 1279 } 1280 1281 return (NFA_STATUS_FAILED); 1282 } 1283 1284 /******************************************************************************* 1285 ** 1286 ** Function NFA_RwI93LockAFI 1287 ** 1288 ** Description: 1289 ** Send Lock AFI command to the activated ISO 15693 tag. 1290 ** 1291 ** When the operation has completed (or if an error occurs), the 1292 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1293 ** 1294 ** Returns: 1295 ** NFA_STATUS_OK if successfully initiated 1296 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1297 ** NFA_STATUS_FAILED otherwise 1298 ** 1299 *******************************************************************************/ 1300 tNFA_STATUS NFA_RwI93LockAFI (void) 1301 { 1302 tNFA_RW_OPERATION *p_msg; 1303 1304 NFA_TRACE_API0 ("NFA_RwI93LockAFI ()"); 1305 1306 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1307 { 1308 return (NFA_STATUS_WRONG_PROTOCOL); 1309 } 1310 1311 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1312 { 1313 /* Fill in tNFA_RW_OPERATION struct */ 1314 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1315 p_msg->op = NFA_RW_OP_I93_LOCK_AFI; 1316 1317 nfa_sys_sendmsg (p_msg); 1318 1319 return (NFA_STATUS_OK); 1320 } 1321 1322 return (NFA_STATUS_FAILED); 1323 } 1324 1325 /******************************************************************************* 1326 ** 1327 ** Function NFA_RwI93WriteDSFID 1328 ** 1329 ** Description: 1330 ** Send Write DSFID command to the activated ISO 15693 tag. 1331 ** 1332 ** When the operation has completed (or if an error occurs), the 1333 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1334 ** 1335 ** Returns: 1336 ** NFA_STATUS_OK if successfully initiated 1337 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1338 ** NFA_STATUS_FAILED otherwise 1339 ** 1340 *******************************************************************************/ 1341 tNFA_STATUS NFA_RwI93WriteDSFID (UINT8 dsfid) 1342 { 1343 tNFA_RW_OPERATION *p_msg; 1344 1345 NFA_TRACE_API1 ("NFA_RwI93WriteDSFID (): DSFID: 0x%02X", dsfid); 1346 1347 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1348 { 1349 return (NFA_STATUS_WRONG_PROTOCOL); 1350 } 1351 1352 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1353 { 1354 /* Fill in tNFA_RW_OPERATION struct */ 1355 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1356 p_msg->op = NFA_RW_OP_I93_WRITE_DSFID; 1357 1358 p_msg->params.i93_cmd.dsfid = dsfid; 1359 1360 nfa_sys_sendmsg (p_msg); 1361 1362 return (NFA_STATUS_OK); 1363 } 1364 1365 return (NFA_STATUS_FAILED); 1366 } 1367 1368 /******************************************************************************* 1369 ** 1370 ** Function NFA_RwI93LockDSFID 1371 ** 1372 ** Description: 1373 ** Send Lock DSFID command to the activated ISO 15693 tag. 1374 ** 1375 ** When the operation has completed (or if an error occurs), the 1376 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1377 ** 1378 ** Returns: 1379 ** NFA_STATUS_OK if successfully initiated 1380 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1381 ** NFA_STATUS_FAILED otherwise 1382 ** 1383 *******************************************************************************/ 1384 tNFA_STATUS NFA_RwI93LockDSFID (void) 1385 { 1386 tNFA_RW_OPERATION *p_msg; 1387 1388 NFA_TRACE_API0 ("NFA_RwI93LockDSFID ()"); 1389 1390 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1391 { 1392 return (NFA_STATUS_WRONG_PROTOCOL); 1393 } 1394 1395 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1396 { 1397 /* Fill in tNFA_RW_OPERATION struct */ 1398 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1399 p_msg->op = NFA_RW_OP_I93_LOCK_DSFID; 1400 1401 nfa_sys_sendmsg (p_msg); 1402 1403 return (NFA_STATUS_OK); 1404 } 1405 1406 return (NFA_STATUS_FAILED); 1407 } 1408 1409 /******************************************************************************* 1410 ** 1411 ** Function NFA_RwI93GetSysInfo 1412 ** 1413 ** Description: 1414 ** Send Get system information command to the activated ISO 15693 tag. 1415 ** If UID is provided then set UID[0]:MSB, ... UID[7]:LSB 1416 ** 1417 ** When the operation has completed (or if an error occurs), the 1418 ** app will be notified with NFA_I93_CMD_CPLT_EVT. 1419 ** 1420 ** Returns: 1421 ** NFA_STATUS_OK if successfully initiated 1422 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1423 ** NFA_STATUS_FAILED otherwise 1424 ** 1425 *******************************************************************************/ 1426 tNFA_STATUS NFA_RwI93GetSysInfo (UINT8 *p_uid) 1427 { 1428 tNFA_RW_OPERATION *p_msg; 1429 1430 NFA_TRACE_API0 ("NFA_RwI93GetSysInfo ()"); 1431 1432 if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1433 { 1434 return (NFA_STATUS_WRONG_PROTOCOL); 1435 } 1436 1437 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1438 { 1439 /* Fill in tNFA_RW_OPERATION struct */ 1440 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1441 p_msg->op = NFA_RW_OP_I93_GET_SYS_INFO; 1442 1443 if (p_uid) 1444 { 1445 p_msg->params.i93_cmd.uid_present = TRUE; 1446 memcpy (p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN); 1447 } 1448 else 1449 { 1450 p_msg->params.i93_cmd.uid_present = FALSE; 1451 } 1452 1453 nfa_sys_sendmsg (p_msg); 1454 1455 return (NFA_STATUS_OK); 1456 } 1457 1458 return (NFA_STATUS_FAILED); 1459 } 1460 1461 /******************************************************************************* 1462 ** 1463 ** Function NFA_RwI93GetMultiBlockSecurityStatus 1464 ** 1465 ** Description: 1466 ** Send Get Multiple block security status command to the activated ISO 15693 tag. 1467 ** 1468 ** Data is returned to the application using the NFA_DATA_EVT. When the read 1469 ** operation has completed, or if an error occurs, the app will be notified with 1470 ** NFA_I93_CMD_CPLT_EVT. 1471 ** 1472 ** Returns: 1473 ** NFA_STATUS_OK if successfully initiated 1474 ** NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated 1475 ** NFA_STATUS_FAILED otherwise 1476 ** 1477 *******************************************************************************/ 1478 tNFA_STATUS NFA_RwI93GetMultiBlockSecurityStatus (UINT8 first_block_number, 1479 UINT16 number_blocks) 1480 { 1481 tNFA_RW_OPERATION *p_msg; 1482 1483 NFA_TRACE_API2 ("NFA_RwI93GetMultiBlockSecurityStatus(): %d, %d", first_block_number, number_blocks); 1484 1485 if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693) 1486 { 1487 return (NFA_STATUS_WRONG_PROTOCOL); 1488 } 1489 1490 if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL) 1491 { 1492 /* Fill in tNFA_RW_OPERATION struct */ 1493 p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT; 1494 p_msg->op = NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS; 1495 1496 p_msg->params.i93_cmd.first_block_number = first_block_number; 1497 p_msg->params.i93_cmd.number_blocks = number_blocks; 1498 1499 nfa_sys_sendmsg (p_msg); 1500 1501 return (NFA_STATUS_OK); 1502 } 1503 1504 return (NFA_STATUS_FAILED); 1505 } 1506