1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 /*! 17 * \file phHal4Nfc_Emulation.c 18 * \brief Hal4 Emulation source. 19 * 20 * Project: NFC-FRI 1.1 21 * 22 * $Date: Wed May 26 18:03:59 2010 $ 23 * $Author: ing07385 $ 24 * $Revision: 1.35 $ 25 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $ 26 * 27 */ 28 29 /* ---------------------------Include files ------------------------------------*/ 30 #include <phHciNfc.h> 31 #include <phHal4Nfc.h> 32 #include <phHal4Nfc_Internal.h> 33 #include <phOsalNfc.h> 34 35 /* ------------------------------- Macros ------------------------------------*/ 36 37 /* Note : Macros required and used only in this module to be declared here*/ 38 39 40 /* --------------------Structures and enumerations --------------------------*/ 41 42 43 /*Event Notification handler for emulation*/ 44 void phHal4Nfc_HandleEmulationEvent( 45 phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt, 46 void *pInfo 47 ) 48 { 49 phNfc_sNotificationInfo_t *psNotificationInfo = (phNfc_sNotificationInfo_t *) 50 pInfo; 51 phHal4Nfc_NotificationInfo_t uNotificationInfo = {NULL}; 52 /*Pass on Event notification info from Hci to Upper layer*/ 53 uNotificationInfo.psEventInfo = psNotificationInfo->info; 54 if(NULL != Hal4Ctxt->sUpperLayerInfo.pEventNotification) 55 { 56 Hal4Ctxt->sUpperLayerInfo.pEventNotification( 57 Hal4Ctxt->sUpperLayerInfo.EventNotificationCtxt, 58 psNotificationInfo->type, 59 uNotificationInfo, 60 NFCSTATUS_SUCCESS 61 ); 62 } 63 else/*No Event notification handler registered*/ 64 { 65 /*Use default handler to notify to the upper layer*/ 66 if(NULL != Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler) 67 { 68 Hal4Ctxt->sUpperLayerInfo.pDefaultEventHandler( 69 Hal4Ctxt->sUpperLayerInfo.DefaultListenerCtxt, 70 psNotificationInfo->type, 71 uNotificationInfo, 72 NFCSTATUS_SUCCESS 73 ); 74 } 75 } 76 return; 77 } 78 79 /* Switch mode from Virtual to Wired or Vice Versa for SMX. 80 */ 81 NFCSTATUS phHal4Nfc_Switch_SMX_Mode( 82 phHal_sHwReference_t *psHwReference, 83 phHal_eSmartMX_Mode_t smx_mode, 84 pphHal4Nfc_GenCallback_t pSwitchModecb, 85 void *pContext 86 ) 87 { 88 NFCSTATUS CfgStatus = NFCSTATUS_PENDING; 89 phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL; 90 static phHal_sADD_Cfg_t sSmxCfg; 91 92 /*NULL checks*/ 93 if((NULL == psHwReference) || (NULL == pSwitchModecb)) 94 { 95 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 96 CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER); 97 } 98 /*Check Initialised state*/ 99 else if((NULL == psHwReference->hal_context) 100 || (((phHal4Nfc_Hal4Ctxt_t *) 101 psHwReference->hal_context)->Hal4CurrentState 102 < eHal4StateOpenAndReady) 103 || (((phHal4Nfc_Hal4Ctxt_t *) 104 psHwReference->hal_context)->Hal4NextState 105 == eHal4StateClosed)) 106 { 107 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 108 CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED); 109 } 110 else 111 { 112 Hal4Ctxt = psHwReference->hal_context; 113 /*Previous POLL Config has not completed or device is connected, 114 do not allow poll*/ 115 if(Hal4Ctxt->Hal4NextState == eHal4StateConfiguring) 116 { 117 PHDBG_INFO("Hal4:Configuration in progress.Returning status Busy"); 118 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY); 119 } 120 else if(Hal4Ctxt->Hal4CurrentState >= eHal4StateOpenAndReady) 121 { 122 /**If config discovery has not been called prior to this ,allocate 123 ADD Context here*/ 124 if (NULL == Hal4Ctxt->psADDCtxtInfo) 125 { 126 Hal4Ctxt->psADDCtxtInfo= (pphHal4Nfc_ADDCtxtInfo_t) 127 phOsalNfc_GetMemory((uint32_t) 128 (sizeof(phHal4Nfc_ADDCtxtInfo_t))); 129 if(NULL != Hal4Ctxt->psADDCtxtInfo) 130 { 131 (void)memset(Hal4Ctxt->psADDCtxtInfo, 132 0,sizeof(phHal4Nfc_ADDCtxtInfo_t)); 133 } 134 } 135 if(NULL == Hal4Ctxt->psADDCtxtInfo) 136 { 137 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0); 138 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , 139 NFCSTATUS_INSUFFICIENT_RESOURCES); 140 } 141 else 142 { 143 /* Register Upper layer context */ 144 Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext; 145 /* Switch request to Wired mode */ 146 if(eSmartMx_Wired == smx_mode) 147 { 148 if(Hal4Ctxt->Hal4CurrentState 149 == eHal4StateTargetConnected) 150 { 151 PHDBG_INFO("Hal4:In Connected state.Returning Busy"); 152 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY); 153 } 154 /*It is Mandatory to register a listener before switching 155 to wired mode*/ 156 else if(NULL == 157 Hal4Ctxt->sUpperLayerInfo.pTagDiscoveryNotification) 158 { 159 CfgStatus = PHNFCSTVAL(CID_NFC_HAL , 160 NFCSTATUS_FAILED); 161 } 162 else 163 { 164 Hal4Ctxt->psADDCtxtInfo->nbr_of_devices = 0; 165 Hal4Ctxt->psADDCtxtInfo->smx_discovery = TRUE; 166 sSmxCfg.PollDevInfo.PollCfgInfo.EnableIso14443A = TRUE; 167 sSmxCfg.PollDevInfo.PollCfgInfo.DisableCardEmulation = TRUE; 168 /*Switch mode to wired*/ 169 CfgStatus = phHciNfc_Switch_SmxMode ( 170 Hal4Ctxt->psHciHandle, 171 psHwReference, 172 smx_mode, 173 &sSmxCfg 174 ); 175 } 176 } 177 else 178 { 179 Hal4Ctxt->psADDCtxtInfo->smx_discovery = FALSE; 180 /*Switch mode to virtual or off*/ 181 CfgStatus = phHciNfc_Switch_SmxMode ( 182 Hal4Ctxt->psHciHandle, 183 psHwReference, 184 smx_mode, 185 &(Hal4Ctxt->psADDCtxtInfo->sADDCfg) 186 ); 187 } 188 189 /* Change the State of the HAL only if Switch mode Returns 190 Success*/ 191 if ( NFCSTATUS_PENDING == CfgStatus ) 192 { 193 Hal4Ctxt->Hal4NextState = eHal4StateConfiguring; 194 Hal4Ctxt->sUpperLayerInfo.pConfigCallback 195 = pSwitchModecb; 196 } 197 } 198 } 199 else/*Return Status not initialised*/ 200 { 201 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 202 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED); 203 } 204 } 205 return CfgStatus; 206 } 207 208 209 210 /* Switch mode for Swp.*/ 211 NFCSTATUS phHal4Nfc_Switch_Swp_Mode( 212 phHal_sHwReference_t *psHwReference, 213 phHal_eSWP_Mode_t swp_mode, 214 pphHal4Nfc_GenCallback_t pSwitchModecb, 215 void *pContext 216 ) 217 { 218 NFCSTATUS CfgStatus = NFCSTATUS_PENDING; 219 phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL; 220 /*NULL checks*/ 221 if(NULL == psHwReference 222 || NULL == pSwitchModecb 223 ) 224 { 225 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 226 CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER); 227 } 228 /*Check Initialised state*/ 229 else if((NULL == psHwReference->hal_context) 230 || (((phHal4Nfc_Hal4Ctxt_t *) 231 psHwReference->hal_context)->Hal4CurrentState 232 < eHal4StateOpenAndReady) 233 || (((phHal4Nfc_Hal4Ctxt_t *) 234 psHwReference->hal_context)->Hal4NextState 235 == eHal4StateClosed)) 236 { 237 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 238 CfgStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED); 239 } 240 else 241 { 242 Hal4Ctxt = psHwReference->hal_context; 243 /*Previous POLL CFG has not completed or device is connected, 244 do not allow poll*/ 245 if(Hal4Ctxt->Hal4NextState == eHal4StateConfiguring) 246 { 247 PHDBG_INFO("Hal4:Configuration in progress.Returning status Busy"); 248 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_BUSY); 249 } 250 else if(Hal4Ctxt->Hal4CurrentState >= eHal4StateOpenAndReady) 251 { 252 /**If config discovery has not been called prior to this ,allocate 253 ADD Context here*/ 254 if (NULL == Hal4Ctxt->psADDCtxtInfo) 255 { 256 Hal4Ctxt->psADDCtxtInfo= (pphHal4Nfc_ADDCtxtInfo_t) 257 phOsalNfc_GetMemory((uint32_t) 258 (sizeof(phHal4Nfc_ADDCtxtInfo_t))); 259 if(NULL != Hal4Ctxt->psADDCtxtInfo) 260 { 261 (void)memset(Hal4Ctxt->psADDCtxtInfo, 262 0,sizeof(phHal4Nfc_ADDCtxtInfo_t)); 263 } 264 } 265 if(NULL == Hal4Ctxt->psADDCtxtInfo) 266 { 267 phOsalNfc_RaiseException(phOsalNfc_e_NoMemory,0); 268 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , 269 NFCSTATUS_INSUFFICIENT_RESOURCES); 270 } 271 else 272 { 273 /* Register Upper layer context */ 274 Hal4Ctxt->sUpperLayerInfo.psUpperLayerCtxt = pContext; 275 /*Switch mode to On or off*/ 276 CfgStatus = phHciNfc_Switch_SwpMode( 277 Hal4Ctxt->psHciHandle, 278 psHwReference, 279 swp_mode 280 ); 281 282 /* Change the State of the HAL only if Switch mode Returns 283 Success*/ 284 if ( NFCSTATUS_PENDING == CfgStatus ) 285 { 286 Hal4Ctxt->Hal4NextState = eHal4StateConfiguring; 287 Hal4Ctxt->sUpperLayerInfo.pConfigCallback 288 = pSwitchModecb; 289 } 290 } 291 } 292 else/*Return Status not initialised*/ 293 { 294 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 295 CfgStatus= PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED); 296 } 297 } 298 return CfgStatus; 299 } 300 301 #ifdef FULL_HAL4_EMULATION_ENABLE 302 /* Switch Emulation mode ON or OFF.*/ 303 NFCSTATUS phHal4Nfc_Host_Emulation_Mode( 304 phHal_sHwReference_t *psHwReference, 305 phNfc_eModeType_t eModeType, 306 pphHal4Nfc_GenCallback_t pEmulationModecb, 307 void *pContext 308 ) 309 { 310 NFCSTATUS RetStatus = NFCSTATUS_PENDING; 311 phHal4Nfc_Hal4Ctxt_t *Hal4Ctxt = NULL; 312 /*NULL checks*/ 313 if(NULL == psHwReference 314 || NULL == pEmulationModecb 315 ) 316 { 317 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 318 RetStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_INVALID_PARAMETER); 319 } 320 /*Check Initialised state*/ 321 else if((NULL == psHwReference->hal_context) 322 || (((phHal4Nfc_Hal4Ctxt_t *) 323 psHwReference->hal_context)->Hal4CurrentState 324 < eHal4StateOpenAndReady) 325 || (((phHal4Nfc_Hal4Ctxt_t *) 326 psHwReference->hal_context)->Hal4NextState 327 == eHal4StateClosed)) 328 { 329 phOsalNfc_RaiseException(phOsalNfc_e_PrecondFailed,1); 330 RetStatus = PHNFCSTVAL(CID_NFC_HAL , NFCSTATUS_NOT_INITIALISED); 331 } 332 else 333 { 334 335 } 336 return NFCSTATUS_PENDING; 337 } 338 #endif /*FULL_HAL4_EMULATION_ENABLE*/ 339