/* * 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_IDMgmt.c * * \brief HCI Identity Management Gate Routines. * * * * * * Project: NFC-FRI-1.1 * * * * $Date: Fri Jun 11 11:19:25 2010 $ * * $Author: ing04880 $ * * $Revision: 1.23 $ * * $Aliases: NFC_FRI1.1_WK1023_R35_1 $ * * * =========================================================================== * */ /* ***************************** Header File Inclusion **************************** */ #include #include #include #include /* ****************************** Macro Definitions ******************************* */ #define FW_VERSION_INDEX 0x01U #define HCI_VERSION_INDEX 0x02U #define HW_VERSION_INDEX 0x03U #define VENDOR_NAME_INDEX 0x04U #define MODEL_ID_INDEX 0x05U #define GATES_LIST_INDEX 0x06U #define FULL_VERSION_INDEX 0x10U #define VERSION_LEN 0x03U #define GATES_LIST_LEN 0x20U /* *************************** Structure and Enumeration *************************** */ /** \defgroup grp_hci_nfc HCI Identity Management Component * * */ typedef enum phHciNfc_IDMgmt_Seq{ IDMGMT_PIPE_OPEN = 0x00U, IDMGMT_GET_FULL_VERSION, IDMGMT_GET_FW_VERSION, IDMGMT_GET_HW_VERSION, IDMGMT_GET_HCI_VERSION, IDMGMT_GET_VENDOR_NAME, IDMGMT_GET_MODEL_ID, IDMGMT_GET_GATES_LIST, IDMGMT_PIPE_CLOSE } phHciNfc_IDMgmt_Seq_t; typedef struct phHciNfc_IDMgmt_Info{ phHciNfc_IDMgmt_Seq_t id_cur_seq; phHciNfc_IDMgmt_Seq_t id_next_seq; phHciNfc_Pipe_Info_t *p_pipe_info; uint8_t pipe_id; uint32_t fw_version; uint32_t hw_version; utf8_t vendor_name[VENDOR_NAME_LEN]; uint8_t model_id; uint8_t hci_version; uint8_t gates_list[GATES_LIST_LEN]; uint8_t full_version[NXP_FULL_VERSION_LEN]; } phHciNfc_IDMgmt_Info_t; /* *************************** Static Function Declaration ************************** */ static NFCSTATUS phHciNfc_IDMgmt_InfoUpdate( phHciNfc_sContext_t *psHciContext, phHal_sHwReference_t *pHwRef, uint8_t index, uint8_t *reg_value, uint8_t reg_length ); static NFCSTATUS phHciNfc_Recv_IDMgmt_Response( void *psHciContext, void *pHwRef, uint8_t *pResponse, #ifdef ONE_BYTE_LEN uint8_t length #else uint16_t length #endif ); /* *************************** Function Definitions *************************** */ /*! * \brief Allocates the resources of Identity Managment Gate. * * This function Allocates the resources of the Identity Management * gate Information Structure. * */ NFCSTATUS phHciNfc_IDMgmt_Init_Resources( phHciNfc_sContext_t *psHciContext ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( ( NULL == psHciContext->p_identity_info ) && (phHciNfc_Allocate_Resource((void **)(&p_identity_info), sizeof(phHciNfc_IDMgmt_Info_t))== NFCSTATUS_SUCCESS) ) { psHciContext->p_identity_info = p_identity_info; p_identity_info->id_cur_seq = IDMGMT_PIPE_OPEN; p_identity_info->id_next_seq = IDMGMT_PIPE_OPEN; p_identity_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; } else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); } } return status; } /*! * \brief Get the pipe_id of Identity Managment Gate. * * This function Get the pipe_id of Identity Managment Gate. * */ NFCSTATUS phHciNfc_IDMgmt_Get_PipeID( phHciNfc_sContext_t *psHciContext, uint8_t *ppipe_id ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; if( (NULL != psHciContext) && ( NULL != ppipe_id ) && ( NULL != psHciContext->p_identity_info ) ) { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; *ppipe_id = p_identity_info->pipe_id ; } else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } return status; } NFCSTATUS phHciNfc_IDMgmt_Update_Sequence( phHciNfc_sContext_t *psHciContext, phHciNfc_eSeqType_t reader_seq ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL == psHciContext->p_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; switch(reader_seq) { case RESET_SEQ: case INIT_SEQ: { p_identity_info->id_cur_seq = IDMGMT_PIPE_OPEN; p_identity_info->id_next_seq = IDMGMT_PIPE_OPEN; break; } case UPDATE_SEQ: { p_identity_info->id_cur_seq = p_identity_info->id_next_seq; break; } case INFO_SEQ: { p_identity_info->id_cur_seq = IDMGMT_GET_FW_VERSION; p_identity_info->id_next_seq = IDMGMT_GET_FW_VERSION; break; } case REL_SEQ: { p_identity_info->id_cur_seq = IDMGMT_PIPE_CLOSE; p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; break; } default: { break; } } } } return status; } /*! * \brief Initialisation of Identity Managment Gate. * * This function initialses the Identity Management gate and * populates the Identity Management Information Structure * */ NFCSTATUS phHciNfc_IDMgmt_Initialise( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; #ifndef ESTABLISH_SESSION uint8_t id_pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; #endif if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL == psHciContext->p_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; p_pipe_info = p_identity_info->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); } else { switch(p_identity_info->id_cur_seq ) { /* Identity Mgmt pipe open sequence */ case IDMGMT_PIPE_OPEN: { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_identity_info->id_next_seq = IDMGMT_GET_FW_VERSION; #ifndef ESTABLISH_SESSION status = NFCSTATUS_PENDING; #endif } break; } #ifndef ESTABLISH_SESSION case IDMGMT_GET_FW_VERSION: { p_pipe_info->reg_index = FW_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_HW_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_HW_VERSION: { p_pipe_info->reg_index = HW_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_HCI_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_HCI_VERSION: { p_pipe_info->reg_index = HCI_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_VENDOR_NAME; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_VENDOR_NAME: { p_pipe_info->reg_index = VENDOR_NAME_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_MODEL_ID; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_MODEL_ID: { p_pipe_info->reg_index = MODEL_ID_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_GATES_LIST; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_GATES_LIST: { p_pipe_info->reg_index = GATES_LIST_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_FULL_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_FULL_VERSION: { p_pipe_info->reg_index = FULL_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; status = NFCSTATUS_SUCCESS; } break; } #endif default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); break; } }/* End of the Sequence Switch */ }/* End of Pipe Info Memory Check */ }/* End of the Identity Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Initialisation of Identity Managment Gate. * * This function initialses the Identity Management gate and * populates the Identity Management Information Structure * */ NFCSTATUS phHciNfc_IDMgmt_Info_Sequence( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; uint8_t id_pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL == psHciContext->p_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; p_pipe_info = p_identity_info->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); } else { switch(p_identity_info->id_cur_seq ) { case IDMGMT_GET_FW_VERSION: { p_pipe_info->reg_index = FW_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_HW_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_HW_VERSION: { p_pipe_info->reg_index = HW_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_HCI_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_HCI_VERSION: { p_pipe_info->reg_index = HCI_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_VENDOR_NAME; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_VENDOR_NAME: { p_pipe_info->reg_index = VENDOR_NAME_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_MODEL_ID; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_MODEL_ID: { p_pipe_info->reg_index = MODEL_ID_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_GATES_LIST; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_GATES_LIST: { p_pipe_info->reg_index = GATES_LIST_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_GET_FULL_VERSION; /* status = NFCSTATUS_SUCCESS; */ } break; } case IDMGMT_GET_FULL_VERSION: { p_pipe_info->reg_index = FULL_VERSION_INDEX; id_pipe_id = p_identity_info->pipe_id ; status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, id_pipe_id, (uint8_t)ANY_GET_PARAMETER ); if(NFCSTATUS_PENDING == status ) { p_identity_info->id_next_seq = IDMGMT_PIPE_CLOSE; status = NFCSTATUS_SUCCESS; } break; } default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); break; } }/* End of the Sequence Switch */ }/* End of Pipe Info Memory Check */ }/* End of the Identity Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Releases the resources allocated the Identity Management. * * This function Releases the resources allocated the Identity Management. */ NFCSTATUS phHciNfc_IDMgmt_Release( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; /* static phHciNfc_IDMgmt_Seq_t identity_init_seq = IDMGMT_PIPE_CREATE; */ if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL != psHciContext->p_identity_info ) { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; p_pipe_info = p_identity_info->p_pipe_info; status = phHciNfc_Close_Pipe( psHciContext, pHwRef, p_pipe_info ); } else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); }/* End of the Identity Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Receives the HCI Response from the corresponding peripheral device. * * This function receives the HCI Command Response from the connected NFC * Pheripheral device. */ static NFCSTATUS phHciNfc_Recv_IDMgmt_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_IDMgmt_Info_t *p_identity_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_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; if( NULL != p_identity_info->p_pipe_info) { prev_cmd = p_identity_info->p_pipe_info->prev_msg ; switch(prev_cmd) { case ANY_GET_PARAMETER: { status = phHciNfc_IDMgmt_InfoUpdate(psHciContext, (phHal_sHwReference_t *)pHwRef, p_identity_info->p_pipe_info->reg_index, &pResponse[HCP_HEADER_LEN], (uint8_t)(length - HCP_HEADER_LEN)); break; } case ANY_SET_PARAMETER: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } case ANY_OPEN_PIPE: { break; } case ANY_CLOSE_PIPE: { break; } default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE); break; } } if( NFCSTATUS_SUCCESS == status ) { p_identity_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS; p_identity_info->id_cur_seq = p_identity_info->id_next_seq; } } } return status; } /* Function to Update the Pipe Information */ NFCSTATUS phHciNfc_IDMgmt_Update_PipeInfo( phHciNfc_sContext_t *psHciContext, uint8_t pipe_id, phHciNfc_Pipe_Info_t *pPipeInfo ) { phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; NFCSTATUS status = NFCSTATUS_SUCCESS; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else if ( NULL == psHciContext->p_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; /* Update the pipe_id of the ID Mgmt Gate obtained from the HCI Response */ p_identity_info->pipe_id = pipe_id; p_identity_info->p_pipe_info = pPipeInfo; if ( NULL != pPipeInfo) { /* Update the Response Receive routine of the IDMgmt Gate */ pPipeInfo->recv_resp = &phHciNfc_Recv_IDMgmt_Response; } } return status; } static NFCSTATUS phHciNfc_IDMgmt_InfoUpdate( phHciNfc_sContext_t *psHciContext, phHal_sHwReference_t *pHwRef, uint8_t index, uint8_t *reg_value, uint8_t reg_length ) { phHciNfc_IDMgmt_Info_t *p_identity_info=NULL; NFCSTATUS status = NFCSTATUS_SUCCESS; uint8_t i=0; if( (NULL == psHciContext) || (NULL == reg_value) || (reg_length == 0) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else if ( NULL == psHciContext->p_identity_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_identity_info = (phHciNfc_IDMgmt_Info_t *) psHciContext->p_identity_info ; switch(index) { case FW_VERSION_INDEX : { HCI_PRINT_BUFFER("\tFW Version:",reg_value,reg_length); for(i=0 ;(reg_length == VERSION_LEN)&&(i < reg_length); i++) { p_identity_info->fw_version |= (uint32_t)(reg_value[VERSION_LEN - i - 1] << (BYTE_SIZE * i)); } pHwRef->device_info.fw_version = p_identity_info->fw_version ; break; } case HW_VERSION_INDEX : { HCI_PRINT_BUFFER("\tHW Version:",reg_value,reg_length); for(i=0 ;(reg_length == VERSION_LEN)&&(i < reg_length); i++) { p_identity_info->hw_version |= (uint32_t)(reg_value[VERSION_LEN - i - 1] << (BYTE_SIZE * i)); } pHwRef->device_info.hw_version = p_identity_info->hw_version ; break; } case VENDOR_NAME_INDEX : { for(i=0 ;(reg_length <= VENDOR_NAME_LEN)&&(i < reg_length); i++) { p_identity_info->vendor_name[i] = reg_value[i]; pHwRef->device_info.vendor_name[i]= reg_value[i]; } HCI_DEBUG("\tVendor Name:%s",p_identity_info->vendor_name); break; } case MODEL_ID_INDEX : { HCI_PRINT_BUFFER("\tModel ID:",reg_value,reg_length); p_identity_info->model_id = reg_value[i] ; pHwRef->device_info.model_id = p_identity_info->model_id ; #ifndef NXP_HAL_ENABLE_SMX if( NFC_HW_PN65N == pHwRef->device_info.model_id) #endif { pHwRef->smx_connected = TRUE; } break; } case HCI_VERSION_INDEX : { HCI_PRINT_BUFFER("\tHCI Version:",reg_value,reg_length); p_identity_info->hci_version = reg_value[i] ; pHwRef->device_info.hci_version = p_identity_info->hci_version ; break; } case GATES_LIST_INDEX : { HCI_PRINT_BUFFER("\tGates List:",reg_value,reg_length); for(i=0 ;(reg_length <= GATES_LIST_LEN)&&(i < reg_length); i++) { p_identity_info->gates_list[i] = reg_value[i]; } break; } case FULL_VERSION_INDEX : { HCI_PRINT_BUFFER("\tVERSION INFO:",reg_value,reg_length); for(i=0 ;(reg_length <= NXP_FULL_VERSION_LEN)&&(i < reg_length); i++) { p_identity_info->full_version[i] = reg_value[i]; pHwRef->device_info.full_version[i]= reg_value[i]; } break; } default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); break; } /*End of the default Switch Case */ } /*End of the Index Switch */ } /* End of Context and the Identity information validity check */ return status; }