First add
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_RFReaderB.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_RFReaderB.c                                                 *\r
22 * \brief HCI Reader B Management Routines.                                    *\r
23 *                                                                             *\r
24 *                                                                             *\r
25 * Project: NFC-FRI-1.1                                                        *\r
26 *                                                                             *\r
27 * $Date: Mon Aug 17 15:17:07 2009 $                                           *\r
28 * $Author: ing04880 $                                                         *\r
29 * $Revision: 1.7 $                                                           *\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 /*\r
36 ***************************** Header File Inclusion ****************************\r
37 */\r
38 #include <phNfcCompId.h>\r
39 #include <phHciNfc_Pipe.h>\r
40 #include <phHciNfc_RFReader.h>\r
41 #include <phOsalNfc.h>\r
42 \r
43 #if defined (TYPE_B)\r
44 #include <phHciNfc_RFReaderB.h>\r
45 /*\r
46 ****************************** Macro Definitions *******************************\r
47 */\r
48 \r
49 #define RDR_B_SINGLE_TAG_FOUND              0x00U\r
50 #define RDR_B_MULTIPLE_TAGS_FOUND           0x03U\r
51 /* Commands exposed to the upper layer */\r
52 #define NXP_WRA_CONTINUE_ACTIVATION         0x12U\r
53 \r
54 #define RDR_B_PUPI_INDEX                    0x03U\r
55 #define RDR_B_APP_DATA_INDEX                0x04U\r
56 #define RDR_B_AFI_INDEX                     0x02U\r
57 #define RDR_B_HIGHER_LAYER_RESP_INDEX       0x01U\r
58 #define RDR_B_HIGHER_LAYER_DATA_INDEX       0x05U\r
59 \r
60 \r
61 /*\r
62 *************************** Structure and Enumeration ***************************\r
63 */\r
64 \r
65 \r
66 /*\r
67 *************************** Static Function Declaration **************************\r
68 */\r
69 \r
70 static \r
71 NFCSTATUS\r
72 phHciNfc_Recv_ReaderB_Response(\r
73                                void                *psContext,\r
74                                void                *pHwRef,\r
75                                uint8_t             *pResponse,\r
76 #ifdef ONE_BYTE_LEN\r
77                                uint8_t             length\r
78 #else\r
79                                uint16_t            length\r
80 #endif\r
81                                );\r
82 \r
83 static\r
84 NFCSTATUS\r
85 phHciNfc_Recv_ReaderB_Event(\r
86                             void               *psContext,\r
87                             void               *pHwRef,\r
88                             uint8_t            *pEvent,\r
89 #ifdef ONE_BYTE_LEN\r
90                             uint8_t             length\r
91 #else\r
92                             uint16_t            length\r
93 #endif\r
94                             );\r
95 \r
96 static\r
97 NFCSTATUS\r
98 phHciNfc_ReaderB_InfoUpdate(\r
99                             phHciNfc_sContext_t     *psHciContext,\r
100                             uint8_t                 index,\r
101                             uint8_t                 *reg_value,\r
102                             uint8_t                 reg_length\r
103                             );\r
104 \r
105 static\r
106 NFCSTATUS\r
107 phHciNfc_Recv_Iso_B_Packet(\r
108                            phHciNfc_sContext_t  *psHciContext,\r
109                            uint8_t              *pResponse,\r
110 #ifdef ONE_BYTE_LEN\r
111                            uint8_t             length\r
112 #else\r
113                            uint16_t            length\r
114 #endif\r
115                            );\r
116 /*\r
117 *************************** Function Definitions ***************************\r
118 */\r
119 \r
120 NFCSTATUS\r
121 phHciNfc_ReaderB_Get_PipeID(\r
122                             phHciNfc_sContext_t        *psHciContext,\r
123                             uint8_t                    *ppipe_id\r
124                             )\r
125 {\r
126     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
127 \r
128     if( (NULL != psHciContext)\r
129         && ( NULL != ppipe_id )\r
130         && ( NULL != psHciContext->p_reader_b_info ) \r
131         )\r
132     {\r
133         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
134         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
135                             psHciContext->p_reader_b_info ;\r
136         *ppipe_id =  p_rdr_b_info->pipe_id  ;\r
137     }\r
138     else \r
139     {\r
140         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
141     }\r
142     return status;\r
143 }\r
144 \r
145 NFCSTATUS\r
146 phHciNfc_ReaderB_Init_Resources(\r
147                                 phHciNfc_sContext_t     *psHciContext\r
148                                 )\r
149 {\r
150     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
151     phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
152     if( NULL == psHciContext )\r
153     {\r
154         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
155     }\r
156     else\r
157     {\r
158         if(\r
159             ( NULL == psHciContext->p_reader_b_info ) &&\r
160                 (phHciNfc_Allocate_Resource((void **)(&p_rdr_b_info),\r
161                 sizeof(phHciNfc_ReaderB_Info_t))== NFCSTATUS_SUCCESS)\r
162             )\r
163         {\r
164             psHciContext->p_reader_b_info = p_rdr_b_info;\r
165             p_rdr_b_info->current_seq = RDR_B_INVALID_SEQ;\r
166             p_rdr_b_info->next_seq = RDR_B_INVALID_SEQ;\r
167             p_rdr_b_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
168         }\r
169         else\r
170         {\r
171             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);\r
172         }\r
173 \r
174     }\r
175     return status;\r
176 }\r
177 \r
178 NFCSTATUS\r
179 phHciNfc_ReaderB_Update_Info(\r
180                              phHciNfc_sContext_t        *psHciContext,\r
181                              uint8_t                    infotype,\r
182                              void                       *rdr_b_info\r
183                              )\r
184 {\r
185     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
186     \r
187     if (NULL == psHciContext)\r
188     {\r
189         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
190     }\r
191     else if(NULL == psHciContext->p_reader_b_info)\r
192     {\r
193         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
194     }\r
195     else\r
196     {\r
197         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;\r
198         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
199                         psHciContext->p_reader_b_info ;\r
200 \r
201         switch(infotype)\r
202         {\r
203             case HCI_READER_B_ENABLE:\r
204             {\r
205                 if(NULL != rdr_b_info)\r
206                 {\r
207                     ps_rdr_b_info->enable_rdr_b_gate = \r
208                                 *((uint8_t *)rdr_b_info);\r
209                 }\r
210                 break;\r
211             }\r
212             case HCI_READER_B_INFO_SEQ:\r
213             {\r
214                 ps_rdr_b_info->current_seq = RDR_B_PUPI;\r
215                 ps_rdr_b_info->next_seq = RDR_B_PUPI;\r
216                 break;\r
217             }\r
218             default:\r
219             {\r
220                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
221                 break;\r
222             }\r
223         }\r
224     }\r
225     return status;\r
226 }\r
227 \r
228 \r
229 NFCSTATUS\r
230 phHciNfc_ReaderB_Update_PipeInfo(\r
231                                  phHciNfc_sContext_t     *psHciContext,\r
232                                  uint8_t                 pipeID,\r
233                                  phHciNfc_Pipe_Info_t    *pPipeInfo\r
234                                  )\r
235 {\r
236     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
237 \r
238     if( NULL == psHciContext )\r
239     {\r
240         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
241     }\r
242     else if(NULL == psHciContext->p_reader_b_info)\r
243     {\r
244         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
245     }\r
246     else\r
247     {\r
248         phHciNfc_ReaderB_Info_t *p_rdr_b_info=NULL;\r
249         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
250                             psHciContext->p_reader_b_info ;\r
251         /* Update the pipe_id of the reader B Gate obtained from the HCI Response */\r
252         p_rdr_b_info->pipe_id = pipeID;\r
253         p_rdr_b_info->p_pipe_info = pPipeInfo;\r
254         /* Update the Response Receive routine of the reader B Gate */\r
255         pPipeInfo->recv_resp = &phHciNfc_Recv_ReaderB_Response;\r
256         /* Update the event Receive routine of the reader B Gate */\r
257         pPipeInfo->recv_event = &phHciNfc_Recv_ReaderB_Event;\r
258     }\r
259 \r
260     return status;\r
261 }\r
262 \r
263 NFCSTATUS\r
264 phHciNfc_ReaderB_Info_Sequence (\r
265                                 void             *psHciHandle,\r
266                                 void             *pHwRef\r
267                                 )\r
268 {\r
269     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
270     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);\r
271     if( (NULL == psHciContext) \r
272         || (NULL == pHwRef)\r
273         )\r
274     {\r
275         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
276     }\r
277     else if((NULL == psHciContext->p_reader_b_info) || \r
278         (HCI_READER_B_ENABLE != \r
279         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->\r
280         enable_rdr_b_gate))\r
281     {\r
282         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
283     }   \r
284     else\r
285     {\r
286         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
287         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
288         uint8_t                     pipeid = 0;\r
289 \r
290         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
291                             psHciContext->p_reader_b_info ;\r
292         p_pipe_info = p_rdr_b_info->p_pipe_info;\r
293         if(NULL == p_pipe_info )\r
294         {\r
295             status = PHNFCSTVAL(CID_NFC_HCI, \r
296                 NFCSTATUS_INVALID_HCI_SEQUENCE);\r
297         }\r
298         else\r
299         {\r
300             switch(p_rdr_b_info->current_seq)\r
301             {\r
302                 case RDR_B_PUPI:\r
303                 {\r
304                     p_pipe_info->reg_index = RDR_B_PUPI_INDEX;\r
305                     pipeid = p_rdr_b_info->pipe_id ;\r
306                     /* Fill the data buffer and send the command to the \r
307                     device */\r
308                     status = \r
309                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
310                         pipeid, (uint8_t)ANY_GET_PARAMETER);\r
311                     if(NFCSTATUS_PENDING == status )\r
312                     {\r
313                         p_rdr_b_info->next_seq = RDR_B_APP_DATA;\r
314                     }\r
315                     break;\r
316                 }\r
317                 case RDR_B_APP_DATA:\r
318                 {\r
319                     p_pipe_info->reg_index = RDR_B_APP_DATA_INDEX;\r
320                     pipeid = p_rdr_b_info->pipe_id ;\r
321                     /* Fill the data buffer and send the command to the \r
322                     device */\r
323                     status = \r
324                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
325                         pipeid, (uint8_t)ANY_GET_PARAMETER);\r
326                     if(NFCSTATUS_PENDING == status )\r
327                     {\r
328                         p_rdr_b_info->next_seq = RDR_B_AFI;\r
329                     }\r
330                     break;\r
331                 }\r
332                 case RDR_B_AFI:\r
333                 {\r
334                     /* RW to the registry */\r
335                     p_pipe_info->reg_index = RDR_B_AFI_INDEX;\r
336                     pipeid = p_rdr_b_info->pipe_id ;\r
337                     /* Fill the data buffer and send the command to the \r
338                     device */\r
339                     status = \r
340                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
341                         pipeid, (uint8_t)ANY_GET_PARAMETER);\r
342                     if(NFCSTATUS_PENDING == status )\r
343                     {\r
344                         p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_RESP;\r
345                     }\r
346                     break;\r
347                 }\r
348 \r
349                 case RDR_B_HIGHER_LAYER_RESP:\r
350                 {\r
351                     p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_RESP_INDEX;\r
352                     pipeid = p_rdr_b_info->pipe_id ;\r
353                     /* Fill the data buffer and send the command to the \r
354                         device */\r
355                     status = \r
356                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
357                                     pipeid, (uint8_t)ANY_GET_PARAMETER);\r
358                     if(NFCSTATUS_PENDING == status )\r
359                     {\r
360                         p_rdr_b_info->next_seq = RDR_B_HIGHER_LAYER_DATA;\r
361                     }\r
362                     break;\r
363                 }\r
364 \r
365                 case RDR_B_HIGHER_LAYER_DATA:\r
366                 {\r
367                     /* RW to the registry */\r
368                     p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;\r
369                     pipeid = p_rdr_b_info->pipe_id ;\r
370                     /* Fill the data buffer and send the command to the \r
371                     device */\r
372                     status = \r
373                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
374                         pipeid, (uint8_t)ANY_GET_PARAMETER);\r
375                     if(NFCSTATUS_PENDING == status )\r
376                     {\r
377                         p_rdr_b_info->next_seq = RDR_B_END_SEQUENCE;\r
378                     }\r
379                     break;\r
380                 }\r
381                 case RDR_B_END_SEQUENCE:\r
382                 {\r
383                     phNfc_sCompletionInfo_t     CompInfo;\r
384                     if (RDR_B_MULTIPLE_TAGS_FOUND == \r
385                         p_rdr_b_info->multiple_tgts_found)\r
386                     {\r
387                         CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;\r
388                     }\r
389                     else\r
390                     {\r
391                         CompInfo.status = NFCSTATUS_SUCCESS;\r
392                     }\r
393 \r
394                     CompInfo.info = &(p_rdr_b_info->reader_b_info);\r
395 \r
396                     p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;\r
397                     p_rdr_b_info->current_seq = RDR_B_PUPI;\r
398                     p_rdr_b_info->next_seq = RDR_B_PUPI;\r
399                     status = NFCSTATUS_SUCCESS;\r
400                     /* Notify to the upper layer */\r
401                     phHciNfc_Tag_Notify(psHciContext, \r
402                                         pHwRef, \r
403                                         NFC_NOTIFY_TARGET_DISCOVERED, \r
404                                         &CompInfo);\r
405                     break;\r
406                 }\r
407                 default:\r
408                 {\r
409                     status = PHNFCSTVAL(CID_NFC_HCI, \r
410                         NFCSTATUS_INVALID_HCI_RESPONSE);\r
411                     break;\r
412                 }\r
413             }           \r
414         }\r
415     }\r
416     return status;\r
417 }\r
418 \r
419 static \r
420 NFCSTATUS\r
421 phHciNfc_Recv_ReaderB_Response(\r
422                                void                *psContext,\r
423                                void                *pHwRef,\r
424                                uint8_t             *pResponse,\r
425 #ifdef ONE_BYTE_LEN\r
426                                uint8_t              length\r
427 #else\r
428                                uint16_t             length\r
429 #endif\r
430                                )\r
431 {\r
432     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
433     phHciNfc_sContext_t         *psHciContext = \r
434                                 (phHciNfc_sContext_t *)psContext ;\r
435 \r
436     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)\r
437         || (length == 0))\r
438     {\r
439         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
440     }\r
441     else if(NULL == psHciContext->p_reader_b_info)\r
442     {\r
443         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
444     }\r
445     else\r
446     {\r
447         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
448         uint8_t                     prev_cmd = ANY_GET_PARAMETER;\r
449 \r
450         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
451                                 psHciContext->p_reader_b_info ;\r
452         if( NULL == p_rdr_b_info->p_pipe_info)\r
453         {\r
454             status = PHNFCSTVAL(CID_NFC_HCI, \r
455                                 NFCSTATUS_INVALID_HCI_SEQUENCE);\r
456         }\r
457         else\r
458         {\r
459             prev_cmd = p_rdr_b_info->p_pipe_info->prev_msg ;\r
460             switch(prev_cmd)\r
461             {\r
462             case ANY_GET_PARAMETER:\r
463                 {\r
464                     status = phHciNfc_ReaderB_InfoUpdate(psHciContext,\r
465                                         p_rdr_b_info->p_pipe_info->reg_index, \r
466                                         &pResponse[HCP_HEADER_LEN],\r
467                                         (uint8_t)(length - HCP_HEADER_LEN));\r
468                     break;\r
469                 }\r
470                 case ANY_SET_PARAMETER:\r
471                 {\r
472                     HCI_PRINT("Reader B Parameter Set \n");\r
473                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, \r
474                                                                 UPDATE_SEQ);\r
475                     p_rdr_b_info->next_seq = RDR_B_PUPI;\r
476                     break;\r
477                 }\r
478                 case ANY_OPEN_PIPE:\r
479                 {\r
480                     HCI_PRINT("Reader B open pipe complete\n");\r
481                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, \r
482                                                                 UPDATE_SEQ);\r
483                     p_rdr_b_info->next_seq = RDR_B_PUPI;\r
484                     break;\r
485                 }\r
486                 case ANY_CLOSE_PIPE:\r
487                 {\r
488                     HCI_PRINT("Reader B close pipe complete\n");\r
489                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, \r
490                                                                 UPDATE_SEQ);\r
491                     break;\r
492                 }\r
493                 case NXP_WRA_CONTINUE_ACTIVATION:\r
494                 case NXP_WR_ACTIVATE_ID:\r
495                 {\r
496                     HCI_PRINT("Reader B continue activation or ");\r
497                     HCI_PRINT("reactivation completed \n");\r
498                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, \r
499                                                     UPDATE_SEQ);\r
500                     break;\r
501                 }\r
502                 case WR_XCHGDATA:\r
503                 {\r
504                     if (length >= HCP_HEADER_LEN)\r
505                     {\r
506                         uint8_t         i = 1;\r
507                         HCI_PRINT("ISO 14443-4B received \n");\r
508                         /* Copy buffer to the receive buffer */\r
509                         phHciNfc_Append_HCPFrame(psHciContext->recv_buffer, \r
510                                                 0, pResponse, length);\r
511                         psHciContext->rx_total = (length - i);\r
512                         status = phHciNfc_Recv_Iso_B_Packet(psHciContext, \r
513                                                     &pResponse[HCP_HEADER_LEN],\r
514                                                     (length - HCP_HEADER_LEN));\r
515                     } \r
516                     else\r
517                     {\r
518                         status = PHNFCSTVAL(CID_NFC_HCI, \r
519                                             NFCSTATUS_INVALID_HCI_RESPONSE);\r
520                     }\r
521                     break;\r
522                 }\r
523                 case NXP_WR_PRESCHECK:\r
524                 {\r
525                     HCI_PRINT("Presence check completed \n");\r
526                     break;\r
527                 }\r
528                 case NXP_WR_ACTIVATE_NEXT:\r
529                 {\r
530                     if (length > HCP_HEADER_LEN)\r
531                     {\r
532                         if (RDR_B_MULTIPLE_TAGS_FOUND == pResponse[HCP_HEADER_LEN])\r
533                         {\r
534                             p_rdr_b_info->multiple_tgts_found = \r
535                                 RDR_B_MULTIPLE_TAGS_FOUND;\r
536                         }\r
537                         else\r
538                         {\r
539                             p_rdr_b_info->multiple_tgts_found = FALSE;\r
540                         }\r
541                         HCI_PRINT("Activate next completed \n");\r
542                     }\r
543                     else\r
544                     {\r
545                         status = PHNFCSTVAL(CID_NFC_HCI, \r
546                                             NFCSTATUS_INVALID_HCI_RESPONSE);\r
547                     }\r
548                     break;\r
549                 }\r
550                 case NXP_WR_DISPATCH_TO_UICC:\r
551                 {\r
552                     switch(length)\r
553                     {\r
554                         case HCP_HEADER_LEN:\r
555                         {\r
556                             /* Error code field is optional, if no error \r
557                                 code field in the response, then the command \r
558                                 is successfully completed */\r
559                             p_rdr_b_info->uicc_activation = \r
560                                         UICC_CARD_ACTIVATION_SUCCESS;\r
561                             break;\r
562                         }\r
563                         case (HCP_HEADER_LEN + 1):\r
564                         {\r
565                             p_rdr_b_info->uicc_activation = \r
566                                         pResponse[HCP_HEADER_LEN];\r
567                             break;\r
568                         } /* End of case (HCP_HEADER_LEN + index) */\r
569                         default:\r
570                         {                            \r
571                             status = PHNFCSTVAL(CID_NFC_HCI, \r
572                                                 NFCSTATUS_INVALID_HCI_RESPONSE);\r
573                             break;\r
574                         }\r
575                     } /* End of switch(length) */\r
576                     if (NFCSTATUS_SUCCESS == status)\r
577                     {\r
578                         status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, \r
579                                                                     UPDATE_SEQ);\r
580                     }\r
581                     break;\r
582                 }\r
583                 default:\r
584                 {\r
585                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);\r
586                     break;\r
587                 }\r
588             }\r
589             if( NFCSTATUS_SUCCESS == status )\r
590             {\r
591                 p_rdr_b_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;\r
592                 p_rdr_b_info->current_seq = p_rdr_b_info->next_seq;\r
593             }\r
594         }\r
595     }\r
596     return status;\r
597 }\r
598 \r
599 \r
600 static\r
601 NFCSTATUS\r
602 phHciNfc_Recv_ReaderB_Event(\r
603                             void               *psContext,\r
604                             void               *pHwRef,\r
605                             uint8_t            *pEvent,\r
606 #ifdef ONE_BYTE_LEN\r
607                             uint8_t             length\r
608 #else\r
609                             uint16_t            length\r
610 #endif\r
611                             )\r
612 {\r
613     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
614     phHciNfc_sContext_t         *psHciContext = \r
615                                 (phHciNfc_sContext_t *)psContext ;\r
616     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)\r
617         || (length == 0))\r
618     {\r
619         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
620     }\r
621     else if((NULL == psHciContext->p_reader_b_info) || \r
622         (HCI_READER_B_ENABLE != \r
623         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->\r
624         enable_rdr_b_gate))\r
625     {\r
626         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
627     }\r
628     else\r
629     {\r
630         phHciNfc_HCP_Packet_t       *p_packet = NULL;\r
631         phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
632         phHciNfc_HCP_Message_t      *message = NULL;\r
633         uint8_t                     instruction=0, \r
634                                     i = 0;\r
635 \r
636         p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
637                                     psHciContext->p_reader_b_info ;\r
638         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;\r
639         message = &p_packet->msg.message;\r
640         /* Get the instruction bits from the Message Header */\r
641         instruction = (uint8_t) GET_BITS8( message->msg_header,\r
642                         HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);\r
643 \r
644         if ((EVT_TARGET_DISCOVERED == instruction) \r
645             && ((RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i] ) \r
646             || (RDR_B_SINGLE_TAG_FOUND == message->payload[i])) \r
647             )\r
648         {\r
649             phNfc_sCompletionInfo_t pCompInfo;\r
650 \r
651             if (RDR_B_MULTIPLE_TAGS_FOUND == message->payload[i])\r
652             {\r
653                 p_rdr_b_info->multiple_tgts_found = RDR_B_MULTIPLE_TAGS_FOUND;\r
654                 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;\r
655             }\r
656             else\r
657             {\r
658                 p_rdr_b_info->multiple_tgts_found = FALSE;\r
659                 pCompInfo.status = NFCSTATUS_SUCCESS;\r
660             }\r
661 \r
662             psHciContext->host_rf_type = phHal_eISO14443_B_PCD;\r
663             p_rdr_b_info->reader_b_info.RemDevType = phHal_eISO14443_B_PICC;\r
664             p_rdr_b_info->current_seq = RDR_B_PUPI;\r
665 \r
666             /* Notify to the HCI Generic layer To Update the FSM */\r
667             phHciNfc_Notify_Event(psHciContext, pHwRef, \r
668                                     NFC_NOTIFY_TARGET_DISCOVERED, \r
669                                     &pCompInfo);\r
670 \r
671         }\r
672         else\r
673         {\r
674             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);\r
675         }\r
676     }\r
677     return status;\r
678 }\r
679 \r
680 static\r
681 NFCSTATUS\r
682 phHciNfc_ReaderB_InfoUpdate(\r
683                             phHciNfc_sContext_t     *psHciContext,\r
684                             uint8_t                 index,\r
685                             uint8_t                 *reg_value,\r
686                             uint8_t                 reg_length\r
687                             )\r
688 {\r
689     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
690     phHciNfc_ReaderB_Info_t     *p_rdr_b_info=NULL;\r
691     phHal_sIso14443BInfo_t      *p_tag_b_info = NULL;\r
692 \r
693     p_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
694                     (psHciContext->p_reader_b_info );\r
695     p_tag_b_info = &(p_rdr_b_info->reader_b_info.RemoteDevInfo.Iso14443B_Info);\r
696 \r
697     switch(index)\r
698     {\r
699         case RDR_B_PUPI_INDEX:\r
700         {\r
701             HCI_PRINT_BUFFER("\tReader B PUPI", reg_value, reg_length);\r
702             /* Update PUPI buffer and length in the remote device info, \r
703                 PUPI length is 4 bytes */\r
704             if(PHHAL_PUPI_LENGTH == reg_length)\r
705             {\r
706                 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.Pupi, \r
707                             (void *)reg_value, reg_length);\r
708             }\r
709             else\r
710             {\r
711                 status = PHNFCSTVAL(CID_NFC_HCI, \r
712                                     NFCSTATUS_INVALID_HCI_RESPONSE);\r
713             }\r
714             break;\r
715         }\r
716         case RDR_B_APP_DATA_INDEX:\r
717         {\r
718             HCI_PRINT_BUFFER("\tReader B Application data", reg_value, reg_length);\r
719             /* Update application data buffer and length, 3 bytes, \r
720                 this includes CRC_B and number of application \r
721              */\r
722             if(PHHAL_APP_DATA_B_LENGTH == reg_length)\r
723             {\r
724                 (void)memcpy((void *)p_tag_b_info->AtqB.AtqResInfo.AppData, \r
725                             (void *)reg_value, reg_length);\r
726             }\r
727             else\r
728             {\r
729                 status = PHNFCSTVAL(CID_NFC_HCI, \r
730                                     NFCSTATUS_INVALID_HCI_RESPONSE);\r
731             }\r
732             break;\r
733         }\r
734         case RDR_B_AFI_INDEX:\r
735         {\r
736             HCI_PRINT_BUFFER("\tReader B AFI", reg_value, reg_length);\r
737             /* Update AFI byte, Only one byte */\r
738             if(sizeof(*reg_value) == reg_length)\r
739             {\r
740                 p_tag_b_info->Afi = *reg_value;\r
741             }\r
742             else\r
743             {\r
744                 status = PHNFCSTVAL(CID_NFC_HCI, \r
745                                     NFCSTATUS_INVALID_HCI_RESPONSE);\r
746             }\r
747             break;\r
748         }\r
749 \r
750         case RDR_B_HIGHER_LAYER_RESP_INDEX:\r
751         {\r
752             HCI_PRINT_BUFFER("\tReader B higher layer response", reg_value, reg_length);\r
753             /* Update higher layer response buffer and length */\r
754             if (reg_length <= PHHAL_MAX_ATR_LENGTH)\r
755             {\r
756                 (void)memcpy((void *)p_tag_b_info->HiLayerResp, \r
757                                 (void *)reg_value, reg_length);\r
758             }\r
759             else\r
760             {\r
761                 status = PHNFCSTVAL(CID_NFC_HCI, \r
762                                     NFCSTATUS_INVALID_HCI_RESPONSE);\r
763             }\r
764             break;\r
765         }\r
766 \r
767         case RDR_B_HIGHER_LAYER_DATA_INDEX:\r
768         {\r
769             HCI_PRINT_BUFFER("\tReader B higher layer data", reg_value, reg_length);\r
770             /* Update higher layer data buffer and length */\r
771             break;\r
772         }\r
773         default:\r
774         {\r
775             status = PHNFCSTVAL(CID_NFC_HCI, \r
776                                 NFCSTATUS_INVALID_HCI_RESPONSE);\r
777             break;\r
778         }\r
779     }\r
780     return status;\r
781 }\r
782 \r
783 \r
784 static\r
785 NFCSTATUS\r
786 phHciNfc_Recv_Iso_B_Packet(\r
787                            phHciNfc_sContext_t  *psHciContext,\r
788                            uint8_t              *pResponse,\r
789 #ifdef ONE_BYTE_LEN\r
790                            uint8_t             length\r
791 #else\r
792                            uint16_t            length\r
793 #endif\r
794                            )\r
795 {\r
796     NFCSTATUS       status = NFCSTATUS_SUCCESS;\r
797     uint8_t         i = 1;        \r
798     \r
799     psHciContext->rx_index = HCP_HEADER_LEN;\r
800     /* command WR_XCHG_DATA: so give ISO 14443-4B data to the upper layer */\r
801     HCI_PRINT_BUFFER("ISO 14443-4B Bytes received", pResponse, length); \r
802     if(FALSE != pResponse[(length - i)])\r
803     {\r
804         status = PHNFCSTVAL(CID_NFC_HCI, \r
805                             NFCSTATUS_RF_ERROR);\r
806     }\r
807     return status;\r
808 }\r
809 \r
810 \r
811 NFCSTATUS\r
812 phHciNfc_ReaderB_Set_AFI(\r
813                         void         *psContext,\r
814                         void         *pHwRef,\r
815                         uint8_t      afi_value\r
816                         )\r
817 {\r
818     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
819     phHciNfc_sContext_t         *psHciContext = \r
820                                 (phHciNfc_sContext_t *)psContext ;\r
821     if( (NULL == psHciContext) || (NULL == pHwRef))\r
822     {\r
823         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
824     }\r
825     else if((NULL == psHciContext->p_reader_b_info) || \r
826         (HCI_READER_B_ENABLE != \r
827         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->\r
828         enable_rdr_b_gate))\r
829     {\r
830         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
831     }\r
832     else\r
833     {\r
834         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;\r
835         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
836         uint8_t                     pipeid = 0;\r
837 \r
838         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
839                         psHciContext->p_reader_b_info ;\r
840         p_pipe_info = ps_rdr_b_info->p_pipe_info;\r
841         if(NULL == p_pipe_info )\r
842         {\r
843             status = PHNFCSTVAL(CID_NFC_HCI, \r
844                 NFCSTATUS_INVALID_HCI_SEQUENCE);\r
845         }\r
846         else\r
847         {\r
848             pipeid = ps_rdr_b_info->pipe_id ;\r
849             p_pipe_info->reg_index = RDR_B_AFI_INDEX;\r
850             \r
851             p_pipe_info->param_info = &afi_value;\r
852             p_pipe_info->param_length = sizeof(uint8_t); \r
853             /* Fill the data buffer and send the command to the \r
854             device */\r
855             status = \r
856                 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
857                                 pipeid, (uint8_t)ANY_SET_PARAMETER);\r
858         }\r
859     }\r
860     return status;\r
861 }\r
862 \r
863 NFCSTATUS\r
864 phHciNfc_ReaderB_Set_LayerData(\r
865                         void            *psContext,\r
866                         void            *pHwRef,\r
867                         phNfc_sData_t   *layer_data_info\r
868                         )\r
869 {\r
870     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
871     phHciNfc_sContext_t         *psHciContext = \r
872                                 (phHciNfc_sContext_t *)psContext ;\r
873 \r
874     if( (NULL == psHciContext) || (NULL == pHwRef) || \r
875         (NULL == layer_data_info) || (NULL == layer_data_info->buffer)\r
876         || (0 == layer_data_info->length))\r
877     {\r
878         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
879     }\r
880     else if((NULL == psHciContext->p_reader_b_info) || \r
881         (HCI_READER_B_ENABLE != \r
882         ((phHciNfc_ReaderB_Info_t *)(psHciContext->p_reader_b_info))->\r
883         enable_rdr_b_gate))\r
884     {\r
885         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
886     }\r
887     else\r
888     {\r
889         phHciNfc_ReaderB_Info_t     *ps_rdr_b_info=NULL;\r
890         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;\r
891         uint8_t                     pipeid = 0;\r
892 \r
893         ps_rdr_b_info = (phHciNfc_ReaderB_Info_t *)\r
894                         psHciContext->p_reader_b_info ;\r
895         p_pipe_info = ps_rdr_b_info->p_pipe_info;\r
896         if(NULL == p_pipe_info )\r
897         {\r
898             status = PHNFCSTVAL(CID_NFC_HCI, \r
899                 NFCSTATUS_INVALID_HCI_SEQUENCE);\r
900         }\r
901         else\r
902         {\r
903             p_pipe_info->reg_index = RDR_B_HIGHER_LAYER_DATA_INDEX;\r
904             pipeid = ps_rdr_b_info->pipe_id ;\r
905             p_pipe_info->param_info = (void *)layer_data_info->buffer;\r
906             p_pipe_info->param_length = (uint8_t)\r
907                                         layer_data_info->length;\r
908             /* Fill the data buffer and send the command to the \r
909             device */\r
910             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, \r
911                                 pipeid, (uint8_t)ANY_SET_PARAMETER);\r
912         }\r
913     }\r
914     return status;\r
915 }\r
916 #endif /* #if defined (TYPE_B) */\r
917 \r
918 \r