| /* |
| * Copyright (C) 2010 NXP Semiconductors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /*! |
| * =========================================================================== * |
| * * |
| * * |
| * \file phHciNfc_Generic.h * |
| * \brief Common HCI Header for the Generic HCI Management. * |
| * * |
| * * |
| * Project: NFC-FRI-1.1 * |
| * * |
| * $Date: Mon Mar 29 17:34:47 2010 $ * |
| * $Author: ing04880 $ * |
| * $Revision: 1.73 $ * |
| * $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 $ |
| * * |
| * =========================================================================== * |
| */ |
| |
| /*@{*/ |
| #ifndef PHHCINFC_GENERIC_H |
| #define PHHCINFC_GENERIC_H |
| |
| /*@}*/ |
| |
| |
| /** |
| * \name HCI |
| * |
| * File: \ref phHciNfc_Generic.h |
| * |
| */ |
| /*@{*/ |
| #define PHHCINFC_GENERIC_FILEREVISION "$Revision: 1.73 $" /**< \ingroup grp_file_attributes */ |
| #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 */ |
| /*@}*/ |
| /* |
| |
| ################################################################################ |
| ***************************** Header File Inclusion **************************** |
| ################################################################################ |
| */ |
| #define LOG_TAG "NFC-HCI" |
| #include <cutils/log.h> |
| #include <phNfcIoctlCode.h> |
| #include<phNfcInterface.h> |
| #include <phHciNfc.h> |
| /* |
| ################################################################################ |
| ****************************** Macro Definitions ******************************* |
| ################################################################################ |
| */ |
| |
| #define Trace_buffer phOsalNfc_DbgTraceBuffer |
| |
| /* HCI TRACE Macros */ |
| #if defined(HCI_TRACE)&& !defined(SILENT_HCI) |
| #include <phOsalNfc.h> |
| #include <stdio.h> |
| extern char phOsalNfc_DbgTraceBuffer[]; |
| #define MAX_TRACE_BUFFER 150 |
| /* #define HCI_PRINT( str ) phOsalNfc_DbgTrace(str) */ |
| #define HCI_PRINT( str ) phOsalNfc_DbgString(str) |
| #define HCI_DEBUG(...) LOGD(__VA_ARGS__) |
| |
| |
| |
| |
| #define HCI_PRINT_BUFFER(msg,buf,len) \ |
| { \ |
| snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \ |
| phOsalNfc_DbgString(Trace_buffer); \ |
| phOsalNfc_DbgTrace(buf,len); \ |
| phOsalNfc_DbgString("\r"); \ |
| \ |
| } |
| #else |
| #include <phDbgTrace.h> |
| #if defined(PHDBG_TRACES) && !defined(HCI_TRACE) |
| #define HCI_PRINT( str ) PHDBG_INFO(str) |
| #define HCI_DEBUG(str, arg) |
| #define HCI_PRINT_BUFFER(msg,buf,len) |
| #else |
| #define HCI_PRINT( str ) |
| #define HCI_DEBUG(...) |
| #define HCI_PRINT_BUFFER(msg,buf,len) |
| #endif /* #if defined(PHDBG_TRACES) */ |
| /* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */ |
| |
| #endif /* #if defined(HCI_TRACE) */ |
| |
| #define ZERO 0x00U |
| |
| |
| #ifdef MASK_BITS |
| #define BYTE_SIZE 0x08U |
| |
| /* HCI GET and SET BITS Macros */ |
| #define MASK_BITS8(p,l) \ |
| ( ( (((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE )? \ |
| (~(0xFFU<<((p)+(l))) & (0xFFU<<(p))):(0U) ) |
| #ifdef MASK_BITS |
| #define GET_BITS8(num,p,l) \ |
| ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \ |
| (((num)& (MASK_BITS8(p,l)))>>(p)):(0U) ) |
| #else |
| #define GET_BITS8(num,p,l) \ |
| ( ((((p)+(l))<=BYTE_SIZE))? \ |
| (((num)>>(p))& (~(0xFFU<<(l)))):(0U) ) |
| #endif |
| #define SET_BITS8(num,p,l,val) \ |
| ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \ |
| (((num)& (~MASK_BITS8(p,l)))|((val)<<(p))):(0U)) |
| |
| #endif |
| |
| /** \ingroup grp_hci_retval |
| The Corresponding HCI Gate Not Supported. |
| */ |
| #define NFCSTATUS_HCI_GATE_NOT_SUPPORTED (0x71U) |
| |
| /** \ingroup grp_hci_retval |
| Invalid Command from the HCI Layer |
| */ |
| #define NFCSTATUS_INVALID_HCI_COMMAND (0x72U) |
| |
| /** \ingroup grp_hci_retval |
| HCI Command not supported . */ |
| #define NFCSTATUS_COMMAND_NOT_SUPPORTED (0x73U) |
| |
| /** \ingroup grp_hci_retval |
| Invalide Response from the HCI Layer |
| */ |
| #define NFCSTATUS_INVALID_HCI_RESPONSE (0x74U) |
| |
| /** \ingroup grp_hci_retval |
| The Invalid Instruction type (Neither Command/Response nor Event ). |
| */ |
| #define NFCSTATUS_INVALID_HCI_INSTRUCTION (0x75U) |
| |
| /** \ingroup grp_hci_retval |
| The Invalid Instruction type (Neither Command/Response nor Event ). |
| */ |
| #define NFCSTATUS_INVALID_HCI_INFORMATION (0x76U) |
| |
| /** \ingroup grp_hci_retval |
| The Invalid HCI Sequence. |
| */ |
| #define NFCSTATUS_INVALID_HCI_SEQUENCE (0x78U) |
| |
| |
| /** \ingroup grp_hci_retval |
| The HCI Error Response with Response code. |
| */ |
| #define NFCSTATUS_HCI_RESPONSE(code) (code) |
| |
| |
| /* Length of the HCP and the HCP Message Header in Bytes */ |
| #define HCP_HEADER_LEN 0x02U |
| |
| /* Length of the HCP Message Header in Bytes */ |
| #define HCP_MESSAGE_LEN 0x01U |
| |
| /* HCP Header Chaining Bit Offset */ |
| #define HCP_CHAINBIT_OFFSET 0x07U |
| /* HCP Header Chaining Bit Length */ |
| #define HCP_CHAINBIT_LEN 0x01U |
| |
| /* Chaining Bit Values */ |
| #define HCP_CHAINBIT_DEFAULT 0x01U |
| #define HCP_CHAINBIT_BEGIN 0x00U |
| #define HCP_CHAINBIT_END HCP_CHAINBIT_DEFAULT |
| |
| /* HCP Header Pipe ID Offset */ |
| #define HCP_PIPEID_OFFSET 0x00U |
| /* HCP Header Pipe ID Length */ |
| #define HCP_PIPEID_LEN 0x07U |
| |
| /* HCP Message Header Type Offset */ |
| #define HCP_MSG_TYPE_OFFSET 0x06U |
| /* HCP Message Header Type Length */ |
| #define HCP_MSG_TYPE_LEN 0x02U |
| |
| /* HCP Message Type Values */ |
| #define HCP_MSG_TYPE_COMMAND 0x00U |
| #define HCP_MSG_TYPE_EVENT 0x01U |
| #define HCP_MSG_TYPE_RESPONSE 0x02U |
| #define HCP_MSG_TYPE_RESERVED 0x03U |
| |
| /* HCP Message Header Instruction Offset */ |
| #define HCP_MSG_INSTRUCTION_OFFSET 0x00U |
| /* HCP Message Header Instruction Length */ |
| #define HCP_MSG_INSTRUCTION_LEN 0x06U |
| /* HCP Invalid Message Instruction */ |
| #define HCP_MSG_INSTRUCTION_INVALID 0x3FU |
| |
| |
| /* HCP Packet Zero Length */ |
| #define HCP_ZERO_LEN 0x00U |
| |
| |
| |
| /** \internal Generic HCI Commands for all the Gates */ |
| #define ANY_SET_PARAMETER 0x01U |
| #define ANY_GET_PARAMETER 0x02U |
| #define ANY_OPEN_PIPE 0x03U |
| #define ANY_CLOSE_PIPE 0x04U |
| #define ANY_GENERIC_CMD_RFU_B 0x05U |
| #define ANY_GENERIC_CMD_RFU_E 0x0FU |
| |
| /* |
| * 0x05-0x0F is Reserved for Future Use |
| */ |
| |
| /** \internal HCI Administration Com mands for the Management of the Host Network */ |
| |
| #define ADM_CREATE_PIPE 0x10U |
| #define ADM_DELETE_PIPE 0x11U |
| #define ADM_NOTIFY_PIPE_CREATED 0x12U |
| #define ADM_NOTIFY_PIPE_DELETED 0x13U |
| #define ADM_CLEAR_ALL_PIPE 0x14U |
| #define ADM_NOTIFY_ALL_PIPE_CLEARED 0x15U |
| #define ADM_CMD_RFU_B 0x16U |
| #define ADM_CMD_RFU_E 0x3FU |
| |
| #define MSG_INSTRUCTION_UNKNWON 0x3FU |
| |
| /* |
| * 0x16-0x3F is Reserved for Future Use |
| */ |
| |
| |
| /** \internal HCI Generic Responses from the Gates */ |
| #define ANY_OK 0x00U |
| #define ANY_E_NOT_CONNECTED 0x01U |
| #define ANY_E_CMD_PAR_UNKNOWN 0x02U |
| #define ANY_E_NOK 0x03U |
| #define ANY_E_PIPES_FULL 0x04U |
| #define ANY_E_REG_PAR_UNKNOWN 0x05U |
| #define ANY_E_PIPE_NOT_OPENED 0x06U |
| #define ANY_E_CMD_NOT_SUPPORTED 0x07U |
| #define ANY_E_INHIBITED 0x08U |
| #define ANY_E_TIMEOUT 0x09U |
| #define ANY_E_REG_ACCESS_DENIED 0x0AU |
| #define ANY_E_PIPE_ACCESS_DENIED 0x0BU |
| |
| /* Response Error Code for RF Reader Gate */ |
| #define WR_RF_ERROR 0x10U |
| |
| /* |
| * 0x08, 0x0B-0x3F is Reserved for Future Use |
| */ |
| |
| |
| /** \internal HCI Generic Events from the Gates */ |
| #define EVT_HCI_END_OF_OPERATION 0x01 |
| #define EVT_POST_DATA 0x02 |
| #define EVT_HOT_PLUG 0x03 |
| |
| |
| /* Maximum Buffer Size for the HCI Data */ |
| #define PHHCINFC_MAX_BUFFERSIZE (PHHAL_MAX_DATASIZE + 0x50U) |
| |
| #define PHHCINFC_MAX_OPENPIPE 0x6FU |
| #define PHHCINFC_MAX_PIPE 0x6FU |
| #define PHHCINFC_MIN_PIPE 0x02U |
| |
| |
| /* Maximum Payload Length of HCI. */ |
| #define PHHCINFC_MAX_PACKET_DATA 0x1CU |
| #define PHHCINFC_MAX_HCP_LEN PHHCINFC_MAX_PACKET_DATA + 1 |
| |
| |
| |
| /* Maximum Payload Length of HCI. */ |
| |
| |
| /* |
| ################################################################################ |
| ******************** Enumeration and Structure Definition ********************** |
| ################################################################################ |
| */ |
| #if 1 |
| typedef NFCSTATUS (*pphHciNfc_Pipe_Receive_t) ( |
| void *pContext, |
| void *pHwRef, |
| uint8_t *data, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| #else |
| |
| typedef pphNfcIF_Transact_t pphHciNfc_Pipe_Receive_t; |
| |
| #endif |
| |
| /** \defgroup grp_hci_nfc HCI Component |
| * |
| * |
| */ |
| |
| typedef enum phHciNfc_HostID { |
| phHciNfc_HostControllerID = 0x00U, |
| phHciNfc_TerminalHostID = 0x01U, |
| phHciNfc_UICCHostID = 0x02U |
| /* |
| phHciNfc_HostID_RFU_B = 0x03U, |
| phHciNfc_HostID_RFU_E = 0xBFU, |
| phHciNfc_HostIDProprietary_B = 0xC0U, |
| phHciNfc_HostIDProprietary_E = 0xFFU |
| */ |
| }phHciNfc_HostID_t; |
| |
| |
| typedef enum phHciNfc_GateID{ |
| phHciNfc_AdminGate = 0x00U, |
| /* |
| phHciNfc_evGateIDProprietary_B = 0x01U, |
| phHciNfc_evGateIDProprietary_E = 0x03U, |
| */ |
| phHciNfc_LoopBackGate = 0x04U, |
| phHciNfc_IdentityMgmtGate = 0x05U, |
| phHciNfc_LinkMgmtGate = 0x06U, |
| /* |
| phHciNfc_GateID_RFU_B = 0x07U, |
| phHciNfc_GateID_RFU_E = 0x0FU, |
| */ |
| |
| /* TODO: Fillin Other Gate Information */ |
| /* ETSI HCI Specific RF Reader Gates */ |
| phHciNfc_RFReaderAGate = 0x13, |
| phHciNfc_RFReaderBGate = 0x11, |
| |
| /* Proprietary Reader Gate */ |
| phHciNfc_ISO15693Gate = 0x12, |
| phHciNfc_RFReaderFGate = 0x14, |
| phHciNfc_JewelReaderGate = 0x15, |
| |
| /* ETSI HCI Card RF Gates */ |
| phHciNfc_CETypeBGate = 0x21, |
| phHciNfc_CETypeBPrimeGate = 0x22, |
| phHciNfc_CETypeAGate = 0x23, |
| phHciNfc_CETypeFGate = 0x24, |
| |
| /* NFC-IP1 Gates */ |
| phHciNfc_NFCIP1InitRFGate = 0x30, |
| phHciNfc_NFCIP1TargetRFGate = 0x31, |
| |
| /* ETSI HCI Connectivity Gate */ |
| phHciNfc_ConnectivityGate = 0x41, |
| |
| |
| /* Device Configuration Gates */ |
| phHciNfc_PN544MgmtGate = 0x90, |
| phHciNfc_HostCommGate = 0x91, |
| phHciNfc_GPIOGate = 0x92, |
| phHciNfc_RFMgmtGate = 0x93, |
| phHciNfc_PollingLoopGate = 0x94, |
| phHciNfc_DownloadMgmtGate = 0x95, |
| |
| /* Card Emulation Managment Gates */ |
| phHciNfc_SwpMgmtGate = 0xA0, |
| phHciNfc_NfcWIMgmtGate = 0xA1, |
| phHciNfc_UnknownGate = 0xFF |
| |
| }phHciNfc_GateID_t; |
| |
| |
| typedef enum phHciNfc_PipeID{ |
| HCI_LINKMGMT_PIPE_ID = 0x00U, |
| HCI_ADMIN_PIPE_ID = 0x01U, |
| HCI_DYNAMIC_PIPE_ID = 0x02U, |
| HCI_RESERVED_PIPE_ID = 0x70U, |
| HCI_UNKNOWN_PIPE_ID = PHHCINFC_MAX_PIPE |
| /* |
| phHciNfc_evOtherGatePipeID_B = 0x02U, |
| phHciNfc_evOtherGatePipeID_E = 0x6FU, |
| phHciNfc_evGatePipeID_RFU_B = 0x70U, |
| phHciNfc_evGatePipeID_RFU_E = 0x7FU, |
| */ |
| }phHciNfc_PipeID_t; |
| |
| |
| typedef enum phHciNfc_eState { |
| hciState_Reset = 0x00U, |
| hciState_Initialise, |
| hciState_Test, |
| hciState_Config, |
| hciState_IO, |
| hciState_Select, |
| hciState_Listen, |
| hciState_Activate, |
| hciState_Reactivate, |
| hciState_Connect, |
| hciState_Transact, |
| hciState_Disconnect, |
| hciState_Presence, |
| hciState_Release, |
| hciState_Unknown |
| }phHciNfc_eState_t; |
| |
| typedef enum phHciNfc_eMode { |
| hciMode_Reset = 0x00U, |
| hciMode_Session, |
| hciMode_Override, |
| hciMode_Test, |
| hciMode_Unknown |
| }phHciNfc_eMode_t; |
| |
| |
| typedef enum phHciNfc_eSeq{ |
| /* HCI Admin Sequence */ |
| ADMIN_INIT_SEQ = 0x00U, |
| ADMIN_SESSION_SEQ, |
| ADMIN_CE_SEQ, |
| ADMIN_REL_SEQ, |
| ADMIN_EVT_HOTPLUG_SEQ, |
| |
| /* HCI Link Management Sequence */ |
| LINK_MGMT_INIT_SEQ, |
| LINK_MGMT_REL_SEQ, |
| |
| /* HCI Identity Management Sequence */ |
| IDENTITY_INIT_SEQ, |
| IDENTITY_INFO_SEQ, |
| IDENTITY_REL_SEQ, |
| |
| /* HCI Polling Loop Sequence */ |
| PL_INIT_SEQ, |
| PL_DURATION_SEQ, |
| PL_CONFIG_PHASE_SEQ, |
| PL_TGT_DISABLE_SEQ, |
| PL_RESTART_SEQ, |
| PL_STOP_SEQ, |
| PL_REL_SEQ, |
| |
| /* HCI Device Management Sequence */ |
| DEV_INIT_SEQ, |
| DEV_HAL_INFO_SEQ, |
| DEV_CONFIG_SEQ, |
| DEV_REL_SEQ, |
| |
| /* HCI Reader Management Sequence */ |
| READER_MGMT_INIT_SEQ, |
| READER_ENABLE_SEQ, |
| READER_SELECT_SEQ, |
| READER_REACTIVATE_SEQ, |
| READER_SW_AUTO_SEQ, |
| READER_PRESENCE_CHK_SEQ, |
| READER_UICC_DISPATCH_SEQ, |
| READER_DESELECT_SEQ, |
| READER_RESELECT_SEQ, |
| READER_DISABLE_SEQ, |
| READER_MGMT_REL_SEQ, |
| |
| /* HCI NFC-IP1 Sequence */ |
| NFCIP1_INIT_SEQ, |
| INITIATOR_SPEED_SEQ, |
| INITIATOR_GENERAL_SEQ, |
| TARGET_GENERAL_SEQ, |
| TARGET_SPEED_SEQ, |
| NFCIP1_REL_SEQ, |
| |
| /* HCI Emulation Management Sequence */ |
| EMULATION_INIT_SEQ, |
| EMULATION_SWP_SEQ, |
| EMULATION_CONFIG_SEQ, |
| EMULATION_REL_SEQ, |
| |
| HCI_END_SEQ, |
| HCI_INVALID_SEQ |
| } phHciNfc_eSeq_t; |
| |
| |
| |
| typedef enum phHciNfc_eSeqType{ |
| RESET_SEQ = 0x00U, |
| INIT_SEQ, |
| UPDATE_SEQ, |
| INFO_SEQ, |
| CONFIG_SEQ, |
| REL_SEQ, |
| END_SEQ |
| } phHciNfc_eSeqType_t; |
| |
| |
| typedef enum phHciNfc_eConfigType{ |
| INVALID_CFG = 0x00U, |
| POLL_LOOP_CFG, |
| SMX_WI_CFG, |
| SMX_WI_MODE, |
| UICC_SWP_CFG, |
| SWP_EVT_CFG, |
| SWP_PROTECT_CFG, |
| NFC_GENERAL_CFG, |
| NFC_TARGET_CFG, |
| NFC_CE_A_CFG, |
| NFC_CE_B_CFG |
| } phHciNfc_eConfigType_t; |
| |
| |
| typedef struct phHciNfc_HCP_Message{ |
| /** \internal Identifies the Type and Kind of Instruction */ |
| uint8_t msg_header; |
| /** \internal Host Controller Protocol (HCP) Packet Message Payload */ |
| uint8_t payload[PHHCINFC_MAX_PACKET_DATA - 1]; |
| }phHciNfc_HCP_Message_t; |
| |
| |
| typedef struct phHciNfc_HCP_Packet{ |
| /** \internal Chaining Information and Pipe Identifier */ |
| uint8_t hcp_header; |
| /** \internal Host Controller Protocol (HCP) Packet Message or Payload */ |
| union |
| { |
| /** \internal Host Controller Protocol (HCP) Packet Message */ |
| phHciNfc_HCP_Message_t message; |
| /** \internal Host Controller Protocol (HCP) Packet Payload */ |
| uint8_t payload[PHHCINFC_MAX_PACKET_DATA]; |
| }msg; |
| }phHciNfc_HCP_Packet_t; |
| |
| |
| |
| typedef struct phHciNfc_Gate_Info{ |
| /** \internal HCI Host Identifier */ |
| uint8_t host_id; |
| /** \internal HCI Gate Identifier */ |
| uint8_t gate_id; |
| }phHciNfc_Gate_Info_t; |
| |
| |
| typedef struct phHciNfc_Pipe_Params{ |
| /** \internal HCI Source Gate Information for the pipe */ |
| phHciNfc_Gate_Info_t source; |
| /** \internal HCI Destination Gate Information for the pipe */ |
| phHciNfc_Gate_Info_t dest; |
| /** \internal HCI Pipe Identifier */ |
| uint8_t pipe_id; |
| }phHciNfc_Pipe_Params_t; |
| |
| |
| typedef struct phHciNfc_Pipe_Info{ |
| /** \internal Structure containing the created dynamic pipe information */ |
| phHciNfc_Pipe_Params_t pipe; |
| /** \internal Status of the previous command sent to this pipe */ |
| NFCSTATUS prev_status; |
| /** \internal previous message type Sent to this pipe */ |
| uint8_t sent_msg_type; |
| /** \internal Message type Received in this pipe */ |
| uint8_t recv_msg_type; |
| /** \internal previous message sent to this pipe */ |
| uint8_t prev_msg; |
| /** \internal Index of the previous Set/Get Parameter command |
| * sent to this pipe */ |
| uint8_t reg_index; |
| /** \internal length of Parameter of the Set/Get Parameter |
| * command sent to this pipe */ |
| uint16_t param_length; |
| /** \internal Parameter of the Set/Get Parameter command |
| * sent to this pipe */ |
| void *param_info; |
| /** \internal Pointer to a Pipe specific Receive Response function */ |
| pphHciNfc_Pipe_Receive_t recv_resp; |
| /** \internal Pointer to a Pipe specific Receive Event function */ |
| pphHciNfc_Pipe_Receive_t recv_event; |
| /** \internal Pointer to a Pipe specific Receive Command function */ |
| pphHciNfc_Pipe_Receive_t recv_cmd; |
| }phHciNfc_Pipe_Info_t; |
| |
| |
| typedef struct phHciNfc_sContext{ |
| /** \internal HCI Layer Pointer from the upper layer for |
| lower layer function registration */ |
| phNfcLayer_sCfg_t *p_hci_layer; |
| /** \internal Pointer to the upper layer context */ |
| void *p_upper_context; |
| /** \internal Pointer to the Hardware Reference Sturcture */ |
| phHal_sHwReference_t *p_hw_ref; |
| /** \internal Pointer to the upper layer notification callback function */ |
| pphNfcIF_Notification_CB_t p_upper_notify; |
| /** \internal Structure to store the lower interface operations */ |
| phNfc_sLowerIF_t lower_interface; |
| /** \internal Execution Sequence using the HCI Context */ |
| volatile phHciNfc_eSeq_t hci_seq; |
| |
| /** \internal State of the HCI Context */ |
| volatile phNfc_sState_t hci_state; |
| |
| /** \internal Mode of HCI Initialisation */ |
| phHciNfc_Init_t init_mode; |
| |
| /** \internal Memory Information for HCI Initialisation */ |
| uint8_t hal_mem_info[NXP_HAL_MEM_INFO_SIZE]; |
| |
| /** \internal HCI Configuration Type */ |
| phHciNfc_eConfigType_t config_type; |
| /** \internal HCI SmartMX Mode Configuration */ |
| phHal_eSmartMX_Mode_t smx_mode; |
| /** \internal HCI Configuration Information */ |
| void *p_config_params; |
| |
| /** \internal Current RF Reader/Emulation Gate in Use */ |
| phHal_eRFDevType_t host_rf_type; |
| |
| /** \internal Connected Target Information */ |
| phHal_sRemoteDevInformation_t *p_target_info; |
| |
| /** \internal Information of all the pipes created and opened */ |
| phHciNfc_Pipe_Info_t *p_pipe_list[PHHCINFC_MAX_PIPE+1]; |
| |
| /** \internal Tag */ |
| phHciNfc_XchgInfo_t *p_xchg_info; |
| |
| /** \internal Information of the HCI Gates */ |
| /** \internal HCI Admin Management Gate Information */ |
| void *p_admin_info; |
| /** \internal HCI Link Management Gate Information */ |
| void *p_link_mgmt_info; |
| /** \internal HCI Identity Management Gate Information */ |
| void *p_identity_info; |
| /** \internal HCI Polling Loop Gate Information */ |
| void *p_poll_loop_info; |
| /** \internal HCI NFC Device Management Information */ |
| void *p_device_mgmt_info; |
| /** \internal HCI RF Reader Gates Management Information */ |
| void *p_reader_mgmt_info; |
| /** \internal HCI Card Application Gates and Emulation |
| Information */ |
| void *p_emulation_mgmt_info; |
| /** \internal HCI RF Reader A Gate Information */ |
| void *p_reader_a_info; |
| #ifdef TYPE_B |
| /** \internal HCI RF Reader B Gate Information */ |
| void *p_reader_b_info; |
| #endif |
| #ifdef TYPE_FELICA |
| /** \internal HCI Felica Reader Gate Information */ |
| void *p_felica_info; |
| #endif |
| #ifdef TYPE_JEWEL |
| /** \internal HCI Jewel Reader Gate Information */ |
| void *p_jewel_info; |
| #endif |
| #ifdef TYPE_ISO15693 |
| /** \internal HCI ISO15693 Reader Gate Information */ |
| void *p_iso_15693_info; |
| #endif |
| |
| #ifdef ENABLE_P2P |
| /** \internal HCI NFC-IP1 Peer to Peer Information */ |
| void *p_nfcip_info; |
| #endif |
| /** \internal HCI Secure Element Management Information */ |
| void *p_wi_info; |
| /** \internal HCI UICC Information */ |
| void *p_uicc_info; |
| /** \internal HCI SWP Information */ |
| void *p_swp_info; |
| #ifdef HOST_EMULATION |
| /** \internal HCI Card Emulation A Gate Information */ |
| void *p_ce_a_info; |
| /** \internal HCI Card Emulation B Gate Information */ |
| void *p_ce_b_info; |
| #endif |
| |
| /** \internal HCI Packet Data to be sent to the lower layer */ |
| phHciNfc_HCP_Packet_t tx_packet; |
| /** \internal HCI Packet Data to be received from the lower layer */ |
| phHciNfc_HCP_Packet_t rx_packet; |
| |
| /** \internal Previous Status (To Store the Error Status ) */ |
| NFCSTATUS error_status; |
| |
| /** \internal Pointer to HCI Send Buffer */ |
| uint8_t send_buffer[PHHCINFC_MAX_BUFFERSIZE]; |
| /** \internal Pointer to HCI Receive Buffer */ |
| uint8_t recv_buffer[PHHCINFC_MAX_BUFFERSIZE]; |
| |
| /** \internal Total Number of bytes to be Sent */ |
| volatile uint16_t tx_total; |
| /** \internal Number of bytes Remaining to be Sent */ |
| volatile uint16_t tx_remain; |
| /** \internal Number of bytes sent */ |
| volatile uint16_t tx_sent; |
| |
| volatile uint16_t rx_index; |
| |
| /** \internal Total Number of bytes received */ |
| volatile uint16_t rx_total; |
| /** \internal Number of bytes received */ |
| volatile uint16_t rx_recvd; |
| /** \internal Index of the received data in the |
| * response packet |
| */ |
| |
| /** \internal Send HCP Chaining Information */ |
| volatile uint8_t tx_hcp_chaining; |
| /** \internal Send HCP Fragment Index */ |
| volatile uint16_t tx_hcp_frgmnt_index; |
| |
| /** \internal Receive HCP Chaining Information */ |
| volatile uint8_t rx_hcp_chaining; |
| /** \internal Receive HCP Fragment Index */ |
| volatile uint16_t rx_hcp_frgmnt_index; |
| |
| /** \internal The Device under Test */ |
| volatile uint8_t hci_mode; |
| /** \internal Wait for Response if Response is Pending */ |
| volatile uint8_t response_pending; |
| /** \internal Notify the Event if Notifcation is Pending */ |
| volatile uint8_t event_pending; |
| |
| /** \internal Pending Release of the detected Target */ |
| uint8_t target_release; |
| |
| }phHciNfc_sContext_t; |
| |
| /* |
| ################################################################################ |
| *********************** Function Prototype Declaration ************************* |
| ################################################################################ |
| */ |
| |
| |
| /** |
| * |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Receive function receives the HCI Events or Response from the |
| * corresponding peripheral device, described by the HCI Context Structure. |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[out] pdata Pointer to the response buffer that |
| * receives the response read. |
| * \param[in] length Variable that receives |
| * the number of bytes read. |
| * |
| * \retval NFCSTATUS_PENDING Data successfully read. |
| * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters |
| * could not be interpreted properly. |
| * \retval Other errors Other related errors |
| * |
| */ |
| |
| extern |
| NFCSTATUS |
| phHciNfc_Receive( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pdata, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Send_Complete function acknowledges the completion of the HCI |
| * Commands sent to the device. |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] pInfo Transaction information like |
| * status and length after the |
| * completion of the send. |
| * |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Send_Complete ( |
| void *psContext, |
| void *pHwRef, |
| phNfc_sTransactionInfo_t *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Receive_Complete function acknowledges the completion of the HCI |
| * Event Information or Response received from the device. |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] pInfo Transaction information like status |
| * data and length after the completely |
| * receiving the response . |
| * \retval NONE. |
| * |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Receive_Complete ( |
| void *psContext, |
| void *pHwRef, |
| phNfc_sTransactionInfo_t *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Notify_Event function notifies the occurence of the HCI |
| * Event from the device. |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type reason returned for the notification to |
| * the HCI. |
| * \param[in] pInfo Notification information like status |
| * data,length etc from the lower layer |
| * to the HCI Layer. |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Notify_Event( |
| void *psContext, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Tag_Notify function notifies the the upper layer |
| * with the Tag Specific Notifications . |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type reason returned for the notification to |
| * the HCI. |
| * \param[in] pInfo Notification information like status |
| * data,length etc from the lower layer |
| * to the HCI Layer. |
| * \retval NONE. |
| * |
| */ |
| extern |
| void |
| phHciNfc_Tag_Notify( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Tag_Notify function notifies the the upper layer |
| * with the Tag Specific Notifications . |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type reason returned for the notification to |
| * the HCI. |
| * \param[in] pInfo Notification information like status |
| * data,length etc from the lower layer |
| * to the HCI Layer. |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Target_Select_Notify( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Transceive_Notify function notifies the the upper layer |
| * with the after the transceive operation. |
| * |
| * \param[in] psContext psContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type reason returned for the notification to |
| * the HCI. |
| * \param[in] pInfo Notification information like status |
| * data,length etc from the lower layer |
| * to the HCI Layer. |
| * \retval NONE. |
| * |
| */ |
| extern |
| void |
| phHciNfc_Transceive_Notify( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Notify function calls the upper layer notification callback. |
| * |
| * \param[in] pUpperNotify pUpperNotify is the notification |
| * callback of the upper HAL Layer. |
| * \param[in] pUpperContext pUpperContext is the context of |
| * the upper HAL Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type type of the notification to |
| * the upper HAL layer. |
| * \param[in] pInfo completion information returned |
| * to the Upper HAL Layer. |
| * NFCSTATUS_SUCCESS Notification successfully completed . |
| * NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters |
| * could not be interpreted properly. |
| * Other errors Errors related to the HCI or lower layers |
| * |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Notify( |
| pphNfcIF_Notification_CB_t p_upper_notify, |
| void *p_upper_context, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Release_Notify function Releases HCI and notifies |
| * the upper layer. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] type reason returned for the notification to |
| * the HCI. |
| * \param[in] pInfo Notification information like status |
| * data,length etc from the lower layer |
| * to the HCI Layer. |
| * \retval NONE. |
| * |
| */ |
| extern |
| void |
| phHciNfc_Release_Notify( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t type, |
| void *pInfo |
| ); |
| |
| |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Send_Generic_Cmd function sends the HCI Generic Commands |
| * to the device. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] pipe_id The pipe to which the command |
| * is being sent. |
| * \param[in] cmd The HCI Generic command sent to a |
| * particular pipe . |
| * |
| * \retval NFCSTATUS_PENDING HCI Generic Command send in progress . |
| * \retval |
| * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated |
| * as required amount of memory |
| * is not sufficient. |
| * |
| */ |
| |
| extern |
| NFCSTATUS |
| phHciNfc_Send_Generic_Cmd ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t pipe_id, |
| uint8_t cmd |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Set_Param function configures the Gate specific register |
| * with the provided value. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * \param[in] p_pipe_info Pointer to pipe specific information. |
| * \param[in] reg_index Index of the register to be |
| * configured . |
| * \param[in] p_param Value to the configured in |
| * particular register. |
| * \param[in] param_length Length of the parameter provided |
| * for the configuration. |
| * |
| * \retval NFCSTATUS_PENDING HCI Set parameter in progress . |
| * \retval |
| * NFCSTATUS_INVALID_HCI_INFORMATION The Information like p_pipe_info, |
| * p_param or param_length is invalid |
| * |
| */ |
| |
| extern |
| NFCSTATUS |
| phHciNfc_Set_Param ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_Pipe_Info_t *p_pipe_info, |
| uint8_t reg_index, |
| void *p_param, |
| uint16_t param_length |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Send_HCP function sends the HCI Host Control Packet |
| * Frames to the device. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * |
| * \retval NFCSTATUS_PENDING HCP Frame send pending. |
| * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters |
| * could not be interpreted properly. |
| * \retval Other errors Other related errors |
| * |
| * |
| */ |
| |
| extern |
| NFCSTATUS |
| phHciNfc_Send_HCP ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ); |
| |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Build_HCPFrame function initially builds the HCP Packet Frame |
| * with the values passed in the arguments . |
| * |
| * \param[in] hcp_packet hcp_packet is the frame packet structure |
| * in which the frame is populated with the |
| * appropriate fields. |
| * \param[in] chainbit chainbit specifies whether the following |
| * HCP frames are chained or the frame is a |
| * normal frame. |
| * \param[in] pipe_id pipe_id of the pipe to which the frame has |
| * to be sent. |
| * \param[in] msg_type type of message sent to the pipe. |
| * \param[in] instruction type of message instruction send to the pipe. |
| * |
| * \retval NONE. |
| * |
| */ |
| |
| |
| extern |
| void |
| phHciNfc_Build_HCPFrame ( |
| phHciNfc_HCP_Packet_t *hcp_packet, |
| uint8_t chainbit, |
| uint8_t pipe_id, |
| uint8_t msg_type, |
| uint8_t instruction |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Append_HCPFrame function Appends the HCP Packet Frame |
| * with the values passed in the arguments . |
| * |
| * \param[in] hcp_data hcp_data is the pointer to the HCP |
| * payload to which the data is to be |
| * appended. |
| * \param[in] hcp_index hcp_index is the index from which |
| * the data source needs to be appended. |
| * \param[in] src_data src_data that is to be appended to the |
| * HCP packet. |
| * \param[in] src_len The length of the data source that is |
| * to be appended. |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Append_HCPFrame ( |
| uint8_t *hcp_data, |
| uint16_t hcp_index, |
| uint8_t *src_data, |
| uint16_t src_len |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Allocate_Resource function allocates and initialises the |
| * resource memory for the HCI layer. |
| * |
| * \param[in] ppBuffer ppBuffer is the pointer to which the |
| * resource memory is allocated. |
| * \param[in] size Variable that specifies the size of |
| * the memory that needs to be created. |
| * |
| * \retval NFCSTATUS_SUCCESS The Resource Memory was allocated |
| * successfully . |
| * \retval |
| * NFCSTATUS_INSUFFICIENT_RESOURCES The memory could not be allocated |
| * as required amount of memory |
| * is not suffient. |
| * |
| */ |
| |
| extern |
| NFCSTATUS |
| phHciNfc_Allocate_Resource ( |
| void **ppBuffer, |
| uint16_t size |
| ); |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Release_Resources function releases all the resources |
| * allocated in the HCI Layer. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Release_Resources ( |
| phHciNfc_sContext_t **ppsHciContext |
| ); |
| |
| /** |
| * \ingroup grp_hci_nfc |
| * |
| * The phHciNfc_Release_Lower function initiates the release of the |
| * lower layers. |
| * |
| * \param[in] psHciContext psHciContext is the context of |
| * the HCI Layer. |
| * \param[in] pHwRef pHwRef is the Information of |
| * the Device Interface Link . |
| * |
| * \retval NONE. |
| * |
| */ |
| |
| extern |
| void |
| phHciNfc_Release_Lower( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ); |
| |
| |
| |
| #endif |
| |