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 #ifndef PHNFCTYPES_H
18 #define PHNFCTYPES_H
19 
20 #include <stdint.h>
21 #include <string.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 
26 #ifndef TRUE
27 #define TRUE            (0x01)            /* Logical True Value */
28 #endif
29 #ifndef FALSE
30 #define FALSE           (0x00)            /* Logical False Value */
31 #endif
32 typedef uint8_t         utf8_t;       /* UTF8 Character String */
33 typedef uint8_t         bool_t;       /* boolean data type */
34 typedef uint16_t        NFCSTATUS;        /* Return values */
35 #define STATIC static
36 
37 #define PHNFC_MAX_UID_LENGTH            0x0AU  /* Maximum UID length expected */
38 #define PHNFC_MAX_ATR_LENGTH            0x30U  /* Maximum ATR_RES (General Bytes) length expected */
39 #define PHNFC_NFCID_LENGTH              0x0AU  /* Maximum length of NFCID 1.3*/
40 #define PHNFC_ATQA_LENGTH               0x02U  /* ATQA length */
41 
42 /*
43  * NFC Data structure
44  */
45 typedef struct phNfc_sData
46 {
47     uint8_t             *buffer; /* Buffer to store data */
48     uint32_t            length;  /* Buffer length */
49 } phNfc_sData_t;
50 
51 /*
52  * Possible Hardware Configuration exposed to upper layer.
53  * Typically this should be port name (Ex:"COM1","COM2") to which PN547 is connected.
54  */
55 typedef enum
56 {
57     ENUM_LINK_TYPE_COM1,
58     ENUM_LINK_TYPE_COM2,
59     ENUM_LINK_TYPE_COM3,
60     ENUM_LINK_TYPE_COM4,
61     ENUM_LINK_TYPE_COM5,
62     ENUM_LINK_TYPE_COM6,
63     ENUM_LINK_TYPE_COM7,
64     ENUM_LINK_TYPE_COM8,
65     ENUM_LINK_TYPE_I2C,
66     ENUM_LINK_TYPE_SPI,
67     ENUM_LINK_TYPE_USB,
68     ENUM_LINK_TYPE_TCP,
69     ENUM_LINK_TYPE_NB
70 } phLibNfc_eConfigLinkType;
71 
72 /*
73  * Deferred message. This message type will be posted to the client application thread
74  * to notify that a deferred call must be invoked.
75  */
76 #define PH_LIBNFC_DEFERREDCALL_MSG        (0x311)
77 
78 /*
79  * Deferred call declaration.
80  * This type of API is called from ClientApplication ( main thread) to notify
81  * specific callback.
82  */
83 typedef void (*pphLibNfc_DeferredCallback_t) (void*);
84 
85 /*
86  * Deferred parameter declaration.
87  * This type of data is passed as parameter from ClientApplication (main thread) to the
88  * callback.
89  */
90 typedef void *pphLibNfc_DeferredParameter_t;
91 
92 /*
93  * Possible Hardware Configuration exposed to upper layer.
94  * Typically this should be at least the communication link (Ex:"COM1","COM2")
95  * the controller is connected to.
96  */
97 typedef struct phLibNfc_sConfig
98 {
99     uint8_t *pLogFile; /* Log File Name*/
100     /* Hardware communication link to the controller */
101     phLibNfc_eConfigLinkType  nLinkType;
102     /* The client ID (thread ID or message queue ID) */
103     unsigned int nClientId;
104 } phLibNfc_sConfig_t, *pphLibNfc_sConfig_t;
105 
106 /*
107  * NFC Message structure contains message specific details like
108  * message type, message specific data block details, etc.
109  */
110 typedef struct phLibNfc_Message
111 {
112     uint32_t eMsgType;   /* Type of the message to be posted*/
113     void   * pMsgData;   /* Pointer to message specific data block in case any*/
114     uint32_t Size;       /* Size of the datablock*/
115 } phLibNfc_Message_t, *pphLibNfc_Message_t;
116 
117 /*
118  * Deferred message specific info declaration.
119  * This type of information is packed as message data when PH_LIBNFC_DEFERREDCALL_MSG
120  * type message is posted to message handler thread.
121  */
122 typedef struct phLibNfc_DeferredCall
123 {
124     pphLibNfc_DeferredCallback_t pCallback;/* pointer to Deferred callback */
125     pphLibNfc_DeferredParameter_t pParameter;/* pointer to Deferred parameter */
126 } phLibNfc_DeferredCall_t;
127 
128 /*
129  * Definitions for supported protocol
130  */
131 typedef struct phNfc_sSupProtocol
132 {
133     unsigned int MifareUL    : 1;  /* Protocol Mifare Ultra Light or any NFC Forum Type-2 tags */
134     unsigned int MifareStd   : 1;  /* Protocol Mifare Standard. */
135     unsigned int ISO14443_4A : 1;  /* Protocol ISO14443-4 Type A.  */
136     unsigned int ISO14443_4B : 1;  /* Protocol ISO14443-4 Type B.  */
137     unsigned int ISO15693    : 1;  /* Protocol ISO15693 HiTag.  */
138     unsigned int Felica      : 1;  /* Protocol Felica. */
139     unsigned int NFC         : 1;  /* Protocol NFC. */
140     unsigned int Jewel       : 1;  /* Protocol Innovision Jewel Tag. or Any T1T*/
141     unsigned int Desfire     : 1;  /*TRUE indicates specified feature (mapping
142                                    or formatting)for DESFire tag supported else not supported.*/
143     unsigned int Kovio       : 1;   /* Protocol Kovio Tag*/
144     unsigned int HID         : 1;   /* Protocol HID(Picopass) Tag*/
145     unsigned int Bprime      : 1;   /* Protocol BPrime Tag*/
146     unsigned int EPCGEN2     : 1;   /* Protocol EPCGEN2 Tag*/
147 } phNfc_sSupProtocol_t;
148 
149 /*
150  *  Enumerated MIFARE Commands
151  */
152 
153 typedef enum phNfc_eMifareCmdList
154 {
155     phNfc_eMifareRaw        = 0x00U,     /* This command performs raw transcations */
156     phNfc_eMifareAuthentA   = 0x60U,     /* This command performs an authentication with KEY A for a sector. */
157     phNfc_eMifareAuthentB   = 0x61U,     /* This command performs an authentication with KEY B for a sector. */
158     phNfc_eMifareRead16     = 0x30U,     /* Read 16 Bytes from a Mifare Standard block */
159     phNfc_eMifareRead       = 0x30U,     /* Read Mifare Standard */
160     phNfc_eMifareWrite16    = 0xA0U,     /* Write 16 Bytes to a Mifare Standard block */
161     phNfc_eMifareWrite4     = 0xA2U,     /* Write 4 bytes. */
162     phNfc_eMifareInc        = 0xC1U,     /* Increment */
163     phNfc_eMifareDec        = 0xC0U,     /* Decrement */
164     phNfc_eMifareTransfer   = 0xB0U,     /* Transfer */
165     phNfc_eMifareRestore    = 0xC2U,     /* Restore.   */
166     phNfc_eMifareReadSector = 0x38U,     /* Read Sector.   */
167     phNfc_eMifareWriteSector= 0xA8U,     /* Write Sector.   */
168     /* Above commands could be used for preparing raw command but below one can not be */
169     phNfc_eMifareReadN      = 0x01,      /* Proprietary Command */
170     phNfc_eMifareWriteN     = 0x02,      /* Proprietary Command */
171     phNfc_eMifareSectorSel  = 0x03,      /* Proprietary Command */
172     phNfc_eMifareAuth       = 0x04,      /* Proprietary Command */
173     phNfc_eMifareProxCheck  = 0x05,      /* Proprietary Command */
174     phNfc_eMifareInvalidCmd = 0xFFU      /* Invalid Command */
175 } phNfc_eMifareCmdList_t;
176 
177 /*
178  * Information about ISO14443A
179  */
180 typedef struct phNfc_sIso14443AInfo
181 {
182     uint8_t         Uid[PHNFC_MAX_UID_LENGTH];      /* UID information of the TYPE A
183                                                      * Tag Discovered */
184     uint8_t         UidLength;                      /* UID information length */
185     uint8_t         AppData[PHNFC_MAX_ATR_LENGTH];  /* Application data information of the
186                               1                      * tag discovered (= Historical bytes for
187                                                      * type A) */
188     uint8_t         AppDataLength;                  /* Application data length */
189     uint8_t         Sak;                            /* SAK information of the TYPE A
190                                                      * Tag Discovered */
191     uint8_t         AtqA[PHNFC_ATQA_LENGTH];        /* ATQA informationof the TYPE A
192                                                      * Tag Discovered */
193     uint8_t         MaxDataRate;                    /* Maximum data rate supported
194                                                      * by the tag Discovered */
195     uint8_t         Fwi_Sfgt;                       /* Frame waiting time and start up
196                                                      * frame guard */
197 } phNfc_sIso14443AInfo_t;
198 
199 /* Remote device information structure */
200 typedef union phNfc_uRemoteDevInfo
201 {
202     phNfc_sIso14443AInfo_t Iso14443A_Info;/* ISO1443A Remote device info */
203 } phNfc_uRemoteDevInfo_t;
204 
205 /*
206 *
207 *  The RF Device Type List is used to identify the type of
208 *  remote device that is discovered and connected.
209 *
210 */
211 
212 typedef enum phNfc_eRFDevType
213 {
214     phNfc_eUnknown_DevType        = 0x00U,
215     phNfc_eISO14443_A_PCD,
216     phNfc_eISO14443_B_PCD,
217     phNfc_eISO14443_BPrime_PCD,
218     phNfc_eFelica_PCD,
219     phNfc_eJewel_PCD,
220     phNfc_eISO15693_PCD,
221     phNfc_eEpcGen2_PCD,
222     phNfc_ePCD_DevType,
223     phNfc_ePICC_DevType,
224     phNfc_eISO14443_A_PICC,
225     phNfc_eISO14443_4A_PICC,
226     phNfc_eISO14443_3A_PICC,
227     phNfc_eMifare_PICC,
228     phNfc_eISO14443_B_PICC,
229     phNfc_eISO14443_4B_PICC,
230     phNfc_eISO14443_BPrime_PICC,
231     phNfc_eFelica_PICC,
232     phNfc_eJewel_PICC,
233     phNfc_eISO15693_PICC,
234     phNfc_eEpcGen2_PICC,
235     phNfc_eNfcIP1_Target,
236     phNfc_eNfcIP1_Initiator,
237     phNfc_eInvalid_DevType
238 } phNfc_eRFDevType_t;
239 
240 /*
241  * The Remote Device Type List is used to identify the type of
242  * remote device that is discovered/connected
243  */
244 typedef phNfc_eRFDevType_t phNfc_eRemDevType_t;
245 typedef phNfc_eRemDevType_t phHal_eRemDevType_t;
246 
247 /*
248  *   Union for each available type of Commands.
249  */
250 
251 typedef union phNfc_uCommand
252 {
253     phNfc_eMifareCmdList_t MfCmd;  /* Mifare command structure.  */
254 } phNfc_uCmdList_t;
255 
256 /*
257  *  The Remote Device Information Structure holds information about one single Remote
258  *  Device detected.
259  */
260 typedef struct phNfc_sRemoteDevInformation
261 {
262     uint8_t                    SessionOpened;       /* Flag indicating the validity of
263                                                      * the handle of the remote device.
264                                                      * 1 = Device is not activer (Only discovered), 2 = Device is active and ready for use*/
265     phNfc_eRemDevType_t        RemDevType;          /* Remote device type */
266     phNfc_uRemoteDevInfo_t     RemoteDevInfo;       /* Union of available Remote Device */
267 } phNfc_sRemoteDevInformation_t;
268 
269 
270 /*
271  * Transceive Information Data Structure for sending commands/response to the remote device
272  */
273 
274 typedef struct phNfc_sTransceiveInfo
275 {
276     phNfc_uCmdList_t                cmd;        /* Command for transceive */
277     uint8_t                         addr;       /* Start Block Number */
278     uint8_t                         NumBlock;   /* Number of Blocks to perform operation */
279     /* For Felica only*/
280     uint16_t *ServiceCodeList;                  /* 2 Byte service Code List */
281     uint16_t *Blocklist;                        /* 2 Byte Block list */
282     phNfc_sData_t                   sSendData; /* Send data */
283     phNfc_sData_t                   sRecvData; /* Recv data */
284     /* For EPC-GEN */
285     uint32_t                        dwWordPtr;   /* Word address for the memory write */
286     uint8_t                         bWordPtrLen; /* Specifies the length of word pointer
287                                                  00: 8  bits
288                                                  01: 16 bits
289                                                  10: 24 bits
290                                                  11: 32 bits
291                                                  */
292     uint8_t                         bWordCount;   /* Number of words to be read or written */
293 } phNfc_sTransceiveInfo_t;
294 
295 #define UNUSED(X) (void)(X);
296 
297 #endif /* PHNFCTYPES_H */
298