merge with master
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_SWP.c
1 /*\r
2  * Copyright (C) 2010 NXP Semiconductors\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /*!\r
18 * =========================================================================== *\r
19 *                                                                             *\r
20 *                                                                             *\r
21 * \file  phHciNfc_SWP.c                                                       *\r
22 * \brief HCI SWP gate Management Routines.                                     *\r
23 *                                                                             *\r
24 *                                                                             *\r
25 * Project: NFC-FRI-1.1                                                        *\r
26 *                                                                             *\r
27 * $Date: Tue Aug 18 10:16:36 2009 $                                           *\r
28 * $Author: ing04880 $                                                         *\r
29 * $Revision: 1.31 $                                                            *\r
30 * $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $                                                                *                                                                             *\r
31 * =========================================================================== *\r
32 */\r
33 \r
34 /*\r
35 ***************************** Header File Inclusion ****************************\r
36 */\r
37 #include <phNfcCompId.h>\r
38 #include <phHciNfc_Pipe.h>\r
39 #include <phHciNfc_SWP.h>\r
40 #include <phOsalNfc.h>\r
41 #include <phHciNfc_Emulation.h>\r
42 #include <phHciNfc_DevMgmt.h>\r
43 /*\r
44 ****************************** Macro Definitions *******************************\r
45 */\r
46 \r
47 /* SWP Gate regsitry Settings */\r
48 /* set default mode mode as virtual mode */\r
49 #define NXP_SWP_DEFAULT_MODE_INDEX      (0x01U)\r
50 /* Get the Status of the UICC Connection */\r
51 #define NXP_SWP_STATUS_INDEX            (0x02U)\r
52 \r
53 /* Configure the Secure Element Protected Mode */\r
54 #define NXP_SWP_PROTECTED_INDEX         (0x03U)\r
55 \r
56 /* Switch mode index */\r
57 #define NXP_EVT_SWP_SWITCH_MODE         (0x03U)\r
58 \r
59 /* Protected Event from the Host Controller */\r
60 #define NXP_EVT_SWP_PROTECTED           (0x04U)\r
61 \r
62 /****************** Structure and Enumeration ****************************/\r
63 \r
64 /****************** Static Function Declaration **************************/\r
65 \r
66 static \r
67 NFCSTATUS \r
68 phHciNfc_Recv_SWP_Response(\r
69                             void        *psContext,\r
70                             void        *pHwRef,\r
71                             uint8_t     *pResponse,\r
72 #ifdef ONE_BYTE_LEN\r
73                             uint8_t     length\r
74 #else\r
75                             uint16_t    length\r
76 #endif\r
77                         );\r
78 \r
79 static \r
80 NFCSTATUS\r
81 phHciNfc_Send_SWP_Event(\r
82                        phHciNfc_sContext_t      *psHciContext,\r
83                        void                     *pHwRef,\r
84                        uint8_t                  pipe_id,\r
85                        uint8_t                  event\r
86                        );\r
87 \r
88 \r
89 static \r
90 NFCSTATUS\r
91 phHciNfc_Recv_SWP_Event(\r
92                         void                *psContext,\r
93                         void                *pHwRef,\r
94                         uint8_t             *pEvent,\r
95 #ifdef ONE_BYTE_LEN\r
96                        uint8_t               length\r
97 #else\r
98                        uint16_t              length\r
99 #endif\r
100                        );\r
101 \r
102 static\r
103 NFCSTATUS\r
104 phHciNfc_SWP_InfoUpdate(\r
105                                 phHciNfc_sContext_t     *psHciContext,\r
106                                 uint8_t                 index,\r
107                                 uint8_t                 *reg_value,\r
108                                 uint8_t                 reg_length\r
109                           );\r
110 \r
111 /*\r
112 *************************** Function Definitions ***************************\r
113 */\r
114 \r
115 NFCSTATUS\r
116 phHciNfc_SWP_Get_PipeID(\r
117                        phHciNfc_sContext_t        *psHciContext,\r
118                        uint8_t                    *ppipe_id\r
119                        )\r
120 {\r
121     NFCSTATUS         status = NFCSTATUS_SUCCESS;\r
122 \r
123     if( (NULL != psHciContext)\r
124         && ( NULL != ppipe_id )\r
125         && ( NULL != psHciContext->p_swp_info ) \r
126         )\r
127     {\r
128         phHciNfc_SWP_Info_t     *p_swp_info=NULL;\r
129         p_swp_info = (phHciNfc_SWP_Info_t *)\r
130                         psHciContext->p_swp_info ;\r
131         *ppipe_id =  p_swp_info->pipe_id  ;\r
132     }\r
133     else \r
134     {\r
135         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
136     }\r
137     return status;\r
138 }\r
139 \r
140 NFCSTATUS\r
141 phHciNfc_SWP_Init_Resources(phHciNfc_sContext_t *psHciContext)\r
142 {\r
143     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
144     phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
145    \r
146     if( NULL == psHciContext )\r
147     {\r
148         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
149     }\r
150     else\r
151     {\r
152         if(( NULL == psHciContext->p_swp_info ) &&\r
153              (phHciNfc_Allocate_Resource((void **)(&ps_swp_info),\r
154             sizeof(phHciNfc_SWP_Info_t))== NFCSTATUS_SUCCESS))\r
155         {\r
156             psHciContext->p_swp_info = ps_swp_info;\r
157             ps_swp_info->current_seq = SWP_INVALID_SEQUENCE;\r
158             ps_swp_info->next_seq = SWP_INVALID_SEQUENCE;\r
159             ps_swp_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
160         }\r
161         else\r
162         {\r
163             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);\r
164         }\r
165         \r
166     }\r
167     return status;\r
168 }\r
169 \r
170 \r
171 NFCSTATUS\r
172 phHciNfc_SWP_Update_PipeInfo(\r
173                                   phHciNfc_sContext_t     *psHciContext,\r
174                                   uint8_t                 pipeID,\r
175                                   phHciNfc_Pipe_Info_t    *pPipeInfo\r
176                                   )\r
177 {\r
178     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
179 \r
180     if( NULL == psHciContext )\r
181     {\r
182         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
183     }\r
184     else if(NULL == psHciContext->p_swp_info)\r
185     {\r
186         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
187     }\r
188     else\r
189     {\r
190         phHciNfc_SWP_Info_t     *ps_swp_info=NULL;\r
191         ps_swp_info = (phHciNfc_SWP_Info_t *)\r
192                                 psHciContext->p_swp_info ;\r
193         /* Update the pipe_id of the SWP Gate obtained from HCI Response */\r
194         ps_swp_info->pipe_id = pipeID;\r
195         ps_swp_info->p_pipe_info = pPipeInfo;\r
196         if (NULL != pPipeInfo)\r
197         {\r
198             /* Update the Response Receive routine of the SWP Gate */\r
199             pPipeInfo->recv_resp = &phHciNfc_Recv_SWP_Response;\r
200             pPipeInfo->recv_event =&phHciNfc_Recv_SWP_Event;\r
201         }\r
202     }\r
203     return status;\r
204 }\r
205 \r
206 \r
207 static \r
208 NFCSTATUS\r
209 phHciNfc_Recv_SWP_Response(\r
210                         void                *psContext,\r
211                         void                *pHwRef,\r
212                         uint8_t             *pResponse,\r
213 #ifdef ONE_BYTE_LEN\r
214                         uint8_t             length\r
215 #else\r
216                         uint16_t            length\r
217 #endif\r
218                        )\r
219 {\r
220     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
221     phHciNfc_sContext_t         *psHciContext = \r
222                                 (phHciNfc_sContext_t *)psContext ;\r
223     \r
224 \r
225     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)\r
226         || (length == 0))\r
227     {\r
228       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
229     }\r
230     else if(NULL == psHciContext->p_swp_info)\r
231     {\r
232         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
233     }\r
234     else\r
235     {\r
236         phHciNfc_SWP_Info_t     *ps_swp_info=NULL;\r
237         uint8_t                 prev_cmd = ANY_GET_PARAMETER;\r
238 \r
239         ps_swp_info = (phHciNfc_SWP_Info_t *)\r
240                         psHciContext->p_swp_info ;\r
241         if( NULL == ps_swp_info->p_pipe_info)\r
242         {\r
243             status = PHNFCSTVAL(CID_NFC_HCI, \r
244                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
245         }\r
246         else\r
247         {\r
248             prev_cmd = ps_swp_info->p_pipe_info->prev_msg ;\r
249             switch(prev_cmd)\r
250             {\r
251                 case ANY_GET_PARAMETER:\r
252                 {\r
253                     HCI_PRINT(" Getting the SWP Parameter \n");\r
254                     status = phHciNfc_SWP_InfoUpdate(psHciContext,\r
255                                     ps_swp_info->p_pipe_info->reg_index, \r
256                                     &pResponse[HCP_HEADER_LEN],\r
257                                     (uint8_t)(length - HCP_HEADER_LEN));\r
258 \r
259                     break;\r
260                 }\r
261                 case ANY_SET_PARAMETER:\r
262                 {\r
263                     HCI_PRINT("SWP Parameter Set \n");\r
264                     break;\r
265                 }\r
266                 case ANY_OPEN_PIPE:\r
267                 {\r
268                     HCI_PRINT("SWP gate open pipe complete\n");\r
269                     break;\r
270                 }\r
271                 case ANY_CLOSE_PIPE:\r
272                 {\r
273                     HCI_PRINT("SWP close pipe complete\n");\r
274                     break;\r
275                 }\r
276                 default:\r
277                 {\r
278                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);\r
279                     break;\r
280                 }\r
281             }\r
282             if( NFCSTATUS_SUCCESS == status )\r
283             {\r
284                 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, \r
285                                                     UPDATE_SEQ);\r
286                 ps_swp_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;\r
287                 ps_swp_info->current_seq = ps_swp_info->next_seq;\r
288             }\r
289         }\r
290     }\r
291     return status;\r
292 }\r
293 \r
294 \r
295 NFCSTATUS\r
296 phHciNfc_SWP_Configure_Default(\r
297                             void        *psHciHandle,\r
298                             void        *pHwRef,\r
299                             uint8_t     enable_type\r
300                         )\r
301 {\r
302     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
303     static uint8_t          param = 0 ;\r
304     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
305 \r
306     if((NULL == psHciContext)||(NULL == pHwRef))\r
307     {\r
308         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
309     }\r
310     else if(NULL == psHciContext->p_swp_info)\r
311     {\r
312         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
313     }\r
314     else\r
315     {\r
316         phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
317         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;\r
318         \r
319         ps_swp_info = (phHciNfc_SWP_Info_t*)psHciContext->p_swp_info;       \r
320         ps_pipe_info = ps_swp_info->p_pipe_info;\r
321 \r
322         if(NULL == ps_pipe_info)\r
323         {\r
324             status = PHNFCSTVAL(CID_NFC_HCI, \r
325                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
326         }\r
327         else\r
328         {\r
329             ps_pipe_info->reg_index = NXP_SWP_DEFAULT_MODE_INDEX;\r
330             /* Enable/Disable SWP link */\r
331             param = (uint8_t)enable_type;\r
332             ps_pipe_info->param_info =(void*)&param ;\r
333             ps_pipe_info->param_length = sizeof(param) ;\r
334             status = phHciNfc_Send_Generic_Cmd(psHciContext, pHwRef, \r
335                                         ps_swp_info->pipe_id, \r
336                                         (uint8_t)ANY_SET_PARAMETER);\r
337         }\r
338 \r
339     }\r
340     return status;\r
341 }\r
342 \r
343 \r
344 NFCSTATUS\r
345 phHciNfc_SWP_Get_Status(\r
346                             void        *psHciHandle,\r
347                             void        *pHwRef\r
348                         )\r
349 {\r
350     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
351     /* static uint8_t       param = 0 ; */\r
352     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
353 \r
354     if((NULL == psHciContext)||(NULL == pHwRef))\r
355     {\r
356         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
357     }\r
358     else if(NULL == psHciContext->p_swp_info)\r
359     {\r
360         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
361     }\r
362     else\r
363     {\r
364         phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
365         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;\r
366 \r
367         ps_swp_info = (phHciNfc_SWP_Info_t*)psHciContext->p_swp_info;\r
368         ps_pipe_info = ps_swp_info->p_pipe_info;\r
369 \r
370         if(NULL == ps_pipe_info)\r
371         {\r
372             status = PHNFCSTVAL(CID_NFC_HCI, \r
373                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
374         }\r
375         else\r
376         {\r
377             ps_pipe_info->reg_index = NXP_SWP_STATUS_INDEX;\r
378             status = phHciNfc_Send_Generic_Cmd(psHciContext, pHwRef,  \r
379                                     ps_swp_info->pipe_id, \r
380                                     (uint8_t)ANY_GET_PARAMETER);\r
381         }\r
382     }\r
383     return status;\r
384 }\r
385 \r
386 \r
387 NFCSTATUS\r
388 phHciNfc_SWP_Get_Bitrate(\r
389                             void        *psHciHandle,\r
390                             void        *pHwRef\r
391                         )\r
392 {\r
393     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
394     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)\r
395                                             psHciHandle);\r
396 \r
397     if((NULL == psHciContext) || (NULL == pHwRef))\r
398     {\r
399         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
400     }\r
401     else if(NULL == psHciContext->p_swp_info)\r
402     {\r
403         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
404     }\r
405     else\r
406     {\r
407         phHciNfc_SWP_Info_t         *ps_swp_info = NULL;\r
408         \r
409         ps_swp_info = (phHciNfc_SWP_Info_t*)psHciContext->p_swp_info;\r
410        \r
411         status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef, \r
412                     NFC_ADDRESS_SWP_BITRATE, &(ps_swp_info->uicc_bitrate));\r
413 \r
414     }\r
415     return status;\r
416 }\r
417 \r
418 \r
419 NFCSTATUS\r
420 phHciNfc_SWP_Protection(\r
421                             void        *psHciHandle,\r
422                             void        *pHwRef,\r
423                             uint8_t     mode\r
424                       )\r
425 {\r
426     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
427     static uint8_t          param = 0 ;\r
428     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
429 \r
430     if((NULL == psHciContext)||(NULL == pHwRef))\r
431     {\r
432         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
433     }\r
434     else if(NULL == psHciContext->p_swp_info)\r
435     {\r
436         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
437     }\r
438     else\r
439     {\r
440         phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
441         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;\r
442         \r
443         ps_swp_info = (phHciNfc_SWP_Info_t*)psHciContext->p_swp_info;       \r
444         ps_pipe_info = ps_swp_info->p_pipe_info;\r
445 \r
446         if(NULL == ps_pipe_info)\r
447         {\r
448             status = PHNFCSTVAL(CID_NFC_HCI, \r
449                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
450         }\r
451         else\r
452         {\r
453             ps_pipe_info->reg_index = NXP_SWP_PROTECTED_INDEX;\r
454             /* Enable/Disable SWP Protection */\r
455             param = (uint8_t)mode;\r
456             ps_pipe_info->param_info =(void*)&param ;\r
457             ps_pipe_info->param_length = sizeof(param) ;\r
458             status = phHciNfc_Send_Generic_Cmd(psHciContext, pHwRef, \r
459                                         ps_swp_info->pipe_id, \r
460                                         (uint8_t)ANY_SET_PARAMETER);\r
461         }\r
462 \r
463     }\r
464     return status;\r
465 }\r
466 \r
467 \r
468 \r
469 \r
470 static\r
471 NFCSTATUS\r
472 phHciNfc_SWP_InfoUpdate(\r
473                                 phHciNfc_sContext_t     *psHciContext,\r
474                                 uint8_t                 index,\r
475                                 uint8_t                 *reg_value,\r
476                                 uint8_t                 reg_length\r
477                           )\r
478 {\r
479     phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
480     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
481 \r
482     ps_swp_info = (phHciNfc_SWP_Info_t *)\r
483                     psHciContext->p_swp_info ;\r
484 \r
485     /* To remove "warning (VS C4100) : unreferenced formal parameter" */\r
486     PHNFC_UNUSED_VARIABLE(reg_length);\r
487     switch(index)\r
488     {\r
489         case NXP_SWP_DEFAULT_MODE_INDEX:\r
490         {\r
491             HCI_PRINT_BUFFER("\tUICC Enable Register:",reg_value,reg_length);\r
492             break;\r
493         } \r
494             /* Get the Status of the UICC Connection */\r
495         case NXP_SWP_STATUS_INDEX:\r
496         {\r
497             HCI_PRINT_BUFFER("\tUICC Connection Status:", reg_value, reg_length);\r
498             ps_swp_info->uicc_status = (phHciNfc_SWP_Status_t ) *reg_value ;\r
499             break;\r
500         }\r
501         case NXP_SWP_PROTECTED_INDEX:\r
502         {\r
503             HCI_PRINT_BUFFER("\t UICC Card Emulation Rights :",reg_value,reg_length);\r
504 \r
505             break;\r
506         }\r
507         default:\r
508         {\r
509             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
510             break;\r
511         }\r
512     } /* End of switch(index) */\r
513     \r
514     return status;\r
515 }\r
516 \r
517 NFCSTATUS\r
518 phHciNfc_SWP_Configure_Mode(\r
519                               void              *psHciHandle,\r
520                               void              *pHwRef,\r
521                               uint8_t           uicc_mode\r
522                           )\r
523 {\r
524     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
525     static uint8_t          param = 0;\r
526     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)\r
527                                             psHciHandle);\r
528     \r
529     if( (NULL == psHciContext)||(NULL == pHwRef))\r
530     {\r
531       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
532     }\r
533     else if ( NULL == psHciContext->p_swp_info )\r
534     {\r
535         status = PHNFCSTVAL(CID_NFC_HCI, \r
536                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
537     }\r
538     else\r
539     {\r
540         phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
541         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;\r
542         \r
543         ps_swp_info = (phHciNfc_SWP_Info_t*)psHciContext->p_swp_info;\r
544        \r
545         ps_pipe_info = ps_swp_info->p_pipe_info;\r
546         if(NULL == ps_pipe_info)\r
547         {\r
548             status = PHNFCSTVAL(CID_NFC_HCI, \r
549                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
550         }\r
551         else\r
552         {\r
553             /* Switch the Mode of the SmartMx */\r
554             param = uicc_mode;\r
555             ps_pipe_info->param_info =(void*)&param ;\r
556             ps_pipe_info->param_length = sizeof(param) ;\r
557             status = phHciNfc_Send_SWP_Event( psHciContext, pHwRef,\r
558                                             ps_swp_info->pipe_id, \r
559                                             NXP_EVT_SWP_SWITCH_MODE );\r
560 \r
561             /* Send the Success Status as this is an event */\r
562             status = ((status == NFCSTATUS_PENDING)?\r
563                     NFCSTATUS_SUCCESS : status);\r
564 \r
565         }/* End of else part*/\r
566     } \r
567     return status;\r
568 }\r
569 \r
570 static \r
571 NFCSTATUS\r
572 phHciNfc_Recv_SWP_Event(\r
573                         void                *psContext,\r
574                         void                *pHwRef,\r
575                         uint8_t             *pEvent,\r
576 #ifdef ONE_BYTE_LEN\r
577                         uint8_t             length\r
578 #else\r
579                         uint16_t            length\r
580 #endif\r
581                        )\r
582 {\r
583     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
584     phHciNfc_sContext_t         *psHciContext = \r
585                                 (phHciNfc_sContext_t *)psContext ;\r
586     static phHal_sEventInfo_t   EventInfo;\r
587     \r
588 \r
589     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)\r
590         || (length == 0))\r
591     {\r
592       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
593     }\r
594     else if(NULL == psHciContext->p_swp_info)\r
595     {\r
596         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
597     }\r
598     else\r
599     {\r
600         phHciNfc_SWP_Info_t     *ps_swp_info=NULL;\r
601 \r
602         ps_swp_info = (phHciNfc_SWP_Info_t *)\r
603                         psHciContext->p_swp_info ;\r
604         if( NULL == ps_swp_info->p_pipe_info)\r
605         {\r
606             status = PHNFCSTVAL(CID_NFC_HCI, \r
607                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
608         }\r
609         else\r
610         {\r
611             phHciNfc_HCP_Packet_t       *p_packet = NULL;\r
612             phHciNfc_HCP_Message_t      *message = NULL;\r
613             uint8_t                     EventType = 0;                      \r
614 \r
615             p_packet = (phHciNfc_HCP_Packet_t *)pEvent;\r
616             message = &(p_packet->msg.message);\r
617             /* Get the instruction bits from the Message Header */\r
618             EventType = (uint8_t) GET_BITS8( message->msg_header,\r
619                 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);\r
620 \r
621             EventInfo.eventHost = phHal_eHostController;\r
622             EventInfo.eventSource = phHal_ePICC_DevType;\r
623             /* Occurrence of the Protected events for reporting */\r
624             if (NXP_EVT_SWP_PROTECTED == EventType) \r
625             {\r
626                 EventInfo.eventType = NFC_EVT_PROTECTED;\r
627             }\r
628             else\r
629             {\r
630                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);\r
631             }\r
632 \r
633             if (NFCSTATUS_SUCCESS == status )\r
634             {\r
635                 phHciNfc_Notify_Event(  psHciContext, pHwRef, \r
636                 NFC_NOTIFY_EVENT, (void*)&EventInfo);\r
637             }\r
638 \r
639         }\r
640     }\r
641     return status;\r
642 }\r
643 \r
644 \r
645 \r
646 static \r
647 NFCSTATUS\r
648 phHciNfc_Send_SWP_Event(\r
649                        phHciNfc_sContext_t      *psHciContext,\r
650                        void                     *pHwRef,\r
651                        uint8_t                  pipe_id,\r
652                        uint8_t                  event\r
653                        )\r
654 {\r
655     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;\r
656     phHciNfc_HCP_Message_t  *hcp_message = NULL;\r
657     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;\r
658     uint8_t                 length = 0;\r
659     uint8_t                 i=0;\r
660     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
661 \r
662     p_pipe_info = (phHciNfc_Pipe_Info_t *) \r
663                     psHciContext->p_pipe_list[pipe_id];\r
664     psHciContext->tx_total = 0 ;\r
665     length = (length + HCP_HEADER_LEN);\r
666 \r
667     hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;\r
668     /* Construct the HCP Frame */\r
669     phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,\r
670                             (uint8_t) pipe_id, \r
671                             HCP_MSG_TYPE_EVENT, event);\r
672 \r
673     hcp_message = &(hcp_packet->msg.message);\r
674 \r
675     phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,\r
676                             i, \r
677                             (uint8_t *)p_pipe_info->param_info,\r
678                             p_pipe_info->param_length);\r
679     length = (uint8_t)(length + i + p_pipe_info->param_length);\r
680 \r
681     p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ;\r
682     p_pipe_info->prev_msg = event ;\r
683     psHciContext->tx_total = length;\r
684 \r
685     /* Send the Constructed HCP packet to the lower layer */\r
686     status = phHciNfc_Send_HCP( psHciContext, pHwRef );\r
687     if(NFCSTATUS_PENDING == status)\r
688     {\r
689         ((phHciNfc_SWP_Info_t *)psHciContext->p_swp_info)->current_seq = \r
690             ((phHciNfc_SWP_Info_t *)psHciContext->p_swp_info)->next_seq;\r
691         p_pipe_info->prev_status = status;\r
692     }\r
693 \r
694     return status;\r
695 }\r
696 \r
697 NFCSTATUS\r
698 phHciNfc_SWP_Update_Sequence(\r
699                                 phHciNfc_sContext_t     *psHciContext,\r
700                                 phHciNfc_eSeqType_t     SWP_seq\r
701                              )\r
702 {\r
703     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
704     phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
705     if( NULL == psHciContext )\r
706     {\r
707         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
708     }\r
709     else if( NULL == psHciContext->p_swp_info )\r
710     {\r
711         status = PHNFCSTVAL(CID_NFC_HCI, \r
712                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
713     }\r
714     else\r
715     {\r
716         ps_swp_info = (phHciNfc_SWP_Info_t *)\r
717                             psHciContext->p_swp_info ;\r
718         switch(SWP_seq)\r
719         {\r
720             case RESET_SEQ:\r
721             case INIT_SEQ:\r
722             {\r
723                 ps_swp_info->current_seq = SWP_INVALID_SEQUENCE;\r
724                 ps_swp_info->next_seq = SWP_INVALID_SEQUENCE ;\r
725                 break;\r
726             }\r
727             case UPDATE_SEQ:\r
728             {\r
729                 ps_swp_info->current_seq = ps_swp_info->next_seq;\r
730                 break;\r
731             }\r
732             case REL_SEQ:\r
733             {\r
734                 ps_swp_info->current_seq = SWP_INVALID_SEQUENCE;\r
735                 ps_swp_info->next_seq =  SWP_INVALID_SEQUENCE;\r
736                 break;\r
737             }\r
738             case CONFIG_SEQ:\r
739             {\r
740                 ps_swp_info->current_seq = SWP_STATUS_SEQ;\r
741                 ps_swp_info->next_seq =  SWP_STATUS_SEQ;\r
742                 break;\r
743             }\r
744             default:\r
745             {\r
746                 break;\r
747             }\r
748         }\r
749     }\r
750     return status;\r
751 }\r
752 \r
753 NFCSTATUS\r
754 phHciNfc_SWP_Config_Sequence(\r
755                             phHciNfc_sContext_t     *psHciContext, \r
756                             void                    *pHwRef, \r
757                             phHal_sEmulationCfg_t   *ps_emulation_cfg\r
758                         )\r
759 {\r
760     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
761     phHciNfc_SWP_Info_t         *ps_swp_info=NULL;\r
762 \r
763     if ((NULL == psHciContext) || (NULL == pHwRef) || \r
764         (NULL == ps_emulation_cfg))\r
765     {\r
766         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
767     }\r
768     else if( NULL == psHciContext->p_swp_info )\r
769     {\r
770         status = PHNFCSTVAL(CID_NFC_HCI, \r
771                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
772     }\r
773     else\r
774     {\r
775         phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;\r
776         phHal_sUiccEmuCfg_t         *uicc_config = \r
777                                     &(ps_emulation_cfg->config.uiccEmuCfg);\r
778 \r
779         ps_swp_info = (phHciNfc_SWP_Info_t *)psHciContext->p_swp_info;\r
780         ps_pipe_info = ps_swp_info->p_pipe_info;\r
781 \r
782         if (NULL == ps_pipe_info)\r
783         {\r
784             status = PHNFCSTVAL(CID_NFC_HCI, \r
785                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
786         }\r
787         else\r
788         {\r
789             switch(ps_swp_info->current_seq)\r
790             {\r
791                 case SWP_STATUS_SEQ :\r
792                 {\r
793                     status = phHciNfc_SWP_Configure_Default( psHciContext,\r
794                                             pHwRef, uicc_config->enableUicc );\r
795 \r
796                     if(status == NFCSTATUS_PENDING)\r
797                     {\r
798                         ps_swp_info->next_seq = SWP_STATUS_SEQ;\r
799                         status = NFCSTATUS_SUCCESS;\r
800                     }\r
801                     break;\r
802                 }\r
803                 case SWP_MODE_SEQ :\r
804                 {\r
805                     status = phHciNfc_SWP_Configure_Mode( psHciContext, \r
806                                         pHwRef, UICC_SWITCH_MODE_DEFAULT );\r
807                                         /* UICC_SWITCH_MODE_ON  */\r
808                     if(status == NFCSTATUS_PENDING)\r
809                     {\r
810                         ps_swp_info->next_seq = SWP_STATUS_SEQ;\r
811                         status = NFCSTATUS_SUCCESS;\r
812                     }\r
813                     break;\r
814                 }\r
815                 default :\r
816                 {\r
817                     status = PHNFCSTVAL(CID_NFC_HCI, \r
818                                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
819                     break;\r
820                 }\r
821             }\r
822         }\r
823     }\r
824     return status;\r
825 }\r
826 \r
827 \r
828 \r