summaryrefslogtreecommitdiffstats
path: root/src/phLibNfc_Ioctl.c
diff options
context:
space:
mode:
authorNick Pelly <npelly@google.com>2010-09-23 12:47:58 -0700
committerNick Pelly <npelly@google.com>2010-09-23 13:53:18 -0700
commit5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch)
tree190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phLibNfc_Ioctl.c
parent4ff7c86a2c706b150078274455406f1b04966e1a (diff)
downloadexternal_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/phLibNfc_Ioctl.c')
-rw-r--r--src/phLibNfc_Ioctl.c329
1 files changed, 329 insertions, 0 deletions
diff --git a/src/phLibNfc_Ioctl.c b/src/phLibNfc_Ioctl.c
new file mode 100644
index 0000000..9983c60
--- /dev/null
+++ b/src/phLibNfc_Ioctl.c
@@ -0,0 +1,329 @@
+/*
+ * 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_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;
+}
+