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 _PHNXPEXTNS_MFCRF_H_
18 #define _PHNXPEXTNS_MFCRF_H_
19 
20 #include <phNfcTypes.h>
21 #include <phNciNfcTypes.h>
22 #include <phFriNfc_MifareStdMap.h>
23 #include <phFriNfc_MifStdFormat.h>
24 #include <phNxpExtns.h>
25 #include <semaphore.h>
26 #include <pthread.h>
27 
28 extern uint8_t current_key[];
29 /* Enable this macro to set key configuration for mifare classic Tag */
30 #define PHLIBNFC_NXPETENSION_CONFIGURE_MFKEYS 1
31 
32 #define MAX_BUFF_SIZE (512)
33 
34 #define PHLIBNFC_MIFARESTD4K_BLK128         128  /*Block number 128 for Mifare 4k */
35 #define PHLIBNFC_MIFARESTD_SECTOR_NO32      32   /* Sector 32 for Mifare 4K*/
36 #define PHLIBNFC_MIFARESTD_BLOCK_BYTES      16   /* Bytes per block after block 32 for Mifare 4K*/
37 
38 #define PHLIBNFC_NO_OF_BLKPERSECTOR  (0x04)      /* Number of blocks per sector for \
39                                                   * Mifare Clsssic Tag*/
40 
41 #define PHLIBNFC_MFCUIDLEN_INAUTHCMD        0x04     /* UID length in Authentication command */
42 #define PHLIBNFC_MFC_AUTHKEYLEN             0x06     /* Authentication key length */
43 
44 #define PHNCINFC_AUTHENTICATION_KEY   (0x00U)     /* Authentication key passed in extension \
45                                                      command header of authentication command */
46 #define PHNCINFC_AUTHENTICATION_KEYB  (0x61U)     /* Authentication Key B */
47 #define PHNCINFC_ENABLE_KEY_B         (0x80U)     /* Enable Key B */
48 #define PH_NCINFC_MIFARECLASSIC_EMBEDDED_KEY  (0x10)    /* MIFARE Classic use Embedded Key*/
49 
50 #define PH_NCINFC_STATUS_OK           (0x0000)    /* Status OK */
51 #define PHNCINFC_EXTNID_SIZE          (0x01U)     /* Size of Mifare Extension Req/Rsp Id */
52 #define PHNCINFC_EXTNSTATUS_SIZE      (0x01U)     /* Size of Mifare Extension Resp Status Byte */
53 
54 #define PH_NCINFC_EXTN_INVALID_PARAM_VAL (0xFFU)  /* Initial value of Req/Resp Param/Status */
55 
56 #define PH_FRINFC_NDEF_READ_REQ       (0x00U)     /* NDEF Read Request */
57 #define PH_FRINFC_NDEF_WRITE_REQ      (0x01U)     /* NDEF Write Request */
58 
59 #define PH_LIBNFC_INTERNAL_CHK_NDEF_NOT_DONE (0x02U)  /* Status for check NDEF not done */
60 
61 #define NDEF_SENDRCV_BUF_LEN            252U      /* Send receive buffer length */
62 
63 #define NXP_NUMBER_OF_MFC_KEYS    (0x04U)
64 #define NXP_MFC_KEY_SIZE          (0x06U)
65 
66 #define NXP_MFC_KEYS    {\
67                           {0xA0,0XA1,0xA2,0XA3,0xA4,0XA5},\
68                           {0xD3,0XF7,0xD3,0XF7,0xD3,0XF7},\
69                           {0xFF,0XFF,0xFF,0XFF,0xFF,0XFF},\
70                           {0x00,0x00,0x00,0x00,0x00,0x00}} /* Key used during NDEF format */
71 
72 
73 #ifndef NCI_MAX_DATA_LEN
74 #define NCI_MAX_DATA_LEN 300
75 #endif
76 
77 /*
78  * Request Id for different commands
79  */
80 typedef enum phNciNfc_ExtnReqId
81 {
82     phNciNfc_e_T1TXchgDataReq = 0x10,                   /* T1T Raw Data Request from DH */
83     phNciNfc_e_T1TWriteNReq = 0x20,                     /* T1T N bytes write request from DH */
84     phNciNfc_e_MfRawDataXchgHdr = 0x10,                 /* MF Raw Data Request from DH */
85     phNciNfc_e_MfWriteNReq = 0x31,                      /* MF N bytes write request from DH */
86     phNciNfc_e_MfReadNReq = 0x32,                       /* MF N bytes read request from DH */
87     phNciNfc_e_MfSectorSelReq = 0x33,                   /* MF Block select request from DH */
88     phNciNfc_e_MfPlusProxCheckReq = 0x28,               /* MF + Prox check request for NFCC from DH */
89     phNciNfc_e_MfcAuthReq = 0x40,                       /* MFC Authentication request for NFCC from DH */
90     phNciNfc_e_InvalidReq                               /* Invalid ReqId */
91 } phNciNfc_ExtnReqId_t ;
92 
93 /*
94  * Response Ids for different command response
95  */
96 typedef enum phNciNfc_ExtnRespId
97 {
98     phNciNfc_e_T1TXchgDataRsp = 0x10,           /* DH gets Raw data from T1T on successful req */
99     phNciNfc_e_T1TWriteNRsp = 0x20,             /* DH gets write status */
100     phNciNfc_e_MfXchgDataRsp = 0x10,            /* DH gets Raw data from MF on successful req */
101     phNciNfc_e_MfWriteNRsp = 0x31,              /* DH gets write status */
102     phNciNfc_e_MfReadNRsp = 0x32,               /* DH gets N Bytes read from MF, if successful */
103     phNciNfc_e_MfSectorSelRsp = 0x33,           /* DH gets the Sector Select cmd status */
104     phNciNfc_e_MfPlusProxCheckRsp = 0x29,       /* DH gets the MF+ Prox Check cmd status */
105     phNciNfc_e_MfcAuthRsp = 0x40,               /* DH gets the authenticate cmd status */
106     phNciNfc_e_InvalidRsp                       /* Invalid RspId */
107 }phNciNfc_ExtnRespId_t ;
108 
109 /* Data buffer */
110 typedef struct phNciNfc_Buff
111 {
112     uint8_t *pBuff;    /* pointer to the buffer where received payload shall be stored*/
113     uint16_t wLen;     /* Buffer length*/
114 }phNciNfc_Buff_t, *pphNciNfc_Buff_t;
115 
116 /*
117  * Structure for NCI Extension information
118  */
119 typedef struct phNciNfc_ExtnInfo
120 {
121     union
122     {
123         phNciNfc_ExtnReqId_t      ExtnReqId;      /* NCI extension reqid sent */
124         phNciNfc_ExtnRespId_t     ExtnRspId;      /* NCI extension respid received */
125     }ActivExtnId;                                 /* Active Req/Rsp Id */
126     uint8_t              bParamsNumsPresent;      /* Holds number of params available for this Req/Rsp Id */
127     uint8_t              bParam[2];               /* Req/Res: Param[0] = Param1, Param[1] = Param2 */
128 }phNciNfc_ExtnInfo_t;
129 
130 /*
131  * NDEF related data structures
132  */
133 typedef struct phLibNfc_NdefInfo
134 {
135 
136     uint8_t             NdefContinueRead;
137     uint32_t            NdefActualSize;
138     uint32_t            AppWrLength;
139     phFriNfc_NdefMap_t  *psNdefMap;
140     uint16_t            NdefSendRecvLen;
141     phNfc_sData_t       *psUpperNdefMsg;
142     uint32_t            dwWrLength;
143     uint32_t            NdefLength;
144     uint8_t             is_ndef;
145     phFriNfc_sNdefSmtCrdFmt_t    *ndef_fmt;
146 }phLibNfc_NdefInfo_t;
147 
148 /*
149  * NDEF offsets
150  */
151 typedef enum
152 {
153     phLibNfc_Ndef_EBegin         = 0x01, /**<  Start from the beginning position */
154     phLibNfc_Ndef_ECurrent               /**<  Start from the current position */
155 } phLibNfc_Ndef_EOffset_t;
156 
157 /*
158  * Extns module status
159  */
160 typedef enum
161 {
162    EXTNS_STATUS_OPEN = 0,
163    EXTNS_STATUS_CLOSE
164 } phNxpExtns_Status;
165 
166 /*
167  * NCI Data
168  */
169 typedef struct nci_data_package
170 {
171     uint16_t len;
172     uint8_t p_data[NCI_MAX_DATA_LEN];
173 } nci_rsp_data_t;
174 
175 /*
176  * Mifare Callback function definition
177  */
178 typedef void (*CallBackMifare_t)(void*, uint16_t);
179 
180 /*
181   * Auth Cmd Data
182  */
183 typedef struct nci_mfc_package
184 {
185     bool_t   auth_status;
186     bool_t   auth_sent;
187     sem_t    semPresenceCheck;
188     pthread_mutex_t syncmutex;
189     NFCSTATUS status;
190     phNfc_sData_t *pauth_cmd;
191 } phNci_mfc_auth_cmd_t;
192 /*
193  * Structure of callback functions from different module.
194  * It includes the status also.
195  */
196 typedef struct phNxpExtns_Context
197 {
198     phNxpExtns_Status           Extns_status;
199     tNFA_DM_CBACK               *p_dm_cback;
200     tNFA_CONN_CBACK             *p_conn_cback;
201     tNFA_NDEF_CBACK             *p_ndef_cback;
202     uint8_t                     writecmdFlag;
203     uint8_t                     RawWriteCallBack;
204     void                        *CallBackCtxt;
205     CallBackMifare_t            CallBackMifare;
206     bool_t                     ExtnsConnect;
207     bool_t                     ExtnsDeactivate;
208     bool_t                     ExtnsCallBack;
209     uint8_t                    incrdecflag;
210     uint8_t                    incrdecstatusflag;
211 } phNxpExtns_Context_t;
212 
213 NFCSTATUS phFriNfc_ExtnsTransceive(phNfc_sTransceiveInfo_t *pTransceiveInfo,
214                                    phNfc_uCmdList_t Cmd,
215                                    uint8_t *SendRecvBuf,
216                                    uint16_t SendLength,
217                                    uint16_t* SendRecvLength);
218 NFCSTATUS phNxpExtns_MfcModuleInit(void);
219 NFCSTATUS phNxpExtns_MfcModuleDeInit(void);
220 NFCSTATUS Mfc_WriteNdef(uint8_t *p_data, uint32_t len);
221 NFCSTATUS Mfc_CheckNdef(void);
222 NFCSTATUS Mfc_ReadNdef(void);
223 NFCSTATUS Mfc_FormatNdef(uint8_t *secretkey, uint8_t len);
224 NFCSTATUS Mfc_Transceive(uint8_t *p_data, uint32_t len);
225 NFCSTATUS Mfc_SetReadOnly(uint8_t *secrtkey, uint8_t len);
226 void Mfc_DeactivateCbackSelect(void);
227 void Mfc_ActivateCback(void);
228 NFCSTATUS Mfc_RecvPacket(uint8_t *buff, uint8_t buffSz);
229 NFCSTATUS phNxNciExtns_MifareStd_Reconnect(void);
230 NFCSTATUS Mfc_PresenceCheck (void);
231 
232 #endif /* _PHNXPEXTNS_MFCRF_H_ */
233