• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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*/
phHal4Nfc_HandleEmulationEvent(phHal4Nfc_Hal4Ctxt_t * Hal4Ctxt,void * pInfo)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 */
phHal4Nfc_Switch_SMX_Mode(phHal_sHwReference_t * psHwReference,phHal_eSmartMX_Mode_t smx_mode,pphHal4Nfc_GenCallback_t pSwitchModecb,void * pContext)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.*/
phHal4Nfc_Switch_Swp_Mode(phHal_sHwReference_t * psHwReference,phHal_eSWP_Mode_t swp_mode,pphHal4Nfc_GenCallback_t pSwitchModecb,void * pContext)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.*/
phHal4Nfc_Host_Emulation_Mode(phHal_sHwReference_t * psHwReference,phNfc_eModeType_t eModeType,pphHal4Nfc_GenCallback_t pEmulationModecb,void * pContext)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