code update
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_WI.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_WI.c                                                        *\r
22 * \brief HCI WI gate Management Routines.                                     *\r
23 *                                                                             *\r
24 *                                                                             *\r
25 * Project: NFC-FRI-1.1                                                        *\r
26 *                                                                             *\r
27 * $Date: Tue Aug 18 10:22:34 2009 $                                           *\r
28 * $Author: ing04880 $                                                         *\r
29 * $Revision: 1.33 $                                                            *\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_WI.h>\r
40 #include <phOsalNfc.h>\r
41 #include <phHciNfc_Emulation.h>\r
42 /*\r
43 ****************************** Macro Definitions *******************************\r
44 */\r
45 /*  WI gate specific Events definition */\r
46 #define NXP_EVT_SE_START_OF_TRANSACTION (0x01U)\r
47 #define NXP_EVT_SE_END_OF_TRANSACTION   (0x02U)\r
48 #define NXP_EVT_SE_SWITCH_MODE          (0x03U)\r
49 #define NXP_EVT_SE_TRANSACTION          (0x04U)\r
50 \r
51 /* WI Gate registry Settings */\r
52 /* set default mode mode as virtual mode */\r
53 #define NXP_SE_DEFAULTMODE_INDEX        (0x01)\r
54 #define NXP_SE_EVENTS_INDEX             (0x05)                  \r
55 \r
56 /* Set Bit 0 and Bit 1 to report Start of transaction and End of transaction*/\r
57 #define WI_ENABLE_EVENTS                (0x04)\r
58 #define WI_VIRTUALMODE                  (0x01)\r
59 #define WI_OFFMODE                      (0x00)\r
60 #define AID_SIZE                        (0x20)\r
61 /****************** Structure and Enumeration ****************************/\r
62 \r
63 \r
64 /****************** Static Function Declaration **************************/\r
65 \r
66 static uint8_t paypass_removal[2]          = {0x50, 0x00};\r
67 static uint8_t mifare_access               = 0x60;\r
68 \r
69 static \r
70 NFCSTATUS \r
71 phHciNfc_Recv_WI_Response(  \r
72                               void  *psContext,\r
73                               void  *pHwRef,\r
74                               uint8_t *pResponse,\r
75 #ifdef ONE_BYTE_LEN\r
76                               uint8_t            length\r
77 #else\r
78                               uint16_t           length\r
79 #endif\r
80                          );\r
81 \r
82 static \r
83 NFCSTATUS \r
84 phHciNfc_Recv_WI_Event(\r
85                         void    *psContext,\r
86                         void    *pHwRef,\r
87                         uint8_t *pEvent,\r
88 #ifdef ONE_BYTE_LEN\r
89                         uint8_t            length\r
90 #else\r
91                         uint16_t           length\r
92 #endif\r
93                     );\r
94 \r
95 static \r
96 NFCSTATUS\r
97 phHciNfc_Send_WI_Event(\r
98                         phHciNfc_sContext_t     *psHciContext,\r
99                         void                    *pHwRef,\r
100                         uint8_t                 pipe_id,\r
101                         uint8_t                 event\r
102                     );\r
103 \r
104 static\r
105 NFCSTATUS\r
106 phHciNfc_WI_InfoUpdate(\r
107                             phHciNfc_sContext_t     *psHciContext,\r
108                             uint8_t                 index,\r
109                             uint8_t                 *reg_value,\r
110                             uint8_t                 reg_length\r
111                             );\r
112 \r
113 \r
114 #if defined (WI_UPDATE_SEQ)\r
115 static\r
116 NFCSTATUS\r
117 phHciNfc_WI_Update_Sequence(\r
118                                 phHciNfc_sContext_t     *psHciContext,\r
119                                 phHciNfc_eSeqType_t     WI_seq\r
120                          );\r
121 #endif /* #if defined (WI_UPDATE_SEQ) */\r
122 \r
123 /*\r
124 *************************** Function Definitions ***************************\r
125 */\r
126 \r
127 \r
128 \r
129 NFCSTATUS\r
130 phHciNfc_WI_Init_Resources(\r
131                            phHciNfc_sContext_t  *psHciContext\r
132                           )\r
133 {\r
134     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
135     phHciNfc_WI_Info_t          *p_WI_info=NULL;\r
136    \r
137     if( NULL == psHciContext )\r
138     {\r
139         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
140     }\r
141     else\r
142     {\r
143         if(( NULL == psHciContext->p_wi_info ) &&\r
144              (phHciNfc_Allocate_Resource((void **)(&p_WI_info),\r
145             sizeof(phHciNfc_WI_Info_t))== NFCSTATUS_SUCCESS))\r
146         {\r
147             psHciContext->p_wi_info = p_WI_info;\r
148             p_WI_info->current_seq = eWI_PipeOpen;\r
149             p_WI_info->next_seq = eWI_PipeOpen;\r
150             p_WI_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
151         }\r
152         else\r
153         {\r
154             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);\r
155         }\r
156         \r
157     }\r
158     return status;\r
159 }\r
160 \r
161 NFCSTATUS\r
162 phHciNfc_WI_Get_PipeID(\r
163                             phHciNfc_sContext_t        *psHciContext,\r
164                             uint8_t                    *ppipe_id\r
165                             )\r
166 {\r
167     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
168 \r
169     if( (NULL != psHciContext)\r
170         && ( NULL != ppipe_id )\r
171         && ( NULL != psHciContext->p_wi_info ) \r
172         )\r
173     {\r
174         phHciNfc_WI_Info_t     *p_wi_info=NULL;\r
175         p_wi_info = (phHciNfc_WI_Info_t *)\r
176             psHciContext->p_wi_info ;\r
177         *ppipe_id =  p_wi_info->pipe_id  ;\r
178     }\r
179     else \r
180     {\r
181         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
182     }\r
183     return status;\r
184 }\r
185 \r
186 \r
187 NFCSTATUS\r
188 phHciNfc_WI_Update_PipeInfo(\r
189                                   phHciNfc_sContext_t     *psHciContext,\r
190                                   uint8_t                 pipeID,\r
191                                   phHciNfc_Pipe_Info_t    *pPipeInfo\r
192                            )\r
193 {\r
194     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
195 \r
196     if( NULL == psHciContext )\r
197     {\r
198         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
199     }\r
200     else if(NULL == psHciContext->p_wi_info)\r
201     {\r
202         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
203     }\r
204     else\r
205     {\r
206         phHciNfc_WI_Info_t *p_WI_info=NULL;\r
207         p_WI_info = (phHciNfc_WI_Info_t *)\r
208                                 psHciContext->p_wi_info ;\r
209         /* Update the pipe_id of the WI Gate obtained from HCI Response */\r
210         p_WI_info->pipe_id = pipeID;\r
211         p_WI_info->p_pipe_info = pPipeInfo;\r
212         if ( NULL != pPipeInfo)\r
213         {\r
214             /* Update the Response Receive routine of the WI Gate */\r
215             pPipeInfo->recv_resp = &phHciNfc_Recv_WI_Response;\r
216             /* Update the event Receive routine of the WI Gate */\r
217             pPipeInfo->recv_event = &phHciNfc_Recv_WI_Event;\r
218         }\r
219     }\r
220 \r
221     return status;\r
222 }\r
223 \r
224 #if defined (WI_UPDATE_SEQ)\r
225 static\r
226 NFCSTATUS\r
227 phHciNfc_WI_Update_Sequence(\r
228                                 phHciNfc_sContext_t     *psHciContext,\r
229                                 phHciNfc_eSeqType_t     WI_seq\r
230                              )\r
231 {\r
232     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
233     phHciNfc_WI_Info_t          *p_WI_info=NULL;\r
234     if( NULL == psHciContext )\r
235     {\r
236         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
237     }\r
238     else if ( NULL == psHciContext->p_wi_info )\r
239     {\r
240         status = PHNFCSTVAL(CID_NFC_HCI, \r
241                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
242     }\r
243     else\r
244     {\r
245         p_WI_info = (phHciNfc_WI_Info_t *)\r
246                             psHciContext->p_wi_info ;\r
247         switch(WI_seq)\r
248         {\r
249             case RESET_SEQ:\r
250             case INIT_SEQ:\r
251             {\r
252                 p_WI_info->current_seq = eWI_PipeOpen;\r
253                 p_WI_info->next_seq = eWI_SetDefaultMode ;\r
254             }break;\r
255             case UPDATE_SEQ:\r
256             {\r
257                 p_WI_info->current_seq = p_WI_info->next_seq;\r
258             \r
259             }break;\r
260             case REL_SEQ:\r
261             {\r
262                 p_WI_info->current_seq = eWI_PipeOpen;\r
263                 p_WI_info->next_seq = eWI_PipeClose ;\r
264             }break;\r
265             default:\r
266             {\r
267                 break;\r
268             }\r
269         }/* End of Update Sequence Switch */\r
270     }\r
271     return status;\r
272 \r
273 }\r
274 #endif /* #if defined (WI_UPDATE_SEQ) */\r
275 \r
276 NFCSTATUS\r
277 phHciNfc_WI_Configure_Default(\r
278                               void                  *psHciHandle,\r
279                               void                  *pHwRef,\r
280                               uint8_t               enable_type\r
281                           )\r
282 {\r
283     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
284     static uint8_t          param = 0;\r
285     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
286     \r
287     if( (NULL == psHciContext)||(NULL == pHwRef))\r
288     {\r
289       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
290     }\r
291     else if ( NULL == psHciContext->p_wi_info )\r
292     {\r
293         status = PHNFCSTVAL(CID_NFC_HCI, \r
294                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
295     }\r
296     else\r
297     {\r
298         phHciNfc_WI_Info_t          *p_wi_info=NULL;\r
299         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
300         \r
301         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;\r
302        \r
303         p_pipe_info = p_wi_info->p_pipe_info;\r
304         if(NULL == p_pipe_info)\r
305         {\r
306             status = PHNFCSTVAL(CID_NFC_HCI, \r
307                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
308         }\r
309         else\r
310         {\r
311             p_pipe_info->reg_index = NXP_SE_DEFAULTMODE_INDEX;\r
312             /* Enable/Disable Default Virtual Mode for SmartMx */\r
313             param = (uint8_t)enable_type;\r
314             p_pipe_info->param_info =(void*)&param ;\r
315             p_pipe_info->param_length = sizeof(param) ;\r
316             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, \r
317                                     p_wi_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);\r
318 \r
319         }/* End of else part*/\r
320     } \r
321     return status;\r
322 }\r
323 \r
324 NFCSTATUS\r
325 phHciNfc_WI_Get_Default(\r
326                               void                  *psHciHandle,\r
327                               void                  *pHwRef\r
328                               )\r
329 {\r
330     NFCSTATUS               status = NFCSTATUS_SUCCESS; \r
331     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
332 \r
333     if( (NULL == psHciContext)||(NULL == pHwRef))\r
334     {\r
335         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
336     }\r
337     else if ( NULL == psHciContext->p_wi_info )\r
338     {\r
339         status = PHNFCSTVAL(CID_NFC_HCI, \r
340                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
341     }\r
342     else\r
343     {\r
344         phHciNfc_WI_Info_t          *p_wiinfo=NULL;\r
345         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
346 \r
347         p_wiinfo = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;\r
348 \r
349         p_pipe_info = p_wiinfo->p_pipe_info;\r
350         if(NULL == p_pipe_info)\r
351         {\r
352             status = PHNFCSTVAL(CID_NFC_HCI, \r
353                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
354         }\r
355         else\r
356         {\r
357             p_pipe_info->reg_index = NXP_SE_DEFAULTMODE_INDEX;\r
358             \r
359             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, \r
360                                             p_wiinfo->pipe_id,\r
361                                             (uint8_t)ANY_GET_PARAMETER);\r
362 \r
363         }/* End of else part*/\r
364     } \r
365     return status;\r
366 }\r
367 \r
368 \r
369 NFCSTATUS\r
370 phHciNfc_WI_Configure_Mode(\r
371                               void                *psHciHandle,\r
372                               void                *pHwRef,\r
373                               phHal_eSmartMX_Mode_t   e_smx_mode\r
374                           )\r
375 {\r
376     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
377     static uint8_t          param = 0;\r
378     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
379     \r
380     if( (NULL == psHciContext)||(NULL == pHwRef))\r
381     {\r
382       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
383     }\r
384     else if ( NULL == psHciContext->p_wi_info )\r
385     {\r
386         status = PHNFCSTVAL(CID_NFC_HCI, \r
387                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
388     }\r
389     else\r
390     {\r
391         phHciNfc_WI_Info_t          *p_wi_info=NULL;\r
392         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
393         \r
394         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;\r
395        \r
396         p_pipe_info = p_wi_info->p_pipe_info;\r
397         if(NULL == p_pipe_info)\r
398         {\r
399             status = PHNFCSTVAL(CID_NFC_HCI, \r
400                             NFCSTATUS_INVALID_HCI_INFORMATION);\r
401         }\r
402         else\r
403         {\r
404             /* Switch the Mode of the SmartMx */\r
405             param = (uint8_t)e_smx_mode;\r
406             p_pipe_info->param_info =(void*)&param ;\r
407             p_pipe_info->param_length = sizeof(param) ;\r
408             status = phHciNfc_Send_WI_Event( psHciContext, pHwRef,\r
409                                 p_wi_info->pipe_id, NXP_EVT_SE_SWITCH_MODE );\r
410             /* Send the Success Status as this is an event */\r
411             status = ( (status == NFCSTATUS_PENDING)?\r
412                                 NFCSTATUS_SUCCESS : status);\r
413 \r
414         }/* End of else part*/\r
415     } \r
416     return status;\r
417 }\r
418 \r
419 \r
420 NFCSTATUS\r
421 phHciNfc_WI_Configure_Notifications(\r
422                                     void        *psHciHandle,\r
423                                     void        *pHwRef,\r
424                                     phHciNfc_WI_Events_t eNotification\r
425                                 )\r
426 {   \r
427     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
428     static uint8_t          param = 0;\r
429     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
430     \r
431     if( (NULL == psHciContext)||(NULL == pHwRef))\r
432     {\r
433       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
434     }\r
435     else if ( NULL == psHciContext->p_wi_info )\r
436     {\r
437         status = PHNFCSTVAL(CID_NFC_HCI, \r
438                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
439     }\r
440     else\r
441     {\r
442         phHciNfc_WI_Info_t          *p_wi_info=NULL;\r
443         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
444       \r
445         \r
446         p_wi_info = (phHciNfc_WI_Info_t*)psHciContext->p_wi_info;\r
447         p_pipe_info = p_wi_info->p_pipe_info;\r
448         if(NULL == p_pipe_info)\r
449         {\r
450             status = PHNFCSTVAL(CID_NFC_HCI,\r
451                                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
452         }\r
453         else\r
454         {   \r
455             if(eEnableEvents == eNotification)\r
456             {\r
457                 /* Enable start and end of transaction events*/\r
458                 param = WI_ENABLE_EVENTS;   \r
459             }\r
460             else\r
461             {\r
462                 /* Disable Events*/\r
463                 param = FALSE ; \r
464             }\r
465             p_pipe_info->reg_index = NXP_SE_EVENTS_INDEX;\r
466             p_pipe_info->param_info =(void*)&param ;\r
467             p_pipe_info->param_length = sizeof(param) ;\r
468                         \r
469             status = phHciNfc_Send_Generic_Cmd(psHciContext,pHwRef, \r
470             p_wi_info->pipe_id,(uint8_t)ANY_SET_PARAMETER);\r
471         }\r
472     }\r
473     return status;\r
474 }\r
475 \r
476 \r
477 /*!\r
478 * \brief Sends WI gate specfic HCI Events to the connected reader device.\r
479 * This function Sends the WI mode specific HCI Event frames in the HCP packet format to the \r
480 * connected reader device.\r
481 */\r
482 \r
483 static \r
484 NFCSTATUS\r
485 phHciNfc_Send_WI_Event(\r
486                        phHciNfc_sContext_t      *psHciContext,\r
487                        void                     *pHwRef,\r
488                        uint8_t                  pipe_id,\r
489                        uint8_t                  event\r
490                        )\r
491 {\r
492     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;\r
493     phHciNfc_HCP_Message_t  *hcp_message = NULL;\r
494     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;\r
495     uint8_t                 length = 0;\r
496     uint8_t                 i=0;\r
497     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
498 \r
499     if( (NULL == psHciContext)\r
500         || ( pipe_id > PHHCINFC_MAX_PIPE)\r
501         ||(NULL == psHciContext->p_pipe_list[pipe_id])\r
502         )\r
503     {\r
504         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
505         HCI_DEBUG("%s: Invalid Arguments passed \n",\r
506             "phHciNfc_Send_WI_Event");\r
507     }\r
508     else\r
509     {\r
510         p_pipe_info = (phHciNfc_Pipe_Info_t *) \r
511             psHciContext->p_pipe_list[pipe_id];\r
512         psHciContext->tx_total = 0 ;\r
513         length =length+HCP_HEADER_LEN ;\r
514 \r
515         if( NXP_EVT_SE_SWITCH_MODE == event)\r
516         {\r
517             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;\r
518             /* Construct the HCP Frame */\r
519             phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,\r
520                                     (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);\r
521             hcp_message = &(hcp_packet->msg.message);\r
522             phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,\r
523                                             i, (uint8_t *)p_pipe_info->param_info,\r
524                                             p_pipe_info->param_length);\r
525             length =(uint8_t)(length + i + p_pipe_info->param_length);\r
526         }\r
527         else\r
528         {\r
529             status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INSTRUCTION );\r
530             HCI_DEBUG("%s: Invalid Send Event Request \n","phHciNfc_Send_WI_Event");\r
531         }\r
532 \r
533         if( NFCSTATUS_SUCCESS == status )\r
534         {\r
535             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ;\r
536             p_pipe_info->prev_msg = event ;\r
537             psHciContext->tx_total = length;\r
538 \r
539             /* Send the Constructed HCP packet to the lower layer */\r
540             status = phHciNfc_Send_HCP( psHciContext, pHwRef );\r
541             p_pipe_info->prev_status = NFCSTATUS_PENDING;\r
542         }\r
543     }\r
544     return status;\r
545 }\r
546 \r
547 static \r
548 NFCSTATUS\r
549 phHciNfc_Recv_WI_Response(\r
550                           void                *psContext,\r
551                           void                *pHwRef,\r
552                           uint8_t             *pResponse,\r
553 #ifdef ONE_BYTE_LEN\r
554                           uint8_t             length\r
555 #else\r
556                           uint16_t            length\r
557 #endif\r
558                           )\r
559 {\r
560     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
561     phHciNfc_sContext_t         *psHciContext = \r
562                                 (phHciNfc_sContext_t *)psContext;\r
563 \r
564 \r
565     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)\r
566         || (length == 0))\r
567     {\r
568         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
569     }\r
570     else if(NULL == psHciContext->p_wi_info)\r
571     {\r
572         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
573     }\r
574     else\r
575     {\r
576         phHciNfc_WI_Info_t     *p_wiinfo=NULL;\r
577         uint8_t                 prev_cmd = ANY_GET_PARAMETER;\r
578         p_wiinfo = (phHciNfc_WI_Info_t *)psHciContext->p_wi_info ;\r
579 \r
580         if( NULL == p_wiinfo->p_pipe_info)\r
581         {\r
582             status = PHNFCSTVAL(CID_NFC_HCI, \r
583                 NFCSTATUS_INVALID_HCI_INFORMATION);\r
584         }\r
585         else\r
586         {\r
587             prev_cmd = p_wiinfo->p_pipe_info->prev_msg ;\r
588             switch(prev_cmd)\r
589             {\r
590                 case ANY_GET_PARAMETER:\r
591                 {\r
592                     if (length > HCP_HEADER_LEN)\r
593                     {\r
594                         status = phHciNfc_WI_InfoUpdate (psHciContext, \r
595                                         p_wiinfo->p_pipe_info->reg_index, \r
596                                         &pResponse[HCP_HEADER_LEN],\r
597                                         (uint8_t)(length - HCP_HEADER_LEN));\r
598                     } \r
599                     else\r
600                     {\r
601                         status = PHNFCSTVAL(CID_NFC_HCI, \r
602                                             NFCSTATUS_INVALID_HCI_RESPONSE);\r
603                     }\r
604                     break;\r
605                 }\r
606                 case ANY_SET_PARAMETER:\r
607                 {\r
608                     HCI_PRINT("WI Parameter Set \n");\r
609                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, \r
610                                                         UPDATE_SEQ);\r
611                     break;\r
612                 }\r
613                 case ANY_OPEN_PIPE:\r
614                 {\r
615                     HCI_PRINT("WI gate open pipe complete\n");\r
616                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, \r
617                                                         UPDATE_SEQ);\r
618                     break;\r
619                 }\r
620                 case ANY_CLOSE_PIPE:\r
621                 {\r
622                     HCI_PRINT("WI close pipe complete\n");\r
623                     status = phHciNfc_EmuMgmt_Update_Seq(psHciContext, \r
624                                                         UPDATE_SEQ);\r
625                     break;\r
626                 }\r
627                 default:\r
628                 {\r
629                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);\r
630                     break;\r
631                 }\r
632             }\r
633             if( NFCSTATUS_SUCCESS == status )\r
634             {\r
635                 p_wiinfo->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;\r
636                 p_wiinfo->current_seq = p_wiinfo->next_seq;\r
637             }\r
638         }\r
639     }\r
640     return status;\r
641 }\r
642 \r
643 static\r
644 NFCSTATUS\r
645 phHciNfc_Recv_WI_Event(\r
646                        void               *psContext,\r
647                        void               *pHwRef,\r
648                        uint8_t            *pEvent,\r
649 #ifdef ONE_BYTE_LEN\r
650                        uint8_t             length\r
651 #else\r
652                        uint16_t            length\r
653 #endif\r
654                        )\r
655 {\r
656     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
657     phHal_sEventInfo_t          EventInfo;\r
658     /* phNfc_sNotificationInfo_t   NotificationInfo; */\r
659     phHciNfc_sContext_t         *psHciContext =(phHciNfc_sContext_t *)psContext;\r
660 \r
661 \r
662     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)\r
663         || (length == 0))\r
664     {\r
665         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
666     }\r
667     else if(NULL == psHciContext->p_wi_info) \r
668     {\r
669         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
670     }\r
671     else\r
672     {   \r
673         phHciNfc_HCP_Packet_t       *p_packet = NULL;\r
674         phHciNfc_HCP_Message_t      *message = NULL;\r
675         phHciNfc_WI_Info_t          *p_wi_info = NULL;\r
676         uint8_t                     EventType = 0;                      \r
677 \r
678         p_wi_info = (phHciNfc_WI_Info_t *)psHciContext->p_wi_info ;\r
679 \r
680         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;\r
681         message = &(p_packet->msg.message);\r
682         /* Get the instruction bits from the Message Header */\r
683         EventType = (uint8_t) GET_BITS8( message->msg_header,\r
684             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);\r
685 \r
686         EventInfo.eventHost = phHal_eHostController;\r
687         EventInfo.eventSource = phHal_ePICC_DevType;\r
688         /* Now check for possible Transaction events for reporting */\r
689         switch(EventType)\r
690         {   \r
691             case NXP_EVT_SE_START_OF_TRANSACTION:\r
692             {\r
693                 EventInfo.eventType = NFC_EVT_START_OF_TRANSACTION;\r
694                 break;\r
695             }\r
696             case NXP_EVT_SE_END_OF_TRANSACTION:\r
697             {   \r
698                 EventInfo.eventType = NFC_EVT_END_OF_TRANSACTION;\r
699                 break;\r
700             }\r
701             case NXP_EVT_SE_TRANSACTION:\r
702             {\r
703                 EventInfo.eventType = NFC_EVT_TRANSACTION;\r
704                 EventInfo.eventInfo.aid.buffer = (uint8_t *)p_wi_info->aid;\r
705                 /* check for AID data is at least 1 byte is their */\r
706                 if (length > HCP_HEADER_LEN)\r
707                 {\r
708                     EventInfo.eventInfo.aid.length = length - HCP_HEADER_LEN;\r
709                     memcpy((void *)p_wi_info->aid, message->payload,\r
710                            EventInfo.eventInfo.aid.length );\r
711                 }\r
712 \r
713                 /* Filter Transaction event */\r
714                 if (EventInfo.eventInfo.aid.length == 4)\r
715                 {\r
716                     EventInfo.eventType = NFC_EVT_APDU_RECEIVED;\r
717                 }\r
718                 else if (EventInfo.eventInfo.aid.length == 2)\r
719                 {\r
720                     if (!memcmp(paypass_removal, EventInfo.eventInfo.aid.buffer, EventInfo.eventInfo.aid.length))\r
721                     {\r
722                         EventInfo.eventType = NFC_EVT_EMV_CARD_REMOVAL;\r
723                     }\r
724                     else if(mifare_access == EventInfo.eventInfo.aid.buffer[0])\r
725                     {\r
726                         EventInfo.eventType = NFC_EVT_MIFARE_ACCESS;\r
727                     }\r
728                 }\r
729 \r
730                 EventInfo.eventInfo.aid.buffer = (uint8_t *)p_wi_info->aid;\r
731                 (void) memcpy((void *)p_wi_info->aid,message->payload,\r
732                                 EventInfo.eventInfo.aid.length );\r
733                 break;\r
734             }\r
735             default:\r
736             {\r
737                 status = PHNFCSTVAL(CID_NFC_HCI, \r
738                                 NFCSTATUS_INVALID_HCI_INSTRUCTION);\r
739                 break;\r
740             }\r
741         }\r
742         if (NFCSTATUS_SUCCESS == status )\r
743         {\r
744             phHciNfc_Notify_Event(  psHciContext, pHwRef, \r
745             NFC_NOTIFY_EVENT, (void*)&EventInfo);\r
746         }\r
747     }\r
748     return status;\r
749 }\r
750 \r
751 static \r
752 NFCSTATUS \r
753 phHciNfc_WI_InfoUpdate(\r
754                        phHciNfc_sContext_t     *psHciContext,\r
755                        uint8_t                 index,\r
756                        uint8_t                 *reg_value,\r
757                        uint8_t                 reg_length\r
758                        )\r
759 {\r
760     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
761     phHciNfc_WI_Info_t      *p_wiinfo = NULL;\r
762 \r
763     p_wiinfo = psHciContext->p_wi_info;\r
764 \r
765     if ((NXP_SE_DEFAULTMODE_INDEX == index) &&\r
766         (sizeof(*reg_value) == reg_length))\r
767     {       \r
768         p_wiinfo->default_type = *reg_value;\r
769     } \r
770     else\r
771     {\r
772         status = PHNFCSTVAL(CID_NFC_HCI, \r
773                             NFCSTATUS_INVALID_HCI_RESPONSE);\r
774     }\r
775 \r
776     return status;\r
777 }\r
778 \r