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_Generic.h                                                   *
22* \brief Common HCI Header for the Generic HCI Management.                    *
23*                                                                             *
24*                                                                             *
25* Project: NFC-FRI-1.1                                                        *
26*                                                                             *
27* $Date: Mon Mar 29 17:34:47 2010 $                                           *
28* $Author: ing04880 $                                                         *
29* $Revision: 1.73 $                                                           *
30* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
31*                                                                             *
32* =========================================================================== *
33*/
34
35/*@{*/
36#ifndef PHHCINFC_GENERIC_H
37#define PHHCINFC_GENERIC_H
38
39/*@}*/
40
41
42/**
43 *  \name HCI
44 *
45 * File: \ref phHciNfc_Generic.h
46 *
47 */
48/*@{*/
49#define PHHCINFC_GENERIC_FILEREVISION "$Revision: 1.73 $" /**< \ingroup grp_file_attributes */
50#define PHHCINFC_GENERIC_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"     /**< \ingroup grp_file_attributes */
51/*@}*/
52/*
53
54################################################################################
55***************************** Header File Inclusion ****************************
56################################################################################
57*/
58#define LOG_TAG "NFC-HCI"
59#include <cutils/log.h>
60#include <phNfcIoctlCode.h>
61#include<phNfcInterface.h>
62#include <phHciNfc.h>
63/*
64################################################################################
65****************************** Macro Definitions *******************************
66################################################################################
67*/
68
69#define Trace_buffer    phOsalNfc_DbgTraceBuffer
70
71/* HCI TRACE Macros */
72#if defined(HCI_TRACE)&& !defined(SILENT_HCI)
73#include <phOsalNfc.h>
74#include <stdio.h>
75extern char phOsalNfc_DbgTraceBuffer[];
76#define MAX_TRACE_BUFFER    150
77/* #define HCI_PRINT( str )  phOsalNfc_DbgTrace(str) */
78#define HCI_PRINT( str )  phOsalNfc_DbgString(str)
79#define HCI_DEBUG(...) ALOGD(__VA_ARGS__)
80
81
82
83
84#define HCI_PRINT_BUFFER(msg,buf,len)               \
85    {                                               \
86        snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\t %s:",msg); \
87        phOsalNfc_DbgString(Trace_buffer);              \
88        phOsalNfc_DbgTrace(buf,len);                \
89        phOsalNfc_DbgString("\r");                  \
90                                                    \
91    }
92#else
93#include <phDbgTrace.h>
94#if defined(PHDBG_TRACES) && !defined(HCI_TRACE)
95#define HCI_PRINT( str )  PHDBG_INFO(str)
96#define HCI_DEBUG(str, arg)
97#define HCI_PRINT_BUFFER(msg,buf,len)
98#else
99#define HCI_PRINT( str )
100#define HCI_DEBUG(...)
101#define HCI_PRINT_BUFFER(msg,buf,len)
102#endif  /* #if defined(PHDBG_TRACES) */
103/* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */
104
105#endif /* #if defined(HCI_TRACE) */
106
107#define ZERO                        0x00U
108
109
110#ifdef MASK_BITS
111#define BYTE_SIZE                   0x08U
112
113/* HCI GET and SET BITS Macros */
114#define MASK_BITS8(p,l) \
115                         ( ( (((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE )? \
116                          (~(0xFFU<<((p)+(l))) & (0xFFU<<(p))):(0U) )
117#ifdef MASK_BITS
118#define GET_BITS8(num,p,l) \
119                          ( ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \
120                           (((num)& (MASK_BITS8(p,l)))>>(p)):(0U) )
121#else
122#define GET_BITS8(num,p,l) \
123                          ( ((((p)+(l))<=BYTE_SIZE))? \
124                           (((num)>>(p))& (~(0xFFU<<(l)))):(0U) )
125#endif
126#define SET_BITS8(num,p,l,val) \
127                         (  ((((uint8_t)(p))+((uint8_t)(l)))<=BYTE_SIZE)? \
128                           (((num)& (~MASK_BITS8(p,l)))|((val)<<(p))):(0U))
129
130#endif
131
132/** \ingroup grp_hci_retval
133    The Corresponding HCI Gate Not Supported.
134 */
135#define NFCSTATUS_HCI_GATE_NOT_SUPPORTED    (0x71U)
136
137/** \ingroup grp_hci_retval
138    Invalid Command from the HCI Layer
139 */
140#define NFCSTATUS_INVALID_HCI_COMMAND       (0x72U)
141
142/** \ingroup grp_hci_retval
143    HCI Command not supported . */
144#define NFCSTATUS_COMMAND_NOT_SUPPORTED     (0x73U)
145
146/** \ingroup grp_hci_retval
147    Invalide Response from the HCI Layer
148 */
149#define NFCSTATUS_INVALID_HCI_RESPONSE      (0x74U)
150
151/** \ingroup grp_hci_retval
152    The Invalid Instruction type (Neither Command/Response nor Event ).
153 */
154#define NFCSTATUS_INVALID_HCI_INSTRUCTION   (0x75U)
155
156/** \ingroup grp_hci_retval
157    The Invalid Instruction type (Neither Command/Response nor Event ).
158 */
159#define NFCSTATUS_INVALID_HCI_INFORMATION   (0x76U)
160
161/** \ingroup grp_hci_retval
162    The Invalid HCI Sequence.
163 */
164#define NFCSTATUS_INVALID_HCI_SEQUENCE      (0x78U)
165
166
167/** \ingroup grp_hci_retval
168    The HCI Error Response with Response code.
169 */
170#define NFCSTATUS_HCI_RESPONSE(code)        (code)
171
172
173/* Length of the HCP and the HCP Message Header in Bytes */
174#define HCP_HEADER_LEN          0x02U
175
176/* Length of the HCP Message Header in Bytes */
177#define HCP_MESSAGE_LEN         0x01U
178
179/* HCP Header Chaining Bit Offset */
180#define HCP_CHAINBIT_OFFSET     0x07U
181/* HCP Header Chaining Bit Length */
182#define HCP_CHAINBIT_LEN        0x01U
183
184/* Chaining Bit Values */
185#define HCP_CHAINBIT_DEFAULT    0x01U
186#define HCP_CHAINBIT_BEGIN      0x00U
187#define HCP_CHAINBIT_END        HCP_CHAINBIT_DEFAULT
188
189/* HCP Header Pipe ID Offset */
190#define HCP_PIPEID_OFFSET       0x00U
191/* HCP Header Pipe ID Length */
192#define HCP_PIPEID_LEN          0x07U
193
194/* HCP Message Header Type  Offset */
195#define HCP_MSG_TYPE_OFFSET     0x06U
196/* HCP Message Header Type Length */
197#define HCP_MSG_TYPE_LEN        0x02U
198
199/* HCP Message Type Values */
200#define HCP_MSG_TYPE_COMMAND        0x00U
201#define HCP_MSG_TYPE_EVENT          0x01U
202#define HCP_MSG_TYPE_RESPONSE       0x02U
203#define HCP_MSG_TYPE_RESERVED       0x03U
204
205/* HCP Message Header Instruction  Offset */
206#define HCP_MSG_INSTRUCTION_OFFSET  0x00U
207/* HCP Message Header Instruction Length */
208#define HCP_MSG_INSTRUCTION_LEN     0x06U
209/* HCP Invalid Message Instruction */
210#define HCP_MSG_INSTRUCTION_INVALID 0x3FU
211
212
213/* HCP Packet Zero Length */
214#define HCP_ZERO_LEN                0x00U
215
216
217
218    /** \internal Generic HCI Commands for all the Gates */
219#define ANY_SET_PARAMETER                   0x01U
220#define ANY_GET_PARAMETER                   0x02U
221#define ANY_OPEN_PIPE                       0x03U
222#define ANY_CLOSE_PIPE                      0x04U
223#define ANY_GENERIC_CMD_RFU_B               0x05U
224#define ANY_GENERIC_CMD_RFU_E               0x0FU
225
226/*
227 *  0x05-0x0F is Reserved for Future Use
228 */
229
230/** \internal HCI Administration Com mands for the Management of the Host Network */
231
232#define ADM_CREATE_PIPE                     0x10U
233#define ADM_DELETE_PIPE                     0x11U
234#define ADM_NOTIFY_PIPE_CREATED             0x12U
235#define ADM_NOTIFY_PIPE_DELETED             0x13U
236#define ADM_CLEAR_ALL_PIPE                  0x14U
237#define ADM_NOTIFY_ALL_PIPE_CLEARED         0x15U
238#define ADM_CMD_RFU_B                       0x16U
239#define ADM_CMD_RFU_E                       0x3FU
240
241#define MSG_INSTRUCTION_UNKNWON             0x3FU
242
243    /*
244     *  0x16-0x3F is Reserved for Future Use
245     */
246
247
248/** \internal HCI Generic Responses from the Gates */
249#define ANY_OK                              0x00U
250#define ANY_E_NOT_CONNECTED                 0x01U
251#define ANY_E_CMD_PAR_UNKNOWN               0x02U
252#define ANY_E_NOK                           0x03U
253#define ANY_E_PIPES_FULL                    0x04U
254#define ANY_E_REG_PAR_UNKNOWN               0x05U
255#define ANY_E_PIPE_NOT_OPENED               0x06U
256#define ANY_E_CMD_NOT_SUPPORTED             0x07U
257#define ANY_E_INHIBITED                     0x08U
258#define ANY_E_TIMEOUT                       0x09U
259#define ANY_E_REG_ACCESS_DENIED             0x0AU
260#define ANY_E_PIPE_ACCESS_DENIED            0x0BU
261
262/* Response Error Code for RF Reader Gate */
263#define WR_RF_ERROR                         0x10U
264
265/*
266*  0x08, 0x0B-0x3F is Reserved for Future Use
267*/
268
269
270/** \internal HCI Generic Events from the Gates */
271#define EVT_HCI_END_OF_OPERATION    0x01
272#define EVT_POST_DATA               0x02
273#define EVT_HOT_PLUG                0x03
274
275
276/* Maximum Buffer Size for the HCI Data */
277#define PHHCINFC_MAX_BUFFERSIZE     (PHHAL_MAX_DATASIZE + 0x50U)
278
279#define PHHCINFC_MAX_OPENPIPE       0x6FU
280#define PHHCINFC_MAX_PIPE           0x6FU
281#define PHHCINFC_MIN_PIPE           0x02U
282
283
284/* Maximum Payload Length of HCI. */
285#define PHHCINFC_MAX_PACKET_DATA    0x1CU
286#define PHHCINFC_MAX_HCP_LEN        PHHCINFC_MAX_PACKET_DATA + 1
287
288
289
290/* Maximum Payload Length of HCI. */
291
292
293/*
294################################################################################
295******************** Enumeration and Structure Definition **********************
296################################################################################
297*/
298#if 1
299typedef NFCSTATUS (*pphHciNfc_Pipe_Receive_t) (
300                                                void *pContext,
301                                                void *pHwRef,
302                                                uint8_t *data,
303#ifdef ONE_BYTE_LEN
304                                                uint8_t length
305#else
306                                                uint16_t length
307#endif
308                                        );
309#else
310
311typedef pphNfcIF_Transact_t pphHciNfc_Pipe_Receive_t;
312
313#endif
314
315/** \defgroup grp_hci_nfc HCI Component
316 *
317 *
318 */
319
320typedef enum phHciNfc_HostID {
321    phHciNfc_HostControllerID                   = 0x00U,
322    phHciNfc_TerminalHostID                     = 0x01U,
323    phHciNfc_UICCHostID                         = 0x02U
324/*
325    phHciNfc_HostID_RFU_B                       = 0x03U,
326    phHciNfc_HostID_RFU_E                       = 0xBFU,
327    phHciNfc_HostIDProprietary_B                = 0xC0U,
328    phHciNfc_HostIDProprietary_E                = 0xFFU
329*/
330}phHciNfc_HostID_t;
331
332
333typedef enum phHciNfc_GateID{
334    phHciNfc_AdminGate                          = 0x00U,
335/*
336    phHciNfc_evGateIDProprietary_B              = 0x01U,
337    phHciNfc_evGateIDProprietary_E              = 0x03U,
338*/
339    phHciNfc_LoopBackGate                       = 0x04U,
340    phHciNfc_IdentityMgmtGate                   = 0x05U,
341    phHciNfc_LinkMgmtGate                       = 0x06U,
342/*
343    phHciNfc_GateID_RFU_B                       = 0x07U,
344    phHciNfc_GateID_RFU_E                       = 0x0FU,
345*/
346
347/*  TODO: Fillin Other Gate Information */
348    /* ETSI HCI Specific RF Reader Gates */
349    phHciNfc_RFReaderAGate                      = 0x13,
350    phHciNfc_RFReaderBGate                      = 0x11,
351
352    /* Proprietary Reader Gate */
353    phHciNfc_ISO15693Gate                       = 0x12,
354    phHciNfc_RFReaderFGate                      = 0x14,
355    phHciNfc_JewelReaderGate                    = 0x15,
356
357    /* ETSI HCI Card RF Gates */
358    phHciNfc_CETypeBGate                        = 0x21,
359    phHciNfc_CETypeBPrimeGate                   = 0x22,
360    phHciNfc_CETypeAGate                        = 0x23,
361    phHciNfc_CETypeFGate                        = 0x24,
362
363    /* NFC-IP1 Gates */
364    phHciNfc_NFCIP1InitRFGate                   = 0x30,
365    phHciNfc_NFCIP1TargetRFGate                 = 0x31,
366
367    /* ETSI HCI Connectivity Gate */
368    phHciNfc_ConnectivityGate                   = 0x41,
369
370
371    /*  Device Configuration Gates */
372    phHciNfc_PN544MgmtGate                      = 0x90,
373    phHciNfc_HostCommGate                       = 0x91,
374    phHciNfc_GPIOGate                           = 0x92,
375    phHciNfc_RFMgmtGate                         = 0x93,
376    phHciNfc_PollingLoopGate                    = 0x94,
377    phHciNfc_DownloadMgmtGate                   = 0x95,
378
379    /* Card Emulation Managment Gates */
380    phHciNfc_SwpMgmtGate                        = 0xA0,
381    phHciNfc_NfcWIMgmtGate                      = 0xA1,
382    phHciNfc_UnknownGate                        = 0xFF
383
384}phHciNfc_GateID_t;
385
386
387typedef enum phHciNfc_PipeID{
388    HCI_LINKMGMT_PIPE_ID                = 0x00U,
389    HCI_ADMIN_PIPE_ID                   = 0x01U,
390    HCI_DYNAMIC_PIPE_ID                 = 0x02U,
391    HCI_RESERVED_PIPE_ID                = 0x70U,
392    HCI_UNKNOWN_PIPE_ID                 = PHHCINFC_MAX_PIPE
393/*
394    phHciNfc_evOtherGatePipeID_B                = 0x02U,
395    phHciNfc_evOtherGatePipeID_E                = 0x6FU,
396    phHciNfc_evGatePipeID_RFU_B                 = 0x70U,
397    phHciNfc_evGatePipeID_RFU_E                 = 0x7FU,
398*/
399}phHciNfc_PipeID_t;
400
401
402typedef enum phHciNfc_eState {
403    hciState_Reset              = 0x00U,
404    hciState_Initialise,
405    hciState_Test,
406    hciState_Config,
407    hciState_IO,
408    hciState_Select,
409    hciState_Listen,
410    hciState_Activate,
411    hciState_Reactivate,
412    hciState_Connect,
413    hciState_Transact,
414    hciState_Disconnect,
415    hciState_Presence,
416    hciState_Release,
417    hciState_Unknown
418}phHciNfc_eState_t;
419
420typedef enum phHciNfc_eMode {
421    hciMode_Reset               = 0x00U,
422    hciMode_Session,
423    hciMode_Override,
424    hciMode_Test,
425    hciMode_Unknown
426}phHciNfc_eMode_t;
427
428
429typedef enum phHciNfc_eSeq{
430    /* HCI Admin Sequence */
431    ADMIN_INIT_SEQ              = 0x00U,
432    ADMIN_SESSION_SEQ,
433    ADMIN_CE_SEQ,
434    ADMIN_REL_SEQ,
435    ADMIN_EVT_HOTPLUG_SEQ,
436
437    /* HCI Link Management Sequence */
438    LINK_MGMT_INIT_SEQ,
439    LINK_MGMT_REL_SEQ,
440
441    /* HCI Identity Management Sequence */
442    IDENTITY_INIT_SEQ,
443    IDENTITY_INFO_SEQ,
444    IDENTITY_REL_SEQ,
445
446    /* HCI Polling Loop Sequence */
447    PL_INIT_SEQ,
448    PL_DURATION_SEQ,
449    PL_CONFIG_PHASE_SEQ,
450    PL_TGT_DISABLE_SEQ,
451    PL_RESTART_SEQ,
452    PL_STOP_SEQ,
453    PL_REL_SEQ,
454
455    /* HCI Device Management Sequence */
456    DEV_INIT_SEQ,
457    DEV_HAL_INFO_SEQ,
458    DEV_CONFIG_SEQ,
459    DEV_REL_SEQ,
460
461    /* HCI Reader Management Sequence */
462    READER_MGMT_INIT_SEQ,
463    READER_ENABLE_SEQ,
464    READER_SELECT_SEQ,
465    READER_REACTIVATE_SEQ,
466    READER_SW_AUTO_SEQ,
467    READER_PRESENCE_CHK_SEQ,
468    READER_UICC_DISPATCH_SEQ,
469    READER_DESELECT_SEQ,
470    READER_RESELECT_SEQ,
471    READER_DISABLE_SEQ,
472    READER_MGMT_REL_SEQ,
473
474    /* HCI NFC-IP1 Sequence */
475    NFCIP1_INIT_SEQ,
476    INITIATOR_SPEED_SEQ,
477    INITIATOR_GENERAL_SEQ,
478    TARGET_GENERAL_SEQ,
479    TARGET_SPEED_SEQ,
480    NFCIP1_REL_SEQ,
481
482    /* HCI Emulation Management Sequence */
483    EMULATION_INIT_SEQ,
484    EMULATION_SWP_SEQ,
485    EMULATION_CONFIG_SEQ,
486    EMULATION_REL_SEQ,
487
488    HCI_END_SEQ,
489    HCI_INVALID_SEQ
490} phHciNfc_eSeq_t;
491
492
493
494typedef enum phHciNfc_eSeqType{
495    RESET_SEQ                   = 0x00U,
496    INIT_SEQ,
497    UPDATE_SEQ,
498    INFO_SEQ,
499    CONFIG_SEQ,
500    REL_SEQ,
501    END_SEQ
502} phHciNfc_eSeqType_t;
503
504
505typedef enum phHciNfc_eConfigType{
506    INVALID_CFG                 = 0x00U,
507    POLL_LOOP_CFG,
508    SMX_WI_CFG,
509    SMX_WI_MODE,
510    UICC_SWP_CFG,
511    SWP_EVT_CFG,
512    SWP_PROTECT_CFG,
513    NFC_GENERAL_CFG,
514    NFC_TARGET_CFG,
515    NFC_CE_A_CFG,
516    NFC_CE_B_CFG
517} phHciNfc_eConfigType_t;
518
519
520typedef struct phHciNfc_HCP_Message{
521    /** \internal Identifies the Type and Kind of Instruction */
522    uint8_t     msg_header;
523    /** \internal Host Controller Protocol (HCP) Packet Message Payload */
524    uint8_t     payload[PHHCINFC_MAX_PACKET_DATA - 1];
525}phHciNfc_HCP_Message_t;
526
527
528typedef struct phHciNfc_HCP_Packet{
529    /** \internal Chaining Information and Pipe Identifier */
530    uint8_t     hcp_header;
531    /** \internal Host Controller Protocol (HCP) Packet Message or Payload */
532    union
533    {
534    /** \internal Host Controller Protocol (HCP) Packet Message */
535        phHciNfc_HCP_Message_t message;
536    /** \internal Host Controller Protocol (HCP) Packet Payload */
537        uint8_t payload[PHHCINFC_MAX_PACKET_DATA];
538    }msg;
539}phHciNfc_HCP_Packet_t;
540
541
542
543typedef struct phHciNfc_Gate_Info{
544    /** \internal HCI Host Identifier  */
545    uint8_t     host_id;
546    /** \internal HCI Gate Identifier  */
547    uint8_t     gate_id;
548}phHciNfc_Gate_Info_t;
549
550
551typedef struct phHciNfc_Pipe_Params{
552    /** \internal HCI Source Gate Information for the pipe  */
553    phHciNfc_Gate_Info_t    source;
554    /** \internal HCI Destination Gate Information for the pipe  */
555    phHciNfc_Gate_Info_t    dest;
556    /** \internal HCI Pipe Identifier  */
557    uint8_t                 pipe_id;
558}phHciNfc_Pipe_Params_t;
559
560
561typedef struct phHciNfc_Pipe_Info{
562    /** \internal Structure containing the created dynamic pipe information */
563    phHciNfc_Pipe_Params_t      pipe;
564    /** \internal Status of the previous command sent to this pipe */
565    NFCSTATUS                   prev_status;
566    /** \internal previous message type Sent to this pipe */
567    uint8_t                     sent_msg_type;
568    /** \internal Message type Received in this pipe */
569    uint8_t                     recv_msg_type;
570    /** \internal previous message sent to this pipe */
571    uint8_t                     prev_msg;
572    /** \internal Index of the previous Set/Get Parameter command
573     *  sent to this pipe */
574    uint8_t                     reg_index;
575    /** \internal length of Parameter of the Set/Get Parameter
576     *  command sent to this pipe */
577    uint16_t                    param_length;
578    /** \internal Parameter of the Set/Get Parameter command
579     *  sent to this pipe */
580    void                        *param_info;
581    /** \internal Pointer to a Pipe specific Receive Response function */
582    pphHciNfc_Pipe_Receive_t    recv_resp;
583    /** \internal Pointer to a Pipe specific Receive Event function */
584    pphHciNfc_Pipe_Receive_t    recv_event;
585    /** \internal Pointer to a Pipe specific Receive Command function */
586    pphHciNfc_Pipe_Receive_t    recv_cmd;
587}phHciNfc_Pipe_Info_t;
588
589
590typedef struct phHciNfc_sContext{
591    /** \internal HCI Layer Pointer from the upper layer for
592                        lower layer function registration */
593    phNfcLayer_sCfg_t           *p_hci_layer;
594    /** \internal Pointer to the upper layer context */
595    void                        *p_upper_context;
596    /** \internal Pointer to the Hardware Reference Sturcture */
597    phHal_sHwReference_t        *p_hw_ref;
598    /** \internal Pointer to the upper layer notification callback function */
599    pphNfcIF_Notification_CB_t  p_upper_notify;
600    /** \internal Structure to store the lower interface operations */
601    phNfc_sLowerIF_t            lower_interface;
602    /** \internal Execution Sequence using the HCI Context */
603    volatile phHciNfc_eSeq_t    hci_seq;
604
605    /** \internal State of the HCI Context */
606    volatile phNfc_sState_t     hci_state;
607
608    /** \internal Mode of HCI Initialisation */
609    phHciNfc_Init_t             init_mode;
610
611    /** \internal Memory Information for HCI Initialisation */
612    uint8_t                     hal_mem_info[NXP_HAL_MEM_INFO_SIZE];
613
614    /** \internal HCI Configuration Type */
615    phHciNfc_eConfigType_t      config_type;
616    /** \internal HCI SmartMX Mode Configuration */
617    phHal_eSmartMX_Mode_t       smx_mode;
618    /** \internal HCI Configuration Information */
619    void                        *p_config_params;
620
621    /** \internal Current RF Reader/Emulation Gate in Use */
622    phHal_eRFDevType_t          host_rf_type;
623
624    /** \internal Connected Target Information */
625    phHal_sRemoteDevInformation_t *p_target_info;
626
627    /** \internal Information of all the pipes created and opened */
628    phHciNfc_Pipe_Info_t        *p_pipe_list[PHHCINFC_MAX_PIPE+1];
629
630    /** \internal Tag */
631    phHciNfc_XchgInfo_t         *p_xchg_info;
632
633    /** \internal Information of the HCI Gates */
634    /** \internal HCI Admin Management Gate Information */
635    void                        *p_admin_info;
636    /** \internal HCI Link Management Gate Information */
637    void                        *p_link_mgmt_info;
638    /** \internal HCI Identity Management Gate Information */
639    void                        *p_identity_info;
640    /** \internal HCI Polling Loop Gate Information */
641    void                        *p_poll_loop_info;
642    /** \internal HCI NFC Device Management Information */
643    void                        *p_device_mgmt_info;
644    /** \internal HCI RF Reader Gates Management Information */
645    void                        *p_reader_mgmt_info;
646    /** \internal HCI Card Application Gates and Emulation
647                  Information */
648    void                        *p_emulation_mgmt_info;
649    /** \internal HCI RF Reader A Gate Information */
650    void                        *p_reader_a_info;
651#ifdef TYPE_B
652    /** \internal HCI RF Reader B Gate Information */
653    void                        *p_reader_b_info;
654#endif
655#ifdef TYPE_FELICA
656    /** \internal HCI Felica Reader Gate Information */
657    void                        *p_felica_info;
658#endif
659#ifdef TYPE_JEWEL
660    /** \internal HCI Jewel Reader Gate Information */
661    void                        *p_jewel_info;
662#endif
663#ifdef TYPE_ISO15693
664    /** \internal HCI ISO15693 Reader Gate Information */
665    void                        *p_iso_15693_info;
666#endif
667
668#ifdef ENABLE_P2P
669    /** \internal HCI NFC-IP1 Peer to Peer Information */
670    void                        *p_nfcip_info;
671#endif
672    /** \internal HCI Secure Element Management Information */
673    void                        *p_wi_info;
674    /** \internal HCI UICC Information */
675    void                        *p_uicc_info;
676    /** \internal HCI SWP Information */
677    void                        *p_swp_info;
678#ifdef HOST_EMULATION
679    /** \internal HCI Card Emulation A Gate Information */
680    void                        *p_ce_a_info;
681    /** \internal HCI Card Emulation B Gate Information */
682    void                        *p_ce_b_info;
683#endif
684
685    /** \internal HCI Packet Data to be sent to the lower layer */
686    phHciNfc_HCP_Packet_t       tx_packet;
687    /** \internal HCI Packet Data to be received from the lower layer */
688    phHciNfc_HCP_Packet_t       rx_packet;
689
690    /** \internal Previous Status (To Store the Error Status ) */
691    NFCSTATUS                   error_status;
692
693    /** \internal Pointer to HCI Send Buffer */
694    uint8_t                     send_buffer[PHHCINFC_MAX_BUFFERSIZE];
695    /** \internal Pointer to HCI Receive Buffer */
696    uint8_t                     recv_buffer[PHHCINFC_MAX_BUFFERSIZE];
697
698    /** \internal Total Number of bytes to be Sent */
699    volatile uint16_t           tx_total;
700    /** \internal Number of bytes Remaining to be Sent */
701    volatile uint16_t           tx_remain;
702    /** \internal Number of bytes sent */
703    volatile uint16_t           tx_sent;
704
705    volatile uint16_t           rx_index;
706
707    /** \internal Total Number of bytes received */
708    volatile uint16_t           rx_total;
709    /** \internal Number of bytes received */
710    volatile uint16_t           rx_recvd;
711    /** \internal Index of the received data in the
712    *   response packet
713    */
714
715    /** \internal Send HCP Chaining Information */
716    volatile uint8_t            tx_hcp_chaining;
717    /** \internal Send HCP  Fragment Index */
718    volatile uint16_t           tx_hcp_frgmnt_index;
719
720    /** \internal Receive HCP Chaining Information */
721    volatile uint8_t            rx_hcp_chaining;
722    /** \internal Receive HCP Fragment Index */
723    volatile uint16_t           rx_hcp_frgmnt_index;
724
725    /** \internal The Device under Test */
726    volatile uint8_t            hci_mode;
727    /** \internal Wait for Response if Response is Pending  */
728    volatile uint8_t            response_pending;
729    /** \internal Notify the Event if Notifcation is Pending  */
730    volatile uint8_t            event_pending;
731
732    /** \internal Pending Release of the detected Target */
733    uint8_t                     target_release;
734
735}phHciNfc_sContext_t;
736
737/*
738################################################################################
739*********************** Function Prototype Declaration *************************
740################################################################################
741*/
742
743
744/**
745 *
746 * \ingroup grp_hci_nfc
747 *
748 *  The phHciNfc_Receive function receives the HCI Events or Response from the
749 *  corresponding peripheral device, described by the HCI Context Structure.
750 *
751 *  \param[in]  psContext               psContext is the context of
752 *                                      the HCI Layer.
753 *  \param[in]  pHwRef                  pHwRef is the Information of
754 *                                      the Device Interface Link .
755 *  \param[out] pdata                   Pointer to the response buffer that
756 *                                      receives the response read.
757 *  \param[in] length                   Variable that receives
758 *                                      the number of bytes read.
759 *
760 *  \retval NFCSTATUS_PENDING           Data successfully read.
761 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
762 *                                      could not be interpreted properly.
763 *  \retval Other errors                Other related errors
764 *
765 */
766
767extern
768NFCSTATUS
769phHciNfc_Receive(
770                        void                *psContext,
771                        void                *pHwRef,
772                        uint8_t             *pdata,
773#ifdef ONE_BYTE_LEN
774                        uint8_t             length
775#else
776                        uint16_t            length
777#endif
778                );
779
780/**
781 * \ingroup grp_hci_nfc
782 *
783 *  The phHciNfc_Send_Complete function acknowledges the completion of the HCI
784 *  Commands sent to the device.
785 *
786 *  \param[in]  psContext               psContext is the context of
787 *                                      the HCI Layer.
788 *  \param[in]  pHwRef                  pHwRef is the Information of
789 *                                      the Device Interface Link .
790 *  \param[in]  pInfo                   Transaction information like
791 *                                      status and length after the
792 *                                      completion of the send.
793 *
794 *  \retval NONE.
795 *
796 */
797
798extern
799void
800phHciNfc_Send_Complete (
801                            void                    *psContext,
802                            void                    *pHwRef,
803                            phNfc_sTransactionInfo_t *pInfo
804                       );
805
806/**
807 * \ingroup grp_hci_nfc
808 *
809 *  The phHciNfc_Receive_Complete function acknowledges the completion of the HCI
810 *  Event Information or Response received from the device.
811 *
812 *  \param[in]  psContext               psContext is the context of
813 *                                      the HCI Layer.
814 *  \param[in]  pHwRef                  pHwRef is the Information of
815 *                                      the Device Interface Link .
816 *  \param[in]  pInfo                   Transaction information like status
817 *                                      data and length after the completely
818 *                                      receiving the response .
819 *  \retval NONE.
820 *
821 *
822 */
823
824extern
825void
826phHciNfc_Receive_Complete (
827                                void                    *psContext,
828                                void                    *pHwRef,
829                                phNfc_sTransactionInfo_t *pInfo
830                          );
831
832/**
833 * \ingroup grp_hci_nfc
834 *
835 *  The phHciNfc_Notify_Event function notifies the occurence of the HCI
836 *  Event from the device.
837 *
838 *  \param[in]  psContext               psContext is the context of
839 *                                      the HCI Layer.
840 *  \param[in]  pHwRef                  pHwRef is the Information of
841 *                                      the Device Interface Link .
842 *  \param[in]  type                    reason returned for the notification to
843 *                                      the HCI.
844 *  \param[in]  pInfo                   Notification information like status
845 *                                      data,length etc from the lower layer
846 *                                      to the HCI Layer.
847 *  \retval NONE.
848 *
849 */
850
851extern
852void
853phHciNfc_Notify_Event(
854                            void                    *psContext,
855                            void                    *pHwRef,
856                            uint8_t                 type,
857                            void                    *pInfo
858                    );
859
860/**
861 * \ingroup grp_hci_nfc
862 *
863 *  The phHciNfc_Tag_Notify function notifies the the upper layer
864 *  with the Tag Specific Notifications .
865 *
866 *  \param[in]  psContext               psContext is the context of
867 *                                      the HCI Layer.
868 *  \param[in]  pHwRef                  pHwRef is the Information of
869 *                                      the Device Interface Link .
870 *  \param[in]  type                    reason returned for the notification to
871 *                                      the HCI.
872 *  \param[in]  pInfo                   Notification information like status
873 *                                      data,length etc from the lower layer
874 *                                      to the HCI Layer.
875 *  \retval NONE.
876 *
877 */
878extern
879void
880phHciNfc_Tag_Notify(
881                            phHciNfc_sContext_t     *psHciContext,
882                            void                    *pHwRef,
883                            uint8_t                 type,
884                            void                    *pInfo
885               );
886
887/**
888 * \ingroup grp_hci_nfc
889 *
890 *  The phHciNfc_Tag_Notify function notifies the the upper layer
891 *  with the Tag Specific Notifications .
892 *
893 *  \param[in]  psContext               psContext is the context of
894 *                                      the HCI Layer.
895 *  \param[in]  pHwRef                  pHwRef is the Information of
896 *                                      the Device Interface Link .
897 *  \param[in]  type                    reason returned for the notification to
898 *                                      the HCI.
899 *  \param[in]  pInfo                   Notification information like status
900 *                                      data,length etc from the lower layer
901 *                                      to the HCI Layer.
902 *  \retval NONE.
903 *
904 */
905
906extern
907void
908phHciNfc_Target_Select_Notify(
909                            phHciNfc_sContext_t     *psHciContext,
910                            void                    *pHwRef,
911                            uint8_t                 type,
912                            void                    *pInfo
913               );
914
915
916/**
917 * \ingroup grp_hci_nfc
918 *
919 *  The phHciNfc_Transceive_Notify function notifies the the upper layer
920 *  with the after the transceive operation.
921 *
922 *  \param[in]  psContext               psContext is the context of
923 *                                      the HCI Layer.
924 *  \param[in]  pHwRef                  pHwRef is the Information of
925 *                                      the Device Interface Link .
926 *  \param[in]  type                    reason returned for the notification to
927 *                                      the HCI.
928 *  \param[in]  pInfo                   Notification information like status
929 *                                      data,length etc from the lower layer
930 *                                      to the HCI Layer.
931 *  \retval NONE.
932 *
933 */
934extern
935void
936phHciNfc_Transceive_Notify(
937                            phHciNfc_sContext_t     *psHciContext,
938                            void                    *pHwRef,
939                            uint8_t                 type,
940                            void                    *pInfo
941               );
942
943/**
944 * \ingroup grp_hci_nfc
945 *
946 *  The phHciNfc_Notify function calls the upper layer notification callback.
947 *
948 *  \param[in]  pUpperNotify            pUpperNotify is the notification
949 *                                      callback of the upper HAL Layer.
950 *  \param[in]  pUpperContext           pUpperContext is the context of
951 *                                      the upper HAL Layer.
952 *  \param[in]  pHwRef                  pHwRef is the Information of
953 *                                      the Device Interface Link .
954 *  \param[in]  type                    type of the notification to
955 *                                      the upper HAL layer.
956 *  \param[in]  pInfo                   completion information returned
957 *                                      to the Upper HAL Layer.
958 *  NFCSTATUS_SUCCESS                   Notification successfully completed .
959 *  NFCSTATUS_INVALID_PARAMETER         One or more of the supplied parameters
960 *                                      could not be interpreted properly.
961 *  Other errors                        Errors related to the HCI or lower layers
962 *
963 *  \retval NONE.
964 *
965 */
966
967extern
968void
969phHciNfc_Notify(
970                    pphNfcIF_Notification_CB_t  p_upper_notify,
971                    void                        *p_upper_context,
972                    void                        *pHwRef,
973                    uint8_t                     type,
974                    void                        *pInfo
975               );
976
977/**
978 * \ingroup grp_hci_nfc
979 *
980 *  The phHciNfc_Release_Notify function Releases HCI and notifies
981 *  the upper layer.
982 *
983 *  \param[in]  psHciContext            psHciContext is the context of
984 *                                      the HCI Layer.
985 *  \param[in]  pHwRef                  pHwRef is the Information of
986 *                                      the Device Interface Link .
987 *  \param[in]  type                    reason returned for the notification to
988 *                                      the HCI.
989 *  \param[in]  pInfo                   Notification information like status
990 *                                      data,length etc from the lower layer
991 *                                      to the HCI Layer.
992 *  \retval NONE.
993 *
994 */
995extern
996void
997phHciNfc_Release_Notify(
998                            phHciNfc_sContext_t     *psHciContext,
999                            void                    *pHwRef,
1000                            uint8_t                 type,
1001                            void                    *pInfo
1002               );
1003
1004
1005
1006/**
1007 * \ingroup grp_hci_nfc
1008 *
1009 *  The phHciNfc_Send_Generic_Cmd function sends the HCI Generic Commands
1010 *  to the device.
1011 *
1012 *  \param[in]  psHciContext            psHciContext is the context of
1013 *                                      the HCI Layer.
1014 *  \param[in]  pHwRef                  pHwRef is the Information of
1015 *                                      the Device Interface Link .
1016 *  \param[in]  pipe_id                 The pipe to which the command
1017 *                                      is being sent.
1018 *  \param[in]  cmd                     The HCI Generic command sent to a
1019 *                                      particular pipe .
1020 *
1021 *  \retval NFCSTATUS_PENDING           HCI Generic Command send in progress .
1022 *  \retval
1023 *  NFCSTATUS_INSUFFICIENT_RESOURCES    The memory could not be allocated
1024 *                                      as required amount of memory
1025 *                                      is not sufficient.
1026 *
1027 */
1028
1029extern
1030NFCSTATUS
1031phHciNfc_Send_Generic_Cmd (
1032                                phHciNfc_sContext_t *psHciContext,
1033                                void                *pHwRef,
1034                                uint8_t             pipe_id,
1035                                uint8_t             cmd
1036                    );
1037
1038/**
1039 * \ingroup grp_hci_nfc
1040 *
1041 *  The phHciNfc_Set_Param function configures the Gate specific register
1042 *  with the provided value.
1043 *
1044 *  \param[in]  psHciContext            psHciContext is the context of
1045 *                                      the HCI Layer.
1046 *  \param[in]  pHwRef                  pHwRef is the Information of
1047 *                                      the Device Interface Link .
1048 *  \param[in]  p_pipe_info             Pointer to pipe specific information.
1049 *  \param[in]  reg_index               Index of the register to be
1050 *                                      configured .
1051 *  \param[in]  p_param                 Value to the configured in
1052 *                                      particular register.
1053 *  \param[in]  param_length            Length of the parameter provided
1054 *                                      for the configuration.
1055 *
1056 *  \retval NFCSTATUS_PENDING           HCI Set parameter in progress .
1057 *  \retval
1058 *  NFCSTATUS_INVALID_HCI_INFORMATION   The Information like p_pipe_info,
1059 *                                      p_param or param_length is invalid
1060 *
1061 */
1062
1063extern
1064NFCSTATUS
1065phHciNfc_Set_Param (
1066                            phHciNfc_sContext_t     *psHciContext,
1067                            void                    *pHwRef,
1068                            phHciNfc_Pipe_Info_t    *p_pipe_info,
1069                            uint8_t                 reg_index,
1070                            void                    *p_param,
1071                            uint16_t                 param_length
1072                );
1073
1074/**
1075 * \ingroup grp_hci_nfc
1076 *
1077 *  The phHciNfc_Send_HCP function sends the HCI Host Control Packet
1078 *  Frames to the device.
1079 *
1080 *  \param[in]  psHciContext            psHciContext is the context of
1081 *                                      the HCI Layer.
1082 *  \param[in]  pHwRef                  pHwRef is the Information of
1083 *                                      the Device Interface Link .
1084 *
1085 *  \retval NFCSTATUS_PENDING           HCP Frame send pending.
1086 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
1087 *                                      could not be interpreted properly.
1088 *  \retval Other errors                Other related errors
1089 *
1090 *
1091 */
1092
1093extern
1094NFCSTATUS
1095phHciNfc_Send_HCP (
1096                            phHciNfc_sContext_t *psHciContext,
1097                            void                *pHwRef
1098                        );
1099
1100
1101/**
1102 * \ingroup grp_hci_nfc
1103 *
1104 *  The phHciNfc_Build_HCPFrame function initially builds the HCP Packet Frame
1105 *  with the values passed in the arguments .
1106 *
1107 *  \param[in]  hcp_packet              hcp_packet is the frame packet structure
1108 *                                      in which the frame is populated with the
1109 *                                      appropriate fields.
1110 *  \param[in]  chainbit                chainbit specifies whether the following
1111 *                                      HCP frames are chained or the frame is a
1112 *                                      normal frame.
1113 *  \param[in]  pipe_id                 pipe_id of the pipe to which the frame has
1114 *                                      to be sent.
1115 *  \param[in]  msg_type                type of message sent to the pipe.
1116 *  \param[in]  instruction             type of message instruction send to the pipe.
1117 *
1118 *  \retval NONE.
1119 *
1120 */
1121
1122
1123extern
1124void
1125phHciNfc_Build_HCPFrame (
1126                                phHciNfc_HCP_Packet_t *hcp_packet,
1127                                uint8_t             chainbit,
1128                                uint8_t             pipe_id,
1129                                uint8_t             msg_type,
1130                                uint8_t             instruction
1131                      );
1132
1133/**
1134 * \ingroup grp_hci_nfc
1135 *
1136 *  The phHciNfc_Append_HCPFrame function Appends the HCP Packet Frame
1137 *  with the values passed in the arguments .
1138 *
1139 *  \param[in]  hcp_data            hcp_data is the pointer to the HCP
1140 *                                  payload to which the data is to be
1141 *                                  appended.
1142 *  \param[in]  hcp_index           hcp_index is the index from which
1143 *                                  the data source needs to be appended.
1144 *  \param[in]  src_data            src_data that is to be appended to the
1145 *                                  HCP packet.
1146 *  \param[in]  src_len             The length of the data source that is
1147 *                                  to be appended.
1148 *  \retval NONE.
1149 *
1150 */
1151
1152extern
1153void
1154 phHciNfc_Append_HCPFrame (
1155                                uint8_t                 *hcp_data,
1156                                uint16_t                hcp_index,
1157                                uint8_t                 *src_data,
1158                                uint16_t                src_len
1159                          );
1160
1161/**
1162 * \ingroup grp_hci_nfc
1163 *
1164 *  The phHciNfc_Allocate_Resource function allocates and initialises the
1165 *  resource memory for the HCI layer.
1166 *
1167 *  \param[in] ppBuffer                 ppBuffer is the pointer to which the
1168 *                                      resource memory is allocated.
1169 *  \param[in] size                     Variable that specifies the size of
1170 *                                      the memory that needs to be created.
1171 *
1172 *  \retval NFCSTATUS_SUCCESS           The Resource Memory was allocated
1173 *                                      successfully .
1174 *  \retval
1175 *  NFCSTATUS_INSUFFICIENT_RESOURCES    The memory could not be allocated
1176 *                                      as required amount of memory
1177 *                                      is not suffient.
1178 *
1179 */
1180
1181extern
1182NFCSTATUS
1183 phHciNfc_Allocate_Resource (
1184                                void                **ppBuffer,
1185                                uint16_t            size
1186                            );
1187/**
1188 * \ingroup grp_hci_nfc
1189 *
1190 *  The phHciNfc_Release_Resources function releases all the resources
1191 *  allocated in the HCI Layer.
1192 *
1193 *  \param[in]  psHciContext            psHciContext is the context of
1194 *                                      the HCI Layer.
1195 *
1196 *  \retval NONE.
1197 *
1198 */
1199
1200extern
1201 void
1202 phHciNfc_Release_Resources (
1203                                phHciNfc_sContext_t **ppsHciContext
1204                            );
1205
1206/**
1207 * \ingroup grp_hci_nfc
1208 *
1209 *  The phHciNfc_Release_Lower function initiates the release of the
1210 *  lower layers.
1211 *
1212 *  \param[in]  psHciContext            psHciContext is the context of
1213 *                                      the HCI Layer.
1214 *  \param[in]  pHwRef                  pHwRef is the Information of
1215 *                                      the Device Interface Link .
1216 *
1217 *  \retval NONE.
1218 *
1219 */
1220
1221extern
1222void
1223phHciNfc_Release_Lower(
1224                    phHciNfc_sContext_t         *psHciContext,
1225                    void                        *pHwRef
1226               );
1227
1228
1229
1230#endif
1231
1232