/*
* 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;
}