1 /*
2  * Copyright (C) 2010 NXP Semiconductors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*!
18 * =========================================================================== *
19 *                                                                             *
20 *                                                                             *
21 * \file  phHciNfc_NfcIPMgmt.c                                                 *
22 * \brief HCI NFCIP-1 management routines.                                     *
23 *                                                                             *
24 *                                                                             *
25 * Project: NFC-FRI-1.1                                                        *
26 *                                                                             *
27 * $Date: Tue Jun  8 09:32:31 2010 $                                           *
28 * $Author: ing04880 $                                                         *
29 * $Revision: 1.33 $                                                           *
30 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
31 *                                                                             *
32 * =========================================================================== *
33 */
34 
35 /*
36 ***************************** Header File Inclusion ****************************
37 */
38 #include <phNfcCompId.h>
39 #include <phNfcHalTypes.h>
40 #include <phHciNfc_Pipe.h>
41 #include <phHciNfc_RFReader.h>
42 #include <phHciNfc_Emulation.h>
43 #include <phOsalNfc.h>
44 
45 #if defined (ENABLE_P2P)
46 #include <phHciNfc_NfcIPMgmt.h>
47 /*
48 ****************************** Macro Definitions *******************************
49 */
50 /* RF Error */
51 #define NFCIP_RF_NO_ERROR                   0x00U
52 #define NFCIP_STATUS_MAX_VALUE              0x01U
53 
54 /* Read and write to the below registry for initiator and target */
55 #define NXP_NFCIP_MODE                      0x01U
56 #define NXP_NFCIP_ATR_REQ                   0x02U
57 #define NXP_NFCIP_ATR_RES                   0x03U
58 #define NXP_NFCIP_PSL1                      0x04U
59 #define NXP_NFCIP_PSL2                      0x05U
60 #define NXP_NFCIP_DID                       0x06U
61 #define NXP_NFCIP_NAD                       0x07U
62 #define NXP_NFCIP_OPTIONS                   0x08U
63 #define NXP_NFCIP_STATUS                    0x09U
64 #define NXP_NFCIP_NFCID3I                   0x0AU
65 #define NXP_NFCIP_NFCID3T                   0x0BU
66 #define NXP_NFCIP_PARAM                     0x0CU
67 #define NXP_NFCIP_MERGE                     0x0DU
68 
69 /* command */
70 #define NXP_NFCIP_ATTREQUEST                0x12U
71 #define NXP_NFCI_CONTINUE_ACTIVATION        0x13U
72 
73 /* Event */
74 #define NXP_EVT_NFC_SND_DATA                0x01U
75 #define NXP_EVT_NFC_ACTIVATED               0x02U
76 #define NXP_EVT_NFC_DEACTIVATED             0x03U
77 #define NXP_EVT_NFC_RCV_DATA                0x04U
78 #define NXP_EVT_NFC_CONTINUE_MI             0x05U
79 
80 #define NFCIP_DATE_RATE_FACTOR              0x40U
81 #define NFCIP_DATE_RATE_SHIFT               0x06U
82 #define NFCIP_DATA_RATE_CALC(val) \
83         ((((uint8_t)(val) >> NFCIP_DATE_RATE_SHIFT) + \
84         0x01U) * NFCIP_DATE_RATE_FACTOR)
85 #define NFCIP_COMM_INITIATOR_SHIFT          0x03
86 #define NFCIP_COMM_FACTOR                   0x03
87 /*
88 *************************** Structure and Enumeration ***************************
89 */
90 
91 /*
92 *************************** Static Function Declaration **************************
93 */
94 static
95 NFCSTATUS
96 phHciNfc_NfcIP_InfoUpdate(
97                               phHciNfc_sContext_t     *psHciContext,
98                               uint8_t                 index,
99                               uint8_t                 *reg_value,
100                               uint8_t                 reg_length
101                               );
102 
103 static
104 NFCSTATUS
105 phHciNfc_NfcIP_RecvData(
106                         phHciNfc_sContext_t  *psHciContext,
107                         void                 *pHwRef,
108                         uint8_t              *pResponse,
109 #ifdef ONE_BYTE_LEN
110                         uint8_t              length
111 #else
112                         uint16_t             length
113 #endif
114                   );
115 
116 static
117 NFCSTATUS
118 phHciNfc_Recv_NfcIP_Response(
119                              phHciNfc_sContext_t    *psHciContext,
120                              phHciNfc_Pipe_Info_t   *ppipe_info,
121                              uint8_t                *pResponse,
122 #ifdef ONE_BYTE_LEN
123                              uint8_t                length
124 #else
125                              uint16_t               length
126 #endif
127                              );
128 
129 static
130 NFCSTATUS
131 phHciNfc_Recv_NfcIP_Event(
132                         phHciNfc_sContext_t     *psHciContext,
133                         void                    *pHwRef,
134                         uint8_t                 *pEvent,
135 #ifdef ONE_BYTE_LEN
136                         uint8_t                 length
137 #else
138                         uint16_t                length
139 #endif
140                         );
141 
142 static
143 NFCSTATUS
144 phHciNfc_Recv_Initiator_Event(
145                           void                  *psContext,
146                           void                  *pHwRef,
147                           uint8_t               *pEvent,
148 #ifdef ONE_BYTE_LEN
149                           uint8_t               length
150 #else
151                           uint16_t              length
152 #endif
153                           );
154 
155 static
156 NFCSTATUS
157 phHciNfc_Recv_Target_Event(
158                             void                    *psContext,
159                             void                    *pHwRef,
160                             uint8_t                 *pEvent,
161 #ifdef ONE_BYTE_LEN
162                             uint8_t                 length
163 #else
164                             uint16_t                length
165 #endif
166                             );
167 
168 static
169 NFCSTATUS
170 phHciNfc_Recv_Initiator_Response(
171                               void                  *psContext,
172                               void                  *pHwRef,
173                               uint8_t               *pResponse,
174 #ifdef ONE_BYTE_LEN
175                               uint8_t               length
176 #else
177                               uint16_t              length
178 #endif
179                               );
180 
181 static
182 NFCSTATUS
183 phHciNfc_Recv_Target_Response(
184                            void                 *psContext,
185                            void                 *pHwRef,
186                            uint8_t              *pResponse,
187 #ifdef ONE_BYTE_LEN
188                            uint8_t              length
189 #else
190                            uint16_t             length
191 #endif
192                            );
193 /*
194 *************************** Function Definitions ***************************
195 */
196 
197 NFCSTATUS
phHciNfc_Initiator_Init_Resources(phHciNfc_sContext_t * psHciContext)198 phHciNfc_Initiator_Init_Resources(
199                                   phHciNfc_sContext_t     *psHciContext
200                                   )
201 {
202     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
203     phHciNfc_NfcIP_Info_t       *p_init_info=NULL;
204     if( NULL == psHciContext )
205     {
206         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
207     }
208     else
209     {
210         if (NULL != psHciContext->p_nfcip_info)
211         {
212             status = NFCSTATUS_SUCCESS;
213         }
214         else if(( NULL == psHciContext->p_nfcip_info ) &&
215             (phHciNfc_Allocate_Resource((void **)(&p_init_info),
216             sizeof(phHciNfc_NfcIP_Info_t))== NFCSTATUS_SUCCESS)
217             )
218         {
219             psHciContext->p_nfcip_info = p_init_info;
220             p_init_info->nfcip_type = NFCIP_INVALID;
221             p_init_info->current_seq = NFCIP_INVALID_SEQUENCE;
222             p_init_info->next_seq = NFCIP_INVALID_SEQUENCE;
223             p_init_info->p_init_pipe_info = NULL;
224             p_init_info->p_tgt_pipe_info = NULL;
225         }
226         else
227         {
228             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
229         }
230 
231     }
232     return status;
233 }
234 
235 NFCSTATUS
phHciNfc_Initiator_Get_PipeID(phHciNfc_sContext_t * psHciContext,uint8_t * ppipe_id)236 phHciNfc_Initiator_Get_PipeID(
237                               phHciNfc_sContext_t     *psHciContext,
238                               uint8_t                 *ppipe_id
239                               )
240 {
241     NFCSTATUS       status = NFCSTATUS_SUCCESS;
242     if( (NULL != psHciContext)
243         && ( NULL != ppipe_id )
244         && ( NULL != psHciContext->p_nfcip_info )
245         )
246     {
247         phHciNfc_NfcIP_Info_t     *p_init_info=NULL;
248         p_init_info = (phHciNfc_NfcIP_Info_t *)
249                             psHciContext->p_nfcip_info ;
250         *ppipe_id =  p_init_info->p_init_pipe_info->pipe.pipe_id  ;
251     }
252     else
253     {
254         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
255     }
256     return status;
257 }
258 
259 NFCSTATUS
phHciNfc_Initiator_Update_PipeInfo(phHciNfc_sContext_t * psHciContext,uint8_t pipeID,phHciNfc_Pipe_Info_t * pPipeInfo)260 phHciNfc_Initiator_Update_PipeInfo(
261                                    phHciNfc_sContext_t     *psHciContext,
262                                    uint8_t                 pipeID,
263                                    phHciNfc_Pipe_Info_t    *pPipeInfo
264                                    )
265 {
266     NFCSTATUS       status = NFCSTATUS_SUCCESS;
267     if( NULL == psHciContext )
268     {
269         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
270     }
271     else if(NULL == psHciContext->p_nfcip_info)
272     {
273         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
274     }
275     else
276     {
277         phHciNfc_NfcIP_Info_t       *p_init_info=NULL;
278         p_init_info = (phHciNfc_NfcIP_Info_t *)
279                         psHciContext->p_nfcip_info ;
280         /* Update the pipe_id of the NFCIP-1 initiator Gate obtained from
281         the HCI Response */
282         p_init_info->p_init_pipe_info = pPipeInfo;
283         p_init_info->p_init_pipe_info->pipe.pipe_id = pipeID;
284         /* Update the Response Receive routine of the NFCIP-1 initiator Gate */
285         pPipeInfo->recv_resp = &phHciNfc_Recv_Initiator_Response;
286         /* Update the event Receive routine of the NFCIP-1 initiator Gate */
287         pPipeInfo->recv_event = &phHciNfc_Recv_Initiator_Event;
288     }
289     return status;
290 }
291 
292 NFCSTATUS
phHciNfc_NfcIP_Presence_Check(phHciNfc_sContext_t * psHciContext,void * pHwRef)293 phHciNfc_NfcIP_Presence_Check(
294                                 phHciNfc_sContext_t   *psHciContext,
295                                 void                  *pHwRef
296                                 )
297 {
298     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
299 
300     if( (NULL == psHciContext) || (NULL == pHwRef) )
301     {
302         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
303     }
304     else if((NULL == psHciContext->p_nfcip_info) ||
305         (NFCIP_INVALID ==
306         ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))->nfcip_type))
307     {
308         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
309     }
310     else
311     {
312         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
313         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
314 
315         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
316                         psHciContext->p_nfcip_info ;
317         p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)?
318                         p_nfcipinfo->p_init_pipe_info :
319                         p_nfcipinfo->p_tgt_pipe_info);
320 
321         if(NULL == p_pipe_info )
322         {
323             status = PHNFCSTVAL(CID_NFC_HCI,
324                                 NFCSTATUS_INVALID_HCI_INFORMATION);
325         }
326         else
327         {
328             phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
329             uint16_t                    length = HCP_HEADER_LEN;
330             uint8_t                     pipeid = 0;
331 
332             pipeid = p_pipe_info->pipe.pipe_id;
333             psHciContext->tx_total = 0 ;
334             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
335             /* Construct the HCP Frame */
336             phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT,
337                             (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_COMMAND,
338                             (uint8_t)NXP_NFCIP_ATTREQUEST);
339 
340             p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND;
341             p_pipe_info->prev_msg = (uint8_t)NXP_NFCIP_ATTREQUEST;
342             psHciContext->tx_total = length;
343             psHciContext->response_pending = (uint8_t)TRUE;
344 
345             /* Send the Constructed HCP packet to the lower layer */
346             status = phHciNfc_Send_HCP( psHciContext, pHwRef);
347             p_pipe_info->prev_status = status;
348         }
349     }
350     return status;
351 }
352 
353 static
354 NFCSTATUS
phHciNfc_Recv_Initiator_Response(void * pContext,void * pHwRef,uint8_t * pResponse,uint8_t length)355 phHciNfc_Recv_Initiator_Response(
356                                  void                *pContext,
357                                  void                *pHwRef,
358                                  uint8_t             *pResponse,
359 #ifdef ONE_BYTE_LEN
360                                  uint8_t             length
361 #else
362                                  uint16_t            length
363 #endif
364                               )
365 {
366     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
367     phHciNfc_sContext_t         *psHciContext =
368                                 (phHciNfc_sContext_t *)pContext ;
369 
370     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
371         || (0 == length))
372     {
373         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
374     }
375     else if(NULL == psHciContext->p_nfcip_info)
376     {
377         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
378     }
379     else
380     {
381         phHciNfc_NfcIP_Info_t   *p_nfcip_info=NULL;
382         phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
383 
384         p_nfcip_info = (phHciNfc_NfcIP_Info_t *)
385                         psHciContext->p_nfcip_info ;
386         p_pipe_info = p_nfcip_info->p_init_pipe_info;
387         if( NULL == p_pipe_info)
388         {
389             status = PHNFCSTVAL(CID_NFC_HCI,
390                                 NFCSTATUS_INVALID_HCI_INFORMATION);
391         }
392         else
393         {
394             status = phHciNfc_Recv_NfcIP_Response(psHciContext,
395                                                 p_pipe_info, pResponse,
396                                                 length);
397             if (NFCSTATUS_SUCCESS == status)
398             {
399                 status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext,
400                                                             UPDATE_SEQ);
401             }
402         }
403     }
404     return status;
405 }
406 
407 static
408 NFCSTATUS
phHciNfc_Recv_Initiator_Event(void * psContext,void * pHwRef,uint8_t * pEvent,uint8_t length)409 phHciNfc_Recv_Initiator_Event(
410                               void               *psContext,
411                               void               *pHwRef,
412                               uint8_t            *pEvent,
413 #ifdef ONE_BYTE_LEN
414                               uint8_t             length
415 #else
416                               uint16_t            length
417 #endif
418                               )
419 {
420     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
421     phHciNfc_sContext_t         *psHciContext =
422                                 (phHciNfc_sContext_t *)psContext ;
423     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
424         || (0 == length))
425     {
426         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
427     }
428     else if(NULL == psHciContext->p_nfcip_info)
429     {
430         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
431     }
432     else
433     {
434         phHciNfc_HCP_Packet_t       *p_packet = NULL;
435         phHciNfc_NfcIP_Info_t       *p_nfcip_info=NULL;
436         phHciNfc_HCP_Message_t      *message = NULL;
437         uint8_t                     instruction=0;
438 
439         p_nfcip_info = (phHciNfc_NfcIP_Info_t *)
440                         psHciContext->p_nfcip_info ;
441         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
442         message = &p_packet->msg.message;
443         /* Get the instruction bits from the Message Header */
444         instruction = (uint8_t) GET_BITS8( message->msg_header,
445                     HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
446         if (NXP_EVT_NFC_ACTIVATED == instruction)
447         {
448             p_nfcip_info->nfcip_type = NFCIP_INITIATOR;
449             psHciContext->host_rf_type = phHal_eNfcIP1_Initiator;
450             p_nfcip_info->rem_nfcip_tgt_info.RemDevType = phHal_eNfcIP1_Target;
451         }
452 
453         status = phHciNfc_Recv_NfcIP_Event(psHciContext,
454                                         pHwRef, pEvent, length);
455     }
456     return status;
457 }
458 
459 NFCSTATUS
phHciNfc_Target_Init_Resources(phHciNfc_sContext_t * psHciContext)460 phHciNfc_Target_Init_Resources(
461                                phHciNfc_sContext_t     *psHciContext
462                                )
463 {
464     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
465     phHciNfc_NfcIP_Info_t      *p_target_info=NULL;
466     if( NULL == psHciContext )
467     {
468         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
469     }
470     else
471     {
472         if (NULL != psHciContext->p_nfcip_info)
473         {
474             status = NFCSTATUS_SUCCESS;
475         }
476         else if(
477             ( NULL == psHciContext->p_nfcip_info ) &&
478             (phHciNfc_Allocate_Resource((void **)(&p_target_info),
479             sizeof(phHciNfc_NfcIP_Info_t))== NFCSTATUS_SUCCESS)
480             )
481         {
482             psHciContext->p_nfcip_info = p_target_info;
483             p_target_info->nfcip_type = NFCIP_INVALID;
484             p_target_info->current_seq = NFCIP_INVALID_SEQUENCE;
485             p_target_info->next_seq = NFCIP_INVALID_SEQUENCE;
486             p_target_info->p_tgt_pipe_info = NULL;
487             p_target_info->p_tgt_pipe_info = NULL;
488         }
489         else
490         {
491             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
492         }
493 
494     }
495     return status;
496 }
497 
498 NFCSTATUS
phHciNfc_Target_Get_PipeID(phHciNfc_sContext_t * psHciContext,uint8_t * ppipe_id)499 phHciNfc_Target_Get_PipeID(
500                            phHciNfc_sContext_t     *psHciContext,
501                            uint8_t                 *ppipe_id
502                            )
503 {
504     NFCSTATUS       status = NFCSTATUS_SUCCESS;
505     if( (NULL != psHciContext)
506         && ( NULL != ppipe_id )
507         && ( NULL != psHciContext->p_nfcip_info )
508         )
509     {
510         phHciNfc_NfcIP_Info_t     *p_target_info=NULL;
511         p_target_info = (phHciNfc_NfcIP_Info_t *)
512                             psHciContext->p_nfcip_info ;
513         *ppipe_id =  p_target_info->p_tgt_pipe_info->pipe.pipe_id;
514     }
515     else
516     {
517         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
518     }
519     return status;
520 }
521 
522 NFCSTATUS
phHciNfc_Target_Update_PipeInfo(phHciNfc_sContext_t * psHciContext,uint8_t pipeID,phHciNfc_Pipe_Info_t * pPipeInfo)523 phHciNfc_Target_Update_PipeInfo(
524                                 phHciNfc_sContext_t     *psHciContext,
525                                 uint8_t                 pipeID,
526                                 phHciNfc_Pipe_Info_t    *pPipeInfo
527                                 )
528 {
529     NFCSTATUS       status = NFCSTATUS_SUCCESS;
530     if( NULL == psHciContext )
531     {
532         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
533     }
534     else if(NULL == psHciContext->p_nfcip_info)
535     {
536         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
537     }
538     else
539     {
540         phHciNfc_NfcIP_Info_t       *p_target_info=NULL;
541         p_target_info = (phHciNfc_NfcIP_Info_t *)
542                         psHciContext->p_nfcip_info ;
543         /* Update the pipe_id of the NFCIP-1 target Gate obtained from
544         the HCI Response */
545         p_target_info->p_tgt_pipe_info = pPipeInfo;
546         p_target_info->p_tgt_pipe_info->pipe.pipe_id = pipeID;
547         /* Update the Response Receive routine of the NFCIP-1 target Gate */
548         pPipeInfo->recv_resp = &phHciNfc_Recv_Target_Response;
549         /* Update the event Receive routine of the NFCIP-1 target Gate */
550         pPipeInfo->recv_event = &phHciNfc_Recv_Target_Event;
551     }
552     return status;
553 }
554 
555 static
556 NFCSTATUS
phHciNfc_Recv_Target_Response(void * pContext,void * pHwRef,uint8_t * pResponse,uint8_t length)557 phHciNfc_Recv_Target_Response(
558                              void                *pContext,
559                              void                *pHwRef,
560                              uint8_t             *pResponse,
561 #ifdef ONE_BYTE_LEN
562                              uint8_t             length
563 #else
564                              uint16_t            length
565 #endif
566                              )
567 {
568     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
569     phHciNfc_sContext_t         *psHciContext =
570                                 (phHciNfc_sContext_t *)pContext ;
571 
572     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
573         || (0 == length))
574     {
575         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
576     }
577     else if(NULL == psHciContext->p_nfcip_info)
578     {
579         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
580     }
581     else
582     {
583         phHciNfc_NfcIP_Info_t   *p_nfcip_info=NULL;
584         phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;
585 
586         p_nfcip_info = (phHciNfc_NfcIP_Info_t *)
587                         psHciContext->p_nfcip_info ;
588         p_pipe_info = p_nfcip_info->p_tgt_pipe_info;
589         if( NULL == p_pipe_info)
590         {
591             status = PHNFCSTVAL(CID_NFC_HCI,
592                                 NFCSTATUS_INVALID_HCI_INFORMATION);
593         }
594         else
595         {
596             status = phHciNfc_Recv_NfcIP_Response(psHciContext,
597                                                 p_pipe_info, pResponse,
598                                                 length);
599             if (NFCSTATUS_SUCCESS == status)
600             {
601                 status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
602                                                     UPDATE_SEQ);
603             }
604         }
605     }
606     return status;
607 }
608 
609 static
610 NFCSTATUS
phHciNfc_Recv_Target_Event(void * psContext,void * pHwRef,uint8_t * pEvent,uint8_t length)611 phHciNfc_Recv_Target_Event(
612                            void                     *psContext,
613                            void                     *pHwRef,
614                            uint8_t                  *pEvent,
615 #ifdef ONE_BYTE_LEN
616                            uint8_t                  length
617 #else
618                            uint16_t                 length
619 #endif
620                            )
621 {
622     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
623     phHciNfc_sContext_t         *psHciContext =
624                                 (phHciNfc_sContext_t *)psContext ;
625     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
626         || (0 == length))
627     {
628         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
629     }
630     else if(NULL == psHciContext->p_nfcip_info)
631     {
632         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
633     }
634     else
635     {
636         phHciNfc_HCP_Packet_t       *p_packet = NULL;
637         phHciNfc_NfcIP_Info_t       *p_nfcip_info=NULL;
638         phHciNfc_HCP_Message_t      *message = NULL;
639         uint8_t                     instruction=0;
640 
641         p_nfcip_info = (phHciNfc_NfcIP_Info_t *)psHciContext->p_nfcip_info ;
642         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
643         message = &p_packet->msg.message;
644         /* Get the instruction bits from the Message Header */
645         instruction = (uint8_t) GET_BITS8( message->msg_header,
646                     HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
647         if (NXP_EVT_NFC_ACTIVATED == instruction)
648         {
649             p_nfcip_info->nfcip_type = NFCIP_TARGET;
650             psHciContext->host_rf_type = phHal_eNfcIP1_Target;
651             p_nfcip_info->rem_nfcip_tgt_info.RemDevType =
652                                             phHal_eNfcIP1_Initiator;
653         }
654         status = phHciNfc_Recv_NfcIP_Event(psHciContext,
655                                         pHwRef, pEvent, length);
656     }
657     return status;
658 }
659 
660 static
661 NFCSTATUS
phHciNfc_Recv_NfcIP_Response(phHciNfc_sContext_t * psHciContext,phHciNfc_Pipe_Info_t * ppipe_info,uint8_t * pResponse,uint8_t length)662 phHciNfc_Recv_NfcIP_Response(
663                              phHciNfc_sContext_t    *psHciContext,
664                              phHciNfc_Pipe_Info_t   *ppipe_info,
665                              uint8_t                *pResponse,
666 #ifdef ONE_BYTE_LEN
667                              uint8_t                length
668 #else
669                              uint16_t               length
670 #endif
671                              )
672 {
673     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
674     phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
675     uint8_t                     prev_cmd = ANY_GET_PARAMETER;
676 
677     p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
678                     psHciContext->p_nfcip_info ;
679     prev_cmd = ppipe_info->prev_msg ;
680     switch(prev_cmd)
681     {
682         case ANY_OPEN_PIPE:
683         {
684             HCI_PRINT("NFCIP-1 NFCIP open pipe complete\n");
685             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
686             break;
687         }
688         case ANY_CLOSE_PIPE:
689         {
690             HCI_PRINT("NFCIP-1 NFCIP close pipe complete\n");
691             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
692             break;
693         }
694         case ANY_GET_PARAMETER:
695         {
696             HCI_PRINT("NFCIP-1 NFCIP get parameter complete\n");
697             if (length >= HCP_HEADER_LEN)
698             {
699                 status = phHciNfc_NfcIP_InfoUpdate(psHciContext,
700                                     ppipe_info->reg_index,
701                                     &pResponse[HCP_HEADER_LEN],
702                                     (uint8_t)(length - HCP_HEADER_LEN));
703             }
704             else
705             {
706                 status = PHNFCSTVAL(CID_NFC_HCI,
707                                     NFCSTATUS_INVALID_HCI_RESPONSE);
708             }
709             break;
710         }
711         case ANY_SET_PARAMETER:
712         {
713             HCI_PRINT("NFCIP-1 NFCIP Parameter Set \n");
714             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
715             break;
716         }
717         case NXP_NFCI_CONTINUE_ACTIVATION:
718         case NXP_NFCIP_ATTREQUEST:
719         {
720             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
721             break;
722         }
723         default:
724         {
725             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
726             break;
727         }
728     }
729 
730     if( NFCSTATUS_SUCCESS == status )
731     {
732         ppipe_info->prev_status = NFCSTATUS_SUCCESS;
733         p_nfcipinfo->current_seq = p_nfcipinfo->next_seq;
734     }
735     return status;
736 }
737 
738 static
739 NFCSTATUS
phHciNfc_Recv_NfcIP_Event(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t * pEvent,uint8_t length)740 phHciNfc_Recv_NfcIP_Event(
741                           phHciNfc_sContext_t       *psHciContext,
742                           void                      *pHwRef,
743                           uint8_t                   *pEvent,
744 #ifdef ONE_BYTE_LEN
745                           uint8_t                   length
746 #else
747                           uint16_t                  length
748 #endif
749                           )
750 {
751     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
752     phHciNfc_HCP_Packet_t       *p_packet = NULL;
753     phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
754     phHciNfc_HCP_Message_t      *message = NULL;
755     phNfc_sCompletionInfo_t     pCompInfo;
756     uint8_t                     instruction=0;
757     uint8_t                     type = 0;
758 
759     p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
760                     psHciContext->p_nfcip_info ;
761     p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
762     message = &p_packet->msg.message;
763     /* Get the instruction bits from the Message Header */
764     instruction = (uint8_t) GET_BITS8( message->msg_header,
765                     HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
766 
767     switch(instruction)
768     {
769         case NXP_EVT_NFC_ACTIVATED:
770         {
771             HCI_PRINT("NFCIP-1 device discovered\n");
772 
773             if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)
774             {
775                 pCompInfo.info = &(p_nfcipinfo->rem_nfcip_tgt_info);
776                 type = NFC_NOTIFY_TARGET_DISCOVERED;
777             }
778             else
779             {
780                 type = NFC_NOTIFY_DEVICE_ACTIVATED;
781             }
782 
783             if(length > HCP_HEADER_LEN)
784             {
785                 HCI_DEBUG("NfcIP-1 activation mode : %d\n", pEvent[HCP_HEADER_LEN]);
786                 /* Mode indicates in which mode the current activation
787                     as be done
788                         - 0x00: Passive mode
789                         - 0x01: Active */
790                 p_nfcipinfo->activation_mode = pEvent[HCP_HEADER_LEN];
791             }
792             pCompInfo.status = NFCSTATUS_SUCCESS;
793             /* Notify to the HCI Generic layer To Update the FSM */
794             phHciNfc_Notify_Event(psHciContext, pHwRef,
795                                 type, &pCompInfo);
796             break;
797         }
798         case NXP_EVT_NFC_DEACTIVATED:
799         {
800             static phHal_sEventInfo_t   event_info;
801 
802             event_info.eventHost = phHal_eHostController;
803             event_info.eventType = NFC_EVT_DEACTIVATED;
804             p_nfcipinfo->activation_mode = FALSE;
805             if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)
806             {
807                 p_nfcipinfo->rem_nfcip_tgt_info.RemDevType =
808                                         phHal_eNfcIP1_Target;
809                 event_info.eventSource = phHal_eNfcIP1_Initiator;
810             }
811             else
812             {
813                 p_nfcipinfo->rem_nfcip_tgt_info.RemDevType =
814                                         phHal_eNfcIP1_Initiator;
815                 event_info.eventSource = phHal_eNfcIP1_Target;
816             }
817             /* Reset the sequence */
818             p_nfcipinfo->current_seq = NFCIP_NFCID3I;
819             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
820 
821             HCI_PRINT("NFCIP-1 Target Deactivated\n");
822             phHciNfc_Notify_Event(psHciContext, pHwRef,
823                                 NFC_NOTIFY_DEVICE_DEACTIVATED,
824                                 &event_info);
825             break;
826         }
827         case NXP_EVT_NFC_RCV_DATA:
828         {
829             status = phHciNfc_NfcIP_RecvData(psHciContext,
830                                 pHwRef,
831                                 &pEvent[HCP_HEADER_LEN],
832                                 (length - HCP_HEADER_LEN));
833             break;
834         }
835         case NXP_EVT_NFC_CONTINUE_MI:
836         {
837             /* psHciContext->response_pending = FALSE; */
838             psHciContext->event_pending = FALSE;
839             break;
840         }
841         default:
842         {
843             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
844             break;
845         }
846     }
847 
848     return status;
849 }
850 
851 static
852 NFCSTATUS
phHciNfc_NfcIP_RecvData(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t * pResponse,uint8_t length)853 phHciNfc_NfcIP_RecvData(
854                   phHciNfc_sContext_t  *psHciContext,
855                   void                 *pHwRef,
856                   uint8_t              *pResponse,
857 #ifdef ONE_BYTE_LEN
858                   uint8_t              length
859 #else
860                   uint16_t             length
861 #endif
862                   )
863 {
864     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
865     uint8_t                     index = 0;
866 
867     if( (NULL == psHciContext)
868         || (NULL == pHwRef)
869         || (NULL == pResponse)
870         || (0 == length))
871     {
872         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
873     }
874     else
875     {
876         phNfc_sTransactionInfo_t    transInfo;
877         phHciNfc_NfcIP_Info_t       *p_nfcipinfo = NULL;
878         uint8_t                     type = 0;
879 
880         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
881                         psHciContext->p_nfcip_info;
882         HCI_PRINT("NFCIP-1 received bytes :");
883         if (NFCIP_RF_NO_ERROR == pResponse[index])
884         {
885             HCI_PRINT_BUFFER("device ", &pResponse[index], (length - index));
886             transInfo.status = NFCSTATUS_SUCCESS;
887             index++;
888             if (TRUE == pResponse[index])
889             {
890                 /* Update the more information bit to the upper layer */
891                 transInfo.status = NFCSTATUS_MORE_INFORMATION;
892             }
893             index++;
894 
895 
896             transInfo.buffer = &pResponse[index];
897             transInfo.length = (length - index);
898             type = (uint8_t)NFC_NOTIFY_RECV_EVENT;
899         }
900         else
901         {
902             HCI_PRINT("NFCIP-1 receive RF ERROR ");
903             p_nfcipinfo->activation_mode = FALSE;
904             type = (uint8_t)NFC_NOTIFY_RECV_EVENT;
905             transInfo.status = NFCSTATUS_RF_TIMEOUT;
906             transInfo.buffer = NULL;
907             transInfo.length = 0;
908         }
909         status = NFCSTATUS_PENDING;
910         /* Event NXP_EVT_NFC_RCV_DATA: so give received data to
911            the upper layer */
912         phHciNfc_Notify_Event(psHciContext, pHwRef,
913                                 type,
914                                 &transInfo );
915     }
916     return status;
917 }
918 
919 NFCSTATUS
phHciNfc_NfcIP_Send_Data(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_XchgInfo_t * sData)920 phHciNfc_NfcIP_Send_Data (
921                          phHciNfc_sContext_t    *psHciContext,
922                          void                   *pHwRef,
923                          phHciNfc_XchgInfo_t    *sData
924                          )
925 {
926     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
927 
928     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == sData) ||
929         (NULL == sData->tx_buffer) || (0 == sData->tx_length))
930     {
931         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
932     }
933     else if((NULL == psHciContext->p_nfcip_info) ||
934         (NFCIP_INVALID ==
935         ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))->nfcip_type))
936     {
937         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
938     }
939     else
940     {
941         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
942         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
943 
944         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
945                         psHciContext->p_nfcip_info ;
946         p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)?
947                         p_nfcipinfo->p_init_pipe_info :
948                         p_nfcipinfo->p_tgt_pipe_info);
949 
950         if(NULL == p_pipe_info )
951         {
952             status = PHNFCSTVAL(CID_NFC_HCI,
953                                 NFCSTATUS_INVALID_HCI_INFORMATION);
954         }
955         else
956         {
957             phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
958             phHciNfc_HCP_Message_t      *hcp_message = NULL;
959             uint16_t                    length = HCP_HEADER_LEN;
960             uint8_t                     pipeid = 0,
961                                         i = 0;
962 
963             HCI_PRINT_BUFFER("HCI NFCIP-1 Send Data: ", sData->tx_buffer, sData->tx_length);
964 
965             psHciContext->tx_total = 0 ;
966             pipeid = p_pipe_info->pipe.pipe_id;
967             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
968             hcp_message = &(hcp_packet->msg.message);
969             hcp_message->payload[i] = sData->params.nfc_info.more_info;
970             i++;
971 
972             /* Construct the HCP Frame */
973             phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT,
974                             (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_EVENT,
975                             (uint8_t)NXP_EVT_NFC_SND_DATA);
976 
977             phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
978                             i, (uint8_t *)sData->tx_buffer,
979                             (uint8_t)sData->tx_length);
980 
981             length =(uint16_t)(length + i + sData->tx_length);
982 
983             p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_EVENT;
984             p_pipe_info->prev_msg = NXP_EVT_NFC_SND_DATA;
985             psHciContext->tx_total = length;
986             /* Send the Constructed HCP packet to the lower layer */
987             status = phHciNfc_Send_HCP( psHciContext, pHwRef);
988 #if !defined (ENABLE_CONTINUE_MI)
989             if ((TRUE == sData->params.nfc_info.more_info) &&
990                 (NFCSTATUS_PENDING == status))
991             {
992                 /* If more information bit is set, then wait for the event
993                     NXP_EVT_NFC_CONTINUE_MI */
994                 /* psHciContext->response_pending = TRUE; */
995                 psHciContext->event_pending = TRUE;
996             }
997 #endif /* #if defined (ENABLE_CONTINUE_MI) */
998             p_pipe_info->prev_status = status;
999         }
1000     }
1001     return status;
1002 }
1003 
1004 NFCSTATUS
phHciNfc_NfcIP_Info_Sequence(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t notify_reqd)1005 phHciNfc_NfcIP_Info_Sequence (
1006                                   phHciNfc_sContext_t   *psHciContext,
1007                                   void                  *pHwRef
1008 #ifdef NOTIFY_REQD
1009                                   ,
1010                                   uint8_t               notify_reqd
1011 #endif /* #ifdef NOTIFY_REQD */
1012                                   )
1013 {
1014     NFCSTATUS               status = NFCSTATUS_SUCCESS;
1015 
1016     if( (NULL == psHciContext)
1017         || (NULL == pHwRef)
1018         )
1019     {
1020         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1021     }
1022     else if((NULL == psHciContext->p_nfcip_info) ||
1023         (NFCIP_INVALID ==
1024         ((phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info))->
1025         nfcip_type))
1026     {
1027         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1028     }
1029     else
1030     {
1031         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1032         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1033 
1034         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1035                         psHciContext->p_nfcip_info ;
1036         p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)?
1037                         p_nfcipinfo->p_init_pipe_info:
1038                         p_nfcipinfo->p_tgt_pipe_info);
1039         if(NULL == p_pipe_info )
1040         {
1041             status = PHNFCSTVAL(CID_NFC_HCI,
1042                                 NFCSTATUS_INVALID_HCI_INFORMATION);
1043         }
1044         else
1045         {
1046             switch(p_nfcipinfo->current_seq)
1047             {
1048                 case NFCIP_NFCID3I:
1049                 {
1050                     p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NFCID3I;
1051                     /* Fill the data buffer and send the command to the
1052                     device */
1053                     status =
1054                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1055                                             p_pipe_info->pipe.pipe_id,
1056                                             ANY_GET_PARAMETER);
1057                     if(NFCSTATUS_PENDING == status )
1058                     {
1059                         p_nfcipinfo->next_seq = NFCIP_NFCID3T;
1060                     }
1061                     break;
1062                 }
1063                 case NFCIP_NFCID3T:
1064                 {
1065                     p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NFCID3T;
1066                     /* Fill the data buffer and send the command to the
1067                     device */
1068                     status =
1069                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1070                                                 p_pipe_info->pipe.pipe_id,
1071                                                 ANY_GET_PARAMETER);
1072                     if(NFCSTATUS_PENDING == status )
1073                     {
1074                         p_nfcipinfo->next_seq = NFCIP_PARAM;
1075                     }
1076                     break;
1077                 }
1078                 case NFCIP_PARAM:
1079                 {
1080                     p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PARAM;
1081                     /* Fill the data buffer and send the command to the
1082                     device */
1083                     status =
1084                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1085                                                 p_pipe_info->pipe.pipe_id,
1086                                                 ANY_GET_PARAMETER);
1087                     if(NFCSTATUS_PENDING == status )
1088                     {
1089                         p_nfcipinfo->next_seq = NFCIP_ATR_INFO;
1090                     }
1091                     break;
1092                 }
1093                 case NFCIP_ATR_INFO:
1094                 {
1095                     p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR ==
1096                             p_nfcipinfo->nfcip_type)?
1097                             NXP_NFCIP_ATR_RES :
1098                             NXP_NFCIP_ATR_REQ);
1099                     status =
1100                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1101                                                 p_pipe_info->pipe.pipe_id,
1102                                                 ANY_GET_PARAMETER);
1103 
1104                     if(NFCSTATUS_PENDING == status )
1105                     {
1106                         p_nfcipinfo->next_seq = NFCIP_STATUS;
1107                     }
1108                     break;
1109                 }
1110                 case NFCIP_STATUS:
1111                 {
1112                     p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_STATUS;
1113                     /* Fill the data buffer and send the command to the
1114                     device */
1115                     status =
1116                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1117                                                 p_pipe_info->pipe.pipe_id,
1118                                                 ANY_GET_PARAMETER);
1119                     if(NFCSTATUS_PENDING == status )
1120                     {
1121 #ifdef NOTIFY_REQD
1122                         if(FALSE == notify_reqd)
1123 #else /* #ifdef NOTIFY_REQD */
1124                         if (NULL != psHciContext->p_target_info)
1125 #endif /* #ifdef NOTIFY_REQD */
1126                         {
1127                             p_nfcipinfo->next_seq = NFCIP_NFCID3I;
1128                             status = NFCSTATUS_SUCCESS;
1129                         }
1130                         else
1131                         {
1132                             p_nfcipinfo->next_seq = NFCIP_END_SEQUENCE;
1133                         }
1134                     }
1135                     break;
1136                 }
1137                 case NFCIP_END_SEQUENCE:
1138                 {
1139                     phHal_uRemoteDevInfo_t          *rem_nfcipinfo = NULL;
1140 
1141                     if (NULL != psHciContext->p_target_info)
1142                     {
1143                         /* This is given to user */
1144                         rem_nfcipinfo =
1145                                 &(psHciContext->p_target_info->RemoteDevInfo);
1146                     }
1147                     else
1148                     {
1149                         rem_nfcipinfo =
1150                                 &(p_nfcipinfo->rem_nfcip_tgt_info.RemoteDevInfo);
1151                     }
1152 
1153                     /* Update maximum frame length */
1154                     rem_nfcipinfo->NfcIP_Info.MaxFrameLength =
1155                                         p_nfcipinfo->max_frame_len;
1156 
1157                     p_nfcipinfo->current_seq = NFCIP_NFCID3I;
1158                     p_nfcipinfo->next_seq = NFCIP_NFCID3I;
1159 
1160                     rem_nfcipinfo->NfcIP_Info.Nfcip_Active =
1161                                             p_nfcipinfo->activation_mode;
1162 
1163                     if (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)
1164                     {
1165                         phNfc_sCompletionInfo_t         CompInfo;
1166 
1167                         p_nfcipinfo->rem_nfcip_tgt_info.RemDevType =
1168                                                     phHal_eNfcIP1_Target;
1169 
1170                         /* Update initiator speed */
1171                         rem_nfcipinfo->NfcIP_Info.Nfcip_Datarate =
1172                                             (phHalNfc_eDataRate_t)
1173                                             (p_nfcipinfo->initiator_speed);
1174 
1175 
1176                         /* Update ATR info */
1177                         rem_nfcipinfo->NfcIP_Info.ATRInfo_Length =
1178                                                     p_nfcipinfo->atr_res_length;
1179                         (void)memcpy(
1180                                 (void *)rem_nfcipinfo->NfcIP_Info.ATRInfo,
1181                                 (void *)p_nfcipinfo->atr_res_info,
1182                                 rem_nfcipinfo->NfcIP_Info.ATRInfo_Length);
1183 
1184                         /* Update NFCID */
1185                         rem_nfcipinfo->NfcIP_Info.NFCID_Length =
1186                                         p_nfcipinfo->nfcid3i_length;
1187                         (void)memcpy(
1188                                 (void *)rem_nfcipinfo->NfcIP_Info.NFCID,
1189                                 (void *)p_nfcipinfo->nfcid3i,
1190                                 rem_nfcipinfo->NfcIP_Info.NFCID_Length);
1191 
1192                         CompInfo.status = status = NFCSTATUS_SUCCESS;
1193                         if (NULL != psHciContext->p_target_info)
1194                         {
1195                             CompInfo.info = &(psHciContext->p_target_info);
1196                         }
1197                         else
1198                         {
1199                             CompInfo.info = &(p_nfcipinfo->rem_nfcip_tgt_info);
1200                         }
1201                         /* Notify to the upper layer */
1202                         phHciNfc_Tag_Notify(psHciContext, pHwRef,
1203                                             NFC_NOTIFY_TARGET_DISCOVERED,
1204                                             &CompInfo);
1205                     }
1206                     else
1207                     {
1208                         static phHal_sEventInfo_t   event_info;
1209 
1210                         p_nfcipinfo->rem_nfcip_tgt_info.RemDevType =
1211                                                     phHal_eNfcIP1_Initiator;
1212 
1213                         /* Update target speed  */
1214                         rem_nfcipinfo->NfcIP_Info.Nfcip_Datarate =
1215                                             (phHalNfc_eDataRate_t)
1216                                             (p_nfcipinfo->target_speed);
1217                         /* Update ATR info */
1218                         rem_nfcipinfo->NfcIP_Info.ATRInfo_Length =
1219                                                     p_nfcipinfo->atr_req_length;
1220                         (void)memcpy(
1221                                 (void *)rem_nfcipinfo->NfcIP_Info.ATRInfo,
1222                                 (void *)p_nfcipinfo->atr_req_info,
1223                                 rem_nfcipinfo->NfcIP_Info.ATRInfo_Length);
1224 
1225                         /* Update NFCID */
1226                         rem_nfcipinfo->NfcIP_Info.NFCID_Length =
1227                                         p_nfcipinfo->nfcid3t_length;
1228                         (void)memcpy(
1229                                 (void *)rem_nfcipinfo->NfcIP_Info.NFCID,
1230                                 (void *)p_nfcipinfo->nfcid3t,
1231                                 rem_nfcipinfo->NfcIP_Info.NFCID_Length);
1232 
1233                         event_info.eventHost = phHal_eHostController;
1234                         event_info.eventType = NFC_EVT_ACTIVATED;
1235                         event_info.eventSource = phHal_eNfcIP1_Target;
1236                         event_info.eventInfo.pRemoteDevInfo =
1237                                             &(p_nfcipinfo->rem_nfcip_tgt_info);
1238 
1239                         phHciNfc_Target_Select_Notify((void *)psHciContext,
1240                                                     pHwRef,
1241                                                     NFC_NOTIFY_EVENT,
1242                                                     &(event_info));
1243                     }
1244                     break;
1245                 }
1246                 default:
1247                 {
1248                     status = PHNFCSTVAL(CID_NFC_HCI,
1249                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1250                     break;
1251                 }
1252             }
1253         }
1254     }
1255     return status;
1256 }
1257 
1258 static
1259 NFCSTATUS
phHciNfc_NfcIP_InfoUpdate(phHciNfc_sContext_t * psHciContext,uint8_t index,uint8_t * reg_value,uint8_t reg_length)1260 phHciNfc_NfcIP_InfoUpdate(
1261                           phHciNfc_sContext_t     *psHciContext,
1262                           uint8_t                 index,
1263                           uint8_t                 *reg_value,
1264                           uint8_t                 reg_length
1265                           )
1266 {
1267     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1268     phHciNfc_NfcIP_Info_t       *p_nfcipinfo = NULL;
1269     phHal_sNfcIPInfo_t          *p_rem_nfcipinfo = NULL;
1270 
1271     p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)(psHciContext->p_nfcip_info );
1272     p_rem_nfcipinfo = &(p_nfcipinfo->rem_nfcip_tgt_info.RemoteDevInfo.NfcIP_Info);
1273 
1274 
1275     switch(index)
1276     {
1277         case NXP_NFCIP_ATR_RES:
1278         {
1279             if (reg_length <= NFCIP_ATR_MAX_LENGTH)
1280             {
1281                 /* Remote device info provided by the user */
1282 
1283                 HCI_PRINT_BUFFER("\tNFCIP ATR_RES", reg_value, reg_length);
1284 
1285                 p_rem_nfcipinfo->ATRInfo_Length =
1286                 p_nfcipinfo->atr_res_length = reg_length;
1287 
1288                 (void)memcpy((void *)p_rem_nfcipinfo->ATRInfo,
1289                                     (void *)reg_value,
1290                                     p_rem_nfcipinfo->ATRInfo_Length);
1291 
1292                 (void)memcpy((void *)p_nfcipinfo->atr_res_info,
1293                                     (void *)reg_value,
1294                                     p_nfcipinfo->atr_res_length);
1295                 if (NULL != psHciContext->p_target_info)
1296                 {
1297                     phHal_sNfcIPInfo_t       *p_remtgt_info = NULL;
1298                     /* This is given to user */
1299                     p_remtgt_info =
1300                     &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info);
1301                     p_remtgt_info->ATRInfo_Length = reg_length;
1302                     (void)memcpy((void *)p_remtgt_info->ATRInfo,
1303                                         (void *)reg_value,
1304                                         p_remtgt_info->ATRInfo_Length);
1305                 }
1306             }
1307             else
1308             {
1309                 status = PHNFCSTVAL(CID_NFC_HCI,
1310                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1311             }
1312             break;
1313         }
1314         case NXP_NFCIP_STATUS:
1315         {
1316             if (sizeof(*reg_value) == reg_length)
1317 #ifdef STATUS_BUFFER_CHECK
1318                 && (*reg_value <= NFCIP_STATUS_MAX_VALUE))
1319 #endif /* #ifdef STATUS_ERROR */
1320             {
1321                 HCI_PRINT_BUFFER("\tNFCIP STATUS", reg_value, reg_length);
1322                 p_nfcipinfo->linkstatus = *reg_value;
1323             }
1324             else
1325             {
1326                 status = PHNFCSTVAL(CID_NFC_HCI,
1327                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1328             }
1329             break;
1330         }
1331         case NXP_NFCIP_NFCID3I:
1332         {
1333             if (reg_length <= NFCIP_NFCID_LENGTH)
1334             {
1335                 HCI_PRINT_BUFFER("\tNFCIP NFCID3I", reg_value, reg_length);
1336                 p_nfcipinfo->nfcid3i_length =
1337                 p_rem_nfcipinfo->NFCID_Length = reg_length;
1338                 (void)memcpy((void *)p_rem_nfcipinfo->NFCID,
1339                                     (void *)reg_value,
1340                                     p_rem_nfcipinfo->NFCID_Length);
1341                 (void)memcpy((void *)p_nfcipinfo->nfcid3i,
1342                                     (void *)reg_value,
1343                                     reg_length);
1344                 if ((NULL != psHciContext->p_target_info) &&
1345                     (NFCIP_INITIATOR == p_nfcipinfo->nfcip_type))
1346                 {
1347                     phHal_sNfcIPInfo_t       *p_remtgt_info = NULL;
1348                     /* This is given to user */
1349                     p_remtgt_info =
1350                     &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info);
1351                     p_remtgt_info->NFCID_Length = reg_length;
1352                     (void)memcpy((void *)p_remtgt_info->NFCID,
1353                                         (void *)reg_value,
1354                                         p_remtgt_info->NFCID_Length);
1355                 }
1356             }
1357             else
1358             {
1359                 status = PHNFCSTVAL(CID_NFC_HCI,
1360                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1361             }
1362             break;
1363         }
1364         case NXP_NFCIP_NFCID3T:
1365         {
1366             if (reg_length <= NFCIP_NFCID_LENGTH)
1367             {
1368                 HCI_PRINT_BUFFER("\tNFCIP NFCID3T", reg_value, reg_length);
1369                 p_nfcipinfo->nfcid3t_length =
1370                 p_rem_nfcipinfo->NFCID_Length = reg_length;
1371                 (void)memcpy((void *)p_rem_nfcipinfo->NFCID,
1372                                     (void *)reg_value,
1373                                     p_rem_nfcipinfo->NFCID_Length);
1374                 (void)memcpy((void *)p_nfcipinfo->nfcid3t,
1375                                     (void *)reg_value,
1376                                     reg_length);
1377                 if ((NULL != psHciContext->p_target_info) &&
1378                     (NFCIP_TARGET == p_nfcipinfo->nfcip_type))
1379                 {
1380                     phHal_sNfcIPInfo_t       *p_remtgt_info = NULL;
1381                     /* This is given to user */
1382                     p_remtgt_info =
1383                     &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info);
1384                     p_remtgt_info->NFCID_Length = reg_length;
1385                     (void)memcpy((void *)p_remtgt_info->NFCID,
1386                                         (void *)reg_value,
1387                                         p_remtgt_info->NFCID_Length);
1388                 }
1389             }
1390             else
1391             {
1392                 status = PHNFCSTVAL(CID_NFC_HCI,
1393                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1394             }
1395             break;
1396         }
1397         case NXP_NFCIP_PARAM:
1398         {
1399             if (sizeof(*reg_value) == reg_length)
1400             {
1401                 HCI_PRINT_BUFFER("\tNFCIP PARAMS", reg_value, reg_length);
1402                 p_nfcipinfo->initiator_speed = (phHciNfc_eP2PSpeed_t)
1403                                 ((*reg_value >> NFCIP_COMM_INITIATOR_SHIFT)
1404                                 & NFCIP_COMM_FACTOR);
1405                 if (p_nfcipinfo->nfcip_type == NFCIP_INITIATOR) {
1406                     switch(p_nfcipinfo->initiator_speed) {
1407                         case phNfc_eDataRate_106:
1408                             ALOGI("I'm P2P %s Initiator @ 106 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1409                             break;
1410                         case phNfc_eDataRate_212:
1411                             ALOGI("I'm P2P %s Initiator @ 212 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1412                             break;
1413                         case phNfc_eDataRate_424:
1414                             ALOGI("I'm P2P %s Initiator @ 424 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1415                             break;
1416                     }
1417                 }
1418                 p_nfcipinfo->target_speed = (phHciNfc_eP2PSpeed_t)
1419                                 (*reg_value & NFCIP_COMM_FACTOR);
1420                 if (p_nfcipinfo->nfcip_type == NFCIP_TARGET) {
1421                     switch(p_nfcipinfo->target_speed) {
1422                         case phNfc_eDataRate_106:
1423                             ALOGI("I'm P2P %s Target @ 106 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1424                             break;
1425                         case phNfc_eDataRate_212:
1426                             ALOGI("I'm P2P %s Target @ 212 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1427                             break;
1428                         case phNfc_eDataRate_424:
1429                             ALOGI("I'm P2P %s Target @ 424 kb/s", p_nfcipinfo->activation_mode ? "Active" : "Passive");
1430                             break;
1431                     }
1432                 }
1433                 p_nfcipinfo->max_frame_len = NFCIP_DATA_RATE_CALC(*reg_value);
1434 
1435                 if (p_nfcipinfo->max_frame_len > NFCIP_MAX_DEP_REQ_HDR_LEN)
1436                 {
1437                     p_nfcipinfo->max_frame_len -= NFCIP_MAX_DEP_REQ_HDR_LEN;
1438 
1439                     if (NULL != psHciContext->p_target_info)
1440                     {
1441                         phHal_sNfcIPInfo_t       *p_remtgt_info = NULL;
1442                         /* This is given to user */
1443                         p_remtgt_info =
1444                         &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info);
1445                         p_remtgt_info->MaxFrameLength = p_nfcipinfo->max_frame_len;
1446                         p_remtgt_info->Nfcip_Datarate = (phHalNfc_eDataRate_t)
1447                                                 p_nfcipinfo->initiator_speed;
1448                     }
1449                 }
1450                 else
1451                 {
1452                     status = PHNFCSTVAL(CID_NFC_HCI,
1453                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1454                 }
1455             }
1456             else
1457             {
1458                 status = PHNFCSTVAL(CID_NFC_HCI,
1459                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1460             }
1461             break;
1462         }
1463         case NXP_NFCIP_MODE:
1464         {
1465             if (sizeof(*reg_value) == reg_length)
1466             {
1467                 HCI_PRINT_BUFFER("\tNFCIP MODE", reg_value, reg_length);
1468                 p_nfcipinfo->nfcip_mode = *reg_value;
1469             }
1470             else
1471             {
1472                 status = PHNFCSTVAL(CID_NFC_HCI,
1473                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1474             }
1475             break;
1476         }
1477         case NXP_NFCIP_ATR_REQ:
1478         {
1479             if (reg_length <= NFCIP_ATR_MAX_LENGTH)
1480             {
1481                 HCI_PRINT_BUFFER("\tNFCIP ATR_REQ", reg_value, reg_length);
1482                 p_rem_nfcipinfo->ATRInfo_Length =
1483                         p_nfcipinfo->atr_req_length = reg_length;
1484                 (void)memcpy((void *)p_rem_nfcipinfo->ATRInfo,
1485                                     (void *)reg_value,
1486                                     p_rem_nfcipinfo->ATRInfo_Length);
1487                 (void)memcpy((void *)p_nfcipinfo->atr_req_info,
1488                                     (void *)reg_value,
1489                                     p_nfcipinfo->atr_req_length);
1490                 if (NULL != psHciContext->p_target_info)
1491                 {
1492                     phHal_sNfcIPInfo_t       *p_remtgt_info = NULL;
1493                     /* This is given to user */
1494                     p_remtgt_info =
1495                     &(psHciContext->p_target_info->RemoteDevInfo.NfcIP_Info);
1496                     p_remtgt_info->NFCID_Length = reg_length;
1497                     (void)memcpy((void *)p_remtgt_info->ATRInfo,
1498                                         (void *)reg_value,
1499                                         p_remtgt_info->ATRInfo_Length);
1500                 }
1501             }
1502             else
1503             {
1504                 status = PHNFCSTVAL(CID_NFC_HCI,
1505                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1506             }
1507             break;
1508         }
1509         case NXP_NFCIP_PSL1:
1510         {
1511             if (sizeof(*reg_value) == reg_length)
1512             {
1513                 HCI_PRINT_BUFFER("\tNFCIP PSL1", reg_value, reg_length);
1514                 p_nfcipinfo->psl1 = *reg_value;
1515             }
1516             else
1517             {
1518                 status = PHNFCSTVAL(CID_NFC_HCI,
1519                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1520             }
1521             break;
1522         }
1523         case NXP_NFCIP_PSL2:
1524         {
1525             if (sizeof(*reg_value) == reg_length)
1526             {
1527                 HCI_PRINT_BUFFER("\tNFCIP PSL2", reg_value, reg_length);
1528                 p_nfcipinfo->psl2 = *reg_value;
1529             }
1530             else
1531             {
1532                 status = PHNFCSTVAL(CID_NFC_HCI,
1533                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1534             }
1535             break;
1536         }
1537         case NXP_NFCIP_DID:
1538         {
1539             if (sizeof(*reg_value) == reg_length)
1540             {
1541                 HCI_PRINT_BUFFER("\tNFCIP DID", reg_value, reg_length);
1542                 p_nfcipinfo->did = *reg_value;
1543             }
1544             else
1545             {
1546                 status = PHNFCSTVAL(CID_NFC_HCI,
1547                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1548             }
1549             break;
1550         }
1551         case NXP_NFCIP_NAD:
1552         {
1553             if (sizeof(*reg_value) == reg_length)
1554             {
1555                 HCI_PRINT_BUFFER("\tNFCIP NAD", reg_value, reg_length);
1556                 p_nfcipinfo->nad = *reg_value;
1557             }
1558             else
1559             {
1560                 status = PHNFCSTVAL(CID_NFC_HCI,
1561                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1562             }
1563             break;
1564         }
1565         case NXP_NFCIP_OPTIONS:
1566         {
1567             if (sizeof(*reg_value) == reg_length)
1568             {
1569                 HCI_PRINT_BUFFER("\tNFCIP OPTIONS", reg_value, reg_length);
1570                 p_nfcipinfo->options = *reg_value;
1571             }
1572             else
1573             {
1574                 status = PHNFCSTVAL(CID_NFC_HCI,
1575                                     NFCSTATUS_INVALID_HCI_RESPONSE);
1576             }
1577             break;
1578         }
1579         default:
1580         {
1581             status = PHNFCSTVAL(CID_NFC_HCI,
1582                                 NFCSTATUS_INVALID_HCI_RESPONSE);
1583             break;
1584         }
1585     }
1586     return status;
1587 }
1588 
1589 
1590 NFCSTATUS
phHciNfc_NfcIP_SetMode(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype,uint8_t nfcip_mode)1591 phHciNfc_NfcIP_SetMode(
1592                         phHciNfc_sContext_t     *psHciContext,
1593                         void                    *pHwRef,
1594                         phHciNfc_eNfcIPType_t   nfciptype,
1595                         uint8_t                 nfcip_mode
1596                         )
1597 {
1598     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1599 
1600     if( (NULL == psHciContext) || (NULL == pHwRef) ||
1601         (nfcip_mode > (uint8_t)NFCIP_MODE_ALL))
1602     {
1603         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1604     }
1605     else if (NFCIP_INVALID == nfciptype)
1606     {
1607         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1608     }
1609     else if(NULL == psHciContext->p_nfcip_info)
1610     {
1611         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1612     }
1613     else
1614     {
1615         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1616         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1617         uint8_t                     pipeid = 0;
1618 
1619         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1620                         psHciContext->p_nfcip_info ;
1621         p_pipe_info = ((NFCIP_INITIATOR == nfciptype)?
1622                         p_nfcipinfo->p_init_pipe_info:
1623                         p_nfcipinfo->p_tgt_pipe_info);
1624 
1625         if(NULL == p_pipe_info )
1626         {
1627             status = PHNFCSTVAL(CID_NFC_HCI,
1628                                 NFCSTATUS_INVALID_HCI_INFORMATION);
1629         }
1630         else
1631         {
1632             pipeid = p_pipe_info->pipe.pipe_id ;
1633             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_MODE;
1634 
1635             p_pipe_info->param_info = &nfcip_mode;
1636             p_pipe_info->param_length = sizeof(uint8_t);
1637             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1638                                     pipeid, (uint8_t)ANY_SET_PARAMETER);
1639         }
1640     }
1641     return status;
1642 }
1643 
1644 NFCSTATUS
phHciNfc_NfcIP_SetNAD(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype,uint8_t nad)1645 phHciNfc_NfcIP_SetNAD(
1646                        phHciNfc_sContext_t      *psHciContext,
1647                        void                     *pHwRef,
1648                        phHciNfc_eNfcIPType_t    nfciptype,
1649                        uint8_t                  nad
1650                        )
1651 {
1652     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1653 
1654     if( (NULL == psHciContext) || (NULL == pHwRef))
1655     {
1656         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1657     }
1658     else if (NFCIP_INVALID == nfciptype)
1659     {
1660         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1661     }
1662     else if(NULL == psHciContext->p_nfcip_info)
1663     {
1664         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1665     }
1666     else
1667     {
1668         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1669         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1670         uint8_t                     pipeid = 0;
1671 
1672         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1673                         psHciContext->p_nfcip_info ;
1674         p_pipe_info = ((NFCIP_INITIATOR == nfciptype)?
1675                         p_nfcipinfo->p_init_pipe_info:
1676                         p_nfcipinfo->p_tgt_pipe_info);
1677 
1678         if(NULL == p_pipe_info )
1679         {
1680             status = PHNFCSTVAL(CID_NFC_HCI,
1681                                 NFCSTATUS_INVALID_HCI_INFORMATION);
1682         }
1683         else
1684         {
1685             pipeid = p_pipe_info->pipe.pipe_id ;
1686             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_NAD;
1687 
1688             p_pipe_info->param_info = &nad;
1689             p_pipe_info->param_length = sizeof(uint8_t);
1690             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1691                                     pipeid, (uint8_t)ANY_SET_PARAMETER);
1692         }
1693     }
1694     return status;
1695 }
1696 
1697 NFCSTATUS
phHciNfc_NfcIP_SetDID(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t did)1698 phHciNfc_NfcIP_SetDID(
1699                       phHciNfc_sContext_t   *psHciContext,
1700                       void                  *pHwRef,
1701                       uint8_t               did
1702                       )
1703 {
1704     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1705 
1706     if( (NULL == psHciContext) || (NULL == pHwRef))
1707     {
1708         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1709     }
1710     else if(NULL == psHciContext->p_nfcip_info)
1711     {
1712         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1713     }
1714     else
1715     {
1716         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1717         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1718         uint8_t                     pipeid = 0;
1719 
1720         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1721                         psHciContext->p_nfcip_info ;
1722         p_pipe_info = p_nfcipinfo->p_init_pipe_info;
1723 
1724         if(NULL == p_pipe_info )
1725         {
1726             status = PHNFCSTVAL(CID_NFC_HCI,
1727                                 NFCSTATUS_INVALID_HCI_INFORMATION);
1728         }
1729         else
1730         {
1731             pipeid = p_pipe_info->pipe.pipe_id ;
1732             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_DID;
1733 
1734             p_pipe_info->param_info = &did;
1735             p_pipe_info->param_length = sizeof(uint8_t);
1736             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1737                                         pipeid, (uint8_t)ANY_SET_PARAMETER);
1738         }
1739     }
1740     return status;
1741 }
1742 
1743 NFCSTATUS
phHciNfc_NfcIP_SetOptions(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype,uint8_t nfcip_options)1744 phHciNfc_NfcIP_SetOptions(
1745                       phHciNfc_sContext_t       *psHciContext,
1746                       void                      *pHwRef,
1747                       phHciNfc_eNfcIPType_t     nfciptype,
1748                       uint8_t                   nfcip_options
1749                       )
1750 {
1751     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1752 
1753     if( (NULL == psHciContext) || (NULL == pHwRef))
1754     {
1755         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1756     }
1757     else if (NFCIP_INVALID == nfciptype)
1758     {
1759         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1760     }
1761     else if(NULL == psHciContext->p_nfcip_info)
1762     {
1763         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1764     }
1765     else
1766     {
1767         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1768         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1769         uint8_t                     pipeid = 0;
1770 
1771         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1772                         psHciContext->p_nfcip_info ;
1773         p_pipe_info = ((NFCIP_INITIATOR == p_nfcipinfo->nfcip_type)?
1774                         p_nfcipinfo->p_init_pipe_info:
1775                         p_nfcipinfo->p_tgt_pipe_info);
1776         pipeid = p_pipe_info->pipe.pipe_id ;
1777         p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_OPTIONS;
1778 
1779         p_pipe_info->param_info = &nfcip_options;
1780         p_pipe_info->param_length = sizeof(uint8_t);
1781         status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1782                                 pipeid, (uint8_t)ANY_SET_PARAMETER);
1783     }
1784     return status;
1785 }
1786 
1787 NFCSTATUS
phHciNfc_NfcIP_SetATRInfo(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype,phHal_sNfcIPCfg_t * atr_info)1788 phHciNfc_NfcIP_SetATRInfo(
1789                           phHciNfc_sContext_t       *psHciContext,
1790                           void                      *pHwRef,
1791                           phHciNfc_eNfcIPType_t     nfciptype,
1792                           phHal_sNfcIPCfg_t         *atr_info
1793                           )
1794 {
1795     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1796 
1797     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == atr_info) ||
1798         (atr_info->generalBytesLength > NFCIP_ATR_MAX_LENGTH))
1799     {
1800         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1801     }
1802     else if (NFCIP_INVALID == nfciptype)
1803     {
1804         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1805     }
1806     else if(NULL == psHciContext->p_nfcip_info)
1807     {
1808         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1809     }
1810     else
1811     {
1812         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1813         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1814         uint8_t                     pipeid = 0;
1815 
1816         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1817                     psHciContext->p_nfcip_info ;
1818         p_pipe_info = ((NFCIP_INITIATOR == nfciptype)?
1819                         p_nfcipinfo->p_init_pipe_info:
1820                         p_nfcipinfo->p_tgt_pipe_info);
1821 
1822         if(NULL == p_pipe_info )
1823         {
1824             status = PHNFCSTVAL(CID_NFC_HCI,
1825                 NFCSTATUS_INVALID_HCI_INFORMATION);
1826         }
1827         else
1828         {
1829             pipeid = p_pipe_info->pipe.pipe_id ;
1830             p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR == nfciptype)?
1831                                         NXP_NFCIP_ATR_REQ :
1832                                         NXP_NFCIP_ATR_RES);
1833 
1834             p_pipe_info->param_info = atr_info->generalBytes;
1835             p_pipe_info->param_length = (uint8_t)
1836                                         atr_info->generalBytesLength;
1837             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1838                                     pipeid, (uint8_t)ANY_SET_PARAMETER);
1839         }
1840     }
1841     return status;
1842 }
1843 
1844 NFCSTATUS
phHciNfc_NfcIP_SetPSL1(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t psl1)1845 phHciNfc_NfcIP_SetPSL1(
1846                           phHciNfc_sContext_t   *psHciContext,
1847                           void                  *pHwRef,
1848                           uint8_t               psl1
1849                           )
1850 {
1851     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1852 
1853     if( (NULL == psHciContext) || (NULL == pHwRef))
1854     {
1855         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1856     }
1857     else if(NULL == psHciContext->p_nfcip_info)
1858     {
1859         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1860     }
1861     else
1862     {
1863         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1864         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1865         uint8_t                     pipeid = 0;
1866 
1867         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1868                         psHciContext->p_nfcip_info ;
1869         p_pipe_info = p_nfcipinfo->p_init_pipe_info;
1870 
1871         if(NULL == p_pipe_info )
1872         {
1873             status = PHNFCSTVAL(CID_NFC_HCI,
1874                 NFCSTATUS_INVALID_HCI_INFORMATION);
1875         }
1876         else
1877         {
1878             pipeid = p_pipe_info->pipe.pipe_id ;
1879             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PSL1;
1880 
1881             p_pipe_info->param_info = &psl1;
1882             p_pipe_info->param_length = sizeof(uint8_t);
1883             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1884                                 pipeid, (uint8_t)ANY_SET_PARAMETER);
1885         }
1886     }
1887     return status;
1888 }
1889 
1890 NFCSTATUS
phHciNfc_NfcIP_SetPSL2(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t psl2)1891 phHciNfc_NfcIP_SetPSL2(
1892                        phHciNfc_sContext_t  *psHciContext,
1893                        void                 *pHwRef,
1894                        uint8_t              psl2
1895                           )
1896 {
1897     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1898 
1899     if( (NULL == psHciContext) || (NULL == pHwRef))
1900     {
1901         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1902     }
1903     else if(NULL == psHciContext->p_nfcip_info)
1904     {
1905         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1906     }
1907     else
1908     {
1909         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1910         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1911         uint8_t                     pipeid = 0;
1912 
1913         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1914                         psHciContext->p_nfcip_info ;
1915         p_pipe_info = p_nfcipinfo->p_init_pipe_info;
1916 
1917         if(NULL == p_pipe_info )
1918         {
1919             status = PHNFCSTVAL(CID_NFC_HCI,
1920                 NFCSTATUS_INVALID_HCI_INFORMATION);
1921         }
1922         else
1923         {
1924             pipeid = p_pipe_info->pipe.pipe_id ;
1925             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PSL2;
1926 
1927             p_pipe_info->param_info = &psl2;
1928             p_pipe_info->param_length = sizeof(uint8_t);
1929             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1930                                     pipeid, (uint8_t)ANY_SET_PARAMETER);
1931         }
1932     }
1933     return status;
1934 }
1935 
1936 NFCSTATUS
phHciNfc_NfcIP_GetStatus(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype)1937 phHciNfc_NfcIP_GetStatus(
1938                        phHciNfc_sContext_t      *psHciContext,
1939                        void                     *pHwRef,
1940                        phHciNfc_eNfcIPType_t    nfciptype
1941                           )
1942 {
1943     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1944 
1945     if( (NULL == psHciContext) || (NULL == pHwRef))
1946     {
1947         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1948     }
1949     else if (NFCIP_INVALID == nfciptype)
1950     {
1951         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
1952     }
1953     else if(NULL == psHciContext->p_nfcip_info)
1954     {
1955         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
1956     }
1957     else
1958     {
1959         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
1960         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
1961         uint8_t                     pipeid = 0;
1962 
1963         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
1964                         psHciContext->p_nfcip_info ;
1965         p_pipe_info =  ((NFCIP_INITIATOR == nfciptype)?
1966                         p_nfcipinfo->p_init_pipe_info :
1967                         p_nfcipinfo->p_tgt_pipe_info);
1968         if(NULL == p_pipe_info )
1969         {
1970             status = PHNFCSTVAL(CID_NFC_HCI,
1971                                 NFCSTATUS_INVALID_HCI_INFORMATION);
1972         }
1973         else
1974         {
1975             pipeid = p_pipe_info->pipe.pipe_id ;
1976             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_STATUS;
1977 
1978             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
1979                                         pipeid, (uint8_t)ANY_GET_PARAMETER);
1980         }
1981     }
1982     return status;
1983 }
1984 
1985 NFCSTATUS
phHciNfc_NfcIP_GetParam(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype)1986 phHciNfc_NfcIP_GetParam(
1987                          phHciNfc_sContext_t    *psHciContext,
1988                          void                   *pHwRef,
1989                          phHciNfc_eNfcIPType_t  nfciptype
1990                          )
1991 {
1992     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
1993 
1994     if( (NULL == psHciContext) || (NULL == pHwRef))
1995     {
1996         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
1997     }
1998     else if (NFCIP_INVALID == nfciptype)
1999     {
2000         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
2001     }
2002     else if(NULL == psHciContext->p_nfcip_info)
2003     {
2004         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2005     }
2006     else
2007     {
2008         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
2009         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
2010         uint8_t                     pipeid = 0;
2011 
2012         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
2013                         psHciContext->p_nfcip_info ;
2014         p_pipe_info =  ((NFCIP_INITIATOR == nfciptype)?
2015                         p_nfcipinfo->p_init_pipe_info :
2016                         p_nfcipinfo->p_tgt_pipe_info);
2017         if(NULL == p_pipe_info )
2018         {
2019             status = PHNFCSTVAL(CID_NFC_HCI,
2020                                 NFCSTATUS_INVALID_HCI_INFORMATION);
2021         }
2022         else
2023         {
2024             pipeid = p_pipe_info->pipe.pipe_id ;
2025             p_pipe_info->reg_index = (uint8_t)NXP_NFCIP_PARAM;
2026 
2027             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
2028                                     pipeid, (uint8_t)ANY_GET_PARAMETER);
2029         }
2030     }
2031     return status;
2032 }
2033 
2034 NFCSTATUS
phHciNfc_Initiator_Cont_Activate(phHciNfc_sContext_t * psHciContext,void * pHwRef)2035 phHciNfc_Initiator_Cont_Activate (
2036                                 phHciNfc_sContext_t       *psHciContext,
2037                                 void                      *pHwRef
2038                                 )
2039 {
2040     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
2041 
2042     if( (NULL == psHciContext) || (NULL == pHwRef) )
2043     {
2044         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2045     }
2046     else if(NULL == psHciContext->p_nfcip_info)
2047     {
2048         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2049     }
2050     else
2051     {
2052         phHciNfc_NfcIP_Info_t     *p_nfcipinfo = NULL;
2053         phHciNfc_Pipe_Info_t      *p_pipe_info=NULL;
2054 
2055         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
2056                         psHciContext->p_nfcip_info ;
2057         p_nfcipinfo->nfcip_type = NFCIP_INITIATOR;
2058         psHciContext->host_rf_type = phHal_eNfcIP1_Initiator;
2059         p_pipe_info =  p_nfcipinfo->p_init_pipe_info;
2060         if(NULL == p_pipe_info )
2061         {
2062             status = PHNFCSTVAL(CID_NFC_HCI,
2063                                 NFCSTATUS_INVALID_HCI_INFORMATION);
2064         }
2065         else
2066         {
2067             phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
2068             uint16_t                    length = HCP_HEADER_LEN;
2069             uint8_t                     pipeid = 0;
2070 
2071             pipeid = p_pipe_info->pipe.pipe_id;
2072             psHciContext->tx_total = 0 ;
2073             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
2074             /* Construct the HCP Frame */
2075             phHciNfc_Build_HCPFrame(hcp_packet,(uint8_t)HCP_CHAINBIT_DEFAULT,
2076                             (uint8_t) pipeid, (uint8_t)HCP_MSG_TYPE_COMMAND,
2077                             (uint8_t)NXP_NFCI_CONTINUE_ACTIVATION);
2078 
2079             p_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND;
2080             p_pipe_info->prev_msg = (uint8_t)NXP_NFCI_CONTINUE_ACTIVATION;
2081             psHciContext->tx_total = length;
2082             psHciContext->response_pending = (uint8_t)TRUE;
2083 
2084             /* Send the Constructed HCP packet to the lower layer */
2085             status = phHciNfc_Send_HCP( psHciContext, pHwRef);
2086             p_pipe_info->prev_status = status;
2087         }
2088     }
2089     return status;
2090 }
2091 
2092 
2093 NFCSTATUS
phHciNfc_NfcIP_GetATRInfo(phHciNfc_sContext_t * psHciContext,void * pHwRef,phHciNfc_eNfcIPType_t nfciptype)2094 phHciNfc_NfcIP_GetATRInfo (
2095                            phHciNfc_sContext_t      *psHciContext,
2096                            void                     *pHwRef,
2097                            phHciNfc_eNfcIPType_t    nfciptype
2098                            )
2099 {
2100     NFCSTATUS               status = NFCSTATUS_SUCCESS;
2101 
2102     if( (NULL == psHciContext)
2103         || (NULL == pHwRef))
2104     {
2105         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2106     }
2107     else if (NFCIP_INVALID == nfciptype)
2108     {
2109         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
2110     }
2111     else if(NULL == psHciContext->p_nfcip_info)
2112     {
2113         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2114     }
2115     else
2116     {
2117         phHciNfc_NfcIP_Info_t       *p_nfcipinfo=NULL;
2118         phHciNfc_Pipe_Info_t        *p_pipe_info=NULL;
2119         uint8_t                     pipeid = 0;
2120 
2121         p_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
2122                         psHciContext->p_nfcip_info ;
2123 
2124         p_pipe_info = ((NFCIP_INITIATOR == nfciptype)?
2125                         p_nfcipinfo->p_init_pipe_info :
2126                         p_nfcipinfo->p_tgt_pipe_info);
2127 
2128         if(NULL == p_pipe_info )
2129         {
2130             status = PHNFCSTVAL(CID_NFC_HCI,
2131                                 NFCSTATUS_INVALID_HCI_INFORMATION);
2132         }
2133         else
2134         {
2135             p_pipe_info->reg_index = (uint8_t)((NFCIP_INITIATOR == nfciptype)?
2136                                     NXP_NFCIP_ATR_RES :
2137                                     NXP_NFCIP_ATR_REQ);
2138             pipeid = p_pipe_info->pipe.pipe_id ;
2139             /* Fill the data buffer and send the command to the
2140                 device */
2141             status =
2142                 phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
2143                 pipeid, (uint8_t)ANY_GET_PARAMETER);
2144         }
2145     }
2146     return status;
2147 }
2148 
2149 NFCSTATUS
phHciNfc_NfcIP_SetMergeSak(phHciNfc_sContext_t * psHciContext,void * pHwRef,uint8_t sak_value)2150 phHciNfc_NfcIP_SetMergeSak(
2151                             phHciNfc_sContext_t     *psHciContext,
2152                             void                    *pHwRef,
2153                             uint8_t                 sak_value
2154                            )
2155 {
2156     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
2157 
2158     if( (NULL == psHciContext) || (NULL == pHwRef) ||
2159         (sak_value > (uint8_t)TRUE))
2160     {
2161         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
2162     }
2163     else if(NULL == psHciContext->p_nfcip_info)
2164     {
2165         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
2166     }
2167     else
2168     {
2169         phHciNfc_NfcIP_Info_t       *ps_nfcipinfo=NULL;
2170         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;
2171         uint8_t                     pipeid = 0;
2172 
2173         ps_nfcipinfo = (phHciNfc_NfcIP_Info_t *)
2174                         psHciContext->p_nfcip_info ;
2175         ps_pipe_info = ps_nfcipinfo->p_tgt_pipe_info;
2176 
2177         if(NULL == ps_pipe_info )
2178         {
2179             status = PHNFCSTVAL(CID_NFC_HCI,
2180                                 NFCSTATUS_INVALID_HCI_INFORMATION);
2181         }
2182         else
2183         {
2184             pipeid = ps_pipe_info->pipe.pipe_id ;
2185             ps_pipe_info->reg_index = (uint8_t)NXP_NFCIP_MERGE;
2186 
2187             ps_pipe_info->param_info = &sak_value;
2188             ps_pipe_info->param_length = sizeof(uint8_t);
2189             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
2190                                     pipeid, (uint8_t)ANY_SET_PARAMETER);
2191         }
2192     }
2193     return status;
2194 }
2195 
2196 #endif /* #if defined (ENABLE_P2P) */
2197 
2198