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*/
94static
95NFCSTATUS
96phHciNfc_NfcIP_InfoUpdate(
97                              phHciNfc_sContext_t     *psHciContext,
98                              uint8_t                 index,
99                              uint8_t                 *reg_value,
100                              uint8_t                 reg_length
101                              );
102
103static
104NFCSTATUS
105phHciNfc_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
116static
117NFCSTATUS
118phHciNfc_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
129static
130NFCSTATUS
131phHciNfc_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
142static
143NFCSTATUS
144phHciNfc_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
155static
156NFCSTATUS
157phHciNfc_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
168static
169NFCSTATUS
170phHciNfc_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
181static
182NFCSTATUS
183phHciNfc_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
197NFCSTATUS
198phHciNfc_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
235NFCSTATUS
236phHciNfc_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
259NFCSTATUS
260phHciNfc_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
292NFCSTATUS
293phHciNfc_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
353static
354NFCSTATUS
355phHciNfc_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
407static
408NFCSTATUS
409phHciNfc_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
459NFCSTATUS
460phHciNfc_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
498NFCSTATUS
499phHciNfc_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
522NFCSTATUS
523phHciNfc_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
555static
556NFCSTATUS
557phHciNfc_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
609static
610NFCSTATUS
611phHciNfc_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
660static
661NFCSTATUS
662phHciNfc_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
738static
739NFCSTATUS
740phHciNfc_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
851static
852NFCSTATUS
853phHciNfc_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
919NFCSTATUS
920phHciNfc_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
1004NFCSTATUS
1005phHciNfc_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
1258static
1259NFCSTATUS
1260phHciNfc_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
1590NFCSTATUS
1591phHciNfc_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
1644NFCSTATUS
1645phHciNfc_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
1697NFCSTATUS
1698phHciNfc_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
1743NFCSTATUS
1744phHciNfc_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
1787NFCSTATUS
1788phHciNfc_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
1844NFCSTATUS
1845phHciNfc_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
1890NFCSTATUS
1891phHciNfc_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
1936NFCSTATUS
1937phHciNfc_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
1985NFCSTATUS
1986phHciNfc_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
2034NFCSTATUS
2035phHciNfc_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
2093NFCSTATUS
2094phHciNfc_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
2149NFCSTATUS
2150phHciNfc_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