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 32typedef uint8_t utf8_t; /* UTF8 Character String */ 33typedef uint8_t bool_t; /* boolean data type */ 34typedef 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 */ 45typedef 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 */ 55typedef 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 */ 83typedef 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 */ 90typedef 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 */ 97typedef 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 */ 110typedef 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 */ 122typedef 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 */ 131typedef 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 153typedef 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 */ 180typedef 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 */ 200typedef 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 212typedef 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 */ 244typedef phNfc_eRFDevType_t phNfc_eRemDevType_t; 245typedef phNfc_eRemDevType_t phHal_eRemDevType_t; 246 247/* 248 * Union for each available type of Commands. 249 */ 250 251typedef 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 */ 260typedef 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 274typedef 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