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