/* * 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 phLibNfc_Ioctl.c * Project: NFC FRI 1.1 * * $Date: Mon Mar 1 19:07:05 2010 $ * $Author: ing07385 $ * $Revision: 1.35 $ * $Aliases: NFC_FRI1.1_WK1008_SDK,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1007_SDK,NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $ * */ /* ************************* Header Files **************************************** */ #include <phLibNfcStatus.h> #include <phLibNfc.h> #include <phHal4Nfc.h> #include <phOsalNfc.h> #include <phLibNfc_Internal.h> #include <phLibNfc_ndef_raw.h> #include <phLibNfc_initiator.h> #include <phLibNfc_discovery.h> #include <phLibNfc_ioctl.h> #include <phNfcStatus.h> /* *************************** Macro's **************************************** */ #ifndef STATIC_DISABLE #define STATIC static #else #define STATIC #endif /* *************************** Global Variables ********************************** */ STATIC phLibNfc_Ioctl_Cntx_t phLibNfc_Ioctl_Cntx; /* *************************** Static Function Declaration *********************** */ /* Response callback for Ioctl management */ STATIC void phLibNfc_Ioctl_Mgmt_CB(void *context, phNfc_sData_t *pOutData, NFCSTATUS status ); /** Response callback for UICC switch mode*/ STATIC void phLibNfc_Switch_Swp_Mode_CB( void *context, NFCSTATUS status ); /* *************************** Function Definitions ****************************** */ /** * The I/O Control function allows the caller to configure specific * functionality provided by the lower layer.Each feature is accessible * via a specific IOCTL Code. */ NFCSTATUS phLibNfc_Mgt_IoCtl (void* pDalHandle, uint16_t IoctlCode, phNfc_sData_t* pInParam, phNfc_sData_t* pOutParam, pphLibNfc_IoctlCallback_t pIoCtl_Rsp_cb, void* pContext ) { NFCSTATUS StatusCode=NFCSTATUS_INVALID_PARAMETER; if((IoctlCode==0)||(NULL==pIoCtl_Rsp_cb) || (NULL==pContext) ||(NULL==pInParam) || (NULL==pDalHandle)) { StatusCode=NFCSTATUS_INVALID_PARAMETER; return StatusCode; } if(IoctlCode!= NFC_FW_DOWNLOAD) { if(pOutParam == NULL) { StatusCode = NFCSTATUS_INVALID_PARAMETER; return StatusCode; } if(( gpphLibContext == NULL) || (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) { StatusCode = NFCSTATUS_NOT_INITIALISED; return StatusCode; } else { if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) { StatusCode = NFCSTATUS_SHUTDOWN; return StatusCode; } } } phLibNfc_Ioctl_Cntx.CliRspCb =pIoCtl_Rsp_cb; phLibNfc_Ioctl_Cntx.pCliCntx = pContext; phLibNfc_Ioctl_Cntx.pOutParam = pOutParam; phLibNfc_Ioctl_Cntx.IoctlCode = IoctlCode; /* Process the IOCTL requests */ switch(IoctlCode) { case NFC_FW_DOWNLOAD: {/* Set power status */ phLibNfc_Ioctl_Cntx.psHwReference = phOsalNfc_GetMemory((uint32_t)sizeof(phHal_sHwReference_t)); if(phLibNfc_Ioctl_Cntx.psHwReference == NULL) return NFCSTATUS_FAILED; (void)memset(phLibNfc_Ioctl_Cntx.psHwReference,0,sizeof(phHal_sHwReference_t)); phLibNfc_Ioctl_Cntx.psHwReference->p_board_driver = pDalHandle; StatusCode = phHal4Nfc_Ioctl( phLibNfc_Ioctl_Cntx.psHwReference, NFC_FW_DOWNLOAD, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case NFC_MEM_READ: { StatusCode = phHal4Nfc_Ioctl(gpphLibContext->psHwReference, NFC_MEM_READ, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case NFC_MEM_WRITE: { StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference, NFC_MEM_WRITE, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case PHLIBNFC_ANTENNA_TEST: { StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference, PHLIBNFC_ANTENNA_TEST, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case PHLIBNFC_SWP_TEST: { StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference, PHLIBNFC_SWP_TEST, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case PHLIBNFC_PRBS_TEST: { StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference, PHLIBNFC_PRBS_TEST, pInParam, pOutParam, phLibNfc_Ioctl_Mgmt_CB, &phLibNfc_Ioctl_Cntx ); }break; case PHLIBNFC_SWITCH_SWP_MODE: { StatusCode = phHal4Nfc_Switch_Swp_Mode( gpphLibContext->psHwReference, (phHal_eSWP_Mode_t)pInParam->buffer[0], phLibNfc_Switch_Swp_Mode_CB, &phLibNfc_Ioctl_Cntx ); }break; default : { /* don't do any thing*/ }break; } /* End of IOCTL switch */ if(StatusCode!=NFCSTATUS_PENDING) { StatusCode = NFCSTATUS_FAILED; } else { if(IoctlCode!= NFC_FW_DOWNLOAD) { gpphLibContext->status.GenCb_pending_status=TRUE; } } return StatusCode; } /* End of IOCTL handler function */ STATIC void phLibNfc_Ioctl_Mgmt_CB(void *context, phNfc_sData_t *pOutData, NFCSTATUS status ) { phLibNfc_Ioctl_Cntx_t *pIoctlCntx=NULL; if(PHNFCSTATUS(status) == NFCSTATUS_FEATURE_NOT_SUPPORTED) { status = NFCSTATUS_FEATURE_NOT_SUPPORTED; } else if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS) { status = NFCSTATUS_FAILED; } if(gpphLibContext!= NULL) { if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) { /*If shutdown called in between allow shutdown to happen*/ phLibNfc_Pending_Shutdown(); status = NFCSTATUS_SHUTDOWN; } } pIoctlCntx= (phLibNfc_Ioctl_Cntx_t*)context; if( pIoctlCntx !=NULL) { switch(pIoctlCntx->IoctlCode) { case NFC_FW_DOWNLOAD: { /*Release the hardware reference memory*/ phOsalNfc_FreeMemory(pIoctlCntx->psHwReference); }break; case NFC_MEM_READ: { }break; case NFC_MEM_WRITE: { }break; case PHLIBNFC_ANTENNA_TEST: { }break; case PHLIBNFC_SWP_TEST: { }break; case PHLIBNFC_PRBS_TEST: { }break; default: { } } pIoctlCntx->CliRspCb(pIoctlCntx->pCliCntx,pOutData,status); if(gpphLibContext!= NULL) { gpphLibContext->status.GenCb_pending_status=FALSE; } } } STATIC void phLibNfc_Switch_Swp_Mode_CB( void *context, NFCSTATUS status ) { if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS) { status = NFCSTATUS_FAILED; } if(gpphLibContext!= NULL) { if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) { /*If shutdown called in between allow shutdown to happen*/ phLibNfc_Pending_Shutdown(); status = NFCSTATUS_SHUTDOWN; } } if((NULL != context)&&(context == (void *)&phLibNfc_Ioctl_Cntx)) { if(NULL != phLibNfc_Ioctl_Cntx.CliRspCb) { (*phLibNfc_Ioctl_Cntx.CliRspCb)( phLibNfc_Ioctl_Cntx.pCliCntx, phLibNfc_Ioctl_Cntx.pOutParam, status ); } } return; }