diff options
author | Nick Pelly <npelly@google.com> | 2010-09-23 12:47:58 -0700 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2010-09-23 13:53:18 -0700 |
commit | 5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch) | |
tree | 190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phHciNfc_DevMgmt.c | |
parent | 4ff7c86a2c706b150078274455406f1b04966e1a (diff) | |
download | external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.zip external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.gz external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.bz2 |
Initial libnfc checkin
Source: Trusted_NFC_Device_Host_AA03.01e02_google.zip code drop (23-Sep-2010)
Change-Id: Ie47f18423f949a8d3e0815d13f55c814312add24
Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'src/phHciNfc_DevMgmt.c')
-rw-r--r-- | src/phHciNfc_DevMgmt.c | 1593 |
1 files changed, 1593 insertions, 0 deletions
diff --git a/src/phHciNfc_DevMgmt.c b/src/phHciNfc_DevMgmt.c new file mode 100644 index 0000000..32662c1 --- /dev/null +++ b/src/phHciNfc_DevMgmt.c @@ -0,0 +1,1593 @@ +/* + * 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_DevMgmt.c * +* \brief HCI PN544 Device Management Gate Routines. * +* * +* * +* Project: NFC-FRI-1.1 * +* * +* $Date: Fri Mar 12 10:21:54 2010 $ * +* $Author: ing04880 $ * +* $Revision: 1.29 $ * +* $Aliases: NFC_FRI1.1_WK1007_R33_3,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 $ * +* * +* =========================================================================== * +*/ + +/* +***************************** Header File Inclusion **************************** +*/ +#include <phNfcConfig.h> +#include <phNfcCompId.h> +#include <phHciNfc_Pipe.h> +#include <phHciNfc_DevMgmt.h> +#include <phHciNfc_Emulation.h> +#include <phOsalNfc.h> + +/* +****************************** Macro Definitions ******************************* +*/ + +/* Commands for System Management module */ +#define NXP_RF_CHECK_SETTINGS 0x10U +#define NXP_RF_UPDATE_SETTINGS 0x11U + +/* Self Test Commands */ +#define NXP_SELF_TEST_ANTENNA 0x20U +#define NXP_SELF_TEST_SWP 0x21U +#define NXP_SELF_TEST_NFCWI 0x22U +#define NXP_SELF_TEST_PRBS 0x25U + +/* System Management propreitary control */ +#define NXP_DBG_READ 0x3EU +#define NXP_DBG_WRITE 0x3FU + +/* System Management Events */ +#define NXP_EVT_SET_AUTONOMOUS 0x01U +#define NXP_EVT_CLF_WAKEUP 0x02U + +/* System Management Information Events */ +#define NXP_EVT_INFO_TXLDO_OVERCUR 0x10U +#define NXP_EVT_INFO_PMUVCC 0x11U +#define NXP_EVT_INFO_EXT_RF_FIELD 0x12U +#define NXP_EVT_INFO_MEM_VIOLATION 0x13U +#define NXP_EVT_INFO_TEMP_OVERHEAT 0x14U + +#define NFC_DEV_TXLDO_MASK 0x03U + + +/* +*************************** Structure and Enumeration *************************** +*/ + + +/** \defgroup grp_hci_nfc HCI PN544 Device Management Component + * + * + */ + +typedef enum phHciNfc_DevMgmt_Seq{ + DEV_MGMT_PIPE_OPEN = 0x00U, + DEV_MGMT_SET_PWR_STATUS, + DEV_MGMT_SET_INFO_EVT, + DEV_MGMT_GET_EEPROM_INFO, + DEV_MGMT_GPIO_PDIR, + DEV_MGMT_GPIO_PEN, + DEV_MGMT_TX_LDO, + DEV_MGMT_IFC_TO_RX_H, + DEV_MGMT_IFC_TO_RX_L, + DEV_MGMT_IFC_TO_TX_H, + DEV_MGMT_IFC_TO_TX_L, + DEV_MGMT_ANAIRQ_CONF, + DEV_MGMT_PMOS_MOD, + DEV_MGMT_CLK_REQ, + DEV_MGMT_INPUT_CLK, + DEV_MGMT_UICC_PWR_REQUEST, + DEV_MGMT_ACTIVE_GUARD_TO, + DEV_MGMT_MAX_ACT_TO_LOW, + DEV_MGMT_MAX_ACT_TO_HIGH, + DEV_MGMT_UICC_CE_A_ACCESS, + DEV_MGMT_UICC_CE_B_ACCESS, + DEV_MGMT_UICC_CE_BP_ACCESS, + DEV_MGMT_UICC_CE_F_ACCESS, + DEV_MGMT_UICC_RD_A_ACCESS, + DEV_MGMT_UICC_RD_B_ACCESS, + DEV_MGMT_UICC_BIT_RATE, + DEV_MGMT_UICC_RX_ERR_CNT, + DEV_MGMT_UICC_TX_ERR_CNT, + DEV_MGMT_LLC_GRD_TO_H, + DEV_MGMT_LLC_GRD_TO_L, + DEV_MGMT_LLC_ACK_TO_H, + DEV_MGMT_LLC_ACK_TO_L, + DEV_MGMT_EVT_AUTONOMOUS, + DEV_MGMT_PIPE_CLOSE +} phHciNfc_DevMgmt_Seq_t; + + +typedef struct phHciNfc_DevMgmt_Info{ + phHciNfc_DevMgmt_Seq_t current_seq; + phHciNfc_DevMgmt_Seq_t next_seq; + phHciNfc_Pipe_Info_t *p_pipe_info; + uint8_t test_status; + uint8_t value; + uint8_t rf_status; + uint8_t pmuvcc_status; + uint8_t overheat_status; + uint8_t *p_val; + uint8_t eeprom_crc; + phNfc_sData_t test_result; + +} phHciNfc_DevMgmt_Info_t; + + +/* +*************************** Static Function Declaration ************************** +*/ + +static +NFCSTATUS +phHciNfc_DevMgmt_InfoUpdate( + phHciNfc_sContext_t *psHciContext, + phHal_sHwReference_t *pHwRef, + uint8_t index, + uint8_t *reg_value, + uint8_t reg_length + ); + +static +NFCSTATUS +phHciNfc_Recv_DevMgmt_Response( + void *psHciContext, + void *pHwRef, + uint8_t *pResponse, +#ifdef ONE_BYTE_LEN + uint8_t length +#else + uint16_t length +#endif + ); + +static +NFCSTATUS +phHciNfc_Recv_DevMgmt_Event( + void *psContext, + void *pHwRef, + uint8_t *pEvent, +#ifdef ONE_BYTE_LEN + uint8_t length +#else + uint16_t length +#endif + ); + + +static +NFCSTATUS +phHciNfc_Send_DevMgmt_Command ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint8_t pipe_id, + uint8_t cmd + ); + +static + NFCSTATUS + phHciNfc_Send_DevMgmt_Event ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint8_t pipe_id, + uint8_t event + ); + +/* +*************************** Function Definitions *************************** +*/ + + +NFCSTATUS +phHciNfc_DevMgmt_Init_Resources( + phHciNfc_sContext_t *psHciContext + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + + if( NULL == psHciContext ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else + { + if(( NULL == psHciContext->p_device_mgmt_info ) && + (phHciNfc_Allocate_Resource((void **)(&p_device_mgmt_info), + sizeof(phHciNfc_DevMgmt_Info_t))== NFCSTATUS_SUCCESS)) + { + psHciContext->p_device_mgmt_info = p_device_mgmt_info; + p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN; + p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN; + p_device_mgmt_info->p_pipe_info = NULL; + } + else + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); + } + } + return status; +} + + +NFCSTATUS +phHciNfc_DevMgmt_Get_PipeID( + phHciNfc_sContext_t *psHciContext, + uint8_t *ppipe_id + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( (NULL != psHciContext) + && ( NULL != ppipe_id ) + && ( NULL != psHciContext->p_device_mgmt_info ) + ) + { + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + p_pipe_info = ((phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info)->p_pipe_info ; + if (NULL != p_pipe_info) + { + *ppipe_id = p_pipe_info->pipe.pipe_id ; + } + else + { + *ppipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; + } + + } + else + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + return status; +} + + +NFCSTATUS +phHciNfc_DevMgmt_Get_Test_Result( + phHciNfc_sContext_t *psHciContext, + phNfc_sData_t *p_test_result + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( (NULL != psHciContext) + && ( NULL != p_test_result ) + && ( NULL != psHciContext->p_device_mgmt_info ) + ) + { + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + p_test_result->buffer = p_device_mgmt_info->test_result.buffer; + p_test_result->length = p_device_mgmt_info->test_result.length; + + } + else + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + + return status; +} + + +NFCSTATUS +phHciNfc_DevMgmt_Set_Test_Result( + phHciNfc_sContext_t *psHciContext, + uint8_t test_status + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( (NULL != psHciContext) + && ( NULL != psHciContext->p_device_mgmt_info ) + ) + { + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + p_device_mgmt_info->test_status = test_status; + + } + else + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + + return status; +} + + + +NFCSTATUS +phHciNfc_DevMgmt_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_device_mgmt_info) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); + } + else + { + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + /* Update the pipe_info of the Device Management Gate obtained + * from HCI Response */ + p_device_mgmt_info->p_pipe_info = pPipeInfo; + if (( NULL != pPipeInfo) + && ((uint8_t)HCI_UNKNOWN_PIPE_ID != pipeID) + ) + { + /* Update the Response Receive routine of the Device + * Managment Gate */ + pPipeInfo->recv_resp = &phHciNfc_Recv_DevMgmt_Response; + pPipeInfo->recv_event = &phHciNfc_Recv_DevMgmt_Event; + } + } + + return status; +} + + + NFCSTATUS + phHciNfc_DevMgmt_Configure ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint16_t address, + uint8_t value + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + uint8_t pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; + uint8_t i=0; + uint8_t params[5]; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + else + { + p_pipe_info = ((phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info)->p_pipe_info ; + + if(NULL == p_pipe_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_SEQUENCE); + } + else + { + pipe_id = p_pipe_info->pipe.pipe_id ; + params[i++] = 0x00; + params[i++] = (uint8_t)(address >> BYTE_SIZE); + params[i++] = (uint8_t)address; + params[i++] = value; + p_pipe_info->param_info = ¶ms; + p_pipe_info->param_length = i ; + status = phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, + pipe_id, (uint8_t)NXP_DBG_WRITE ); + } + } + return status; +} + + + NFCSTATUS + phHciNfc_DevMgmt_Get_Info ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint16_t address, + uint8_t *p_val + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + uint8_t pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; + uint8_t i=0; + uint8_t params[5]; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + else + { + p_pipe_info = ((phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info)->p_pipe_info ; + + if(NULL == p_pipe_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_SEQUENCE); + } + else + { + ((phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info)->p_val = p_val; + pipe_id = p_pipe_info->pipe.pipe_id ; + params[i++] = 0x00; + params[i++] = (uint8_t)(address >> BYTE_SIZE); + params[i++] = (uint8_t) address; + p_pipe_info->param_info = ¶ms; + p_pipe_info->param_length = i ; + status = phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, + pipe_id, (uint8_t)NXP_DBG_READ ); + } + } + return status; + +} + +/*! + * \brief Initialisation of PN544 Device Managment Gate. + * + * This function initialses the PN544 Device Management gate and + * populates the PN544 Device Management Information Structure + * + */ + +NFCSTATUS +phHciNfc_DevMgmt_Initialise( + phHciNfc_sContext_t *psHciContext, + void *pHwRef + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + static uint8_t config = 0x10; + + if( ( NULL == psHciContext ) + || (NULL == pHwRef ) + ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if (NULL == psHciContext->p_device_mgmt_info) + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_INFORMATION); + }/* End of the PN544 Device Info Memory Check */ + else + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + p_pipe_info = p_device_mgmt_info->p_pipe_info; + + if (NULL == p_pipe_info) + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_SEQUENCE); + } + else + { + switch(p_device_mgmt_info->current_seq ) + { + /* PN544 Device Mgmt pipe open sequence */ + case DEV_MGMT_PIPE_OPEN: + { + status = phHciNfc_Open_Pipe( psHciContext, + pHwRef, p_pipe_info ); + if(status == NFCSTATUS_SUCCESS) + { + + if (HCI_SELF_TEST == psHciContext->init_mode ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_GPIO_PDIR; + } + else + { + p_device_mgmt_info->next_seq = + DEV_MGMT_GET_EEPROM_INFO; + } + status = NFCSTATUS_PENDING; + } + break; + } + case DEV_MGMT_GET_EEPROM_INFO: + { + p_pipe_info->reg_index = DEVICE_INFO_EEPROM_INDEX; + status = phHciNfc_Send_Generic_Cmd( psHciContext, + pHwRef, (uint8_t)p_pipe_info->pipe.pipe_id, + (uint8_t)ANY_GET_PARAMETER); + if(NFCSTATUS_PENDING == status ) + { +#if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) + p_device_mgmt_info->next_seq = + DEV_MGMT_IFC_TO_TX_H; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_TX_LDO; +#endif /* #if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */ + } + break; + } + case DEV_MGMT_GPIO_PDIR: + { + config = 0x00; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_GPIO_PDIR , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_GPIO_PEN; + } + break; + } + case DEV_MGMT_GPIO_PEN: + { + config = NXP_NFC_GPIO_MASK(NXP_DOWNLOAD_GPIO)| 0x03 ; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_GPIO_PEN , config ); + if(NFCSTATUS_PENDING == status ) + { +#if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) + p_device_mgmt_info->next_seq = + DEV_MGMT_IFC_TO_TX_H; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_TX_LDO; +#endif /* #if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */ + } + break; + } + +#if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) + + case DEV_MGMT_IFC_TO_TX_H: + { + config = (uint8_t) + ( NXP_NFC_IFC_CONFIG_DEFAULT >> BYTE_SIZE ) /* 0x03 */; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_IFC_TO_TX_H , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_IFC_TO_TX_L; + } + break; + } + case DEV_MGMT_IFC_TO_TX_L: + { + config = (uint8_t) + ( NXP_NFC_IFC_CONFIG_DEFAULT & BYTE_MASK ) /* 0xE8 */; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_IFC_TO_TX_L , config ); + if(NFCSTATUS_PENDING == status ) + { +#if ( NXP_NFC_IFC_TIMEOUT & 0x02 ) + p_device_mgmt_info->next_seq = + DEV_MGMT_IFC_TO_RX_H; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_TX_LDO; +#endif /* #if ( NXP_NFC_IFC_TIMEOUT & 0x02 ) */ + } + break; + } + case DEV_MGMT_IFC_TO_RX_H: + { + config = 0x10; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_IFC_TO_RX_H , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_IFC_TO_RX_L; + } + break; + } + case DEV_MGMT_IFC_TO_RX_L: + { + config = 0x1E; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_IFC_TO_RX_L , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_TX_LDO; + } + break; + } + +#endif /* #if ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */ + case DEV_MGMT_TX_LDO: + { + config = (NFC_DEV_HWCONF_DEFAULT | + (NXP_DEFAULT_TX_LDO & NFC_DEV_TXLDO_MASK)); + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_HW_CONF , config ); + if(NFCSTATUS_PENDING == status ) + { +#if ( SW_TYPE_RF_TUNING_BF & 0x01) + p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF; +#else + p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ; +#endif + /* status = NFCSTATUS_SUCCESS; */ + } + break; + } +#if ( SW_TYPE_RF_TUNING_BF & 0x01) + /* The Analogue IRQ Configuartion */ + case DEV_MGMT_ANAIRQ_CONF: + { + config = 0x04; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_ANAIRQ_CONF , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_PMOS_MOD; + /* status = NFCSTATUS_SUCCESS; */ + } + break; + } + /* The PMOS Modulation Index */ + case DEV_MGMT_PMOS_MOD: + { + config = NFC_DEV_PMOS_MOD_DEFAULT; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_PMOS_MOD , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_CLK_REQ; + /* status = NFCSTATUS_SUCCESS; */ + } + break; + } +#endif /* #if ( SW_TYPE_RF_TUNING_BF & 0x01) */ + case DEV_MGMT_CLK_REQ: + { + config = ((phHal_sHwConfig_t *) + psHciContext->p_config_params)->clk_req ; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_CLK_REQ , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_INPUT_CLK; + /* status = NFCSTATUS_SUCCESS; */ + } + break; + } + case DEV_MGMT_INPUT_CLK: + { + config = ((phHal_sHwConfig_t *) + psHciContext->p_config_params)->input_clk; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_CLK_INPUT , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_PWR_REQUEST; + } + break; + } + case DEV_MGMT_UICC_PWR_REQUEST: + { + config = NXP_UICC_PWR_REQUEST; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_SWP_PWR_REQ , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_RD_A_ACCESS; + } + break; + } + case DEV_MGMT_UICC_RD_A_ACCESS: + { +#if ( NXP_UICC_RD_RIGHTS & 0x01 ) + config = (uint8_t) phHciNfc_RFReaderAGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_RD_RIGHTS & 0x01 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_RD_A_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_RD_B_ACCESS; + } + break; + } + case DEV_MGMT_UICC_RD_B_ACCESS: + { +#if ( NXP_UICC_RD_RIGHTS & 0x02 ) + config = (uint8_t) phHciNfc_RFReaderBGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_RD_RIGHTS & 0x02 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_RD_B_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_CE_A_ACCESS; + } + break; + } + case DEV_MGMT_UICC_CE_A_ACCESS: + { +#if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x01 ) + config = (uint8_t) phHciNfc_CETypeAGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_CE_RIGHTS & 0x01 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_CE_A_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_CE_B_ACCESS; + } + break; + } + case DEV_MGMT_UICC_CE_B_ACCESS: + { +#if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x02 ) + config = (uint8_t) phHciNfc_CETypeBGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_CE_RIGHTS & 0x02 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_CE_B_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_CE_BP_ACCESS; + } + break; + } + case DEV_MGMT_UICC_CE_BP_ACCESS: + { +#if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x04 ) + config = (uint8_t) phHciNfc_CETypeBPrimeGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_CE_RIGHTS & 0x04 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_CE_BP_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_CE_F_ACCESS; + } + break; + } + case DEV_MGMT_UICC_CE_F_ACCESS: + { +#if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x08 ) + config = (uint8_t) phHciNfc_CETypeFGate; +#else + config = 0xFFU; +#endif /* #if ( NXP_UICC_CE_RIGHTS & 0x08 ) */ + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_UICC_CE_F_ACCESS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_UICC_BIT_RATE; + } + break; + } + case DEV_MGMT_UICC_BIT_RATE: + { + config = NXP_UICC_BIT_RATE; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_SWP_BITRATE , config ); + if(NFCSTATUS_PENDING == status ) + { +#if defined (CFG_PWR_STATUS) + p_device_mgmt_info->next_seq = + DEV_MGMT_SET_PWR_STATUS; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_SET_INFO_EVT; +#endif + } + break; + } +#ifdef CFG_PWR_STATUS + case DEV_MGMT_SET_PWR_STATUS: + { + config = NXP_SYSTEM_PWR_STATUS; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_PWR_STATUS , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_SET_INFO_EVT; + } + break; + } +#endif + case DEV_MGMT_SET_INFO_EVT: + { + config = NXP_SYSTEM_EVT_INFO; + status = phHciNfc_Set_Param(psHciContext, pHwRef, + p_pipe_info, DEVICE_INFO_EVT_INDEX, + (uint8_t *)&config, sizeof(config) ); + if(NFCSTATUS_PENDING == status ) + { +#if ( HOST_LINK_TIMEOUT & 0x01 ) + p_device_mgmt_info->next_seq = + DEV_MGMT_LLC_GRD_TO_H; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_EVT_AUTONOMOUS; + status = NFCSTATUS_SUCCESS; +#endif /* #if ( HOST_LINK_TIMEOUT & 0x01 ) */ + } + break; + } +#if ( HOST_LINK_TIMEOUT & 0x01 ) + + case DEV_MGMT_LLC_GRD_TO_H: + { + config =(uint8_t) + ( NXP_NFC_LINK_GRD_CFG_DEFAULT >> BYTE_SIZE ) /* 0x00 */; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_LLC_GRD_TO_H , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_LLC_GRD_TO_L; + } + break; + } + case DEV_MGMT_LLC_GRD_TO_L: + { + config = (uint8_t) + ( NXP_NFC_LINK_GRD_CFG_DEFAULT & BYTE_MASK ) /* 0x32 */; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_LLC_GRD_TO_L , config ); + if(NFCSTATUS_PENDING == status ) + { +#if ( HOST_LINK_TIMEOUT & 0x02 ) + p_device_mgmt_info->next_seq = + DEV_MGMT_LLC_ACK_TO_H; +#else + p_device_mgmt_info->next_seq = + DEV_MGMT_EVT_AUTONOMOUS; + status = NFCSTATUS_SUCCESS; +#endif /* #if ( HOST_LINK_TIMEOUT & 0x02 ) */ + } + break; + } + case DEV_MGMT_LLC_ACK_TO_H: + { + config = (uint8_t) + ( NXP_NFC_LINK_ACK_CFG_DEFAULT >> BYTE_SIZE )/* 0x00 */; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_LLC_ACK_TO_H , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_LLC_ACK_TO_L; + } + break; + } + case DEV_MGMT_LLC_ACK_TO_L: + { + config = (uint8_t) + ( NXP_NFC_LINK_ACK_CFG_DEFAULT & BYTE_MASK ) /* 0x00 */;; + status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef, + NFC_ADDRESS_LLC_ACK_TO_L , config ); + if(NFCSTATUS_PENDING == status ) + { + p_device_mgmt_info->next_seq = + DEV_MGMT_EVT_AUTONOMOUS; + status = NFCSTATUS_SUCCESS; + } + break; + } + +#endif /* #if ( HOST_LINK_TIMEOUT & 0x01 ) */ + default: + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); + break; + } + + }/* End of the Sequence Switch */ + } + + } /* End of Null Context Check */ + + return status; +} + +/*! + * \brief Releases the resources allocated the PN544 Device Management. + * + * This function Releases the resources allocated the PN544 Device Management + * and resets the hardware to the reset state. + */ + +NFCSTATUS +phHciNfc_DevMgmt_Release( + phHciNfc_sContext_t *psHciContext, + void *pHwRef + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else + { + if( NULL != psHciContext->p_device_mgmt_info ) + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + switch(p_device_mgmt_info->current_seq) + { + + /* PN544 Device pipe close sequence */ + case DEV_MGMT_EVT_AUTONOMOUS: + { + p_pipe_info = p_device_mgmt_info->p_pipe_info; + + p_pipe_info->param_info = NULL; + p_pipe_info->param_length = HCP_ZERO_LEN; + + status = phHciNfc_Send_DevMgmt_Event(psHciContext, pHwRef, + p_pipe_info->pipe.pipe_id, NXP_EVT_SET_AUTONOMOUS); + if(status == NFCSTATUS_PENDING) + { + p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN; + status = NFCSTATUS_SUCCESS; + } + break; + } + /* PN544 Device pipe close sequence */ + case DEV_MGMT_PIPE_CLOSE: + { + p_pipe_info = p_device_mgmt_info->p_pipe_info; + + status = phHciNfc_Close_Pipe( psHciContext, + pHwRef, p_pipe_info ); + if(status == NFCSTATUS_SUCCESS) + { + p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN; + /* status = NFCSTATUS_PENDING; */ + } + break; + } + default: + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); + break; + } + + }/* End of the Sequence Switch */ + + }/* End of the PN544 Device Info Memory Check */ + + } /* End of Null Context Check */ + + return status; +} + +NFCSTATUS +phHciNfc_DevMgmt_Update_Sequence( + phHciNfc_sContext_t *psHciContext, + phHciNfc_eSeqType_t DevMgmt_seq + ) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + if( NULL == psHciContext ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if ( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_INFORMATION); + } + else + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + switch(DevMgmt_seq) + { + case RESET_SEQ: + case INIT_SEQ: + { + p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN; + p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN ; + }break; + case UPDATE_SEQ: + { + p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq; + + }break; + case REL_SEQ: + { + p_device_mgmt_info->current_seq = DEV_MGMT_EVT_AUTONOMOUS; + p_device_mgmt_info->next_seq = DEV_MGMT_EVT_AUTONOMOUS ; + }break; + default: + { + break; + } + }/* End of Update Sequence Switch */ + } + return status; + +} + + + +/*! + * \brief Perform the System Management Tests + * provided by the corresponding peripheral device. + * + * This function performs the System Management Tests provided by the NFC + * Peripheral device. + */ + +NFCSTATUS +phHciNfc_DevMgmt_Test( + void *psContext, + void *pHwRef, + uint8_t test_type, + phNfc_sData_t *test_param + ) +{ + phHciNfc_sContext_t *psHciContext = + (phHciNfc_sContext_t *)psContext ; + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + uint8_t pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + else + { + p_pipe_info = ((phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info)->p_pipe_info ; + switch(test_type) + { + case NXP_SELF_TEST_ANTENNA: + case NXP_SELF_TEST_SWP: + case NXP_SELF_TEST_PRBS: + /* case NXP_SELF_TEST_NFCWI: */ + { + if (NULL != p_pipe_info) + { + pipe_id = p_pipe_info->pipe.pipe_id ; + if ( NULL != test_param ) + { + p_pipe_info->param_info = test_param->buffer; + p_pipe_info->param_length = (uint8_t)test_param->length; + } + status = + phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, + pipe_id, (uint8_t)test_type ); + } + else + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_INFORMATION); + } + break; + } + default: + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_FEATURE_NOT_SUPPORTED); + break; + } + } + + } + return status; +} + + +/*! + * \brief Receives the HCI Response from the corresponding peripheral device. + * + * This function receives the HCI Command Response from the connected NFC + * Peripheral device. + */ +static +NFCSTATUS +phHciNfc_Recv_DevMgmt_Response( + void *psContext, + void *pHwRef, + uint8_t *pResponse, +#ifdef ONE_BYTE_LEN + uint8_t length +#else + uint16_t length +#endif + ) +{ + phHciNfc_sContext_t *psHciContext = + (phHciNfc_sContext_t *)psContext ; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + NFCSTATUS status = NFCSTATUS_SUCCESS; + uint8_t prev_cmd = ANY_GET_PARAMETER; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); + } + else + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + prev_cmd = p_device_mgmt_info->p_pipe_info->prev_msg ; + switch(prev_cmd) + { + case ANY_GET_PARAMETER: + { + status = phHciNfc_DevMgmt_InfoUpdate(psHciContext, + (phHal_sHwReference_t *)pHwRef, + p_device_mgmt_info->p_pipe_info->reg_index, + &pResponse[HCP_HEADER_LEN], + (uint8_t)(length - HCP_HEADER_LEN)); + break; + } + case ANY_SET_PARAMETER: + { + break; + } + case ANY_OPEN_PIPE: + { + break; + } + case ANY_CLOSE_PIPE: + { + phOsalNfc_FreeMemory(p_device_mgmt_info->p_pipe_info); + p_device_mgmt_info->p_pipe_info = NULL; + psHciContext->p_pipe_list[PIPETYPE_STATIC_LINK] = NULL; + break; + } + case NXP_DBG_READ: + { + *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ? + pResponse[HCP_HEADER_LEN]: 0; + p_device_mgmt_info->p_val = NULL; + + } + /* fall through */ + case NXP_DBG_WRITE: + { + break; + } + /* Self Test Commands */ + case NXP_SELF_TEST_ANTENNA: + case NXP_SELF_TEST_SWP: + case NXP_SELF_TEST_NFCWI: + case NXP_SELF_TEST_PRBS: + { + p_device_mgmt_info->test_status = (uint8_t) ( length > HCP_HEADER_LEN ) ? + pResponse[HCP_HEADER_LEN]: 0; + p_device_mgmt_info->test_result.buffer = (uint8_t)( length > HCP_HEADER_LEN ) ? + &pResponse[HCP_HEADER_LEN]: NULL; + p_device_mgmt_info->test_result.length = ( length - HCP_HEADER_LEN ); + break; + } + default: + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_RESPONSE); + break; + } + } + if( NFCSTATUS_SUCCESS == status ) + { + if( NULL != p_device_mgmt_info->p_pipe_info) + { + p_device_mgmt_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS; + } + p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq; + } + + } + return status; +} + +/*! + * \brief Receives the HCI Event from the corresponding peripheral device. + * + * This function receives the HCI Event from the connected NFC + * Peripheral device. + */ + +static +NFCSTATUS +phHciNfc_Recv_DevMgmt_Event( + void *psContext, + void *pHwRef, + uint8_t *pEvent, +#ifdef ONE_BYTE_LEN + uint8_t length +#else + uint16_t length +#endif + ) +{ + phHciNfc_sContext_t *psHciContext = + (phHciNfc_sContext_t *)psContext ; + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + phHciNfc_HCP_Packet_t *hcp_packet = NULL; + phHciNfc_HCP_Message_t *hcp_message = NULL; + NFCSTATUS status = NFCSTATUS_SUCCESS; + phHal_sEventInfo_t event_info; + uint8_t event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID; + + if( (NULL == psHciContext) || (NULL == pHwRef) ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); + } + else + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent; + hcp_message = &hcp_packet->msg.message; + + /* Get the Event instruction bits from the Message Header */ + event = (uint8_t) GET_BITS8( hcp_message->msg_header, + HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN); + event_info.eventHost = phHal_eHostController ; + event_info.eventSource = phHal_ePCD_DevType; + + switch(event) + { + /* Information Events */ + case NXP_EVT_INFO_TXLDO_OVERCUR: + { + event_info.eventType = NFC_INFO_TXLDO_OVERCUR; + break; + } + case NXP_EVT_INFO_PMUVCC: + { + p_device_mgmt_info->pmuvcc_status = (uint8_t) ( length > HCP_HEADER_LEN ) ? + pEvent[HCP_HEADER_LEN]: 0; + break; + } + case NXP_EVT_INFO_EXT_RF_FIELD: + { + event_info.eventSource = phHal_ePICC_DevType ; + p_device_mgmt_info->rf_status = (uint8_t) ( length > HCP_HEADER_LEN ) ? + pEvent[HCP_HEADER_LEN]: 0; +#ifdef EVT_INFO_EXT_EVT_DIRECT + event_info.eventType = ( CE_EVT_NFC_FIELD_ON == + (p_device_mgmt_info->rf_status & 0x1FU))? + NFC_EVT_FIELD_ON : NFC_EVT_FIELD_OFF; +#else + event_info.eventType = (TRUE == p_device_mgmt_info->rf_status)? + NFC_EVT_FIELD_ON : NFC_EVT_FIELD_OFF; +#endif + break; + } + case NXP_EVT_INFO_MEM_VIOLATION: + { + event_info.eventType = NFC_INFO_MEM_VIOLATION; + break; + } + case NXP_EVT_INFO_TEMP_OVERHEAT: + { + p_device_mgmt_info->overheat_status = (uint8_t)( length > HCP_HEADER_LEN ) ? + pEvent[HCP_HEADER_LEN]: 0; + event_info.eventType = NFC_INFO_TEMP_OVERHEAT; + event_info.eventInfo.overheat_status = + p_device_mgmt_info->overheat_status; + break; + } + default: + { + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_INVALID_HCI_RESPONSE); + break; + } + } + if( NFCSTATUS_SUCCESS == status ) + { + if( NULL != p_device_mgmt_info->p_pipe_info) + { + p_device_mgmt_info->p_pipe_info->prev_status = + NFCSTATUS_SUCCESS; + } + p_device_mgmt_info->current_seq = + p_device_mgmt_info->next_seq; + phHciNfc_Notify_Event(psHciContext, pHwRef, + NFC_NOTIFY_EVENT, &event_info); + } + } + return status; +} + + +static +NFCSTATUS +phHciNfc_DevMgmt_InfoUpdate( + phHciNfc_sContext_t *psHciContext, + phHal_sHwReference_t *pHwRef, + uint8_t index, + uint8_t *reg_value, + uint8_t reg_length + ) +{ + phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL; + NFCSTATUS status = NFCSTATUS_SUCCESS; + uint8_t i=0; + + PHNFC_UNUSED_VARIABLE(pHwRef); + if( (NULL == psHciContext) + || (NULL == reg_value) + || (reg_length == 0) + ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + } + else if ( NULL == psHciContext->p_device_mgmt_info ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); + } + else + { + p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *) + psHciContext->p_device_mgmt_info ; + + switch(index) + { + case DEVICE_INFO_EEPROM_INDEX: + { + p_device_mgmt_info->eeprom_crc = reg_value[i]; + break; + } + default: + { + break; + } + } + + } /* End of Context and the PN544 Device information validity check */ + + return status; +} + + + +/*! + * \brief Sends the RF Settings HCI Additonal Commands to the connected + * reader device. + * + * This function Sends the RF Settings HCI Command frames in the HCP packet + * format to the connected reader device. + */ +static + NFCSTATUS + phHciNfc_Send_DevMgmt_Command ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint8_t pipe_id, + uint8_t cmd + ) + { + phHciNfc_HCP_Packet_t *hcp_packet = NULL; + phHciNfc_HCP_Message_t *hcp_message = NULL; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + uint8_t length=0; + uint8_t i = 0; + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( (NULL == psHciContext) + || ( pipe_id > PHHCINFC_MAX_PIPE) + ||(NULL == psHciContext->p_pipe_list[pipe_id]) + ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + HCI_DEBUG("%s: Invalid Arguments passed \n", + "phHciNfc_Send_DevMgmt_Command"); + } + else + { + p_pipe_info = (phHciNfc_Pipe_Info_t *) + psHciContext->p_pipe_list[pipe_id]; + psHciContext->tx_total = 0 ; + length += HCP_HEADER_LEN ; + switch( cmd ) + { + /* Self Test Commands */ + case NXP_SELF_TEST_ANTENNA: + case NXP_SELF_TEST_SWP: + case NXP_SELF_TEST_NFCWI: + case NXP_SELF_TEST_PRBS: + /* Internal Properietary Commands */ + case NXP_DBG_READ: + case NXP_DBG_WRITE: + { + + hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; + /* Construct the HCP Frame */ + phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, + (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); + hcp_message = &(hcp_packet->msg.message); + /* Append the RF Setting Parameter also the optional Value */ + phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, + i, p_pipe_info->param_info, + p_pipe_info->param_length); + length =(uint8_t)(length + i + p_pipe_info->param_length); + break; + } + default: + { + status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED ); + HCI_DEBUG("%s: Statement Should Not Occur \n", + "phHciNfc_Send_DevMgmt_Command"); + break; + } + } + if( NFCSTATUS_SUCCESS == status ) + { + p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND; + p_pipe_info->prev_msg = cmd; + psHciContext->tx_total = length; + psHciContext->response_pending = TRUE ; + + /* Send the Constructed HCP packet to the lower layer */ + status = phHciNfc_Send_HCP( psHciContext, pHwRef ); + p_pipe_info->prev_status = NFCSTATUS_PENDING; + } + } + + return status; +} + + + +/*! + * \brief Sends the RF Settings HCI Additonal Events to the connected + * reader device. + * + * This function Sends the RF Settings HCI Events frames in the HCP packet + * format to the connected reader device. + */ + +static + NFCSTATUS + phHciNfc_Send_DevMgmt_Event ( + phHciNfc_sContext_t *psHciContext, + void *pHwRef, + uint8_t pipe_id, + uint8_t event + ) + { + phHciNfc_HCP_Packet_t *hcp_packet = NULL; + phHciNfc_HCP_Message_t *hcp_message = NULL; + phHciNfc_Pipe_Info_t *p_pipe_info = NULL; + uint8_t length=0; + uint8_t i = 0; + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( (NULL == psHciContext) + || ( pipe_id > PHHCINFC_MAX_PIPE) + ||(NULL == psHciContext->p_pipe_list[pipe_id]) + ) + { + status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); + HCI_DEBUG("%s: Invalid Arguments passed \n", + "phHciNfc_Send_DevMgmt_Event"); + } + else + { + p_pipe_info = (phHciNfc_Pipe_Info_t *) + psHciContext->p_pipe_list[pipe_id]; + psHciContext->tx_total = 0 ; + length += HCP_HEADER_LEN ; + if( NXP_EVT_SET_AUTONOMOUS == event ) + { + + hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; + /* Construct the HCP Frame */ + phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, + (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event); + hcp_message = &(hcp_packet->msg.message); + /* Append the RF Setting Parameter also the optional Value */ + phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, + i, p_pipe_info->param_info, + p_pipe_info->param_length); + length =(uint8_t)(length + i + p_pipe_info->param_length); + } + else + { + status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED ); + HCI_DEBUG("%s: Statement Should Not Occur \n", + "phHciNfc_Send_DevMgmt_Event"); + } + if( NFCSTATUS_SUCCESS == status ) + { + p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT; + p_pipe_info->prev_msg = event; + psHciContext->tx_total = length; + + /* Send the Constructed HCP packet to the lower layer */ + status = phHciNfc_Send_HCP( psHciContext, pHwRef ); + p_pipe_info->prev_status = NFCSTATUS_PENDING; + } + } + + return status; +} + + + + + |