| /* |
| * 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_RFReader.c * |
| * \brief HCI RF Reader Management Gate Routines. * |
| * * |
| * * |
| * Project: NFC-FRI-1.1 * |
| * * |
| * $Date: Wed Apr 21 12:21:15 2010 $ * |
| * $Author: ing07385 $ * |
| * $Revision: 1.53 $ * |
| * $Aliases: NFC_FRI1.1_WK1007_R33_6 $ * |
| * * |
| * =========================================================================== * |
| */ |
| |
| /* |
| ***************************** Header File Inclusion **************************** |
| */ |
| #include <phNfcConfig.h> |
| #include <phNfcCompId.h> |
| #include <phHciNfc_Pipe.h> |
| #include <phHciNfc_RFReader.h> |
| #include <phHciNfc_RFReaderA.h> |
| #ifdef TYPE_B |
| #include <phHciNfc_RFReaderB.h> |
| #endif |
| #ifdef ENABLE_P2P |
| #include <phHciNfc_NfcIPMgmt.h> |
| #endif |
| #ifdef TYPE_FELICA |
| #include <phHciNfc_Felica.h> |
| #endif |
| #ifdef TYPE_JEWEL |
| #include <phHciNfc_Jewel.h> |
| #endif |
| #ifdef TYPE_ISO15693 |
| #include <phHciNfc_ISO15693.h> |
| #endif /* #ifdef TYPE_ISO15693 */ |
| #include <phOsalNfc.h> |
| |
| /* |
| ****************************** Macro Definitions ******************************* |
| */ |
| |
| #define NFCIP_ACTIVATE_DELAY 0x05U |
| |
| uint8_t nxp_nfc_isoxchg_timeout = NXP_ISO_XCHG_TIMEOUT; |
| /* |
| *************************** Structure and Enumeration *************************** |
| */ |
| |
| |
| /** \defgroup grp_hci_nfc HCI Reader RF Management Component |
| * |
| * |
| */ |
| |
| |
| typedef enum phHciNfc_ReaderMgmt_Seq{ |
| READERA_PIPE_OPEN = 0x00U, |
| READERB_PIPE_OPEN, |
| FELICA_PROP_PIPE_OPEN, |
| JEWEL_PROP_PIPE_OPEN, |
| ISO15693_PROP_PIPE_OPEN, |
| NFCIP1_INITIATOR_PIPE_OPEN, |
| NFCIP1_INITIATOR_MODE_CONFIG, |
| NFCIP1_INITIATOR_PSL1_CONFIG, |
| NFCIP1_INITIATOR_PSL2_CONFIG, |
| READERA_DISABLE_AUTO_ACTIVATE, |
| |
| |
| READERA_PIPE_CLOSE, |
| READERB_PIPE_CLOSE, |
| FELICA_PROP_PIPE_CLOSE, |
| JEWEL_PROP_PIPE_CLOSE, |
| ISO15693_PROP_PIPE_CLOSE, |
| NFCIP1_INITIATOR_PIPE_CLOSE, |
| END_READER_SEQUENCE |
| } phHciNfc_ReaderMgmt_Seq_t; |
| |
| typedef struct phHciNfc_ReaderMgmt_Info{ |
| phHciNfc_ReaderMgmt_Seq_t rf_gate_cur_seq; |
| phHciNfc_ReaderMgmt_Seq_t rf_gate_next_seq; |
| } phHciNfc_ReaderMgmt_Info_t; |
| |
| |
| /* |
| *************************** Static Function Declaration ************************** |
| */ |
| static |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_End_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t reader_pipe_id |
| ); |
| |
| static |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Initiate_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t reader_pipe_id |
| ); |
| |
| /* |
| *************************** Function Definitions *************************** |
| */ |
| |
| #ifdef READER_INIT |
| /*! |
| * \brief Allocates the resources of RF Reader Managment Gate. |
| * |
| * This function Allocates the resources of the RF Reader Management |
| * gate Information Structure. |
| * |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Init_Resources( |
| phHciNfc_sContext_t *psHciContext |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if( ( NULL == psHciContext->p_reader_mgmt_info ) |
| && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info), |
| sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS) |
| ) |
| { |
| psHciContext->p_reader_mgmt_info = p_reader_mgmt_info; |
| p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; |
| p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); |
| } |
| } |
| return status; |
| } |
| |
| #endif |
| |
| /*! |
| * \brief Updates the Sequence of RF Reader Managment Gate. |
| * |
| * This function Resets/Updates the sequence of the RF Reader Management |
| * gate. |
| * |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Update_Sequence( |
| phHciNfc_sContext_t *psHciContext, |
| phHciNfc_eSeqType_t reader_seq |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info = NULL; |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if( NULL == psHciContext->p_reader_mgmt_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| switch(reader_seq) |
| { |
| case RESET_SEQ: |
| case INIT_SEQ: |
| { |
| p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; |
| p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; |
| break; |
| } |
| case UPDATE_SEQ: |
| { |
| p_reader_mgmt_info->rf_gate_cur_seq = |
| p_reader_mgmt_info->rf_gate_next_seq; |
| break; |
| } |
| case INFO_SEQ: |
| { |
| status = phHciNfc_ReaderA_Update_Info(psHciContext, |
| HCI_READER_A_INFO_SEQ, NULL); |
| #if defined( TYPE_B ) |
| status = phHciNfc_ReaderB_Update_Info(psHciContext, |
| HCI_READER_B_INFO_SEQ, NULL); |
| #endif /* end of #if defined(TYPE_B) */ |
| #if defined( TYPE_FELICA ) |
| status = phHciNfc_Felica_Update_Info(psHciContext, |
| HCI_FELICA_INFO_SEQ, NULL); |
| #endif /* end of #if defined(TYPE_FELICA) */ |
| #if defined( TYPE_JEWEL ) |
| status = phHciNfc_Jewel_Update_Info(psHciContext, |
| HCI_JEWEL_INFO_SEQ, NULL); |
| #endif /* end of #if defined(TYPE_JEWEL) */ |
| #if defined( TYPE_ISO15693 ) |
| status = phHciNfc_ISO15693_Update_Info(psHciContext, |
| HCI_ISO_15693_INFO_SEQ, NULL); |
| #endif /* end of #if defined(TYPE_ISO15693) */ |
| break; |
| } |
| case REL_SEQ: |
| { |
| p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_CLOSE; |
| p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; |
| break; |
| } |
| default: |
| { |
| break; |
| } |
| } |
| } |
| } |
| |
| return status; |
| |
| } |
| |
| |
| /*! |
| * \brief Initialisation of RF Reader Managment Gate. |
| * |
| * This function initialses the RF Reader Management gate and |
| * populates the Reader Management Information Structure |
| * |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Initialise( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| |
| if( ( NULL == psHciContext->p_reader_mgmt_info ) |
| && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info), |
| sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS) |
| ) |
| { |
| psHciContext->p_reader_mgmt_info = p_reader_mgmt_info; |
| p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; |
| p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; |
| } |
| else |
| { |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| } |
| |
| if( NULL == psHciContext->p_reader_mgmt_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INSUFFICIENT_RESOURCES); |
| } |
| #ifdef ESTABLISH_SESSION |
| else if( hciMode_Session == psHciContext->hci_mode ) |
| { |
| status = NFCSTATUS_SUCCESS; |
| } |
| #endif |
| else |
| { |
| switch(p_reader_mgmt_info->rf_gate_cur_seq ) |
| { |
| /* Reader A pipe open sequence */ |
| case READERA_PIPE_OPEN: |
| { |
| p_pipe_info = ((phHciNfc_ReaderA_Info_t *) |
| psHciContext->p_reader_a_info)->p_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| uint8_t rdr_enable = TRUE; |
| status = phHciNfc_ReaderA_Update_Info( |
| psHciContext, HCI_READER_A_ENABLE, |
| &rdr_enable); |
| #if defined( TYPE_B ) && defined ( ENABLE_AUTO_ACTIVATE ) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| READERB_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef TYPE_B */ |
| #elif !defined( ENABLE_AUTO_ACTIVATE ) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| READERA_DISABLE_AUTO_ACTIVATE; |
| status = NFCSTATUS_PENDING; |
| /* #ifdef ENABLE_AUTO_ACTIVATE */ |
| #elif defined( ENABLE_P2P ) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif |
| } |
| } |
| break; |
| } |
| /* Reader A Auto Activate Disable */ |
| case READERA_DISABLE_AUTO_ACTIVATE: |
| { |
| uint8_t activate_enable = FALSE; |
| p_pipe_info = ((phHciNfc_ReaderA_Info_t *) |
| psHciContext->p_reader_a_info)->p_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| |
| status = phHciNfc_ReaderA_Auto_Activate( psHciContext, |
| pHwRef, activate_enable ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| #if defined (TYPE_B) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| READERB_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef TYPE_B */ |
| #elif defined(TYPE_FELICA) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| FELICA_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_FELICA) */ |
| #elif defined(TYPE_JEWEL) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| JEWEL_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_JEWEL) */ |
| #elif defined (TYPE_ISO15693) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| ISO15693_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_ISO15693) */ |
| #elif defined(ENABLE_P2P) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_B)*/ |
| } |
| } |
| break; |
| } |
| #ifdef TYPE_B |
| /* Reader B pipe open sequence */ |
| case READERB_PIPE_OPEN: |
| { |
| p_pipe_info = ((phHciNfc_ReaderB_Info_t *) |
| psHciContext->p_reader_b_info)->p_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| #if defined(TYPE_FELICA) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| FELICA_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef TYPE_FELICA */ |
| #elif defined(TYPE_JEWEL) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| JEWEL_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_JEWEL) */ |
| #elif defined (TYPE_ISO15693) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| ISO15693_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_ISO15693) */ |
| #elif defined(ENABLE_P2P) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_FELICA)*/ |
| } |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| /* Felica Reader pipe open sequence */ |
| case FELICA_PROP_PIPE_OPEN: |
| { |
| p_pipe_info = ((phHciNfc_Felica_Info_t *) |
| psHciContext->p_felica_info)->p_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| #if defined(TYPE_JEWEL) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| JEWEL_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #if defined(TYPE_JEWEL) */ |
| #elif defined (TYPE_ISO15693) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| ISO15693_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #elif defined(TYPE_ISO15693) */ |
| #elif defined(ENABLE_P2P) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif /* #if !defined(ENABLE_P2P) */ |
| } |
| } |
| break; |
| } |
| #endif |
| #ifdef TYPE_JEWEL |
| /* Jewel Reader pipe open sequence */ |
| case JEWEL_PROP_PIPE_OPEN: |
| { |
| p_pipe_info = ((phHciNfc_Jewel_Info_t *) |
| psHciContext->p_jewel_info)->p_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| #if defined (TYPE_ISO15693) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| ISO15693_PROP_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #if defined(TYPE_ISO15693) */ |
| #elif defined (ENABLE_P2P) |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif /* #if !defined(ENABLE_P2P) */ |
| } |
| } |
| break; |
| } |
| #endif |
| |
| #ifdef TYPE_ISO15693 |
| /* ISO15693 Reader pipe open sequence */ |
| case ISO15693_PROP_PIPE_OPEN: |
| { |
| p_pipe_info = ((phHciNfc_ISO15693_Info_t *) |
| psHciContext->p_iso_15693_info)->ps_15693_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| #ifdef ENABLE_P2P |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_OPEN; |
| status = NFCSTATUS_PENDING; |
| /* end of #ifdef ENABLE_P2P */ |
| #else |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| /* status = NFCSTATUS_PENDING; */ |
| #endif /* #if !defined(ENABLE_P2P) */ |
| } |
| } |
| break; |
| } |
| |
| #endif |
| |
| #ifdef ENABLE_P2P |
| /* NFC-IP1 Initiator pipe open sequence */ |
| case NFCIP1_INITIATOR_PIPE_OPEN: |
| { |
| p_pipe_info = |
| ((phHciNfc_NfcIP_Info_t *)psHciContext-> |
| p_nfcip_info)->p_init_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_MODE_CONFIG; |
| status = NFCSTATUS_PENDING; |
| } |
| } |
| break; |
| } |
| case NFCIP1_INITIATOR_MODE_CONFIG: |
| { |
| uint8_t mode = DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT; |
| status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, |
| NFCIP_INITIATOR, mode); |
| if(status == NFCSTATUS_PENDING ) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PSL1_CONFIG; |
| /* status = NFCSTATUS_SUCCESS; */ |
| } |
| break; |
| } |
| case NFCIP1_INITIATOR_PSL1_CONFIG: |
| { |
| uint8_t psl_config = NXP_NFCIP_PSL_BRS_DEFAULT; |
| status = phHciNfc_NfcIP_SetPSL1( psHciContext, pHwRef, |
| psl_config); |
| if(status == NFCSTATUS_PENDING ) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| END_READER_SEQUENCE; |
| status = NFCSTATUS_SUCCESS; |
| } |
| break; |
| } |
| #endif |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); |
| break; |
| } |
| |
| }/* End of the Sequence Switch */ |
| |
| }/* End of the Reader Info Memory Check */ |
| |
| } /* End of Null Context Check */ |
| |
| return status; |
| } |
| |
| |
| /*! |
| * \brief Initiate the Discovery for the RF Reader . |
| * |
| * This function starts the Polling Loop and initiates the discovery |
| * of the Target. |
| * |
| */ |
| static |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Initiate_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t reader_pipe_id |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( ( NULL == psHciContext ) |
| || ( NULL == pHwRef ) |
| || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id) |
| ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| |
| status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, |
| reader_pipe_id,(uint8_t) EVT_READER_REQUESTED ); |
| status = ( (status == NFCSTATUS_PENDING)? |
| NFCSTATUS_SUCCESS : status); |
| } |
| return status; |
| } |
| |
| |
| /*! |
| * \brief End the Discovery of the RF Reader . |
| * |
| * This function stops the Polling Loop and ends the discovery |
| * of the Target. |
| * |
| */ |
| static |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_End_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| uint8_t reader_pipe_id |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if( ( NULL == psHciContext ) |
| || ( NULL == pHwRef ) |
| || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id) |
| ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| |
| status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, |
| reader_pipe_id,(uint8_t) EVT_END_OPERATION ); |
| status = ( (status == NFCSTATUS_PENDING)? |
| NFCSTATUS_SUCCESS : status); |
| } |
| return status; |
| } |
| |
| |
| /*! |
| * \brief Enable the Discovery of RF Reader Managment Gate. |
| * |
| * This function Enable the discovery of the RF Reader Management |
| * gate. |
| * |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Enable_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * ) |
| psHciContext->p_config_params; */ |
| PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); |
| if( NULL != psHciContext->p_reader_mgmt_info ) |
| { |
| uint8_t rdr_enable = FALSE; |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| #ifdef TYPE_B |
| if ( (NULL != psHciContext->p_reader_b_info ) |
| /* && (FALSE == rdr_enable) */ |
| ) |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| rdr_enable = (uint8_t)TRUE; |
| /* rdr_enable = (uint8_t) |
| p_poll_config->PollDevInfo.PollCfgInfo.EnableIso14443B; */ |
| status = phHciNfc_ReaderB_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| } |
| #endif |
| #ifdef TYPE_FELICA |
| if ( (NULL != psHciContext->p_felica_info ) |
| /* && (FALSE == rdr_enable) */ |
| ) |
| { |
| /* Get the Reader F Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| rdr_enable = (uint8_t)TRUE; |
| /* rdr_enable = (uint8_t) |
| ( p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica212 |
| || p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica424 ); */ |
| status = phHciNfc_Felica_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| } |
| #endif |
| #ifdef TYPE_JEWEL |
| if ( (NULL != psHciContext->p_jewel_info ) |
| /* && (FALSE == rdr_enable) */ |
| ) |
| { |
| /* Get the Reader F Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| rdr_enable = (uint8_t)TRUE; |
| status = phHciNfc_Jewel_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #if defined(TYPE_ISO15693) |
| if ( (NULL != psHciContext->p_iso_15693_info ) |
| /* && (FALSE == rdr_enable) */ |
| ) |
| { |
| /* Get the Reader F Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| rdr_enable = (uint8_t)TRUE; |
| status = phHciNfc_ISO15693_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| } |
| |
| /* end of #elif defined(TYPE_ISO15693) */ |
| #endif |
| |
| if(NULL != psHciContext->p_reader_a_info) |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| rdr_enable = (uint8_t)TRUE; |
| status = phHciNfc_ReaderA_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| |
| } |
| if( ( NFCSTATUS_SUCCESS == status ) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_ReaderMgmt_Initiate_Discovery( psHciContext, |
| pHwRef, reader_pipe_id); |
| } |
| |
| }/* End of the Reader Info Memory Check */ |
| |
| return status; |
| } |
| |
| /*! |
| * \brief Disable the Discovery of RF Reader Managment Gate. |
| * |
| * This function Disable the discovery of the RF Reader Management |
| * gate. |
| * |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Disable_Discovery( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_FAILED; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * ) |
| psHciContext->p_config_params; */ |
| PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); |
| if( NULL != psHciContext->p_reader_mgmt_info ) |
| { |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| if(NULL != psHciContext->p_reader_a_info) |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| #if 0 |
| if( NFCSTATUS_SUCCESS == status ) |
| { |
| uint8_t rdr_enable = (uint8_t) FALSE; |
| status = phHciNfc_ReaderA_Update_Info(psHciContext, |
| HCI_RDR_ENABLE_TYPE, &rdr_enable); |
| } |
| #endif |
| |
| } |
| #ifdef TYPE_B |
| else if((NULL != psHciContext->p_reader_b_info ) |
| /* && (NFCSTATUS_SUCCESS != status) */ |
| ) |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| } |
| #endif |
| #ifdef TYPE_FELICA |
| else if((NULL != psHciContext->p_felica_info ) |
| /* && (NFCSTATUS_SUCCESS != status) */ |
| ) |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| } |
| #endif |
| #ifdef TYPE_JEWEL |
| else if((NULL != psHciContext->p_jewel_info ) |
| /* && (NFCSTATUS_SUCCESS != status) */ |
| ) |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #ifdef TYPE_ISO15693 |
| else if((NULL != psHciContext->p_iso_15693_info ) |
| /* && (NFCSTATUS_SUCCESS != status) */ |
| ) |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| } |
| #endif /* #ifdef TYPE_ISO15693 */ |
| |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); |
| } |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_ReaderMgmt_End_Discovery( psHciContext, |
| pHwRef, reader_pipe_id); |
| } |
| |
| }/* End of the Reader Info Memory Check */ |
| |
| return status; |
| } |
| |
| |
| |
| |
| /*! |
| * \brief Updates the Sequence of RF Reader Managment Gate. |
| * |
| * This function Resets/Updates the sequence of the RF Reader Management |
| * gate. |
| * |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Info_Sequence( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| #if defined(NXP_NFCIP_ACTIVATE_DELAY) |
| static uint8_t nfc_atr_retry = 0; |
| #endif |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| #if 0 |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; |
| #endif |
| |
| |
| PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); |
| if( NULL == psHciContext ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if( NULL != psHciContext->p_reader_mgmt_info ) |
| { |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| switch( psHciContext->host_rf_type ) |
| { |
| |
| case phHal_eISO14443_A_PCD: |
| { |
| /* If the Target Info is updated then the Target |
| * is connected. |
| */ |
| if(NULL == psHciContext->p_target_info) |
| { |
| #if defined(NXP_NFCIP_ACTIVATE_DELAY) |
| nfc_atr_retry = 0; |
| #endif |
| status = phHciNfc_ReaderA_Info_Sequence( |
| psHciContext, pHwRef ); |
| } |
| else |
| { |
| status = phHciNfc_ReaderA_App_Data( |
| psHciContext, pHwRef ); |
| status = ((NFCSTATUS_PENDING == status )? |
| NFCSTATUS_SUCCESS : status); |
| } |
| break; |
| } |
| #ifdef ENABLE_P2P |
| case phHal_eNfcIP1_Initiator: |
| { |
| /* If the Target Info is updated then the Target |
| * is connected. |
| */ |
| #ifdef NFCIP_CHECK |
| if(NULL == psHciContext->p_target_info) |
| #endif |
| { |
| status = phHciNfc_NfcIP_Info_Sequence( |
| psHciContext, pHwRef |
| #ifdef NOTIFY_REQD |
| ,(NULL == psHciContext->p_target_info) |
| #endif /* #ifdef NOTIFY_REQD */ |
| ); |
| } |
| #ifdef NFCIP_CHECK |
| else |
| { |
| status = phHciNfc_NfcIP_GetATRInfo( |
| psHciContext, pHwRef, NFCIP_INITIATOR ); |
| #if defined(NXP_NFCIP_ACTIVATE_DELAY) |
| if ( |
| (NFCSTATUS_PENDING == status) |
| && ( NFCIP_ACTIVATE_DELAY <= nfc_atr_retry) |
| ) |
| { |
| nfc_atr_retry = 0; |
| status = NFCSTATUS_SUCCESS; |
| } |
| else |
| { |
| nfc_atr_retry++; |
| } |
| #else |
| status = ((NFCSTATUS_PENDING == status )? |
| NFCSTATUS_SUCCESS : status); |
| #endif |
| } |
| #endif |
| break; |
| } |
| #endif |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PCD: |
| { |
| if(NULL == psHciContext->p_target_info) |
| { |
| status = phHciNfc_ReaderB_Info_Sequence( |
| psHciContext, pHwRef ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PCD: |
| { |
| if(NULL == psHciContext->p_target_info) |
| { |
| #if defined(NXP_NFCIP_ACTIVATE_DELAY) |
| nfc_atr_retry = 0; |
| #endif |
| status = phHciNfc_Felica_Info_Sequence( |
| psHciContext, pHwRef ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef TYPE_JEWEL |
| case phHal_eJewel_PCD: |
| { |
| if(NULL == psHciContext->p_target_info) |
| { |
| status = phHciNfc_Jewel_Info_Sequence( |
| psHciContext, pHwRef ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #if defined(TYPE_ISO15693) |
| case phHal_eISO15693_PCD: |
| { |
| if(NULL == psHciContext->p_target_info) |
| { |
| status = phHciNfc_ISO15693_Info_Sequence( |
| psHciContext, pHwRef ); |
| } |
| break; |
| } |
| #endif |
| default: |
| { |
| break; |
| } |
| } |
| |
| }/* End of the Reader Info Memory Check */ |
| |
| } /* End of Null Context Check */ |
| |
| return status; |
| |
| } |
| |
| |
| /*! |
| * \brief Connects the the selected tag via RF Reader Gates. |
| * |
| * This function connects the selected tags via RF Reader Gate. |
| * This function uses the RF Reader gate based on the type of the |
| * tag specified. |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Select( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHal_eRemDevType_t target_type |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| switch (target_type) |
| { |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_3A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_ReaderMgmt_Reactivate( |
| psHciContext, pHwRef, target_type ); |
| } |
| break; |
| } |
| case phHal_eISO14443_A_PICC: |
| case phHal_eISO14443_4A_PICC: |
| { |
| #ifdef ENABLE_AUTO_ACTIVATE |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); |
| } |
| #else |
| status = phHciNfc_ReaderA_Cont_Activate( |
| psHciContext, pHwRef); |
| #endif /* #ifdef ENABLE_AUTO_ACTIVATE */ |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PICC: |
| case phHal_eISO14443_4B_PICC: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); |
| /* status = phHciNfc_ReaderA_Set_DataRateMax( |
| psHciContext, pHwRef, |
| DATA_RATE_MAX_DEFAULT_VALUE ); */ |
| /* status = phHciNfc_ReaderMgmt_Reactivate( |
| psHciContext, pHwRef, target_type ); */ |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PICC: |
| { |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| /* Get the Reader Felica Pipe ID */ |
| /* status = phHciNfc_ReaderA_Set_DataRateMax( |
| psHciContext, pHwRef, |
| DATA_RATE_MAX_DEFAULT_VALUE ); */ |
| status = phHciNfc_ReaderMgmt_Reactivate( |
| psHciContext, pHwRef, target_type ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef TYPE_JEWEL |
| case phHal_eJewel_PICC: |
| { |
| /* Get the Reader jewel Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Jewel_GetRID( |
| psHciContext, pHwRef); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #ifdef TYPE_ISO15693 |
| case phHal_eISO15693_PICC: |
| { |
| /* Get the Reader ISO 15693 Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| /* TODO */ |
| status = phHciNfc_ReaderA_Set_DataRateMax( |
| psHciContext, pHwRef, |
| DATA_RATE_MAX_DEFAULT_VALUE ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_ISO15693 */ |
| #ifdef ENABLE_P2P |
| case phHal_eNfcIP1_Target: |
| { |
| if ( (phHal_eISO14443_A_PCD == |
| psHciContext->host_rf_type ) |
| || (phHal_eFelica_PCD == |
| psHciContext->host_rf_type ) |
| ) |
| { |
| status = phHciNfc_Initiator_Cont_Activate( |
| psHciContext, pHwRef); |
| } |
| else |
| { |
| status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef); |
| } |
| break; |
| } |
| #endif |
| #if 0 |
| case phHal_eNfcIP1_Initiator: |
| { |
| |
| break; |
| } |
| #endif |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the tag_type Switch */ |
| } |
| |
| return status; |
| } |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_UICC_Dispatch( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHal_eRemDevType_t target_type |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NULL == psHciContext->p_target_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| switch (target_type) |
| { |
| case phHal_eISO14443_A_PICC: |
| case phHal_eISO14443_4A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID( |
| psHciContext, &reader_pipe_id); |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443A_Info.Uid; |
| p_pipe_info->param_length = psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443A_Info.UidLength; |
| |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PICC: |
| case phHal_eISO14443_4B_PICC: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi; |
| p_pipe_info->param_length = PHHAL_PUPI_LENGTH; |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_3A_PICC: |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the tag_type Switch */ |
| } |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_DISPATCH_TO_UICC ); |
| } |
| |
| return status; |
| } |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Reactivate( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHal_eRemDevType_t target_type |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NULL == psHciContext->p_target_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); |
| } |
| else |
| { |
| switch (target_type) |
| { |
| case phHal_eISO14443_A_PICC: |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_4A_PICC: |
| case phHal_eISO14443_3A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID( |
| psHciContext, &reader_pipe_id); |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443A_Info.Uid; |
| p_pipe_info->param_length = psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443A_Info.UidLength; |
| |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PICC: |
| case phHal_eISO14443_4B_PICC: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi; |
| p_pipe_info->param_length = PHHAL_PUPI_LENGTH; |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PICC: |
| { |
| /* Get the Felica Reader Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.Felica_Info.IDm; |
| p_pipe_info->param_length = PHHAL_FEL_ID_LEN; |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef ENABLE_P2P |
| case phHal_eNfcIP1_Target: |
| { |
| /* Get the Initiator Pipe ID */ |
| status = phHciNfc_Initiator_Get_PipeID( |
| psHciContext, &reader_pipe_id); |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &psHciContext->p_target_info-> |
| RemoteDevInfo.NfcIP_Info.NFCID; |
| p_pipe_info->param_length = psHciContext->p_target_info-> |
| RemoteDevInfo.NfcIP_Info.NFCID_Length; |
| break; |
| } |
| case phHal_eNfcIP1_Initiator: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| #endif /* #ifdef ENABLE_P2P */ |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the tag_type Switch */ |
| } |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_ID ); |
| } |
| |
| return status; |
| } |
| |
| |
| /*! |
| * \brief Activates the next Remote Target in the field. |
| * |
| * This function selects and activates the next tag present in the field. |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Activate_Next( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */ |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| switch ( psHciContext->host_rf_type ) |
| { |
| case phHal_eISO14443_A_PCD: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PCD: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PCD: |
| { |
| /* Get the Felica Reader Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef TYPE_ISO15693 |
| case phHal_eISO15693_PCD: |
| { |
| /* Get the ISO 15693 Reader Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_ISO15693 */ |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the reader_type Switch */ |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_NEXT ); |
| } |
| |
| } |
| |
| return status; |
| |
| } |
| |
| /*! |
| * \brief Checks the presence of the Remote Target in the field. |
| * |
| * This function checks the presence of the tag present in the field. |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Presence_Check( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */ |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| target_type = psHciContext->p_target_info->RemDevType; |
| switch (target_type) |
| { |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_3A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_ReaderMgmt_Reactivate( |
| psHciContext, pHwRef, target_type ); |
| } |
| break; |
| } |
| case phHal_eISO14443_A_PICC: |
| case phHal_eISO14443_4A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); |
| } |
| break; |
| } |
| #ifdef ENABLE_P2P |
| case phHal_eNfcIP1_Target: |
| { |
| status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef); |
| break; |
| } |
| #endif |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PICC: |
| case phHal_eISO14443_4B_PICC: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Send_RFReader_Command (psHciContext, |
| pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PICC: |
| { |
| /* Get the Felica Reader Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| status = phHciNfc_Felica_Request_Mode(psHciContext, pHwRef); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef TYPE_JEWEL |
| case phHal_eJewel_PICC: |
| { |
| /* Get the Jewel Reader Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| /* status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_FEATURE_NOT_SUPPORTED); */ |
| status = phHciNfc_Jewel_GetRID( |
| psHciContext, pHwRef); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #ifdef TYPE_ISO15693 |
| case phHal_eISO15693_PICC: |
| { |
| /* Get the Reader ISO 15693 Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| uint8_t cmd[11]; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = &cmd; |
| p_pipe_info->param_length = 11; |
| // masked inventory command: |
| // set #slots to 1 to use mask without padding, |
| // need to set inventory flag to enable setting #slots |
| cmd[0] = 0x04 | 0x20; // FLAG_INVENTORY | FLAG_SLOTS |
| cmd[1] = 0x01; // CMD_INVENTORY |
| cmd[2] = 64; // mask bit-length |
| memcpy(cmd + 3, &(psHciContext->p_target_info->RemoteDevInfo.Iso15693_Info.Uid), 8); |
| status = phHciNfc_Send_ISO15693_Command( |
| psHciContext, pHwRef |
| ,reader_pipe_id, NXP_ISO15693_CMD ); |
| |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_ISO15693 */ |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the tag_type Switch */ |
| } |
| |
| return status; |
| |
| } |
| |
| |
| /*! |
| * \brief Disconnects the the selected tag. |
| * |
| * This function disconnects the selected tags via RF Reader Gate. |
| * This function uses the RF Reader gate based on the type of the |
| * tag specified. |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Deselect( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHal_eRemDevType_t target_type, |
| uint8_t re_poll |
| ) |
| { |
| static uint8_t rls_param = FALSE; |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| uint8_t reader_pipe_id = |
| (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| |
| |
| |
| if( (NULL == psHciContext) |
| || (NULL == pHwRef) |
| ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| rls_param = re_poll; |
| |
| switch (target_type) |
| { |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_A_PICC: |
| case phHal_eISO14443_3A_PICC: |
| case phHal_eISO14443_4A_PICC: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PICC: |
| case phHal_eISO14443_4B_PICC: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PICC: |
| { |
| /* Get the Felica Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef TYPE_JEWEL |
| case phHal_eJewel_PICC: |
| { |
| /* Get the Jewel Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| #ifdef TYPE_ISO15693 |
| case phHal_eISO15693_PICC: |
| { |
| /* Get the ISO 15693 Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif /* #ifdef TYPE_ISO15693 */ |
| #ifdef ENABLE_P2P |
| case phHal_eNfcIP1_Target: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_Initiator_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| break; |
| } |
| #endif |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| |
| } /* End of the tag_type Switch */ |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| && ( NULL != p_pipe_info ) ) |
| { |
| if (TRUE == rls_param) |
| { |
| p_pipe_info->param_info = &rls_param; |
| p_pipe_info->param_length = sizeof(rls_param); |
| } |
| status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, |
| reader_pipe_id,(uint8_t) NXP_EVT_RELEASE_TARGET ); |
| } |
| } |
| |
| return status; |
| } |
| |
| |
| /*! |
| * \brief Exchanges the data to/from the selected tags via RF Reader Gates. |
| * |
| * This function Exchanges the data to/from the selected tags |
| * via RF Reader Gates. This function uses the RF Reader gate based on the |
| * type of the selected tag and the type of the Reader gate specified. |
| */ |
| |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Exchange_Data( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef, |
| phHciNfc_XchgInfo_t *p_xchg_info |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; |
| phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else if (NULL == psHciContext->p_xchg_info) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_INFORMATION); |
| |
| } |
| else |
| { |
| switch (psHciContext->host_rf_type) |
| { |
| case phHal_eISO14443_A_PCD: |
| { |
| /* Get the Reader A Pipe ID */ |
| status = phHciNfc_ReaderA_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = p_xchg_info->tx_buffer; |
| p_pipe_info->param_length = p_xchg_info->tx_length; |
| target_type = psHciContext->p_target_info->RemDevType; |
| switch (target_type) |
| { |
| case phHal_eMifare_PICC: |
| case phHal_eISO14443_3A_PICC: |
| { |
| if ((uint8_t)phHal_eMifareRaw == |
| p_xchg_info->params.tag_info.cmd_type) |
| { |
| status = phHciNfc_Send_ReaderA_Command( |
| psHciContext, pHwRef |
| ,reader_pipe_id, NXP_MIFARE_RAW ); |
| } |
| else |
| { |
| status = phHciNfc_Send_ReaderA_Command( |
| psHciContext, pHwRef, |
| reader_pipe_id, NXP_MIFARE_CMD ); |
| } |
| break; |
| } |
| case phHal_eISO14443_A_PICC: |
| case phHal_eISO14443_4A_PICC: |
| { |
| status = phHciNfc_Send_RFReader_Command( |
| psHciContext, pHwRef, |
| reader_pipe_id, WR_XCHGDATA ); |
| break; |
| } |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| } /* End of the tag_type Switch */ |
| } /* End of Pipe ID Check */ |
| break; |
| } |
| #ifdef TYPE_B |
| case phHal_eISO14443_B_PCD: |
| { |
| /* Get the Reader B Pipe ID */ |
| status = phHciNfc_ReaderB_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = p_xchg_info->tx_buffer; |
| p_pipe_info->param_length = p_xchg_info->tx_length; |
| status = phHciNfc_Send_RFReader_Command( |
| psHciContext, pHwRef, |
| reader_pipe_id, WR_XCHGDATA ); |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| case phHal_eFelica_PCD: |
| { |
| /* Get the Felica Reader Pipe ID */ |
| status = phHciNfc_Felica_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = p_xchg_info->tx_buffer; |
| p_pipe_info->param_length = p_xchg_info->tx_length; |
| if ((uint8_t)phHal_eFelica_Raw == |
| p_xchg_info->params.tag_info.cmd_type) |
| { |
| status = phHciNfc_Send_Felica_Command( |
| psHciContext, pHwRef |
| ,reader_pipe_id, NXP_FELICA_RAW ); |
| } |
| else |
| { |
| status = phHciNfc_Send_Felica_Command( |
| psHciContext, pHwRef, |
| reader_pipe_id, NXP_FELICA_CMD ); |
| } |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #if defined(TYPE_ISO15693) |
| case phHal_eISO15693_PCD: |
| { |
| /* Get the ISO15693 Reader Pipe ID */ |
| status = phHciNfc_ISO15693_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = p_xchg_info->tx_buffer; |
| p_pipe_info->param_length = p_xchg_info->tx_length; |
| if (((uint8_t)phHal_eIso15693_Cmd == |
| p_xchg_info->params.tag_info.cmd_type) |
| #if defined(SUPPORT_ISO15693_RAW) |
| || ((uint8_t) phHal_eIso15693_Raw == |
| p_xchg_info->params.tag_info.cmd_type) |
| #endif |
| ) |
| { |
| status = phHciNfc_Send_ISO15693_Command( |
| psHciContext, pHwRef |
| ,reader_pipe_id, NXP_ISO15693_CMD ); |
| } |
| else |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_PARAMETER); |
| } |
| } |
| break; |
| } |
| #endif |
| #ifdef TYPE_JEWEL |
| case phHal_eJewel_PCD: |
| { |
| /* Get the Jewel Reader Pipe ID */ |
| status = phHciNfc_Jewel_Get_PipeID |
| (psHciContext, &reader_pipe_id); |
| |
| if( (NFCSTATUS_SUCCESS == status) |
| && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) |
| ) |
| { |
| uint8_t transact_type = 0; |
| p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; |
| p_pipe_info->param_info = p_xchg_info->tx_buffer; |
| p_pipe_info->param_length = p_xchg_info->tx_length; |
| switch(p_xchg_info->params.tag_info.cmd_type) |
| { |
| case phHal_eJewel_Raw: |
| { |
| transact_type = NXP_JEWEL_RAW; |
| break; |
| } |
| case phHal_eJewel_Invalid: |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_PARAMETER); |
| break; |
| } |
| } |
| if(0 != transact_type) |
| { |
| status = phHciNfc_Send_Jewel_Command( |
| psHciContext, pHwRef, |
| reader_pipe_id, transact_type ); |
| } |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_JEWEL */ |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_FEATURE_NOT_SUPPORTED); |
| break; |
| } |
| }/* End of Reader Type Switch */ |
| } |
| |
| return status; |
| } |
| |
| |
| |
| /*! |
| * \brief Releases the resources allocated the RF Reader Management. |
| * |
| * This function Releases the resources allocated the RF Reader Management. |
| */ |
| |
| NFCSTATUS |
| phHciNfc_ReaderMgmt_Release( |
| phHciNfc_sContext_t *psHciContext, |
| void *pHwRef |
| ) |
| { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| phHciNfc_Pipe_Info_t *p_pipe_info = NULL; |
| phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; |
| |
| if( (NULL == psHciContext) || (NULL == pHwRef) ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); |
| } |
| else |
| { |
| if( NULL != psHciContext->p_reader_mgmt_info ) |
| { |
| p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) |
| psHciContext->p_reader_mgmt_info ; |
| switch(p_reader_mgmt_info->rf_gate_cur_seq) |
| { |
| /* Reader A pipe close sequence */ |
| case READERA_PIPE_CLOSE: |
| { |
| p_pipe_info = ((phHciNfc_ReaderA_Info_t *) |
| psHciContext->p_reader_a_info)->p_pipe_info; |
| |
| status = phHciNfc_Close_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| READERB_PIPE_CLOSE; |
| /* status = NFCSTATUS_PENDING; */ |
| } |
| break; |
| } |
| #ifdef TYPE_B |
| /* Reader B pipe close sequence */ |
| case READERB_PIPE_CLOSE: |
| { |
| p_pipe_info = ((phHciNfc_ReaderB_Info_t *) |
| psHciContext->p_reader_b_info)->p_pipe_info; |
| |
| status = phHciNfc_Close_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| FELICA_PROP_PIPE_CLOSE; |
| status = NFCSTATUS_PENDING; |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_B */ |
| #ifdef TYPE_FELICA |
| /* Felica Reader pipe close sequence */ |
| case FELICA_PROP_PIPE_CLOSE: |
| { |
| p_pipe_info = ((phHciNfc_Felica_Info_t *) |
| psHciContext->p_felica_info)->p_pipe_info; |
| |
| status = phHciNfc_Close_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = |
| NFCIP1_INITIATOR_PIPE_CLOSE; |
| /* status = NFCSTATUS_PENDING; */ |
| } |
| break; |
| } |
| #endif /* #ifdef TYPE_FELICA */ |
| #ifdef ENABLE_P2P |
| /* NFC-IP1 Initiator pipe Close sequence */ |
| case NFCIP1_INITIATOR_PIPE_CLOSE: |
| { |
| p_pipe_info = |
| ((phHciNfc_NfcIP_Info_t *)psHciContext-> |
| p_nfcip_info)->p_init_pipe_info; |
| if(NULL == p_pipe_info ) |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, |
| NFCSTATUS_INVALID_HCI_SEQUENCE); |
| } |
| else |
| { |
| status = phHciNfc_Open_Pipe( psHciContext, |
| pHwRef, p_pipe_info ); |
| if(status == NFCSTATUS_SUCCESS) |
| { |
| p_reader_mgmt_info->rf_gate_next_seq = READERA_PIPE_CLOSE; |
| status = NFCSTATUS_PENDING; |
| } |
| } |
| break; |
| } |
| #endif /* #ifdef ENABLE_P2P */ |
| default: |
| { |
| status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); |
| break; |
| } |
| |
| }/* End of the Sequence Switch */ |
| |
| }/* End of the Reader Info Memory Check */ |
| |
| } /* End of Null Context Check */ |
| |
| return status; |
| } |
| |
| |
| /*! |
| * \brief Sends the RF Reader HCI Events to the connected reader device. |
| * |
| * This function Sends the RF Reader HCI Event frames in the HCP packet format to the |
| * connected reader device. |
| */ |
| |
| NFCSTATUS |
| phHciNfc_Send_RFReader_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_RFReader_Event"); |
| } |
| else |
| { |
| p_pipe_info = (phHciNfc_Pipe_Info_t *) |
| psHciContext->p_pipe_list[pipe_id]; |
| psHciContext->tx_total = 0 ; |
| length += HCP_HEADER_LEN ; |
| switch( event ) |
| { |
| case EVT_READER_REQUESTED: |
| case EVT_END_OPERATION: |
| { |
| |
| 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); |
| break; |
| } |
| case NXP_EVT_RELEASE_TARGET: |
| { |
| 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); |
| phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, |
| i, p_pipe_info->param_info, |
| p_pipe_info->param_length); |
| length =(uint16_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_RFReader_Event"); |
| break; |
| } |
| } |
| 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; |
| } |
| |
| /*! |
| * \brief Sends the RF Reader HCI Additonal Commands to the connected |
| * reader device. |
| * |
| * This function Sends the RF Reader HCI Command frames in the HCP packet |
| * format to the connected reader device. |
| */ |
| |
| NFCSTATUS |
| phHciNfc_Send_RFReader_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 i = 0; |
| uint16_t length=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_RFReader_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 ) |
| { |
| case WR_XCHGDATA: |
| { |
| |
| 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); |
| /* Frame Wait Timeout */ |
| hcp_message->payload[i++] = nxp_nfc_isoxchg_timeout ; |
| phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, |
| i, p_pipe_info->param_info, |
| p_pipe_info->param_length); |
| length =(uint16_t)(length + i + p_pipe_info->param_length); |
| break; |
| } |
| case NXP_WR_PRESCHECK: |
| case NXP_WR_ACTIVATE_NEXT: |
| { |
| |
| 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); |
| break; |
| } |
| case NXP_WR_DISPATCH_TO_UICC: |
| case NXP_WR_ACTIVATE_ID: |
| { |
| |
| 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); |
| /* UID of the Card */ |
| phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, |
| i, p_pipe_info->param_info, |
| p_pipe_info->param_length); |
| length =(uint16_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_RFReader_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; |
| } |
| |
| |
| |