| /* |
| * 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_NfcIPMgmt.c * |
| * \brief HCI NFCIP-1 management routines. * |
| * * |
| * * |
| * Project: NFC-FRI-1.1 * |
| * * |
| * $Date: Tue Jun 8 09:32:31 2010 $ * |
| * $Author: ing04880 $ * |
| * $Revision: 1.33 $ * |
| * $Aliases: NFC_FRI1.1_WK1023_R35_1 $ |
| * * |
| * =========================================================================== * |
| */ |
| |
| /* |
| ***************************** Header File Inclusion **************************** |
| */ |
| #include <phNfcCompId.h> |
| #include <phNfcHalTypes.h> |
| #include <phHciNfc_Pipe.h> |
| #include <phHciNfc_RFReader.h> |
| #include <phHciNfc_Emulation.h> |
| #include <phOsalNfc.h> |
| |
| #if defined (ENABLE_P2P) |
| #include <phHciNfc_NfcIPMgmt.h> |
| /* |
| ****************************** Macro Definitions ******************************* |
| */ |
| /* RF Error */ |
| #define NFCIP_RF_NO_ERROR 0x00U |
| #define NFCIP_STATUS_MAX_VALUE 0x01U |
| |
| /* Read and write to the below registry for initiator and target */ |
| #define NXP_NFCIP_MODE 0x01U |
| #define NXP_NFCIP_ATR_REQ 0x02U |
| #define NXP_NFCIP_ATR_RES 0x03U |
| #define NXP_NFCIP_PSL1 0x04U |
| #define NXP_NFCIP_PSL2 0x05U |
| #define NXP_NFCIP_DID 0x06U |
| #define NXP_NFCIP_NAD 0x07U |
| #define NXP_NFCIP_OPTIONS 0x08U |
| #define NXP_NFCIP_STATUS 0x09U |
| #define NXP_NFCIP_NFCID3I 0x0AU |
| #define NXP_NFCIP_NFCID3T 0x0BU |
| #define NXP_NFCIP_PARAM 0x0CU |
| #define NXP_NFCIP_MERGE 0x0DU |
| |
| /* command */ |
| #define NXP_NFCIP_ATTREQUEST 0x12U |
| #define NXP_NFCI_CONTINUE_ACTIVATION 0x13U |
| |
| /* Event */ |
| #define NXP_EVT_NFC_SND_DATA 0x01U |
| #define NXP_EVT_NFC_ACTIVATED 0x02U |
| #define NXP_EVT_NFC_DEACTIVATED 0x03U |
| #define NXP_EVT_NFC_RCV_DATA 0x04U |
| #define NXP_EVT_NFC_CONTINUE_MI 0x05U |
| |
| #define NFCIP_DATE_RATE_FACTOR 0x40U |
| #define NFCIP_DATE_RATE_SHIFT 0x06U |
| #define NFCIP_DATA_RATE_CALC(val) \ |
| ((((uint8_t)(val) >> NFCIP_DATE_RATE_SHIFT) + \ |
| 0x01U) * NFCIP_DATE_RATE_FACTOR) |
| #define NFCIP_COMM_INITIATOR_SHIFT 0x03 |
| #define NFCIP_COMM_FACTOR 0x03 |
| /* |
| *************************** Structure and Enumeration *************************** |
| */ |
| |
| /* |
| *************************** Static Function Declaration ************************** |
| */ |
| static |
| NFCSTATUS |
| phHciNfc_NfcIP_InfoUpdate( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t index, |
| uint8_t *reg_value, |
| uint8_t reg_length |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_NfcIP_RecvData( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_NfcIP_Response( |
| phHciNfc_sContext_t *psHciContext, |
| phHciNfc_Pipe_Info_t *ppipe_info, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_NfcIP_Event( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Initiator_Event( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Target_Event( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Initiator_Response( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Target_Response( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ); |
| /* |
| *************************** Function Definitions *************************** |
| */ |
| |
| NFCSTATUS |
| phHciNfc_Initiator_Init_Resources( |
| phHciNfc_sContext_t *psHciContext |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_NfcIP_Info_t *p_init_info=NULL; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if (NULL != psHciContext->p_nfcip_info) |
| { |
| status = NFCSTATUS_SUCCESS; |
| } |
| else if(( NULL == psHciContext->p_nfcip_info ) && |
| (phHciNfc_Allocate_Resource((void **)(&p_init_info), |
| sizeof(phHciNfc_NfcIP_Info_t))== NFCSTATUS_SUCCESS) |
| ) |
| { |
| psHciContext->p_nfcip_info = p_init_info; |
| p_init_info->nfcip_type = NFCIP_INVALID; |
| p_init_info->current_seq = NFCIP_INVALID_SEQUENCE; |
| p_init_info->next_seq = NFCIP_INVALID_SEQUENCE; |
| p_init_info->p_init_pipe_info = NULL; |
| p_init_info->p_tgt_pipe_info = NULL; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); |
| } |
| |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Initiator_Get_PipeID( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t *ppipe_id |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| if( (NULL != psHciContext) |
| && ( NULL != ppipe_id ) |
| && ( NULL != psHciContext->p_nfcip_info ) |
| ) |
| { |
| phHciNfc_NfcIP_Info_t *p_init_info=NULL; |
| p_init_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| *ppipe_id = p_init_info->p_init_pipe_info->pipe.pipe_id ; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Initiator_Update_PipeInfo( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t pipeID, |
| phHciNfc_Pipe_Info_t *pPipeInfo |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_init_info=NULL; |
| p_init_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| /* Update the pipe_id of the NFCIP-1 initiator Gate obtained from |
| the HCI Response */ |
| p_init_info->p_init_pipe_info = pPipeInfo; |
| p_init_info->p_init_pipe_info->pipe.pipe_id = pipeID; |
| /* Update the Response Receive routine of the NFCIP-1 initiator Gate */ |
| pPipeInfo->recv_resp = &phHciNfc_Recv_Initiator_Response; |
| /* Update the event Receive routine of the NFCIP-1 initiator Gate */ |
| pPipeInfo->recv_event = &phHciNfc_Recv_Initiator_Event; |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_Presence_Check( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if((NULL == psHciContext->p_nfcip_info) || |
| (NFCIP_INVALID == |
| ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))->nfcip_type)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)? |
| p_nfcipinfo->p_init_pipe_info : |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| phHciNfc_HCP_Packet_t *hcp_packet = NULL; |
| uint16_t length = HCP_HEADER_LEN; |
| uint8_t pipeid = 0; |
| |
| pipeid = p_pipe_info->pipe.pipe_id; |
| psHciContext->tx_total = 0 ; |
| hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; |
| /* Construct the HCP Frame */ |
| phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT, |
| (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_COMMAND, |
| (uint8_t)NXP_NFCIP_ATTREQUEST); |
| |
| p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND; |
| p_pipe_info->prev_msg = (uint8_t)NXP_NFCIP_ATTREQUEST; |
| psHciContext->tx_total = length; |
| psHciContext->response_pending = (uint8_t)TRUE; |
| |
| /* Send the Constructed HCP packet to the lower layer */ |
| status = phHciNfc_Send_HCP( psHciContext, pHwRef); |
| p_pipe_info->prev_status = status; |
| } |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Initiator_Response( |
| void *pContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_sContext_t *psHciContext = |
| (phHciNfc_sContext_t *)pContext ; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse) |
| || (0 == length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcip_info=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| |
| p_nfcip_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = p_nfcip_info->p_init_pipe_info; |
| if( NULL == p_pipe_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| status = phHciNfc_Recv_NfcIP_Response(psHciContext, |
| p_pipe_info, pResponse, |
| length); |
| if (NFCSTATUS_SUCCESS == status) |
| { |
| status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, |
| UPDATE_SEQ); |
| } |
| } |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Initiator_Event( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_sContext_t *psHciContext = |
| (phHciNfc_sContext_t *)psContext ; |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent) |
| || (0 == length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_HCP_Packet_t *p_packet = NULL; |
| phHciNfc_NfcIP_Info_t *p_nfcip_info=NULL; |
| phHciNfc_HCP_Message_t *message = NULL; |
| uint8_t instruction=0; |
| |
| p_nfcip_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_packet = (phHciNfc_HCP_Packet_t *)pEvent; |
| message = &p_packet->msg.message; |
| /* Get the instruction bits from the Message Header */ |
| instruction = (uint8_t) GET_BITS8( message->msg_header, |
| HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); |
| if (NXP_EVT_NFC_ACTIVATED == instruction) |
| { |
| p_nfcip_info->nfcip_type = NFCIP_INITIATOR; |
| psHciContext->host_rf_type = phHal_eNfcIP1_Initiator; |
| p_nfcip_info->rem_nfcip_tgt_info.RemDevType = phHal_eNfcIP1_Target; |
| } |
| |
| status = phHciNfc_Recv_NfcIP_Event(psHciContext, |
| pHwRef, pEvent, length); |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Target_Init_Resources( |
| phHciNfc_sContext_t *psHciContext |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_NfcIP_Info_t *p_target_info=NULL; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if (NULL != psHciContext->p_nfcip_info) |
| { |
| status = NFCSTATUS_SUCCESS; |
| } |
| else if( |
| ( NULL == psHciContext->p_nfcip_info ) && |
| (phHciNfc_Allocate_Resource((void **)(&p_target_info), |
| sizeof(phHciNfc_NfcIP_Info_t))== NFCSTATUS_SUCCESS) |
| ) |
| { |
| psHciContext->p_nfcip_info = p_target_info; |
| p_target_info->nfcip_type = NFCIP_INVALID; |
| p_target_info->current_seq = NFCIP_INVALID_SEQUENCE; |
| p_target_info->next_seq = NFCIP_INVALID_SEQUENCE; |
| p_target_info->p_tgt_pipe_info = NULL; |
| p_target_info->p_tgt_pipe_info = NULL; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); |
| } |
| |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Target_Get_PipeID( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t *ppipe_id |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| if( (NULL != psHciContext) |
| && ( NULL != ppipe_id ) |
| && ( NULL != psHciContext->p_nfcip_info ) |
| ) |
| { |
| phHciNfc_NfcIP_Info_t *p_target_info=NULL; |
| p_target_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| *ppipe_id = p_target_info->p_tgt_pipe_info->pipe.pipe_id; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Target_Update_PipeInfo( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t pipeID, |
| phHciNfc_Pipe_Info_t *pPipeInfo |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_target_info=NULL; |
| p_target_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| /* Update the pipe_id of the NFCIP-1 target Gate obtained from |
| the HCI Response */ |
| p_target_info->p_tgt_pipe_info = pPipeInfo; |
| p_target_info->p_tgt_pipe_info->pipe.pipe_id = pipeID; |
| /* Update the Response Receive routine of the NFCIP-1 target Gate */ |
| pPipeInfo->recv_resp = &phHciNfc_Recv_Target_Response; |
| /* Update the event Receive routine of the NFCIP-1 target Gate */ |
| pPipeInfo->recv_event = &phHciNfc_Recv_Target_Event; |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Target_Response( |
| void *pContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_sContext_t *psHciContext = |
| (phHciNfc_sContext_t *)pContext ; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse) |
| || (0 == length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcip_info=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| |
| p_nfcip_info = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = p_nfcip_info->p_tgt_pipe_info; |
| if( NULL == p_pipe_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| status = phHciNfc_Recv_NfcIP_Response(psHciContext, |
| p_pipe_info, pResponse, |
| length); |
| if (NFCSTATUS_SUCCESS == status) |
| { |
| status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, |
| UPDATE_SEQ); |
| } |
| } |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_Target_Event( |
| void *psContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_sContext_t *psHciContext = |
| (phHciNfc_sContext_t *)psContext ; |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent) |
| || (0 == length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_HCP_Packet_t *p_packet = NULL; |
| phHciNfc_NfcIP_Info_t *p_nfcip_info=NULL; |
| phHciNfc_HCP_Message_t *message = NULL; |
| uint8_t instruction=0; |
| |
| p_nfcip_info = (phHciNfc_NfcIP_Info_t *)psHciContext->p_nfcip_info ; |
| p_packet = (phHciNfc_HCP_Packet_t *)pEvent; |
| message = &p_packet->msg.message; |
| /* Get the instruction bits from the Message Header */ |
| instruction = (uint8_t) GET_BITS8( message->msg_header, |
| HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); |
| if (NXP_EVT_NFC_ACTIVATED == instruction) |
| { |
| p_nfcip_info->nfcip_type = NFCIP_TARGET; |
| psHciContext->host_rf_type = phHal_eNfcIP1_Target; |
| p_nfcip_info->rem_nfcip_tgt_info.RemDevType = |
| phHal_eNfcIP1_Initiator; |
| } |
| status = phHciNfc_Recv_NfcIP_Event(psHciContext, |
| pHwRef, pEvent, length); |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_NfcIP_Response( |
| phHciNfc_sContext_t *psHciContext, |
| phHciNfc_Pipe_Info_t *ppipe_info, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| uint8_t prev_cmd = ANY_GET_PARAMETER; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| prev_cmd = ppipe_info->prev_msg ; |
| switch(prev_cmd) |
| { |
| case ANY_OPEN_PIPE: |
| { |
| HCI_PRINT("NFCIP-1 NFCIP open pipe complete\n"); |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| break; |
| } |
| case ANY_CLOSE_PIPE: |
| { |
| HCI_PRINT("NFCIP-1 NFCIP close pipe complete\n"); |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| break; |
| } |
| case ANY_GET_PARAMETER: |
| { |
| HCI_PRINT("NFCIP-1 NFCIP get parameter complete\n"); |
| if (length >= HCP_HEADER_LEN) |
| { |
| status = phHciNfc_NfcIP_InfoUpdate(psHciContext, |
| ppipe_info->reg_index, |
| &pResponse[HCP_HEADER_LEN], |
| (uint8_t)(length - HCP_HEADER_LEN)); |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case ANY_SET_PARAMETER: |
| { |
| HCI_PRINT("NFCIP-1 NFCIP Parameter Set \n"); |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| break; |
| } |
| case NXP_NFCI_CONTINUE_ACTIVATION: |
| case NXP_NFCIP_ATTREQUEST: |
| { |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| break; |
| } |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); |
| break; |
| } |
| } |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| ppipe_info->prev_status = NFCSTATUS_SUCCESS; |
| p_nfcipinfo->current_seq = p_nfcipinfo->next_seq; |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_Recv_NfcIP_Event( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t *pEvent, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_HCP_Packet_t *p_packet = NULL; |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_HCP_Message_t *message = NULL; |
| phNfc_sCompletionInfo_t pCompInfo; |
| uint8_t instruction=0; |
| uint8_t type = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_packet = (phHciNfc_HCP_Packet_t *)pEvent; |
| message = &p_packet->msg.message; |
| /* Get the instruction bits from the Message Header */ |
| instruction = (uint8_t) GET_BITS8( message->msg_header, |
| HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); |
| |
| switch(instruction) |
| { |
| case NXP_EVT_NFC_ACTIVATED: |
| { |
| HCI_PRINT("NFCIP-1 device discovered\n"); |
| |
| if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type) |
| { |
| pCompInfo.info = &(p_nfcipinfo->rem_nfcip_tgt_info); |
| type = NFC_NOTIFY_TARGET_DISCOVERED; |
| } |
| else |
| { |
| type = NFC_NOTIFY_DEVICE_ACTIVATED; |
| } |
| |
| if(length > HCP_HEADER_LEN) |
| { |
| HCI_DEBUG("NfcIP-1 activation mode : %d\n", pEvent[HCP_HEADER_LEN]); |
| /* Mode indicates in which mode the current activation |
| as be done |
| - 0x00: Passive mode |
| - 0x01: Active */ |
| p_nfcipinfo->activation_mode = pEvent[HCP_HEADER_LEN]; |
| } |
| pCompInfo.status = NFCSTATUS_SUCCESS; |
| /* Notify to the HCI Generic layer To Update the FSM */ |
| phHciNfc_Notify_Event(psHciContext, pHwRef, |
| type, &pCompInfo); |
| break; |
| } |
| case NXP_EVT_NFC_DEACTIVATED: |
| { |
| static phHal_sEventInfo_t event_info; |
| |
| event_info.eventHost = phHal_eHostController; |
| event_info.eventType = NFC_EVT_DEACTIVATED; |
| p_nfcipinfo->activation_mode = FALSE; |
| if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type) |
| { |
| p_nfcipinfo->rem_nfcip_tgt_info.RemDevType = |
| phHal_eNfcIP1_Target; |
| event_info.eventSource = phHal_eNfcIP1_Initiator; |
| } |
| else |
| { |
| p_nfcipinfo->rem_nfcip_tgt_info.RemDevType = |
| phHal_eNfcIP1_Initiator; |
| event_info.eventSource = phHal_eNfcIP1_Target; |
| } |
| /* Reset the sequence */ |
| p_nfcipinfo->current_seq = NFCIP_NFCID3I; |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| |
| HCI_PRINT("NFCIP-1 Target Deactivated\n"); |
| phHciNfc_Notify_Event(psHciContext, pHwRef, |
| NFC_NOTIFY_DEVICE_DEACTIVATED, |
| &event_info); |
| break; |
| } |
| case NXP_EVT_NFC_RCV_DATA: |
| { |
| status = phHciNfc_NfcIP_RecvData(psHciContext, |
| pHwRef, |
| &pEvent[HCP_HEADER_LEN], |
| (length - HCP_HEADER_LEN)); |
| break; |
| } |
| case NXP_EVT_NFC_CONTINUE_MI: |
| { |
| /* psHciContext->response_pending = FALSE; */ |
| psHciContext->event_pending = FALSE; |
| break; |
| } |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| } |
| |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_NfcIP_RecvData( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t *pResponse, |
| #ifdef ONE_BYTE_LEN |
| uint8_t length |
| #else |
| uint16_t length |
| #endif |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| uint8_t index = 0; |
| |
| if( (NULL == psHciContext) |
| || (NULL == pHwRef) |
| || (NULL == pResponse) |
| || (0 == length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| phNfc_sTransactionInfo_t transInfo; |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo = NULL; |
| uint8_t type = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info; |
| HCI_PRINT("NFCIP-1 received bytes :"); |
| if (NFCIP_RF_NO_ERROR == pResponse[index]) |
| { |
| HCI_PRINT_BUFFER("device ", &pResponse[index], (length - index)); |
| transInfo.status = NFCSTATUS_SUCCESS; |
| index++; |
| if (TRUE == pResponse[index]) |
| { |
| /* Update the more information bit to the upper layer */ |
| transInfo.status = NFCSTATUS_MORE_INFORMATION; |
| } |
| index++; |
| |
| |
| transInfo.buffer = &pResponse[index]; |
| transInfo.length = (length - index); |
| type = (uint8_t)NFC_NOTIFY_RECV_EVENT; |
| } |
| else |
| { |
| HCI_PRINT("NFCIP-1 receive RF ERROR "); |
| p_nfcipinfo->activation_mode = FALSE; |
| type = (uint8_t)NFC_NOTIFY_RECV_EVENT; |
| transInfo.status = NFCSTATUS_RF_TIMEOUT; |
| transInfo.buffer = NULL; |
| transInfo.length = 0; |
| } |
| status = NFCSTATUS_PENDING; |
| /* Event NXP_EVT_NFC_RCV_DATA: so give received data to |
| the upper layer */ |
| phHciNfc_Notify_Event(psHciContext, pHwRef, |
| type, |
| &transInfo ); |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_Send_Data ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_XchgInfo_t *sData |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == sData) || |
| (NULL == sData->tx_buffer) || (0 == sData->tx_length)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if((NULL == psHciContext->p_nfcip_info) || |
| (NFCIP_INVALID == |
| ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))->nfcip_type)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)? |
| p_nfcipinfo->p_init_pipe_info : |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| phHciNfc_HCP_Packet_t *hcp_packet = NULL; |
| phHciNfc_HCP_Message_t *hcp_message = NULL; |
| uint16_t length = HCP_HEADER_LEN; |
| uint8_t pipeid = 0, |
| i = 0; |
| |
| HCI_PRINT_BUFFER("HCI NFCIP-1 Send Data: ", sData->tx_buffer, sData->tx_length); |
| |
| psHciContext->tx_total = 0 ; |
| pipeid = p_pipe_info->pipe.pipe_id; |
| hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; |
| hcp_message = &(hcp_packet->msg.message); |
| hcp_message->payload[i] = sData->params.nfc_info.more_info; |
| i++; |
| |
| /* Construct the HCP Frame */ |
| phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT, |
| (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_EVENT, |
| (uint8_t)NXP_EVT_NFC_SND_DATA); |
| |
| phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, |
| i, (uint8_t *)sData->tx_buffer, |
| (uint8_t)sData->tx_length); |
| |
| length =(uint16_t)(length + i + sData->tx_length); |
| |
| p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_EVENT; |
| p_pipe_info->prev_msg = NXP_EVT_NFC_SND_DATA; |
| psHciContext->tx_total = length; |
| /* Send the Constructed HCP packet to the lower layer */ |
| status = phHciNfc_Send_HCP( psHciContext, pHwRef); |
| #if !defined (ENABLE_CONTINUE_MI) |
| if ((TRUE == sData->params.nfc_info.more_info) && |
| (NFCSTATUS_PENDING == status)) |
| { |
| /* If more information bit is set, then wait for the event |
| NXP_EVT_NFC_CONTINUE_MI */ |
| /* psHciContext->response_pending = TRUE; */ |
| psHciContext->event_pending = TRUE; |
| } |
| #endif /* #if defined (ENABLE_CONTINUE_MI) */ |
| p_pipe_info->prev_status = status; |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_Info_Sequence ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| #ifdef NOTIFY_REQD |
| , |
| uint8_t notify_reqd |
| #endif /* #ifdef NOTIFY_REQD */ |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) |
| || (NULL == pHwRef) |
| ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if((NULL == psHciContext->p_nfcip_info) || |
| (NFCIP_INVALID == |
| ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))-> |
| nfcip_type)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)? |
| p_nfcipinfo->p_init_pipe_info: |
| p_nfcipinfo->p_tgt_pipe_info); |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| switch(p_nfcipinfo->current_seq) |
| { |
| case NFCIP_NFCID3I: |
| { |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NFCID3I; |
| /* Fill the data buffer and send the command to the |
| device */ |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| p_pipe_info->pipe.pipe_id, |
| ANY_GET_PARAMETER); |
| if(NFCSTATUS_PENDING == status ) |
| { |
| p_nfcipinfo->next_seq = NFCIP_NFCID3T; |
| } |
| break; |
| } |
| case NFCIP_NFCID3T: |
| { |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NFCID3T; |
| /* Fill the data buffer and send the command to the |
| device */ |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| p_pipe_info->pipe.pipe_id, |
| ANY_GET_PARAMETER); |
| if(NFCSTATUS_PENDING == status ) |
| { |
| p_nfcipinfo->next_seq = NFCIP_PARAM; |
| } |
| break; |
| } |
| case NFCIP_PARAM: |
| { |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PARAM; |
| /* Fill the data buffer and send the command to the |
| device */ |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| p_pipe_info->pipe.pipe_id, |
| ANY_GET_PARAMETER); |
| if(NFCSTATUS_PENDING == status ) |
| { |
| p_nfcipinfo->next_seq = NFCIP_ATR_INFO; |
| } |
| break; |
| } |
| case NFCIP_ATR_INFO: |
| { |
| p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR == |
| p_nfcipinfo->nfcip_type)? |
| NXP_NFCIP_ATR_RES : |
| NXP_NFCIP_ATR_REQ); |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| p_pipe_info->pipe.pipe_id, |
| ANY_GET_PARAMETER); |
| |
| if(NFCSTATUS_PENDING == status ) |
| { |
| p_nfcipinfo->next_seq = NFCIP_STATUS; |
| } |
| break; |
| } |
| case NFCIP_STATUS: |
| { |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_STATUS; |
| /* Fill the data buffer and send the command to the |
| device */ |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| p_pipe_info->pipe.pipe_id, |
| ANY_GET_PARAMETER); |
| if(NFCSTATUS_PENDING == status ) |
| { |
| #ifdef NOTIFY_REQD |
| if(FALSE == notify_reqd) |
| #else /* #ifdef NOTIFY_REQD */ |
| if (NULL != psHciContext->p_target_info) |
| #endif /* #ifdef NOTIFY_REQD */ |
| { |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| status = NFCSTATUS_SUCCESS; |
| } |
| else |
| { |
| p_nfcipinfo->next_seq = NFCIP_END_SEQUENCE; |
| } |
| } |
| break; |
| } |
| case NFCIP_END_SEQUENCE: |
| { |
| phHal_uRemoteDevInfo_t *rem_nfcipinfo = NULL; |
| |
| if (NULL != psHciContext->p_target_info) |
| { |
| /* This is given to user */ |
| rem_nfcipinfo = |
| &(psHciContext->p_target_info->RemoteDevInfo); |
| } |
| else |
| { |
| rem_nfcipinfo = |
| &(p_nfcipinfo->rem_nfcip_tgt_info.RemoteDevInfo); |
| } |
| |
| /* Update maximum frame length */ |
| rem_nfcipinfo->NfcIP_Info.MaxFrameLength = |
| p_nfcipinfo->max_frame_len; |
| |
| p_nfcipinfo->current_seq = NFCIP_NFCID3I; |
| p_nfcipinfo->next_seq = NFCIP_NFCID3I; |
| |
| rem_nfcipinfo->NfcIP_Info.Nfcip_Active = |
| p_nfcipinfo->activation_mode; |
| |
| if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type) |
| { |
| phNfc_sCompletionInfo_t CompInfo; |
| |
| p_nfcipinfo->rem_nfcip_tgt_info.RemDevType = |
| phHal_eNfcIP1_Target; |
| |
| /* Update initiator speed */ |
| rem_nfcipinfo->NfcIP_Info.Nfcip_Datarate = |
| (phHalNfc_eDataRate_t) |
| (p_nfcipinfo->initiator_speed); |
| |
| |
| /* Update ATR info */ |
| rem_nfcipinfo->NfcIP_Info.ATRInfo_Length = |
| p_nfcipinfo->atr_res_length; |
| (void)memcpy( |
| (void *)rem_nfcipinfo->NfcIP_Info.ATRInfo, |
| (void *)p_nfcipinfo->atr_res_info, |
| rem_nfcipinfo->NfcIP_Info.ATRInfo_Length); |
| |
| /* Update NFCID */ |
| rem_nfcipinfo->NfcIP_Info.NFCID_Length = |
| p_nfcipinfo->nfcid3i_length; |
| (void)memcpy( |
| (void *)rem_nfcipinfo->NfcIP_Info.NFCID, |
| (void *)p_nfcipinfo->nfcid3i, |
| rem_nfcipinfo->NfcIP_Info.NFCID_Length); |
| |
| CompInfo.status = status = NFCSTATUS_SUCCESS; |
| if (NULL != psHciContext->p_target_info) |
| { |
| CompInfo.info = &(psHciContext->p_target_info); |
| } |
| else |
| { |
| CompInfo.info = &(p_nfcipinfo->rem_nfcip_tgt_info); |
| } |
| /* Notify to the upper layer */ |
| phHciNfc_Tag_Notify(psHciContext, pHwRef, |
| NFC_NOTIFY_TARGET_DISCOVERED, |
| &CompInfo); |
| } |
| else |
| { |
| static phHal_sEventInfo_t event_info; |
| |
| p_nfcipinfo->rem_nfcip_tgt_info.RemDevType = |
| phHal_eNfcIP1_Initiator; |
| |
| /* Update target speed */ |
| rem_nfcipinfo->NfcIP_Info.Nfcip_Datarate = |
| (phHalNfc_eDataRate_t) |
| (p_nfcipinfo->target_speed); |
| /* Update ATR info */ |
| rem_nfcipinfo->NfcIP_Info.ATRInfo_Length = |
| p_nfcipinfo->atr_req_length; |
| (void)memcpy( |
| (void *)rem_nfcipinfo->NfcIP_Info.ATRInfo, |
| (void *)p_nfcipinfo->atr_req_info, |
| rem_nfcipinfo->NfcIP_Info.ATRInfo_Length); |
| |
| /* Update NFCID */ |
| rem_nfcipinfo->NfcIP_Info.NFCID_Length = |
| p_nfcipinfo->nfcid3t_length; |
| (void)memcpy( |
| (void *)rem_nfcipinfo->NfcIP_Info.NFCID, |
| (void *)p_nfcipinfo->nfcid3t, |
| rem_nfcipinfo->NfcIP_Info.NFCID_Length); |
| |
| event_info.eventHost = phHal_eHostController; |
| event_info.eventType = NFC_EVT_ACTIVATED; |
| event_info.eventSource = phHal_eNfcIP1_Target; |
| event_info.eventInfo.pRemoteDevInfo = |
| &(p_nfcipinfo->rem_nfcip_tgt_info); |
| |
| phHciNfc_Target_Select_Notify((void *)psHciContext, |
| pHwRef, |
| NFC_NOTIFY_EVENT, |
| &(event_info)); |
| } |
| break; |
| } |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| break; |
| } |
| } |
| } |
| } |
| return status; |
| } |
| |
| static |
| NFCSTATUS |
| phHciNfc_NfcIP_InfoUpdate( |
| phHciNfc_sContext_t *psHciContext, |
| uint8_t index, |
| uint8_t *reg_value, |
| uint8_t reg_length |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo = NULL; |
| phHal_sNfcIPInfo_t *p_rem_nfcipinfo = NULL; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info ); |
| p_rem_nfcipinfo = &(p_nfcipinfo->rem_nfcip_tgt_info.RemoteDevInfo.NfcIP_Info); |
| |
| |
| switch(index) |
| { |
| case NXP_NFCIP_ATR_RES: |
| { |
| if (reg_length <= NFCIP_ATR_MAX_LENGTH) |
| { |
| /* Remote device info provided by the user */ |
| |
| HCI_PRINT_BUFFER("\tNFCIP ATR_RES", reg_value, reg_length); |
| |
| p_rem_nfcipinfo->ATRInfo_Length = |
| p_nfcipinfo->atr_res_length = reg_length; |
| |
| (void)memcpy((void *)p_rem_nfcipinfo->ATRInfo, |
| (void *)reg_value, |
| p_rem_nfcipinfo->ATRInfo_Length); |
| |
| (void)memcpy((void *)p_nfcipinfo->atr_res_info, |
| (void *)reg_value, |
| p_nfcipinfo->atr_res_length); |
| if (NULL != psHciContext->p_target_info) |
| { |
| phHal_sNfcIPInfo_t *p_remtgt_info = NULL; |
| /* This is given to user */ |
| p_remtgt_info = |
| &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info); |
| p_remtgt_info->ATRInfo_Length = reg_length; |
| (void)memcpy((void *)p_remtgt_info->ATRInfo, |
| (void *)reg_value, |
| p_remtgt_info->ATRInfo_Length); |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_STATUS: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| #ifdef STATUS_BUFFER_CHECK |
| && (*reg_value <= NFCIP_STATUS_MAX_VALUE)) |
| #endif /* #ifdef STATUS_ERROR */ |
| { |
| HCI_PRINT_BUFFER("\tNFCIP STATUS", reg_value, reg_length); |
| p_nfcipinfo->linkstatus = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_NFCID3I: |
| { |
| if (reg_length <= NFCIP_NFCID_LENGTH) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP NFCID3I", reg_value, reg_length); |
| p_nfcipinfo->nfcid3i_length = |
| p_rem_nfcipinfo->NFCID_Length = reg_length; |
| (void)memcpy((void *)p_rem_nfcipinfo->NFCID, |
| (void *)reg_value, |
| p_rem_nfcipinfo->NFCID_Length); |
| (void)memcpy((void *)p_nfcipinfo->nfcid3i, |
| (void *)reg_value, |
| reg_length); |
| if ((NULL != psHciContext->p_target_info) && |
| (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)) |
| { |
| phHal_sNfcIPInfo_t *p_remtgt_info = NULL; |
| /* This is given to user */ |
| p_remtgt_info = |
| &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info); |
| p_remtgt_info->NFCID_Length = reg_length; |
| (void)memcpy((void *)p_remtgt_info->NFCID, |
| (void *)reg_value, |
| p_remtgt_info->NFCID_Length); |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_NFCID3T: |
| { |
| if (reg_length <= NFCIP_NFCID_LENGTH) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP NFCID3T", reg_value, reg_length); |
| p_nfcipinfo->nfcid3t_length = |
| p_rem_nfcipinfo->NFCID_Length = reg_length; |
| (void)memcpy((void *)p_rem_nfcipinfo->NFCID, |
| (void *)reg_value, |
| p_rem_nfcipinfo->NFCID_Length); |
| (void)memcpy((void *)p_nfcipinfo->nfcid3t, |
| (void *)reg_value, |
| reg_length); |
| if ((NULL != psHciContext->p_target_info) && |
| (NFCIP_TARGET == p_nfcipinfo->nfcip_type)) |
| { |
| phHal_sNfcIPInfo_t *p_remtgt_info = NULL; |
| /* This is given to user */ |
| p_remtgt_info = |
| &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info); |
| p_remtgt_info->NFCID_Length = reg_length; |
| (void)memcpy((void *)p_remtgt_info->NFCID, |
| (void *)reg_value, |
| p_remtgt_info->NFCID_Length); |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_PARAM: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP PARAMS", reg_value, reg_length); |
| p_nfcipinfo->initiator_speed = (phHciNfc_eP2PSpeed_t) |
| ((*reg_value >> NFCIP_COMM_INITIATOR_SHIFT) |
| & NFCIP_COMM_FACTOR); |
| if (p_nfcipinfo->nfcip_type == NFCIP_INITIATOR) { |
| switch(p_nfcipinfo->initiator_speed) { |
| case phNfc_eDataRate_106: |
| ALOGI("I'm P2P %s Initiator @ 106 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| case phNfc_eDataRate_212: |
| ALOGI("I'm P2P %s Initiator @ 212 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| case phNfc_eDataRate_424: |
| ALOGI("I'm P2P %s Initiator @ 424 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| } |
| } |
| p_nfcipinfo->target_speed = (phHciNfc_eP2PSpeed_t) |
| (*reg_value & NFCIP_COMM_FACTOR); |
| if (p_nfcipinfo->nfcip_type == NFCIP_TARGET) { |
| switch(p_nfcipinfo->target_speed) { |
| case phNfc_eDataRate_106: |
| ALOGI("I'm P2P %s Target @ 106 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| case phNfc_eDataRate_212: |
| ALOGI("I'm P2P %s Target @ 212 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| case phNfc_eDataRate_424: |
| ALOGI("I'm P2P %s Target @ 424 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive"); |
| break; |
| } |
| } |
| p_nfcipinfo->max_frame_len = NFCIP_DATA_RATE_CALC(*reg_value); |
| |
| if (p_nfcipinfo->max_frame_len > NFCIP_MAX_DEP_REQ_HDR_LEN) |
| { |
| p_nfcipinfo->max_frame_len -= NFCIP_MAX_DEP_REQ_HDR_LEN; |
| |
| if (NULL != psHciContext->p_target_info) |
| { |
| phHal_sNfcIPInfo_t *p_remtgt_info = NULL; |
| /* This is given to user */ |
| p_remtgt_info = |
| &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info); |
| p_remtgt_info->MaxFrameLength = p_nfcipinfo->max_frame_len; |
| p_remtgt_info->Nfcip_Datarate = (phHalNfc_eDataRate_t) |
| p_nfcipinfo->initiator_speed; |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_MODE: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP MODE", reg_value, reg_length); |
| p_nfcipinfo->nfcip_mode = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_ATR_REQ: |
| { |
| if (reg_length <= NFCIP_ATR_MAX_LENGTH) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP ATR_REQ", reg_value, reg_length); |
| p_rem_nfcipinfo->ATRInfo_Length = |
| p_nfcipinfo->atr_req_length = reg_length; |
| (void)memcpy((void *)p_rem_nfcipinfo->ATRInfo, |
| (void *)reg_value, |
| p_rem_nfcipinfo->ATRInfo_Length); |
| (void)memcpy((void *)p_nfcipinfo->atr_req_info, |
| (void *)reg_value, |
| p_nfcipinfo->atr_req_length); |
| if (NULL != psHciContext->p_target_info) |
| { |
| phHal_sNfcIPInfo_t *p_remtgt_info = NULL; |
| /* This is given to user */ |
| p_remtgt_info = |
| &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info); |
| p_remtgt_info->NFCID_Length = reg_length; |
| (void)memcpy((void *)p_remtgt_info->ATRInfo, |
| (void *)reg_value, |
| p_remtgt_info->ATRInfo_Length); |
| } |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_PSL1: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP PSL1", reg_value, reg_length); |
| p_nfcipinfo->psl1 = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_PSL2: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP PSL2", reg_value, reg_length); |
| p_nfcipinfo->psl2 = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_DID: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP DID", reg_value, reg_length); |
| p_nfcipinfo->did = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_NAD: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP NAD", reg_value, reg_length); |
| p_nfcipinfo->nad = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| case NXP_NFCIP_OPTIONS: |
| { |
| if (sizeof(*reg_value) == reg_length) |
| { |
| HCI_PRINT_BUFFER("\tNFCIP OPTIONS", reg_value, reg_length); |
| p_nfcipinfo->options = *reg_value; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| } |
| break; |
| } |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_RESPONSE); |
| break; |
| } |
| } |
| return status; |
| } |
| |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetMode( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype, |
| uint8_t nfcip_mode |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || |
| (nfcip_mode > (uint8_t)NFCIP_MODE_ALL)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info: |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_MODE; |
| |
| p_pipe_info->param_info = &nfcip_mode; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetNAD( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype, |
| uint8_t nad |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info: |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NAD; |
| |
| p_pipe_info->param_info = &nad; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetDID( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t did |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = p_nfcipinfo->p_init_pipe_info; |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_DID; |
| |
| p_pipe_info->param_info = &did; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetOptions( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype, |
| uint8_t nfcip_options |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)? |
| p_nfcipinfo->p_init_pipe_info: |
| p_nfcipinfo->p_tgt_pipe_info); |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_OPTIONS; |
| |
| p_pipe_info->param_info = &nfcip_options; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetATRInfo( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype, |
| phHal_sNfcIPCfg_t *atr_info |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == atr_info) || |
| (atr_info->generalBytesLength > NFCIP_ATR_MAX_LENGTH)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info: |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR == nfciptype)? |
| NXP_NFCIP_ATR_REQ : |
| NXP_NFCIP_ATR_RES); |
| |
| p_pipe_info->param_info = atr_info->generalBytes; |
| p_pipe_info->param_length = (uint8_t) |
| atr_info->generalBytesLength; |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetPSL1( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t psl1 |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = p_nfcipinfo->p_init_pipe_info; |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PSL1; |
| |
| p_pipe_info->param_info = &psl1; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetPSL2( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t psl2 |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = p_nfcipinfo->p_init_pipe_info; |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PSL2; |
| |
| p_pipe_info->param_info = &psl2; |
| p_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_GetStatus( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info : |
| p_nfcipinfo->p_tgt_pipe_info); |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_STATUS; |
| |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_GET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_GetParam( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info : |
| p_nfcipinfo->p_tgt_pipe_info); |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PARAM; |
| |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_GET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_Initiator_Cont_Activate ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo = NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| p_nfcipinfo->nfcip_type = NFCIP_INITIATOR; |
| psHciContext->host_rf_type = phHal_eNfcIP1_Initiator; |
| p_pipe_info = p_nfcipinfo->p_init_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| phHciNfc_HCP_Packet_t *hcp_packet = NULL; |
| uint16_t length = HCP_HEADER_LEN; |
| uint8_t pipeid = 0; |
| |
| pipeid = p_pipe_info->pipe.pipe_id; |
| psHciContext->tx_total = 0 ; |
| hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; |
| /* Construct the HCP Frame */ |
| phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT, |
| (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_COMMAND, |
| (uint8_t)NXP_NFCI_CONTINUE_ACTIVATION); |
| |
| p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND; |
| p_pipe_info->prev_msg = (uint8_t)NXP_NFCI_CONTINUE_ACTIVATION; |
| psHciContext->tx_total = length; |
| psHciContext->response_pending = (uint8_t)TRUE; |
| |
| /* Send the Constructed HCP packet to the lower layer */ |
| status = phHciNfc_Send_HCP( psHciContext, pHwRef); |
| p_pipe_info->prev_status = status; |
| } |
| } |
| return status; |
| } |
| |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_GetATRInfo ( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_eNfcIPType_t nfciptype |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) |
| || (NULL == pHwRef)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NFCIP_INVALID == nfciptype) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *p_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *p_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| p_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| |
| p_pipe_info = ((NFCIP_INITIATOR == nfciptype)? |
| p_nfcipinfo->p_init_pipe_info : |
| p_nfcipinfo->p_tgt_pipe_info); |
| |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR == nfciptype)? |
| NXP_NFCIP_ATR_RES : |
| NXP_NFCIP_ATR_REQ); |
| pipeid = p_pipe_info->pipe.pipe_id ; |
| /* Fill the data buffer and send the command to the |
| device */ |
| status = |
| phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_GET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_NfcIP_SetMergeSak( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t sak_value |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) || |
| (sak_value > (uint8_t)TRUE)) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if(NULL == psHciContext->p_nfcip_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| } |
| else |
| { |
| phHciNfc_NfcIP_Info_t *ps_nfcipinfo=NULL; |
| phHciNfc_Pipe_Info_t *ps_pipe_info=NULL; |
| uint8_t pipeid = 0; |
| |
| ps_nfcipinfo = (phHciNfc_NfcIP_Info_t *) |
| psHciContext->p_nfcip_info ; |
| ps_pipe_info = ps_nfcipinfo->p_tgt_pipe_info; |
| |
| if(NULL == ps_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| pipeid = ps_pipe_info->pipe.pipe_id ; |
| ps_pipe_info->reg_index = (uint8_t)NXP_NFCIP_MERGE; |
| |
| ps_pipe_info->param_info = &sak_value; |
| ps_pipe_info->param_length = sizeof(uint8_t); |
| status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, |
| pipeid, (uint8_t)ANY_SET_PARAMETER); |
| } |
| } |
| return status; |
| } |
| |
| #endif /* #if defined (ENABLE_P2P) */ |
| |