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_Generic.h * 22 * \brief Common HCI Header for the Generic HCI Management. * 23 * * 24 * * 25 * Project: NFC-FRI-1.1 * 26 * * 27 * $Date: Mon Mar 29 17:34:47 2010 $ * 28 * $Author: ing04880 $ * 29 * $Revision: 1.73 $ * 30 * $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ 31 * * 32 * =========================================================================== * 33 */ 34 35 /*@{*/ 36 #ifndef PHHCINFC_GENERIC_H 37 #define PHHCINFC_GENERIC_H 38 39 /*@}*/ 40 41 42 /** 43 * \name HCI 44 * 45 * File: \ref phHciNfc_Generic.h 46 * 47 */ 48 /*@{*/ 49 #define PHHCINFC_GENERIC_FILEREVISION "$Revision: 1.73 $" /**< \ingroup grp_file_attributes */ 50 #define PHHCINFC_GENERIC_FILEALIASES "$Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $" /**< \ingroup grp_file_attributes */ 51 /*@}*/ 52 /* 53 54 ################################################################################ 55 ***************************** Header File Inclusion **************************** 56 ################################################################################ 57 */ 58 #define LOG_TAG "NFC-HCI" 59 #include <cutils/log.h> 60 #include <phNfcIoctlCode.h> 61 #include<phNfcInterface.h> 62 #include <phHciNfc.h> 63 /* 64 ################################################################################ 65 ****************************** Macro Definitions ******************************* 66 ################################################################################ 67 */ 68 69 #define Trace_buffer phOsalNfc_DbgTraceBuffer 70 71 /* HCI TRACE Macros */ 72 #if defined(HCI_TRACE)&& !defined(SILENT_HCI) 73 #include <phOsalNfc.h> 74 #include <stdio.h> 75 extern char phOsalNfc_DbgTraceBuffer[]; 76 #define MAX_TRACE_BUFFER 150 77 /* #define HCI_PRINT( str ) phOsalNfc_DbgTrace(str) */ 78 #define HCI_PRINT( str ) phOsalNfc_DbgString(str) 79 #define HCI_DEBUG(...) LOGD(__VA_ARGS__) 80 81 82 83 84 #define HCI_PRINT_BUFFER(msg,buf,len) \ 85 { \ 86 snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \ 87 phOsalNfc_DbgString(Trace_buffer); \ 88 phOsalNfc_DbgTrace(buf,len); \ 89 phOsalNfc_DbgString("\r"); \ 90 \ 91 } 92 #else 93 #include <phDbgTrace.h> 94 #if defined(PHDBG_TRACES) && !defined(HCI_TRACE) 95 #define HCI_PRINT( str ) PHDBG_INFO(str) 96 #define HCI_DEBUG(str, arg) 97 #define HCI_PRINT_BUFFER(msg,buf,len) 98 #else 99 #define HCI_PRINT( str ) 100 #define HCI_DEBUG(...) 101 #define HCI_PRINT_BUFFER(msg,buf,len) 102 #endif /* #if defined(PHDBG_TRACES) */ 103 /* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */ 104 105 #endif /* #if defined(HCI_TRACE) */ 106 107 #define ZERO 0x00U 108 109 110 #ifdef MASK_BITS 111 #define BYTE_SIZE 0x08U 112 113 /* HCI GET and SET BITS Macros */ 114 #define MASK_BITS8(p,l) \ 115 ( ( (((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE )? \ 116 (~(0xFFU<<((p)+(l))) & (0xFFU<<(p))):(0U) ) 117 #ifdef MASK_BITS 118 #define GET_BITS8(num,p,l) \ 119 ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \ 120 (((num)& (MASK_BITS8(p,l)))>>(p)):(0U) ) 121 #else 122 #define GET_BITS8(num,p,l) \ 123 ( ((((p)+(l))<=BYTE_SIZE))? \ 124 (((num)>>(p))& (~(0xFFU<<(l)))):(0U) ) 125 #endif 126 #define SET_BITS8(num,p,l,val) \ 127 ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \ 128 (((num)& (~MASK_BITS8(p,l)))|((val)<<(p))):(0U)) 129 130 #endif 131 132 /** \ingroup grp_hci_retval 133 The Corresponding HCI Gate Not Supported. 134 */ 135 #define NFCSTATUS_HCI_GATE_NOT_SUPPORTED (0x71U) 136 137 /** \ingroup grp_hci_retval 138 Invalid Command from the HCI Layer 139 */ 140 #define NFCSTATUS_INVALID_HCI_COMMAND (0x72U) 141 142 /** \ingroup grp_hci_retval 143 HCI Command not supported . */ 144 #define NFCSTATUS_COMMAND_NOT_SUPPORTED (0x73U) 145 146 /** \ingroup grp_hci_retval 147 Invalide Response from the HCI Layer 148 */ 149 #define NFCSTATUS_INVALID_HCI_RESPONSE (0x74U) 150 151 /** \ingroup grp_hci_retval 152 The Invalid Instruction type (Neither Command/Response nor Event ). 153 */ 154 #define NFCSTATUS_INVALID_HCI_INSTRUCTION (0x75U) 155 156 /** \ingroup grp_hci_retval 157 The Invalid Instruction type (Neither Command/Response nor Event ). 158 */ 159 #define NFCSTATUS_INVALID_HCI_INFORMATION (0x76U) 160 161 /** \ingroup grp_hci_retval 162 The Invalid HCI Sequence. 163 */ 164 #define NFCSTATUS_INVALID_HCI_SEQUENCE (0x78U) 165 166 167 /** \ingroup grp_hci_retval 168 The HCI Error Response with Response code. 169 */ 170 #define NFCSTATUS_HCI_RESPONSE(code) (code) 171 172 173 /* Length of the HCP and the HCP Message Header in Bytes */ 174 #define HCP_HEADER_LEN 0x02U 175 176 /* Length of the HCP Message Header in Bytes */ 177 #define HCP_MESSAGE_LEN 0x01U 178 179 /* HCP Header Chaining Bit Offset */ 180 #define HCP_CHAINBIT_OFFSET 0x07U 181 /* HCP Header Chaining Bit Length */ 182 #define HCP_CHAINBIT_LEN 0x01U 183 184 /* Chaining Bit Values */ 185 #define HCP_CHAINBIT_DEFAULT 0x01U 186 #define HCP_CHAINBIT_BEGIN 0x00U 187 #define HCP_CHAINBIT_END HCP_CHAINBIT_DEFAULT 188 189 /* HCP Header Pipe ID Offset */ 190 #define HCP_PIPEID_OFFSET 0x00U 191 /* HCP Header Pipe ID Length */ 192 #define HCP_PIPEID_LEN 0x07U 193 194 /* HCP Message Header Type Offset */ 195 #define HCP_MSG_TYPE_OFFSET 0x06U 196 /* HCP Message Header Type Length */ 197 #define HCP_MSG_TYPE_LEN 0x02U 198 199 /* HCP Message Type Values */ 200 #define HCP_MSG_TYPE_COMMAND 0x00U 201 #define HCP_MSG_TYPE_EVENT 0x01U 202 #define HCP_MSG_TYPE_RESPONSE 0x02U 203 #define HCP_MSG_TYPE_RESERVED 0x03U 204 205 /* HCP Message Header Instruction Offset */ 206 #define HCP_MSG_INSTRUCTION_OFFSET 0x00U 207 /* HCP Message Header Instruction Length */ 208 #define HCP_MSG_INSTRUCTION_LEN 0x06U 209 /* HCP Invalid Message Instruction */ 210 #define HCP_MSG_INSTRUCTION_INVALID 0x3FU 211 212 213 /* HCP Packet Zero Length */ 214 #define HCP_ZERO_LEN 0x00U 215 216 217 218 /** \internal Generic HCI Commands for all the Gates */ 219 #define ANY_SET_PARAMETER 0x01U 220 #define ANY_GET_PARAMETER 0x02U 221 #define ANY_OPEN_PIPE 0x03U 222 #define ANY_CLOSE_PIPE 0x04U 223 #define ANY_GENERIC_CMD_RFU_B 0x05U 224 #define ANY_GENERIC_CMD_RFU_E 0x0FU 225 226 /* 227 * 0x05-0x0F is Reserved for Future Use 228 */ 229 230 /** \internal HCI Administration Com mands for the Management of the Host Network */ 231 232 #define ADM_CREATE_PIPE 0x10U 233 #define ADM_DELETE_PIPE 0x11U 234 #define ADM_NOTIFY_PIPE_CREATED 0x12U 235 #define ADM_NOTIFY_PIPE_DELETED 0x13U 236 #define ADM_CLEAR_ALL_PIPE 0x14U 237 #define ADM_NOTIFY_ALL_PIPE_CLEARED 0x15U 238 #define ADM_CMD_RFU_B 0x16U 239 #define ADM_CMD_RFU_E 0x3FU 240 241 #define MSG_INSTRUCTION_UNKNWON 0x3FU 242 243 /* 244 * 0x16-0x3F is Reserved for Future Use 245 */ 246 247 248 /** \internal HCI Generic Responses from the Gates */ 249 #define ANY_OK 0x00U 250 #define ANY_E_NOT_CONNECTED 0x01U 251 #define ANY_E_CMD_PAR_UNKNOWN 0x02U 252 #define ANY_E_NOK 0x03U 253 #define ANY_E_PIPES_FULL 0x04U 254 #define ANY_E_REG_PAR_UNKNOWN 0x05U 255 #define ANY_E_PIPE_NOT_OPENED 0x06U 256 #define ANY_E_CMD_NOT_SUPPORTED 0x07U 257 #define ANY_E_INHIBITED 0x08U 258 #define ANY_E_TIMEOUT 0x09U 259 #define ANY_E_REG_ACCESS_DENIED 0x0AU 260 #define ANY_E_PIPE_ACCESS_DENIED 0x0BU 261 262 /* Response Error Code for RF Reader Gate */ 263 #define WR_RF_ERROR 0x10U 264 265 /* 266 * 0x08, 0x0B-0x3F is Reserved for Future Use 267 */ 268 269 270 /** \internal HCI Generic Events from the Gates */ 271 #define EVT_HCI_END_OF_OPERATION 0x01 272 #define EVT_POST_DATA 0x02 273 #define EVT_HOT_PLUG 0x03 274 275 276 /* Maximum Buffer Size for the HCI Data */ 277 #define PHHCINFC_MAX_BUFFERSIZE (PHHAL_MAX_DATASIZE + 0x50U) 278 279 #define PHHCINFC_MAX_OPENPIPE 0x6FU 280 #define PHHCINFC_MAX_PIPE 0x6FU 281 #define PHHCINFC_MIN_PIPE 0x02U 282 283 284 /* Maximum Payload Length of HCI. */ 285 #define PHHCINFC_MAX_PACKET_DATA 0x1CU 286 #define PHHCINFC_MAX_HCP_LEN PHHCINFC_MAX_PACKET_DATA + 1 287 288 289 290 /* Maximum Payload Length of HCI. */ 291 292 293 /* 294 ################################################################################ 295 ******************** Enumeration and Structure Definition ********************** 296 ################################################################################ 297 */ 298 #if 1 299 typedef NFCSTATUS (*pphHciNfc_Pipe_Receive_t) ( 300 void *pContext, 301 void *pHwRef, 302 uint8_t *data, 303 #ifdef ONE_BYTE_LEN 304 uint8_t length 305 #else 306 uint16_t length 307 #endif 308 ); 309 #else 310 311 typedef pphNfcIF_Transact_t pphHciNfc_Pipe_Receive_t; 312 313 #endif 314 315 /** \defgroup grp_hci_nfc HCI Component 316 * 317 * 318 */ 319 320 typedef enum phHciNfc_HostID { 321 phHciNfc_HostControllerID = 0x00U, 322 phHciNfc_TerminalHostID = 0x01U, 323 phHciNfc_UICCHostID = 0x02U 324 /* 325 phHciNfc_HostID_RFU_B = 0x03U, 326 phHciNfc_HostID_RFU_E = 0xBFU, 327 phHciNfc_HostIDProprietary_B = 0xC0U, 328 phHciNfc_HostIDProprietary_E = 0xFFU 329 */ 330 }phHciNfc_HostID_t; 331 332 333 typedef enum phHciNfc_GateID{ 334 phHciNfc_AdminGate = 0x00U, 335 /* 336 phHciNfc_evGateIDProprietary_B = 0x01U, 337 phHciNfc_evGateIDProprietary_E = 0x03U, 338 */ 339 phHciNfc_LoopBackGate = 0x04U, 340 phHciNfc_IdentityMgmtGate = 0x05U, 341 phHciNfc_LinkMgmtGate = 0x06U, 342 /* 343 phHciNfc_GateID_RFU_B = 0x07U, 344 phHciNfc_GateID_RFU_E = 0x0FU, 345 */ 346 347 /* TODO: Fillin Other Gate Information */ 348 /* ETSI HCI Specific RF Reader Gates */ 349 phHciNfc_RFReaderAGate = 0x13, 350 phHciNfc_RFReaderBGate = 0x11, 351 352 /* Proprietary Reader Gate */ 353 phHciNfc_ISO15693Gate = 0x12, 354 phHciNfc_RFReaderFGate = 0x14, 355 phHciNfc_JewelReaderGate = 0x15, 356 357 /* ETSI HCI Card RF Gates */ 358 phHciNfc_CETypeBGate = 0x21, 359 phHciNfc_CETypeBPrimeGate = 0x22, 360 phHciNfc_CETypeAGate = 0x23, 361 phHciNfc_CETypeFGate = 0x24, 362 363 /* NFC-IP1 Gates */ 364 phHciNfc_NFCIP1InitRFGate = 0x30, 365 phHciNfc_NFCIP1TargetRFGate = 0x31, 366 367 /* ETSI HCI Connectivity Gate */ 368 phHciNfc_ConnectivityGate = 0x41, 369 370 371 /* Device Configuration Gates */ 372 phHciNfc_PN544MgmtGate = 0x90, 373 phHciNfc_HostCommGate = 0x91, 374 phHciNfc_GPIOGate = 0x92, 375 phHciNfc_RFMgmtGate = 0x93, 376 phHciNfc_PollingLoopGate = 0x94, 377 phHciNfc_DownloadMgmtGate = 0x95, 378 379 /* Card Emulation Managment Gates */ 380 phHciNfc_SwpMgmtGate = 0xA0, 381 phHciNfc_NfcWIMgmtGate = 0xA1, 382 phHciNfc_UnknownGate = 0xFF 383 384 }phHciNfc_GateID_t; 385 386 387 typedef enum phHciNfc_PipeID{ 388 HCI_LINKMGMT_PIPE_ID = 0x00U, 389 HCI_ADMIN_PIPE_ID = 0x01U, 390 HCI_DYNAMIC_PIPE_ID = 0x02U, 391 HCI_RESERVED_PIPE_ID = 0x70U, 392 HCI_UNKNOWN_PIPE_ID = PHHCINFC_MAX_PIPE 393 /* 394 phHciNfc_evOtherGatePipeID_B = 0x02U, 395 phHciNfc_evOtherGatePipeID_E = 0x6FU, 396 phHciNfc_evGatePipeID_RFU_B = 0x70U, 397 phHciNfc_evGatePipeID_RFU_E = 0x7FU, 398 */ 399 }phHciNfc_PipeID_t; 400 401 402 typedef enum phHciNfc_eState { 403 hciState_Reset = 0x00U, 404 hciState_Initialise, 405 hciState_Test, 406 hciState_Config, 407 hciState_IO, 408 hciState_Select, 409 hciState_Listen, 410 hciState_Activate, 411 hciState_Reactivate, 412 hciState_Connect, 413 hciState_Transact, 414 hciState_Disconnect, 415 hciState_Presence, 416 hciState_Release, 417 hciState_Unknown 418 }phHciNfc_eState_t; 419 420 typedef enum phHciNfc_eMode { 421 hciMode_Reset = 0x00U, 422 hciMode_Session, 423 hciMode_Override, 424 hciMode_Test, 425 hciMode_Unknown 426 }phHciNfc_eMode_t; 427 428 429 typedef enum phHciNfc_eSeq{ 430 /* HCI Admin Sequence */ 431 ADMIN_INIT_SEQ = 0x00U, 432 ADMIN_SESSION_SEQ, 433 ADMIN_CE_SEQ, 434 ADMIN_REL_SEQ, 435 ADMIN_EVT_HOTPLUG_SEQ, 436 437 /* HCI Link Management Sequence */ 438 LINK_MGMT_INIT_SEQ, 439 LINK_MGMT_REL_SEQ, 440 441 /* HCI Identity Management Sequence */ 442 IDENTITY_INIT_SEQ, 443 IDENTITY_INFO_SEQ, 444 IDENTITY_REL_SEQ, 445 446 /* HCI Polling Loop Sequence */ 447 PL_INIT_SEQ, 448 PL_DURATION_SEQ, 449 PL_CONFIG_PHASE_SEQ, 450 PL_TGT_DISABLE_SEQ, 451 PL_RESTART_SEQ, 452 PL_STOP_SEQ, 453 PL_REL_SEQ, 454 455 /* HCI Device Management Sequence */ 456 DEV_INIT_SEQ, 457 DEV_HAL_INFO_SEQ, 458 DEV_CONFIG_SEQ, 459 DEV_REL_SEQ, 460 461 /* HCI Reader Management Sequence */ 462 READER_MGMT_INIT_SEQ, 463 READER_ENABLE_SEQ, 464 READER_SELECT_SEQ, 465 READER_REACTIVATE_SEQ, 466 READER_SW_AUTO_SEQ, 467 READER_PRESENCE_CHK_SEQ, 468 READER_UICC_DISPATCH_SEQ, 469 READER_DESELECT_SEQ, 470 READER_RESELECT_SEQ, 471 READER_DISABLE_SEQ, 472 READER_MGMT_REL_SEQ, 473 474 /* HCI NFC-IP1 Sequence */ 475 NFCIP1_INIT_SEQ, 476 INITIATOR_SPEED_SEQ, 477 INITIATOR_GENERAL_SEQ, 478 TARGET_GENERAL_SEQ, 479 TARGET_SPEED_SEQ, 480 NFCIP1_REL_SEQ, 481 482 /* HCI Emulation Management Sequence */ 483 EMULATION_INIT_SEQ, 484 EMULATION_SWP_SEQ, 485 EMULATION_CONFIG_SEQ, 486 EMULATION_REL_SEQ, 487 488 HCI_END_SEQ, 489 HCI_INVALID_SEQ 490 } phHciNfc_eSeq_t; 491 492 493 494 typedef enum phHciNfc_eSeqType{ 495 RESET_SEQ = 0x00U, 496 INIT_SEQ, 497 UPDATE_SEQ, 498 INFO_SEQ, 499 CONFIG_SEQ, 500 REL_SEQ, 501 END_SEQ 502 } phHciNfc_eSeqType_t; 503 504 505 typedef enum phHciNfc_eConfigType{ 506 INVALID_CFG = 0x00U, 507 POLL_LOOP_CFG, 508 SMX_WI_CFG, 509 SMX_WI_MODE, 510 UICC_SWP_CFG, 511 SWP_EVT_CFG, 512 SWP_PROTECT_CFG, 513 NFC_GENERAL_CFG, 514 NFC_TARGET_CFG, 515 NFC_CE_A_CFG, 516 NFC_CE_B_CFG 517 } phHciNfc_eConfigType_t; 518 519 520 typedef struct phHciNfc_HCP_Message{ 521 /** \internal Identifies the Type and Kind of Instruction */ 522 uint8_t msg_header; 523 /** \internal Host Controller Protocol (HCP) Packet Message Payload */ 524 uint8_t payload[PHHCINFC_MAX_PACKET_DATA - 1]; 525 }phHciNfc_HCP_Message_t; 526 527 528 typedef struct phHciNfc_HCP_Packet{ 529 /** \internal Chaining Information and Pipe Identifier */ 530 uint8_t hcp_header; 531 /** \internal Host Controller Protocol (HCP) Packet Message or Payload */ 532 union 533 { 534 /** \internal Host Controller Protocol (HCP) Packet Message */ 535 phHciNfc_HCP_Message_t message; 536 /** \internal Host Controller Protocol (HCP) Packet Payload */ 537 uint8_t payload[PHHCINFC_MAX_PACKET_DATA]; 538 }msg; 539 }phHciNfc_HCP_Packet_t; 540 541 542 543 typedef struct phHciNfc_Gate_Info{ 544 /** \internal HCI Host Identifier */ 545 uint8_t host_id; 546 /** \internal HCI Gate Identifier */ 547 uint8_t gate_id; 548 }phHciNfc_Gate_Info_t; 549 550 551 typedef struct phHciNfc_Pipe_Params{ 552 /** \internal HCI Source Gate Information for the pipe */ 553 phHciNfc_Gate_Info_t source; 554 /** \internal HCI Destination Gate Information for the pipe */ 555 phHciNfc_Gate_Info_t dest; 556 /** \internal HCI Pipe Identifier */ 557 uint8_t pipe_id; 558 }phHciNfc_Pipe_Params_t; 559 560 561 typedef struct phHciNfc_Pipe_Info{ 562 /** \internal Structure containing the created dynamic pipe information */ 563 phHciNfc_Pipe_Params_t pipe; 564 /** \internal Status of the previous command sent to this pipe */ 565 NFCSTATUS prev_status; 566 /** \internal previous message type Sent to this pipe */ 567 uint8_t sent_msg_type; 568 /** \internal Message type Received in this pipe */ 569 uint8_t recv_msg_type; 570 /** \internal previous message sent to this pipe */ 571 uint8_t prev_msg; 572 /** \internal Index of the previous Set/Get Parameter command 573 * sent to this pipe */ 574 uint8_t reg_index; 575 /** \internal length of Parameter of the Set/Get Parameter 576 * command sent to this pipe */ 577 uint16_t param_length; 578 /** \internal Parameter of the Set/Get Parameter command 579 * sent to this pipe */ 580 void *param_info; 581 /** \internal Pointer to a Pipe specific Receive Response function */ 582 pphHciNfc_Pipe_Receive_t recv_resp; 583 /** \internal Pointer to a Pipe specific Receive Event function */ 584 pphHciNfc_Pipe_Receive_t recv_event; 585 /** \internal Pointer to a Pipe specific Receive Command function */ 586 pphHciNfc_Pipe_Receive_t recv_cmd; 587 }phHciNfc_Pipe_Info_t; 588 589 590 typedef struct phHciNfc_sContext{ 591 /** \internal HCI Layer Pointer from the upper layer for 592 lower layer function registration */ 593 phNfcLayer_sCfg_t *p_hci_layer; 594 /** \internal Pointer to the upper layer context */ 595 void *p_upper_context; 596 /** \internal Pointer to the Hardware Reference Sturcture */ 597 phHal_sHwReference_t *p_hw_ref; 598 /** \internal Pointer to the upper layer notification callback function */ 599 pphNfcIF_Notification_CB_t p_upper_notify; 600 /** \internal Structure to store the lower interface operations */ 601 phNfc_sLowerIF_t lower_interface; 602 /** \internal Execution Sequence using the HCI Context */ 603 volatile phHciNfc_eSeq_t hci_seq; 604 605 /** \internal State of the HCI Context */ 606 volatile phNfc_sState_t hci_state; 607 608 /** \internal Mode of HCI Initialisation */ 609 phHciNfc_Init_t init_mode; 610 611 /** \internal Memory Information for HCI Initialisation */ 612 uint8_t hal_mem_info[NXP_HAL_MEM_INFO_SIZE]; 613 614 /** \internal HCI Configuration Type */ 615 phHciNfc_eConfigType_t config_type; 616 /** \internal HCI SmartMX Mode Configuration */ 617 phHal_eSmartMX_Mode_t smx_mode; 618 /** \internal HCI Configuration Information */ 619 void *p_config_params; 620 621 /** \internal Current RF Reader/Emulation Gate in Use */ 622 phHal_eRFDevType_t host_rf_type; 623 624 /** \internal Connected Target Information */ 625 phHal_sRemoteDevInformation_t *p_target_info; 626 627 /** \internal Information of all the pipes created and opened */ 628 phHciNfc_Pipe_Info_t *p_pipe_list[PHHCINFC_MAX_PIPE+1]; 629 630 /** \internal Tag */ 631 phHciNfc_XchgInfo_t *p_xchg_info; 632 633 /** \internal Information of the HCI Gates */ 634 /** \internal HCI Admin Management Gate Information */ 635 void *p_admin_info; 636 /** \internal HCI Link Management Gate Information */ 637 void *p_link_mgmt_info; 638 /** \internal HCI Identity Management Gate Information */ 639 void *p_identity_info; 640 /** \internal HCI Polling Loop Gate Information */ 641 void *p_poll_loop_info; 642 /** \internal HCI NFC Device Management Information */ 643 void *p_device_mgmt_info; 644 /** \internal HCI RF Reader Gates Management Information */ 645 void *p_reader_mgmt_info; 646 /** \internal HCI Card Application Gates and Emulation 647 Information */ 648 void *p_emulation_mgmt_info; 649 /** \internal HCI RF Reader A Gate Information */ 650 void *p_reader_a_info; 651 #ifdef TYPE_B 652 /** \internal HCI RF Reader B Gate Information */ 653 void *p_reader_b_info; 654 #endif 655 #ifdef TYPE_FELICA 656 /** \internal HCI Felica Reader Gate Information */ 657 void *p_felica_info; 658 #endif 659 #ifdef TYPE_JEWEL 660 /** \internal HCI Jewel Reader Gate Information */ 661 void *p_jewel_info; 662 #endif 663 #ifdef TYPE_ISO15693 664 /** \internal HCI ISO15693 Reader Gate Information */ 665 void *p_iso_15693_info; 666 #endif 667 668 #ifdef ENABLE_P2P 669 /** \internal HCI NFC-IP1 Peer to Peer Information */ 670 void *p_nfcip_info; 671 #endif 672 /** \internal HCI Secure Element Management Information */ 673 void *p_wi_info; 674 /** \internal HCI UICC Information */ 675 void *p_uicc_info; 676 /** \internal HCI SWP Information */ 677 void *p_swp_info; 678 #ifdef HOST_EMULATION 679 /** \internal HCI Card Emulation A Gate Information */ 680 void *p_ce_a_info; 681 /** \internal HCI Card Emulation B Gate Information */ 682 void *p_ce_b_info; 683 #endif 684 685 /** \internal HCI Packet Data to be sent to the lower layer */ 686 phHciNfc_HCP_Packet_t tx_packet; 687 /** \internal HCI Packet Data to be received from the lower layer */ 688 phHciNfc_HCP_Packet_t rx_packet; 689 690 /** \internal Previous Status (To Store the Error Status ) */ 691 NFCSTATUS error_status; 692 693 /** \internal Pointer to HCI Send Buffer */ 694 uint8_t send_buffer[PHHCINFC_MAX_BUFFERSIZE]; 695 /** \internal Pointer to HCI Receive Buffer */ 696 uint8_t recv_buffer[PHHCINFC_MAX_BUFFERSIZE]; 697 698 /** \internal Total Number of bytes to be Sent */ 699 volatile uint16_t tx_total; 700 /** \internal Number of bytes Remaining to be Sent */ 701 volatile uint16_t tx_remain; 702 /** \internal Number of bytes sent */ 703 volatile uint16_t tx_sent; 704 705 volatile uint16_t rx_index; 706 707 /** \internal Total Number of bytes received */ 708 volatile uint16_t rx_total; 709 /** \internal Number of bytes received */ 710 volatile uint16_t rx_recvd; 711 /** \internal Index of the received data in the 712 * response packet 713 */ 714 715 /** \internal Send HCP Chaining Information */ 716 volatile uint8_t tx_hcp_chaining; 717 /** \internal Send HCP Fragment Index */ 718 volatile uint16_t tx_hcp_frgmnt_index; 719 720 /** \internal Receive HCP Chaining Information */ 721 volatile uint8_t rx_hcp_chaining; 722 /** \internal Receive HCP Fragment Index */ 723 volatile uint16_t rx_hcp_frgmnt_index; 724 725 /** \internal The Device under Test */ 726 volatile uint8_t hci_mode; 727 /** \internal Wait for Response if Response is Pending */ 728 volatile uint8_t response_pending; 729 /** \internal Notify the Event if Notifcation is Pending */ 730 volatile uint8_t event_pending; 731 732 /** \internal Pending Release of the detected Target */ 733 uint8_t target_release; 734 735 }phHciNfc_sContext_t; 736 737 /* 738 ################################################################################ 739 *********************** Function Prototype Declaration ************************* 740 ################################################################################ 741 */ 742 743 744 /** 745 * 746 * \ingroup grp_hci_nfc 747 * 748 * The phHciNfc_Receive function receives the HCI Events or Response from the 749 * corresponding peripheral device, described by the HCI Context Structure. 750 * 751 * \param[in] psContext psContext is the context of 752 * the HCI Layer. 753 * \param[in] pHwRef pHwRef is the Information of 754 * the Device Interface Link . 755 * \param[out] pdata Pointer to the response buffer that 756 * receives the response read. 757 * \param[in] length Variable that receives 758 * the number of bytes read. 759 * 760 * \retval NFCSTATUS_PENDING Data successfully read. 761 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 762 * could not be interpreted properly. 763 * \retval Other errors Other related errors 764 * 765 */ 766 767 extern 768 NFCSTATUS 769 phHciNfc_Receive( 770 void *psContext, 771 void *pHwRef, 772 uint8_t *pdata, 773 #ifdef ONE_BYTE_LEN 774 uint8_t length 775 #else 776 uint16_t length 777 #endif 778 ); 779 780 /** 781 * \ingroup grp_hci_nfc 782 * 783 * The phHciNfc_Send_Complete function acknowledges the completion of the HCI 784 * Commands sent to the device. 785 * 786 * \param[in] psContext psContext is the context of 787 * the HCI Layer. 788 * \param[in] pHwRef pHwRef is the Information of 789 * the Device Interface Link . 790 * \param[in] pInfo Transaction information like 791 * status and length after the 792 * completion of the send. 793 * 794 * \retval NONE. 795 * 796 */ 797 798 extern 799 void 800 phHciNfc_Send_Complete ( 801 void *psContext, 802 void *pHwRef, 803 phNfc_sTransactionInfo_t *pInfo 804 ); 805 806 /** 807 * \ingroup grp_hci_nfc 808 * 809 * The phHciNfc_Receive_Complete function acknowledges the completion of the HCI 810 * Event Information or Response received from the device. 811 * 812 * \param[in] psContext psContext is the context of 813 * the HCI Layer. 814 * \param[in] pHwRef pHwRef is the Information of 815 * the Device Interface Link . 816 * \param[in] pInfo Transaction information like status 817 * data and length after the completely 818 * receiving the response . 819 * \retval NONE. 820 * 821 * 822 */ 823 824 extern 825 void 826 phHciNfc_Receive_Complete ( 827 void *psContext, 828 void *pHwRef, 829 phNfc_sTransactionInfo_t *pInfo 830 ); 831 832 /** 833 * \ingroup grp_hci_nfc 834 * 835 * The phHciNfc_Notify_Event function notifies the occurence of the HCI 836 * Event from the device. 837 * 838 * \param[in] psContext psContext is the context of 839 * the HCI Layer. 840 * \param[in] pHwRef pHwRef is the Information of 841 * the Device Interface Link . 842 * \param[in] type reason returned for the notification to 843 * the HCI. 844 * \param[in] pInfo Notification information like status 845 * data,length etc from the lower layer 846 * to the HCI Layer. 847 * \retval NONE. 848 * 849 */ 850 851 extern 852 void 853 phHciNfc_Notify_Event( 854 void *psContext, 855 void *pHwRef, 856 uint8_t type, 857 void *pInfo 858 ); 859 860 /** 861 * \ingroup grp_hci_nfc 862 * 863 * The phHciNfc_Tag_Notify function notifies the the upper layer 864 * with the Tag Specific Notifications . 865 * 866 * \param[in] psContext psContext is the context of 867 * the HCI Layer. 868 * \param[in] pHwRef pHwRef is the Information of 869 * the Device Interface Link . 870 * \param[in] type reason returned for the notification to 871 * the HCI. 872 * \param[in] pInfo Notification information like status 873 * data,length etc from the lower layer 874 * to the HCI Layer. 875 * \retval NONE. 876 * 877 */ 878 extern 879 void 880 phHciNfc_Tag_Notify( 881 phHciNfc_sContext_t *psHciContext, 882 void *pHwRef, 883 uint8_t type, 884 void *pInfo 885 ); 886 887 /** 888 * \ingroup grp_hci_nfc 889 * 890 * The phHciNfc_Tag_Notify function notifies the the upper layer 891 * with the Tag Specific Notifications . 892 * 893 * \param[in] psContext psContext is the context of 894 * the HCI Layer. 895 * \param[in] pHwRef pHwRef is the Information of 896 * the Device Interface Link . 897 * \param[in] type reason returned for the notification to 898 * the HCI. 899 * \param[in] pInfo Notification information like status 900 * data,length etc from the lower layer 901 * to the HCI Layer. 902 * \retval NONE. 903 * 904 */ 905 906 extern 907 void 908 phHciNfc_Target_Select_Notify( 909 phHciNfc_sContext_t *psHciContext, 910 void *pHwRef, 911 uint8_t type, 912 void *pInfo 913 ); 914 915 916 /** 917 * \ingroup grp_hci_nfc 918 * 919 * The phHciNfc_Transceive_Notify function notifies the the upper layer 920 * with the after the transceive operation. 921 * 922 * \param[in] psContext psContext is the context of 923 * the HCI Layer. 924 * \param[in] pHwRef pHwRef is the Information of 925 * the Device Interface Link . 926 * \param[in] type reason returned for the notification to 927 * the HCI. 928 * \param[in] pInfo Notification information like status 929 * data,length etc from the lower layer 930 * to the HCI Layer. 931 * \retval NONE. 932 * 933 */ 934 extern 935 void 936 phHciNfc_Transceive_Notify( 937 phHciNfc_sContext_t *psHciContext, 938 void *pHwRef, 939 uint8_t type, 940 void *pInfo 941 ); 942 943 /** 944 * \ingroup grp_hci_nfc 945 * 946 * The phHciNfc_Notify function calls the upper layer notification callback. 947 * 948 * \param[in] pUpperNotify pUpperNotify is the notification 949 * callback of the upper HAL Layer. 950 * \param[in] pUpperContext pUpperContext is the context of 951 * the upper HAL Layer. 952 * \param[in] pHwRef pHwRef is the Information of 953 * the Device Interface Link . 954 * \param[in] type type of the notification to 955 * the upper HAL layer. 956 * \param[in] pInfo completion information returned 957 * to the Upper HAL Layer. 958 * NFCSTATUS_SUCCESS Notification successfully completed . 959 * NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 960 * could not be interpreted properly. 961 * Other errors Errors related to the HCI or lower layers 962 * 963 * \retval NONE. 964 * 965 */ 966 967 extern 968 void 969 phHciNfc_Notify( 970 pphNfcIF_Notification_CB_t p_upper_notify, 971 void *p_upper_context, 972 void *pHwRef, 973 uint8_t type, 974 void *pInfo 975 ); 976 977 /** 978 * \ingroup grp_hci_nfc 979 * 980 * The phHciNfc_Release_Notify function Releases HCI and notifies 981 * the upper layer. 982 * 983 * \param[in] psHciContext psHciContext is the context of 984 * the HCI Layer. 985 * \param[in] pHwRef pHwRef is the Information of 986 * the Device Interface Link . 987 * \param[in] type reason returned for the notification to 988 * the HCI. 989 * \param[in] pInfo Notification information like status 990 * data,length etc from the lower layer 991 * to the HCI Layer. 992 * \retval NONE. 993 * 994 */ 995 extern 996 void 997 phHciNfc_Release_Notify( 998 phHciNfc_sContext_t *psHciContext, 999 void *pHwRef, 1000 uint8_t type, 1001 void *pInfo 1002 ); 1003 1004 1005 1006 /** 1007 * \ingroup grp_hci_nfc 1008 * 1009 * The phHciNfc_Send_Generic_Cmd function sends the HCI Generic Commands 1010 * to the device. 1011 * 1012 * \param[in] psHciContext psHciContext is the context of 1013 * the HCI Layer. 1014 * \param[in] pHwRef pHwRef is the Information of 1015 * the Device Interface Link . 1016 * \param[in] pipe_id The pipe to which the command 1017 * is being sent. 1018 * \param[in] cmd The HCI Generic command sent to a 1019 * particular pipe . 1020 * 1021 * \retval NFCSTATUS_PENDING HCI Generic Command send in progress . 1022 * \retval 1023 * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated 1024 * as required amount of memory 1025 * is not sufficient. 1026 * 1027 */ 1028 1029 extern 1030 NFCSTATUS 1031 phHciNfc_Send_Generic_Cmd ( 1032 phHciNfc_sContext_t *psHciContext, 1033 void *pHwRef, 1034 uint8_t pipe_id, 1035 uint8_t cmd 1036 ); 1037 1038 /** 1039 * \ingroup grp_hci_nfc 1040 * 1041 * The phHciNfc_Set_Param function configures the Gate specific register 1042 * with the provided value. 1043 * 1044 * \param[in] psHciContext psHciContext is the context of 1045 * the HCI Layer. 1046 * \param[in] pHwRef pHwRef is the Information of 1047 * the Device Interface Link . 1048 * \param[in] p_pipe_info Pointer to pipe specific information. 1049 * \param[in] reg_index Index of the register to be 1050 * configured . 1051 * \param[in] p_param Value to the configured in 1052 * particular register. 1053 * \param[in] param_length Length of the parameter provided 1054 * for the configuration. 1055 * 1056 * \retval NFCSTATUS_PENDING HCI Set parameter in progress . 1057 * \retval 1058 * NFCSTATUS_INVALID_HCI_INFORMATION The Information like p_pipe_info, 1059 * p_param or param_length is invalid 1060 * 1061 */ 1062 1063 extern 1064 NFCSTATUS 1065 phHciNfc_Set_Param ( 1066 phHciNfc_sContext_t *psHciContext, 1067 void *pHwRef, 1068 phHciNfc_Pipe_Info_t *p_pipe_info, 1069 uint8_t reg_index, 1070 void *p_param, 1071 uint16_t param_length 1072 ); 1073 1074 /** 1075 * \ingroup grp_hci_nfc 1076 * 1077 * The phHciNfc_Send_HCP function sends the HCI Host Control Packet 1078 * Frames to the device. 1079 * 1080 * \param[in] psHciContext psHciContext is the context of 1081 * the HCI Layer. 1082 * \param[in] pHwRef pHwRef is the Information of 1083 * the Device Interface Link . 1084 * 1085 * \retval NFCSTATUS_PENDING HCP Frame send pending. 1086 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 1087 * could not be interpreted properly. 1088 * \retval Other errors Other related errors 1089 * 1090 * 1091 */ 1092 1093 extern 1094 NFCSTATUS 1095 phHciNfc_Send_HCP ( 1096 phHciNfc_sContext_t *psHciContext, 1097 void *pHwRef 1098 ); 1099 1100 1101 /** 1102 * \ingroup grp_hci_nfc 1103 * 1104 * The phHciNfc_Build_HCPFrame function initially builds the HCP Packet Frame 1105 * with the values passed in the arguments . 1106 * 1107 * \param[in] hcp_packet hcp_packet is the frame packet structure 1108 * in which the frame is populated with the 1109 * appropriate fields. 1110 * \param[in] chainbit chainbit specifies whether the following 1111 * HCP frames are chained or the frame is a 1112 * normal frame. 1113 * \param[in] pipe_id pipe_id of the pipe to which the frame has 1114 * to be sent. 1115 * \param[in] msg_type type of message sent to the pipe. 1116 * \param[in] instruction type of message instruction send to the pipe. 1117 * 1118 * \retval NONE. 1119 * 1120 */ 1121 1122 1123 extern 1124 void 1125 phHciNfc_Build_HCPFrame ( 1126 phHciNfc_HCP_Packet_t *hcp_packet, 1127 uint8_t chainbit, 1128 uint8_t pipe_id, 1129 uint8_t msg_type, 1130 uint8_t instruction 1131 ); 1132 1133 /** 1134 * \ingroup grp_hci_nfc 1135 * 1136 * The phHciNfc_Append_HCPFrame function Appends the HCP Packet Frame 1137 * with the values passed in the arguments . 1138 * 1139 * \param[in] hcp_data hcp_data is the pointer to the HCP 1140 * payload to which the data is to be 1141 * appended. 1142 * \param[in] hcp_index hcp_index is the index from which 1143 * the data source needs to be appended. 1144 * \param[in] src_data src_data that is to be appended to the 1145 * HCP packet. 1146 * \param[in] src_len The length of the data source that is 1147 * to be appended. 1148 * \retval NONE. 1149 * 1150 */ 1151 1152 extern 1153 void 1154 phHciNfc_Append_HCPFrame ( 1155 uint8_t *hcp_data, 1156 uint16_t hcp_index, 1157 uint8_t *src_data, 1158 uint16_t src_len 1159 ); 1160 1161 /** 1162 * \ingroup grp_hci_nfc 1163 * 1164 * The phHciNfc_Allocate_Resource function allocates and initialises the 1165 * resource memory for the HCI layer. 1166 * 1167 * \param[in] ppBuffer ppBuffer is the pointer to which the 1168 * resource memory is allocated. 1169 * \param[in] size Variable that specifies the size of 1170 * the memory that needs to be created. 1171 * 1172 * \retval NFCSTATUS_SUCCESS The Resource Memory was allocated 1173 * successfully . 1174 * \retval 1175 * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated 1176 * as required amount of memory 1177 * is not suffient. 1178 * 1179 */ 1180 1181 extern 1182 NFCSTATUS 1183 phHciNfc_Allocate_Resource ( 1184 void **ppBuffer, 1185 uint16_t size 1186 ); 1187 /** 1188 * \ingroup grp_hci_nfc 1189 * 1190 * The phHciNfc_Release_Resources function releases all the resources 1191 * allocated in the HCI Layer. 1192 * 1193 * \param[in] psHciContext psHciContext is the context of 1194 * the HCI Layer. 1195 * 1196 * \retval NONE. 1197 * 1198 */ 1199 1200 extern 1201 void 1202 phHciNfc_Release_Resources ( 1203 phHciNfc_sContext_t **ppsHciContext 1204 ); 1205 1206 /** 1207 * \ingroup grp_hci_nfc 1208 * 1209 * The phHciNfc_Release_Lower function initiates the release of the 1210 * lower layers. 1211 * 1212 * \param[in] psHciContext psHciContext is the context of 1213 * the HCI Layer. 1214 * \param[in] pHwRef pHwRef is the Information of 1215 * the Device Interface Link . 1216 * 1217 * \retval NONE. 1218 * 1219 */ 1220 1221 extern 1222 void 1223 phHciNfc_Release_Lower( 1224 phHciNfc_sContext_t *psHciContext, 1225 void *pHwRef 1226 ); 1227 1228 1229 1230 #endif 1231 1232