/* * 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(...) ALOGD(__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