1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /*! 18 * =========================================================================== * 19 * * 20 * * 21 * \file phHciNfc_ISO15693.c * 22 * \brief HCI ISO-15693 management routines. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Thu Feb 11 18:54:47 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.7 $ * 30 * $Aliases: $ 31 * * 32 * =========================================================================== * 33 */ 34 35 /* 36 ***************************** Header File Inclusion **************************** 37 */ 38 #include <phNfcCompId.h> 39 #include <phHciNfc_Pipe.h> 40 #include <phHciNfc_RFReader.h> 41 #include <phOsalNfc.h> 42 43 #if defined (TYPE_ISO15693) 44 #include <phHciNfc_ISO15693.h> 45 46 /* 47 ****************************** Macro Definitions ******************************* 48 */ 49 #define ISO_15693_INVENTORY_INDEX 0x01U 50 #define ISO_15693_AFI_INDEX 0x02U 51 52 #define ISO_15693_INVENTORY_LENGTH 0x0AU 53 #define ISO_15693_AFI_LENGTH 0x01U 54 55 #define ISO_15693_SINGLE_TAG_FOUND 0x00U 56 #define ISO_15693_MULTIPLE_TAGS_FOUND 0x03U 57 58 /* 59 *************************** Structure and Enumeration *************************** 60 */ 61 62 /* 63 *************************** Static Function Declaration ************************** 64 */ 65 66 static 67 NFCSTATUS 68 phHciNfc_ISO15693_InfoUpdate( 69 phHciNfc_sContext_t *psHciContext, 70 uint8_t index, 71 uint8_t *reg_value, 72 uint8_t reg_length 73 ); 74 75 static 76 NFCSTATUS 77 phHciNfc_Recv_ISO15693_Response( 78 void *psContext, 79 void *pHwRef, 80 uint8_t *pResponse, 81 #ifdef ONE_BYTE_LEN 82 uint8_t length 83 #else 84 uint16_t length 85 #endif 86 ); 87 88 static 89 NFCSTATUS 90 phHciNfc_Recv_ISO15693_Event( 91 void *psContext, 92 void *pHwRef, 93 uint8_t *pEvent, 94 #ifdef ONE_BYTE_LEN 95 uint8_t length 96 #else 97 uint16_t length 98 #endif 99 ); 100 101 /* 102 *************************** Function Definitions *************************** 103 */ 104 105 NFCSTATUS 106 phHciNfc_ISO15693_Init_Resources( 107 phHciNfc_sContext_t *psHciContext 108 ) 109 { 110 NFCSTATUS status = NFCSTATUS_SUCCESS; 111 phHciNfc_ISO15693_Info_t *ps_15693_info=NULL; 112 if( NULL == psHciContext ) 113 { 114 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 115 } 116 else 117 { 118 if (NULL != psHciContext->p_iso_15693_info) 119 { 120 status = NFCSTATUS_SUCCESS; 121 } 122 else if(( NULL == psHciContext->p_iso_15693_info ) && 123 (phHciNfc_Allocate_Resource((void **)(&ps_15693_info), 124 sizeof(phHciNfc_ISO15693_Info_t))== NFCSTATUS_SUCCESS) 125 ) 126 { 127 psHciContext->p_iso_15693_info = ps_15693_info; 128 ps_15693_info->current_seq = ISO15693_INVENTORY; 129 ps_15693_info->next_seq = ISO15693_INVENTORY; 130 ps_15693_info->ps_15693_pipe_info = NULL; 131 } 132 else 133 { 134 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); 135 } 136 137 } 138 return status; 139 } 140 141 142 NFCSTATUS 143 phHciNfc_ISO15693_Get_PipeID( 144 phHciNfc_sContext_t *psHciContext, 145 uint8_t *ppipe_id 146 ) 147 { 148 NFCSTATUS status = NFCSTATUS_SUCCESS; 149 if( (NULL != psHciContext) 150 && ( NULL != ppipe_id ) 151 && ( NULL != psHciContext->p_iso_15693_info ) 152 ) 153 { 154 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 155 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 156 psHciContext->p_iso_15693_info ; 157 *ppipe_id = ps_15693_info->ps_15693_pipe_info->pipe.pipe_id; 158 } 159 else 160 { 161 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 162 } 163 return status; 164 } 165 166 167 NFCSTATUS 168 phHciNfc_ISO15693_Update_PipeInfo( 169 phHciNfc_sContext_t *psHciContext, 170 uint8_t pipeID, 171 phHciNfc_Pipe_Info_t *pPipeInfo 172 ) 173 { 174 NFCSTATUS status = NFCSTATUS_SUCCESS; 175 if((NULL == psHciContext) || (NULL == pPipeInfo)) 176 { 177 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 178 } 179 else if(NULL == psHciContext->p_iso_15693_info) 180 { 181 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 182 } 183 else 184 { 185 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 186 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 187 psHciContext->p_iso_15693_info ; 188 189 /* Update the pipe_id of the ISO15693 Gate obtained from 190 the HCI Response */ 191 ps_15693_info->ps_15693_pipe_info = pPipeInfo; 192 ps_15693_info->pipe_id = pipeID; 193 ps_15693_info->ps_15693_pipe_info->pipe.pipe_id = pipeID; 194 /* Update the Response Receive routine of the ISO15693 Gate */ 195 pPipeInfo->recv_resp = &phHciNfc_Recv_ISO15693_Response; 196 /* Update the event Receive routine of the ISO15693 Gate */ 197 pPipeInfo->recv_event = &phHciNfc_Recv_ISO15693_Event; 198 } 199 return status; 200 } 201 202 203 NFCSTATUS 204 phHciNfc_ISO15693_Update_Info( 205 phHciNfc_sContext_t *psHciContext, 206 uint8_t infotype, 207 void *iso_15693_info 208 ) 209 { 210 NFCSTATUS status = NFCSTATUS_SUCCESS; 211 212 if (NULL == psHciContext) 213 { 214 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 215 } 216 else if(NULL == psHciContext->p_iso_15693_info) 217 { 218 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 219 } 220 else 221 { 222 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 223 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 224 psHciContext->p_iso_15693_info; 225 226 switch(infotype) 227 { 228 case HCI_ISO_15693_ENABLE: 229 { 230 if (NULL != iso_15693_info) 231 { 232 ps_15693_info->enable_iso_15693_gate = 233 *((uint8_t *)iso_15693_info); 234 } 235 break; 236 } 237 case HCI_ISO_15693_INFO_SEQ: 238 { 239 ps_15693_info->current_seq = ISO15693_INVENTORY; 240 ps_15693_info->next_seq = ISO15693_INVENTORY; 241 break; 242 } 243 default: 244 { 245 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 246 break; 247 } 248 } 249 } 250 return status; 251 } 252 253 254 NFCSTATUS 255 phHciNfc_ISO15693_Info_Sequence ( 256 void *psHciHandle, 257 void *pHwRef 258 ) 259 { 260 NFCSTATUS status = NFCSTATUS_SUCCESS; 261 phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle); 262 if( (NULL == psHciContext) 263 || (NULL == pHwRef) 264 ) 265 { 266 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 267 } 268 else if((NULL == psHciContext->p_iso_15693_info) || 269 (HCI_ISO_15693_ENABLE != 270 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 271 enable_iso_15693_gate)) 272 { 273 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 274 } 275 else 276 { 277 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 278 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL; 279 uint8_t pipeid = 0; 280 281 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 282 psHciContext->p_iso_15693_info; 283 ps_pipe_info = ps_15693_info->ps_15693_pipe_info; 284 285 if(NULL == ps_pipe_info ) 286 { 287 status = PHNFCSTVAL(CID_NFC_HCI, 288 NFCSTATUS_INVALID_HCI_SEQUENCE); 289 } 290 else 291 { 292 switch(ps_15693_info->current_seq) 293 { 294 case ISO15693_INVENTORY: 295 { 296 ps_pipe_info->reg_index = ISO_15693_INVENTORY_INDEX; 297 pipeid = ps_pipe_info->pipe.pipe_id ; 298 /* Fill the data buffer and send the command to the 299 device */ 300 status = 301 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 302 pipeid, (uint8_t)ANY_GET_PARAMETER); 303 if(NFCSTATUS_PENDING == status ) 304 { 305 ps_15693_info->next_seq = ISO15693_AFI; 306 } 307 break; 308 } 309 case ISO15693_AFI: 310 { 311 ps_pipe_info->reg_index = ISO_15693_AFI_INDEX; 312 pipeid = ps_pipe_info->pipe.pipe_id ; 313 /* Fill the data buffer and send the command to the 314 device */ 315 status = 316 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 317 pipeid, (uint8_t)ANY_GET_PARAMETER); 318 if(NFCSTATUS_PENDING == status ) 319 { 320 ps_15693_info->next_seq = ISO15693_END_SEQUENCE; 321 } 322 break; 323 } 324 case ISO15693_END_SEQUENCE: 325 { 326 phNfc_sCompletionInfo_t CompInfo; 327 if (ISO_15693_MULTIPLE_TAGS_FOUND == 328 ps_15693_info->multiple_tgts_found) 329 { 330 CompInfo.status = NFCSTATUS_MULTIPLE_TAGS; 331 } 332 else 333 { 334 CompInfo.status = NFCSTATUS_SUCCESS; 335 } 336 337 CompInfo.info = &(ps_15693_info->iso15693_info); 338 339 ps_15693_info->iso15693_info.RemDevType = 340 phHal_eISO15693_PICC; 341 ps_15693_info->current_seq = ISO15693_INVENTORY; 342 ps_15693_info->next_seq = ISO15693_INVENTORY; 343 status = NFCSTATUS_SUCCESS; 344 /* Notify to the upper layer */ 345 phHciNfc_Tag_Notify(psHciContext, pHwRef, 346 NFC_NOTIFY_TARGET_DISCOVERED, 347 &CompInfo); 348 break; 349 } 350 default: 351 { 352 status = PHNFCSTVAL(CID_NFC_HCI, 353 NFCSTATUS_INVALID_HCI_RESPONSE); 354 break; 355 } 356 } 357 } 358 } 359 return status; 360 } 361 362 static 363 NFCSTATUS 364 phHciNfc_ISO15693_InfoUpdate( 365 phHciNfc_sContext_t *psHciContext, 366 uint8_t index, 367 uint8_t *reg_value, 368 uint8_t reg_length 369 ) 370 { 371 NFCSTATUS status = NFCSTATUS_SUCCESS; 372 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 373 uint8_t i = 0; 374 375 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 376 (psHciContext->p_iso_15693_info); 377 378 379 switch(index) 380 { 381 case ISO_15693_INVENTORY_INDEX: 382 { 383 if (ISO_15693_INVENTORY_LENGTH == reg_length) 384 { 385 ps_15693_info->iso15693_info.RemoteDevInfo 386 .Iso15693_Info.Flags = *(reg_value + i ); 387 i++; 388 ps_15693_info->iso15693_info.RemoteDevInfo 389 .Iso15693_Info.Dsfid = *(reg_value + i ); 390 i++; 391 (void)memcpy(ps_15693_info->iso15693_info. 392 RemoteDevInfo.Iso15693_Info.Uid, 393 (reg_value+i), (reg_length - i )); 394 ps_15693_info->iso15693_info.RemoteDevInfo 395 .Iso15693_Info.UidLength = ( reg_length - i ); 396 HCI_PRINT_BUFFER("\tISO 15693 inventory", reg_value, reg_length); 397 } 398 else 399 { 400 status = PHNFCSTVAL(CID_NFC_HCI, 401 NFCSTATUS_INVALID_HCI_RESPONSE); 402 } 403 break; 404 } 405 case ISO_15693_AFI_INDEX: 406 { 407 if (ISO_15693_AFI_LENGTH == reg_length) 408 { 409 ps_15693_info->iso15693_info.RemoteDevInfo 410 .Iso15693_Info.Afi = *(reg_value + i ); 411 HCI_PRINT_BUFFER("\tISO 15693 AFI", reg_value, reg_length); 412 } 413 else 414 { 415 status = PHNFCSTVAL(CID_NFC_HCI, 416 NFCSTATUS_INVALID_HCI_RESPONSE); 417 } 418 break; 419 } 420 default: 421 { 422 status = PHNFCSTVAL(CID_NFC_HCI, 423 NFCSTATUS_INVALID_HCI_RESPONSE); 424 break; 425 } 426 } 427 return status; 428 } 429 430 431 static 432 NFCSTATUS 433 phHciNfc_Recv_ISO15693_Response( 434 void *psContext, 435 void *pHwRef, 436 uint8_t *pResponse, 437 #ifdef ONE_BYTE_LEN 438 uint8_t length 439 #else 440 uint16_t length 441 #endif 442 ) 443 { 444 NFCSTATUS status = NFCSTATUS_SUCCESS; 445 phHciNfc_sContext_t *psHciContext = 446 (phHciNfc_sContext_t *)psContext ; 447 448 449 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse) 450 || (0 == length)) 451 { 452 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 453 } 454 else if(NULL == psHciContext->p_iso_15693_info) 455 { 456 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 457 } 458 else 459 { 460 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 461 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL; 462 uint8_t prev_cmd = ANY_GET_PARAMETER; 463 464 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 465 psHciContext->p_iso_15693_info; 466 467 ps_pipe_info = ps_15693_info->ps_15693_pipe_info; 468 if( NULL == ps_pipe_info) 469 { 470 status = PHNFCSTVAL(CID_NFC_HCI, 471 NFCSTATUS_INVALID_HCI_SEQUENCE); 472 } 473 else 474 { 475 prev_cmd = ps_pipe_info->prev_msg ; 476 switch(prev_cmd) 477 { 478 case ANY_GET_PARAMETER: 479 { 480 status = phHciNfc_ISO15693_InfoUpdate(psHciContext, 481 ps_pipe_info->reg_index, 482 &pResponse[HCP_HEADER_LEN], 483 (uint8_t)(length - HCP_HEADER_LEN)); 484 #if 0 485 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 486 UPDATE_SEQ); 487 #endif /* #if 0 */ 488 break; 489 } 490 case ANY_SET_PARAMETER: 491 { 492 HCI_PRINT("ISO 15693 Parameter Set \n"); 493 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 494 UPDATE_SEQ); 495 ps_15693_info->next_seq = ISO15693_INVENTORY; 496 break; 497 } 498 case ANY_OPEN_PIPE: 499 { 500 HCI_PRINT("ISO 15693 open pipe complete\n"); 501 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 502 UPDATE_SEQ); 503 ps_15693_info->next_seq = ISO15693_INVENTORY; 504 break; 505 } 506 case ANY_CLOSE_PIPE: 507 { 508 HCI_PRINT("ISO 15693 close pipe complete\n"); 509 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 510 UPDATE_SEQ); 511 break; 512 } 513 514 case NXP_ISO15693_CMD: 515 { 516 if (length >= HCP_HEADER_LEN) 517 { 518 HCI_PRINT("ISO 15693 packet received \n"); 519 /* Copy buffer to the receive buffer */ 520 phHciNfc_Append_HCPFrame(psHciContext->recv_buffer, 521 0, pResponse, length); 522 psHciContext->rx_total = length; 523 psHciContext->rx_index = HCP_HEADER_LEN; 524 HCI_PRINT_BUFFER("ISO 15693 Bytes received", 525 pResponse, length); 526 } 527 else 528 { 529 status = PHNFCSTVAL(CID_NFC_HCI, 530 NFCSTATUS_INVALID_HCI_RESPONSE); 531 } 532 break; 533 } 534 default: 535 { 536 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 537 break; 538 } 539 }/* End of switch(prev_cmd) */ 540 541 if( NFCSTATUS_SUCCESS == status ) 542 { 543 ps_pipe_info->prev_status = NFCSTATUS_SUCCESS; 544 ps_15693_info->current_seq = ps_15693_info->next_seq; 545 } 546 } 547 } 548 return status; 549 } 550 551 static 552 NFCSTATUS 553 phHciNfc_Recv_ISO15693_Event( 554 void *psContext, 555 void *pHwRef, 556 uint8_t *pEvent, 557 #ifdef ONE_BYTE_LEN 558 uint8_t length 559 #else 560 uint16_t length 561 #endif 562 ) 563 { 564 NFCSTATUS status = NFCSTATUS_SUCCESS; 565 phHciNfc_sContext_t *psHciContext = 566 (phHciNfc_sContext_t *)psContext ; 567 if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent) 568 || (length == 0)) 569 { 570 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 571 } 572 else if((NULL == psHciContext->p_iso_15693_info) || 573 (HCI_ISO_15693_ENABLE != 574 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 575 enable_iso_15693_gate)) 576 { 577 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 578 } 579 else 580 { 581 phHciNfc_HCP_Packet_t *p_packet = NULL; 582 phHciNfc_ISO15693_Info_t *ps_15693_info=NULL; 583 phHciNfc_HCP_Message_t *message = NULL; 584 uint8_t instruction=0, 585 i = 0; 586 587 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 588 psHciContext->p_iso_15693_info; 589 p_packet = (phHciNfc_HCP_Packet_t *)pEvent; 590 message = &p_packet->msg.message; 591 /* Get the instruction bits from the Message Header */ 592 instruction = (uint8_t) GET_BITS8( message->msg_header, 593 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); 594 595 if ((EVT_TARGET_DISCOVERED == instruction) 596 && ((ISO_15693_MULTIPLE_TAGS_FOUND == message->payload[i]) 597 || (ISO_15693_SINGLE_TAG_FOUND == message->payload[i])) 598 ) 599 { 600 phNfc_sCompletionInfo_t pCompInfo; 601 602 /* #define NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT 0x00 */ 603 #if (NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT >= 0x01) 604 605 if (ISO_15693_MULTIPLE_TAGS_FOUND == message->payload[i]) 606 { 607 ps_15693_info->multiple_tgts_found = ISO_15693_MULTIPLE_TAGS_FOUND; 608 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS; 609 } 610 else 611 #endif /* #if (NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT <= 0x01) */ 612 { 613 ps_15693_info->multiple_tgts_found = FALSE; 614 pCompInfo.status = NFCSTATUS_SUCCESS; 615 } 616 /* CompInfo.info = &(ps_15693_info->iso15693_info); */ 617 618 psHciContext->host_rf_type = phHal_eISO15693_PCD; 619 ps_15693_info->iso15693_info.RemDevType = phHal_eISO15693_PICC; 620 ps_15693_info->current_seq = ISO15693_INVENTORY; 621 /* Notify to the HCI Generic layer To Update the FSM */ 622 phHciNfc_Notify_Event(psHciContext, pHwRef, 623 NFC_NOTIFY_TARGET_DISCOVERED, 624 &pCompInfo); 625 626 } 627 else 628 { 629 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); 630 } 631 } 632 return status; 633 } 634 635 NFCSTATUS 636 phHciNfc_Send_ISO15693_Command( 637 phHciNfc_sContext_t *psHciContext, 638 void *pHwRef, 639 uint8_t pipe_id, 640 uint8_t cmd 641 ) 642 { 643 NFCSTATUS status = NFCSTATUS_SUCCESS; 644 645 if( (NULL == psHciContext) || (NULL == pHwRef) ) 646 { 647 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 648 } 649 else if((NULL == psHciContext->p_iso_15693_info) || 650 (HCI_ISO_15693_ENABLE != 651 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 652 enable_iso_15693_gate) || 653 (HCI_UNKNOWN_PIPE_ID == 654 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 655 pipe_id) || 656 (pipe_id != 657 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 658 pipe_id)) 659 { 660 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 661 } 662 else 663 { 664 phHciNfc_ISO15693_Info_t *ps_15693_info=NULL; 665 phHciNfc_Pipe_Info_t *ps_pipe_info=NULL; 666 phHciNfc_HCP_Packet_t *hcp_packet = NULL; 667 phHciNfc_HCP_Message_t *hcp_message = NULL; 668 uint8_t i = 0; 669 uint16_t length = HCP_HEADER_LEN; 670 671 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 672 psHciContext->p_iso_15693_info ; 673 ps_pipe_info = ps_15693_info->ps_15693_pipe_info; 674 if(NULL == ps_pipe_info ) 675 { 676 status = PHNFCSTVAL(CID_NFC_HCI, 677 NFCSTATUS_INVALID_HCI_SEQUENCE); 678 } 679 else 680 { 681 psHciContext->tx_total = 0 ; 682 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; 683 /* Construct the HCP Frame */ 684 if (NXP_ISO15693_CMD == cmd) 685 { 686 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, 687 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); 688 hcp_message = &(hcp_packet->msg.message); 689 690 #if 0 691 /* Command */ 692 hcp_message->payload[i++] = 693 psHciContext->p_xchg_info->params.tag_info.cmd_type ; 694 /* Address */ 695 hcp_message->payload[i++] = 696 psHciContext->p_xchg_info->params.tag_info.addr ; 697 #endif /* #if 0 */ 698 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, 699 i, (uint8_t *)ps_pipe_info->param_info, 700 ps_pipe_info->param_length); 701 length =(uint16_t)(length + i + ps_pipe_info->param_length); 702 703 ps_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND; 704 ps_pipe_info->prev_msg = cmd; 705 psHciContext->tx_total = length; 706 psHciContext->response_pending = TRUE; 707 708 /* Send the Constructed HCP packet to the lower layer */ 709 status = phHciNfc_Send_HCP( psHciContext, pHwRef); 710 ps_pipe_info->prev_status = status; 711 } 712 } 713 } 714 return status; 715 } 716 717 NFCSTATUS 718 phHciNfc_ISO15693_Set_AFI( 719 void *psContext, 720 void *pHwRef, 721 uint8_t afi_value 722 ) 723 { 724 NFCSTATUS status = NFCSTATUS_SUCCESS; 725 phHciNfc_sContext_t *psHciContext = 726 (phHciNfc_sContext_t *)psContext ; 727 728 if( (NULL == psHciContext) || (NULL == pHwRef)) 729 { 730 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); 731 } 732 else if((NULL == psHciContext->p_iso_15693_info) || 733 (HCI_ISO_15693_ENABLE != 734 ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))-> 735 enable_iso_15693_gate)) 736 { 737 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); 738 } 739 else 740 { 741 phHciNfc_ISO15693_Info_t *ps_15693_info = NULL; 742 phHciNfc_Pipe_Info_t *ps_pipe_info = NULL; 743 uint8_t pipeid = 0; 744 745 ps_15693_info = (phHciNfc_ISO15693_Info_t *) 746 psHciContext->p_iso_15693_info ; 747 ps_pipe_info = ps_15693_info->ps_15693_pipe_info; 748 749 if( NULL == ps_pipe_info) 750 { 751 status = PHNFCSTVAL(CID_NFC_HCI, 752 NFCSTATUS_INVALID_HCI_SEQUENCE); 753 } 754 else 755 { 756 ps_pipe_info->reg_index = ISO_15693_AFI_INDEX; 757 ps_pipe_info->param_info = &afi_value; 758 ps_pipe_info->param_length = sizeof(afi_value); 759 pipeid = ps_pipe_info->pipe.pipe_id ; 760 status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 761 pipeid, (uint8_t)ANY_SET_PARAMETER); 762 } 763 } 764 return status; 765 } 766 767 #endif /* #if defined (TYPE_ISO15693) */ 768 769 770