1 /*
2  * Copyright (C) 2015 The Android Open Source Project
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  * NCI Interface
19  */
20 
21 #ifndef PHNCINFCTYPES_H
22 #define PHNCINFCTYPES_H
23 
24 /*
25  ################################################################################
26  ***************************** Header File Inclusion ****************************
27  ################################################################################
28  */
29 #include <phNfcStatus.h>
30 
31 /*
32  ################################################################################
33  ****************************** Macro Definitions *******************************
34  ################################################################################
35  */
36 #define PH_NCINFCTYPES_MAX_UID_LENGTH           (0x0AU)
37 /* Maximum length of ATR_RES (General Bytes) length expected */
38 #define PH_NCINFCTYPES_MAX_ATR_LENGTH           (0x30U)
39 #define PH_NCINFCTYPES_ATQA_LENGTH              (0x02U)    /* ATQA length */
40 #define PH_NCINFCTYPES_MAX_HIST_BYTES           (0x0FU)    /* Max Historical bytes returned by Type A tag */
41 
42 /*
43  * Enum definition contains supported RF Protocols
44  */
45 typedef enum
46 {
47     phNciNfc_e_RfProtocolsUnknownProtocol = 0x00,  /* Protocol is not known */
48     phNciNfc_e_RfProtocolsT1tProtocol     = 0x01,  /* Type 1 Tag protocol */
49     phNciNfc_e_RfProtocolsT2tProtocol     = 0x02,  /* Type 2 Tag protocol */
50     phNciNfc_e_RfProtocolsT3tProtocol     = 0x03,  /* Type 3 Tag protocol */
51     phNciNfc_e_RfProtocolsIsoDepProtocol  = 0x04,  /* ISO DEP protocol */
52     phNciNfc_e_RfProtocolsNfcDepProtocol  = 0x05,  /* NFC DEP protocol */
53     phNciNfc_e_RfProtocols15693Protocol   = 0x06,  /* 15693 protocol */
54     phNciNfc_e_RfProtocolsMifCProtocol    = 0x80,  /* Mifare Classic protocol */
55     phNciNfc_e_RfProtocolsHidProtocol     = 0x81,  /* Hid protocol */
56     phNciNfc_e_RfProtocolsEpcGen2Protocol = 0x82,  /* EpcGen2 protocol */
57     phNciNfc_e_RfProtocolsKovioProtocol   = 0x83   /* Kovio protocol */
58 } phNciNfc_RfProtocols_t;
59 
60 /*
61  * Supported RF Interfaces
62  */
63 typedef enum
64 {
65     phNciNfc_e_RfInterfacesNfceeDirect_RF = 0x00,   /* Nfcee Direct RF Interface */
66     phNciNfc_e_RfInterfacesFrame_RF =       0x01,   /* Frame RF Interface */
67     phNciNfc_e_RfInterfacesISODEP_RF =      0x02,   /* ISO DEP RF Interface */
68     phNciNfc_e_RfInterfacesNFCDEP_RF =      0x03,   /* NFC DEP RF Interface */
69     phNciNfc_e_RfInterfacesTagCmd_RF =      0x80,   /* Tag-Cmd RF Interface (Nxp prop) */
70     phNciNfc_e_RfInterfacesHID_RF =         0x81    /* Hid RF Interface (Nxp prop) */
71 } phNciNfc_RfInterfaces_t;
72 
73 /*
74  * Enum definition contains RF technology modes supported.
75  * This information is a part of RF_DISCOVER_NTF or RF_INTF_ACTIVATED_NTF.
76  */
77 typedef enum
78 {
79     phNciNfc_NFCA_Poll                 = 0x00,  /* Nfc A Technology in Poll Mode */
80     phNciNfc_NFCB_Poll                 = 0x01,  /* Nfc B Technology in Poll Mode */
81     phNciNfc_NFCF_Poll                 = 0x02,  /* Nfc F Technology in Poll Mode */
82     phNciNfc_NFCA_Active_Poll          = 0x03,  /* Nfc A Technology in Active Poll Mode */
83     phNciNfc_NFCF_Active_Poll          = 0x05,  /* Nfc F Technology in Active Poll Mode */
84     phNciNfc_NFCISO15693_Poll          = 0x06, /* Nfc ISO15693 Technology in Poll Mode */
85     phNciNfc_NxpProp_NFCHID_Poll       = 0x70,      /* Nfc Hid Technology in Poll Mode */
86     phNciNfc_NxpProp_NFCEPFGEN2_Poll   = 0x71,  /* Nfc EpcGen2 Technology in Poll Mode */
87     phNciNfc_NxpProp_NFCKOVIO_Poll     = 0x72,    /* Nfc Kovio Technology in Poll Mode */
88     phNciNfc_NFCA_Listen               = 0x80,/* Nfc A Technology in Listen Mode */
89     phNciNfc_NFCB_Listen               = 0x81,/* Nfc B Technology in Listen Mode */
90     phNciNfc_NFCF_Listen               = 0x82,/* Nfc F Technology in Listen Mode */
91     phNciNfc_NFCA_Active_Listen        = 0x83,/* Nfc A Technology in Active Listen Mode */
92     phNciNfc_NFCF_Active_Listen        = 0x85,  /* Nfc F Technology in Active Listen Mode */
93     phNciNfc_NFCISO15693_Active_Listen = 0x86   /* Nfc ISO15693 Technology in Listen Mode */
94 } phNciNfc_RfTechMode_t;
95 
96 /*
97  * This is used to identify the exact device type
98  */
99 typedef enum
100 {
101     phNciNfc_eUnknown_DevType        = 0x00U,
102 
103     /* Generic PICC Type */
104     phNciNfc_ePICC_DevType,
105     /* Specific PICC Devices */
106     /* This PICC type explains that the card is compliant to the
107      * ISO 14443-1 and 2A specification. This type can be used for the
108      * cards that is supporting these specifications
109      */
110     phNciNfc_eISO14443_A_PICC,
111     /* This PICC type explains that the card is compliant to the
112      * ISO 14443-4A specification
113      */
114     phNciNfc_eISO14443_4A_PICC,
115     /* This PICC type explains that the card is compliant to the
116      * ISO 14443-3A specification
117      */
118     phNciNfc_eISO14443_3A_PICC,
119     /* This PICC type explains that the card is Mifare UL/1k/4k and
120      * also it is compliant to ISO 14443-3A. There can also be other
121      * ISO 14443-3A cards, so the phNciNfc_eISO14443_3A_PICC is also used for
122      * PICC detection
123      */
124     phNciNfc_eMifareUL_PICC,
125     phNciNfc_eMifare1k_PICC,
126     phNciNfc_eMifare4k_PICC,
127     phNciNfc_eMifareMini_PICC,
128     /* This PICC type explains that the card is compliant to the
129      * ISO 14443-1, 2 and 3B specification
130      */
131     phNciNfc_eISO14443_B_PICC,
132     /* This PICC type explains that the card is compliant to the
133      * ISO 14443-4B specification
134      */
135     phNciNfc_eISO14443_4B_PICC,
136     /* This PICC type explains that the card is B-Prime type */
137     phNciNfc_eISO14443_BPrime_PICC,
138     phNciNfc_eFelica_PICC,
139     phNciNfc_eJewel_PICC,
140     /* This PICC type explains that the card is ISO15693 type */
141     phNciNfc_eISO15693_PICC,
142     /* This PICC type explains that the card is EpcGen2 type */
143     phNciNfc_eEpcGen_PICC,
144 
145     /* NFC-IP1 Device Types */
146     phNciNfc_eNfcIP1_Target,
147     phNciNfc_eNfcIP1_Initiator,
148 
149     /* Other Sources */
150     phNciNfc_eInvalid_DevType
151 
152 }phNciNfc_RFDevType_t;
153 
154 /*
155  * RATS Response Params structure
156  */
157 typedef struct phNciNfc_RATSResp {
158     uint8_t   bFormatByte;                 /* Format Byte */
159     uint8_t   bIByteTA;                    /* Interface Byte TA(1) */
160     uint8_t   bIByteTB;                    /* Interface Byte TB(1) */
161     uint8_t   bIByteTC;                    /* Interface Byte TC(1) */
162     uint8_t   bHistByte[PH_NCINFCTYPES_MAX_HIST_BYTES];   /* Historical Bytes - Max size 15 */
163 } phNciNfc_RATSResp_t;
164 
165 /*
166  * The Reader A structure includes the available information
167  * related to the discovered ISO14443A remote device. This information
168  * is updated for every device discovery.
169  */
170 typedef struct phNciNfc_Iso14443AInfo
171 {
172     uint8_t         Uid[PH_NCINFCTYPES_MAX_UID_LENGTH]; /* UID information of the TYPE A
173                                                         Tag Discovered NFCID1 -
174                                                         Considering max size of NFCID1*/
175     uint8_t         UidLength;                          /* UID information length, shall not be greater
176                                                         than PHNCINFC_MAX_UID_LENGTH i.e., 10 */
177     uint8_t         AppData[PH_NCINFCTYPES_MAX_ATR_LENGTH]; /* Application data information of the
178                                                         tag discovered (= Historical bytes for
179                                                         type A) */
180     uint8_t         AppDataLength;                      /* Application data length */
181     uint8_t         Sak;                                /* SAK information of the TYPE ATag Discovered
182                                                         Mapped to SEL_RES Response*/
183     uint8_t         AtqA[PH_NCINFCTYPES_ATQA_LENGTH];        /* ATQA information of the TYPE A
184                                                         Tag Discovered */
185     uint8_t         MaxDataRate;                        /* Maximum data rate supported by the TYPE A
186                                                         Tag Discovered */
187     uint8_t         Fwi_Sfgt;                           /* Frame waiting time and start up frame guard
188                                                         time as defined in ISO/IEC 14443-4[7] for type A */
189     uint8_t         bSensResResp[2];                    /* SENS_RES Response */
190     uint8_t         bSelResRespLen;                     /* SEL_RES Response Length */
191     uint8_t         bRatsRespLen;                       /* Length of RATS Response */
192     phNciNfc_RATSResp_t   tRatsResp;                    /* RATS Response Info */
193 } phNciNfc_Iso14443AInfo_t;
194 
195 /*
196  * The Remote Device Information Union includes the available Remote Device Information
197  * structures. Following the device detected, the corresponding data structure is used.
198  */
199 typedef union phNciNfc_RemoteDevInfo
200 {
201     phNciNfc_Iso14443AInfo_t          Iso14443A_Info;/* Type A tag Info */
202 } phNciNfc_RemoteDevInfo_t;
203 
204 /* Contains Details of Discovered Target */
205 typedef struct phNciNfc_RemoteDevInformation
206 {
207     uint8_t                    SessionOpened;      /* Flag indicating the validity of the handle of the remote device. */
208     phNciNfc_RFDevType_t       RemDevType;         /* Remote device type which says that remote
209                                                     is Reader A or Reader B or NFCIP or Felica or
210                                                     Reader B Prime or Jewel*/
211     uint8_t bRfDiscId;                              /* ID of the Tag */
212     phNciNfc_RfInterfaces_t    eRfIf;               /* RF Interface */
213     phNciNfc_RfProtocols_t eRFProtocol;             /* RF protocol of the target */
214     phNciNfc_RfTechMode_t eRFTechMode;              /* RF Technology mode of the discovered/activated target */
215     uint8_t bMaxPayLoadSize;                        /* Max data payload size*/
216     uint8_t bInitialCredit;                         /* Initial credit*/
217     uint8_t bTechSpecificParamLen;                  /* Technology Specific parameter length, for Debugging purpose only*/
218     phNciNfc_RfTechMode_t eDataXchgRFTechMode;      /* Data Exchange RF Technology mode of the activated target */
219     uint8_t   bTransBitRate;                        /* Transmit Bit Rate */
220     uint8_t   bRecvBitRate;                         /* Receive Bit Rate */
221     phNciNfc_RemoteDevInfo_t tRemoteDevInfo;        /* Structure object to #phNciNfc_RemoteDevInfo_t*/
222 } phNciNfc_RemoteDevInformation_t, *pphNciNfc_RemoteDevInformation_t;/* Pointer to Remote Dev Info*/
223 
224 /*
225  * Structure contains buffer where payload of the received data packet
226  * shall be stored and length of the payload stored in the buffer.
227  */
228 typedef struct phNciNfc_Data
229 {
230     uint8_t *pBuff;     /* Buffer to store received data packet's payload */
231     uint16_t wLen;      /* Length of the payload */
232 } phNciNfc_Data_t, *pphNciNfc_Data_t;
233 
234 
235 /*
236  * Type 2 tag command list supported by NCI stack
237  * It includes command lists applicable to Mifare family cards also
238  */
239 typedef enum phNciNfc_T2TCmdList
240 {
241     phNciNfc_eT2TRaw    = 0x00,   /* Performs Raw communication over T2T Tag*/
242     phNciNfc_eT2TWriteN,   /* Write Multiple blocks to T2T tag*/
243     phNciNfc_eT2TreadN,   /* Read Multiple blocks to T2T tag*/
244     phNciNfc_eT2TSectorSel,   /* Sector Select for MifareStd Cards*/
245     phNciNfc_eT2TAuth,   /* Sector Select for MifareStd Cards*/
246     phNciNfc_eT2TProxCheck,/* Proxy Check command for MF+*/
247     phNciNfc_eT2TInvalidCmd /* Invalid Command*/
248 } phNciNfc_T2TCmdList_t;    /* Type2 Tag and Mifare specicific command list*/
249 
250 /* All command list for tag operation supported by NCI stack */
251 typedef union phNciNfc_TagCmdList
252 {
253     phNciNfc_T2TCmdList_t T2TCmd; /* T2T Specific command*/
254 } phNciNfc_TagCmdList_t; /* Tag specific command */
255 
256 /* Transceive info */
257 typedef struct phNciNfc_TransceiveInfo
258 {
259     phNciNfc_TagCmdList_t   uCmd;     /* Technology Specific commands */
260     uint8_t                 bAddr;    /* Start address to perform operation,Valid for T1T T2T T3T and some Propriatery tags */
261     uint8_t                 bNumBlock;/* Number of blocks */
262     uint16_t                wTimeout; /* Timeout value to be used during transceive */
263     phNciNfc_Data_t         tSendData;/* Buffer information for sending data */
264     phNciNfc_Data_t         tRecvData;/* Buffer information for receiving data */
265     /* Details for Felica To be Added if Check and Update supported */
266 } phNciNfc_TransceiveInfo_t, *pphNciNfc_TransceiveInfo_t; /* pointer to struct #phNciNfc_TransceiveInfo_t */
267 
268 #endif                          /* end of #ifndef PHNCINFCTYPES_H */
269