summaryrefslogtreecommitdiffstats
path: root/src/phHal4Nfc_Emulation.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/phHal4Nfc_Emulation.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/phHal4Nfc_Emulation.c')
-rw-r--r--src/phHal4Nfc_Emulation.c337
1 files changed, 337 insertions, 0 deletions
diff --git a/src/phHal4Nfc_Emulation.c b/src/phHal4Nfc_Emulation.c
new file mode 100644
index 0000000..568427c
--- /dev/null
+++ b/src/phHal4Nfc_Emulation.c
@@ -0,0 +1,337 @@
+/*
+ * 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 phHal4Nfc_Emulation.c
+* \brief Hal4 Emulation source.
+*
+* Project: NFC-FRI 1.1
+*
+* $Date: Wed May 26 18:03:59 2010 $
+* $Author: ing07385 $
+* $Revision: 1.35 $
+* $Aliases: NFC_FRI1.1_WK1023_R35_1 $
+*
+*/
+
+/* ---------------------------Include files ------------------------------------*/
+#include <phHciNfc.h>
+#include <phHal4Nfc.h>
+#include <phHal4Nfc_Internal.h>
+#include <phOsalNfc.h>
+
+/* ------------------------------- Macros ------------------------------------*/
+
+/* Note : Macros required and used only in this module to be declared here*/
+
+
+/* --------------------Structures and enumerations --------------------------*/
+
+
+/*Event Notification handler for emulation*/
+void phHal4Nfc_HandleEmulationEvent(
+ phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt,
+ void *pInfo
+ )
+{
+ phNfc_sNotificationInfo_t *psNotificationInfo = (phNfc_sNotificationInfo_t *)
+ pInfo;
+ phHal4Nfc_NotificationInfo_t uNotificationInfo = {NULL};
+ /*Pass on Event notification info from Hci to Upper layer*/
+ uNotificationInfo.psEventInfo = psNotificationInfo->info;
+ if(NULL != Hal4Ctxt->sUpperLayerInfo.pEventNotification)
+ {
+ Hal4Ctxt->sUpperLayerInfo.pEventNotification(
+ Hal4Ctxt->sUpperLayerInfo.EventNotificationCtxt,
+ psNotificationInfo->type,
+ uNotificationInfo,
+ NFCSTATUS_SUCCESS
+ );
+ }
+ else/*No Event notification handler registered*/
+ {
+ /*Use default handler to notify to the upper layer*/
+ if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler)
+ {
+ Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler(
+ Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt,
+ psNotificationInfo->type,
+ uNotificationInfo,
+ NFCSTATUS_SUCCESS
+ );
+ }
+ }
+ return;
+}
+
+/* Switch mode from Virtual to Wired or Vice Versa for SMX.
+*/
+NFCSTATUS phHal4Nfc_Switch_SMX_Mode(
+ phHal_sHwReference_t *psHwReference,
+ phHal_eSmartMX_Mode_t smx_mode,
+ pphHal4Nfc_GenCallback_t pSwitchModecb,
+ void *pContext
+ )
+{
+ NFCSTATUS CfgStatus = NFCSTATUS_PENDING;
+ phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL;
+ static phHal_sADD_Cfg_t sSmxCfg;
+
+ /*NULL checks*/
+ if((NULL == psHwReference) || (NULL == pSwitchModecb))
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER);
+ }
+ /*Check Initialised state*/
+ else if((NULL == psHwReference->hal_context)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4CurrentState
+ < eHal4StateOpenAndReady)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4NextState
+ == eHal4StateClosed))
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED);
+ }
+ else
+ {
+ Hal4Ctxt = psHwReference->hal_context;
+ /*Previous POLL Config has not completed or device is connected,
+ do not allow poll*/
+ if(Hal4Ctxt->Hal4NextState == eHal4StateConfiguring)
+ {
+ PHDBG_INFO("Hal4:Configuration in progress.Returning status Busy");
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY);
+ }
+ else if(Hal4Ctxt->Hal4CurrentState >= eHal4StateOpenAndReady)
+ {
+ /**If config discovery has not been called prior to this ,allocate
+ ADD Context here*/
+ if (NULL == Hal4Ctxt->psADDCtxtInfo)
+ {
+ Hal4Ctxt->psADDCtxtInfo= (pphHal4Nfc_ADDCtxtInfo_t)
+ phOsalNfc_GetMemory((uint32_t)
+ (sizeof(phHal4Nfc_ADDCtxtInfo_t)));
+ if(NULL != Hal4Ctxt->psADDCtxtInfo)
+ {
+ (void)memset(Hal4Ctxt->psADDCtxtInfo,
+ 0,sizeof(phHal4Nfc_ADDCtxtInfo_t));
+ }
+ }
+ if(NULL == Hal4Ctxt->psADDCtxtInfo)
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL ,
+ NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+ else
+ {
+ /* Register Upper layer context */
+ Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext;
+ /* Switch request to Wired mode */
+ if(eSmartMx_Wired == smx_mode)
+ {
+ if(Hal4Ctxt->Hal4CurrentState
+ == eHal4StateTargetConnected)
+ {
+ PHDBG_INFO("Hal4:In Connected state.Returning Busy");
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY);
+ }
+ /*It is Mandatory to register a listener before switching
+ to wired mode*/
+ else if(NULL ==
+ Hal4Ctxt->sUpperLayerInfo.pTagDiscoveryNotification)
+ {
+ CfgStatus = PHNFCSTVAL(CID_NFC_HAL ,
+ NFCSTATUS_FAILED);
+ }
+ else
+ {
+ Hal4Ctxt->psADDCtxtInfo->nbr_of_devices = 0;
+ Hal4Ctxt->psADDCtxtInfo->smx_discovery = TRUE;
+ sSmxCfg.PollDevInfo.PollCfgInfo.EnableIso14443A = TRUE;
+ /*Switch mode to wired*/
+ CfgStatus = phHciNfc_Switch_SmxMode (
+ Hal4Ctxt->psHciHandle,
+ psHwReference,
+ smx_mode,
+ &sSmxCfg
+ );
+ }
+ }
+ else
+ {
+ Hal4Ctxt->psADDCtxtInfo->smx_discovery = FALSE;
+ /*Switch mode to virtual or off*/
+ CfgStatus = phHciNfc_Switch_SmxMode (
+ Hal4Ctxt->psHciHandle,
+ psHwReference,
+ smx_mode,
+ &(Hal4Ctxt->psADDCtxtInfo->sADDCfg)
+ );
+ }
+
+ /* Change the State of the HAL only if Switch mode Returns
+ Success*/
+ if ( NFCSTATUS_PENDING == CfgStatus )
+ {
+ Hal4Ctxt->Hal4NextState = eHal4StateConfiguring;
+ Hal4Ctxt->sUpperLayerInfo.pConfigCallback
+ = pSwitchModecb;
+ }
+ }
+ }
+ else/*Return Status not initialised*/
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED);
+ }
+ }
+ return CfgStatus;
+}
+
+
+
+/* Switch mode for Swp.*/
+NFCSTATUS phHal4Nfc_Switch_Swp_Mode(
+ phHal_sHwReference_t *psHwReference,
+ phHal_eSWP_Mode_t swp_mode,
+ pphHal4Nfc_GenCallback_t pSwitchModecb,
+ void *pContext
+ )
+{
+ NFCSTATUS CfgStatus = NFCSTATUS_PENDING;
+ phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL;
+ /*NULL checks*/
+ if(NULL == psHwReference
+ || NULL == pSwitchModecb
+ )
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER);
+ }
+ /*Check Initialised state*/
+ else if((NULL == psHwReference->hal_context)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4CurrentState
+ < eHal4StateOpenAndReady)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4NextState
+ == eHal4StateClosed))
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED);
+ }
+ else
+ {
+ Hal4Ctxt = psHwReference->hal_context;
+ /*Previous POLL CFG has not completed or device is connected,
+ do not allow poll*/
+ if(Hal4Ctxt->Hal4NextState == eHal4StateConfiguring)
+ {
+ PHDBG_INFO("Hal4:Configuration in progress.Returning status Busy");
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY);
+ }
+ else if(Hal4Ctxt->Hal4CurrentState >= eHal4StateOpenAndReady)
+ {
+ /**If config discovery has not been called prior to this ,allocate
+ ADD Context here*/
+ if (NULL == Hal4Ctxt->psADDCtxtInfo)
+ {
+ Hal4Ctxt->psADDCtxtInfo= (pphHal4Nfc_ADDCtxtInfo_t)
+ phOsalNfc_GetMemory((uint32_t)
+ (sizeof(phHal4Nfc_ADDCtxtInfo_t)));
+ if(NULL != Hal4Ctxt->psADDCtxtInfo)
+ {
+ (void)memset(Hal4Ctxt->psADDCtxtInfo,
+ 0,sizeof(phHal4Nfc_ADDCtxtInfo_t));
+ }
+ }
+ if(NULL == Hal4Ctxt->psADDCtxtInfo)
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0);
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL ,
+ NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+ else
+ {
+ /* Register Upper layer context */
+ Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext;
+ /*Switch mode to On or off*/
+ CfgStatus = phHciNfc_Switch_SwpMode(
+ Hal4Ctxt->psHciHandle,
+ psHwReference,
+ swp_mode
+ );
+
+ /* Change the State of the HAL only if Switch mode Returns
+ Success*/
+ if ( NFCSTATUS_PENDING == CfgStatus )
+ {
+ Hal4Ctxt->Hal4NextState = eHal4StateConfiguring;
+ Hal4Ctxt->sUpperLayerInfo.pConfigCallback
+ = pSwitchModecb;
+ }
+ }
+ }
+ else/*Return Status not initialised*/
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED);
+ }
+ }
+ return CfgStatus;
+}
+
+#ifdef FULL_HAL4_EMULATION_ENABLE
+/* Switch Emulation mode ON or OFF.*/
+NFCSTATUS phHal4Nfc_Host_Emulation_Mode(
+ phHal_sHwReference_t *psHwReference,
+ phNfc_eModeType_t eModeType,
+ pphHal4Nfc_GenCallback_t pEmulationModecb,
+ void *pContext
+ )
+{
+ NFCSTATUS RetStatus = NFCSTATUS_PENDING;
+ phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL;
+ /*NULL checks*/
+ if(NULL == psHwReference
+ || NULL == pEmulationModecb
+ )
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ RetStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER);
+ }
+ /*Check Initialised state*/
+ else if((NULL == psHwReference->hal_context)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4CurrentState
+ < eHal4StateOpenAndReady)
+ || (((phHal4Nfc_Hal4Ctxt_t *)
+ psHwReference->hal_context)->Hal4NextState
+ == eHal4StateClosed))
+ {
+ phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1);
+ RetStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED);
+ }
+ else
+ {
+
+ }
+ return NFCSTATUS_PENDING;
+}
+#endif /*FULL_HAL4_EMULATION_ENABLE*/