1 /*
2  * Copyright 2012-2014, 2021 NXP
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 #include <phNxpConfig.h>
17 #include <phNxpLog.h>
18 #include <phNxpNciHal.h>
19 #include <phNxpNciHal_dta.h>
20 
21 /*********************** Global Variables *************************************/
22 static phNxpDta_Control_t nxpdta_ctrl = {0, 0, 0};
23 extern bool nfc_debug_enabled;
24 /*******************************************************************************
25 **
26 ** Function         phNxpEnable_DtaMode
27 **
28 ** Description      This function configures
29 **                  HAL in DTA mode
30 **
31 *******************************************************************************/
phNxpEnable_DtaMode(uint16_t pattern_no)32 void phNxpEnable_DtaMode(uint16_t pattern_no) {
33   nxpdta_ctrl.dta_ctrl_flag = false;
34   nxpdta_ctrl.dta_t1t_flag = false;
35   nxpdta_ctrl.dta_pattern_no = pattern_no;
36   NXPLOG_NCIHAL_D(">>>>DTA - Mode is enabled");
37   nxpdta_ctrl.dta_ctrl_flag = true;
38 }
39 
40 /*******************************************************************************
41 **
42 ** Function         phNxpDisable_DtaMode
43 **
44 ** Description      This function disable DTA mode
45 **
46 *******************************************************************************/
phNxpDisable_DtaMode(void)47 void phNxpDisable_DtaMode(void) {
48   nxpdta_ctrl.dta_ctrl_flag = false;
49   nxpdta_ctrl.dta_t1t_flag = false;
50   NXPLOG_NCIHAL_D(">>>>DTA - Mode is Disabled");
51 }
52 
53 /******************************************************************************
54  * Function         phNxpDta_IsEnable
55  *
56  * Description      This function checks the DTA mode is enable or not.
57  *
58  * Returns          It returns TRUE if DTA enabled otherwise FALSE
59  *
60  ******************************************************************************/
phNxpDta_IsEnable(void)61 NFCSTATUS phNxpDta_IsEnable(void) { return nxpdta_ctrl.dta_ctrl_flag; }
62 
63 /******************************************************************************
64  * Function         phNxpDta_T1TEnable
65  *
66  * Description      This function  enables  DTA mode for T1T tag.
67  *
68  *
69  ******************************************************************************/
phNxpDta_T1TEnable(void)70 void phNxpDta_T1TEnable(void) { nxpdta_ctrl.dta_t1t_flag = true; }
71 /******************************************************************************
72  * Function         phNxpNHal_DtaUpdate
73  *
74  * Description      This function changes the command and responses specific
75  *                  to make DTA application success
76  *
77  * Returns          It return NFCSTATUS_SUCCESS then continue with send else
78  *                  sends NFCSTATUS_FAILED direct response is prepared and
79  *                  do not send anything to NFCC.
80  *
81  ******************************************************************************/
82 
phNxpNHal_DtaUpdate(uint16_t * cmd_len,uint8_t * p_cmd_data,uint16_t * rsp_len,uint8_t * p_rsp_data)83 NFCSTATUS phNxpNHal_DtaUpdate(uint16_t* cmd_len, uint8_t* p_cmd_data,
84                               uint16_t* rsp_len, uint8_t* p_rsp_data) {
85   NFCSTATUS status = NFCSTATUS_SUCCESS;
86 
87   if (nxpdta_ctrl.dta_ctrl_flag == true) {
88     // Workaround for DTA, block the set config command with general bytes */
89     if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
90         p_cmd_data[2] == 0x17 && p_cmd_data[3] == 0x01 &&
91         p_cmd_data[4] == 0x29 && p_cmd_data[5] == 0x14) {
92       *rsp_len = 5;
93       NXPLOG_NCIHAL_D(">>>>DTA - Block set config command");
94       phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
95 
96       p_rsp_data[0] = 0x40;
97       p_rsp_data[1] = 0x02;
98       p_rsp_data[2] = 0x02;
99       p_rsp_data[3] = 0x00;
100       p_rsp_data[4] = 0x00;
101 
102       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
103 
104       status = NFCSTATUS_FAILED;
105       NXPLOG_NCIHAL_D(
106           "Going through DTA workaround - Block set config command END");
107 
108     } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x08 &&
109                p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0xFF &&
110                p_cmd_data[4] == 0xFF) {
111       NXPLOG_NCIHAL_D(">>>>DTA Change Felica system code");
112       *rsp_len = 4;
113       p_rsp_data[0] = 0x41;
114       p_rsp_data[1] = 0x08;
115       p_rsp_data[2] = 0x01;
116       p_rsp_data[3] = 0x00;
117       status = NFCSTATUS_FAILED;
118 
119       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 4);
120     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
121                p_cmd_data[2] == 0x10 && p_cmd_data[3] == 0x05 &&
122                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
123       NXPLOG_NCIHAL_D(">>>>DTA Update LA_SEL_INFO param");
124 
125       p_cmd_data[12] = 0x40;
126       p_cmd_data[18] = 0x02;
127       status = NFCSTATUS_SUCCESS;
128     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
129                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
130                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
131       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
132       *rsp_len = 5;
133       p_rsp_data[0] = 0x40;
134       p_rsp_data[1] = 0x02;
135       p_rsp_data[2] = 0x02;
136       p_rsp_data[3] = 0x00;
137       p_rsp_data[4] = 0x00;
138       status = NFCSTATUS_FAILED;
139       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
140     } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
141       if (*cmd_len > (NCI_MAX_DATA_LEN - 6)) {
142         android_errorWriteLog(0x534e4554, "183487770");
143         return NFCSTATUS_FAILED;
144       }
145       NXPLOG_NCIHAL_D(">>>>DTA Add NFC-F listen tech params");
146       p_cmd_data[2] += 6;
147       p_cmd_data[3] += 3;
148       p_cmd_data[*cmd_len] = 0x80;
149       p_cmd_data[*cmd_len + 1] = 0x01;
150       p_cmd_data[*cmd_len + 2] = 0x82;
151       p_cmd_data[*cmd_len + 3] = 0x01;
152       p_cmd_data[*cmd_len + 4] = 0x85;
153       p_cmd_data[*cmd_len + 5] = 0x01;
154 
155       *cmd_len += 6;
156       status = NFCSTATUS_SUCCESS;
157     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
158                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
159                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x20 &&
160                nxpdta_ctrl.dta_pattern_no == 0x1000) {
161       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
162       *rsp_len = 5;
163       p_rsp_data[0] = 0x40;
164       p_rsp_data[1] = 0x02;
165       p_rsp_data[2] = 0x02;
166       p_rsp_data[3] = 0x00;
167       p_rsp_data[4] = 0x00;
168       status = NFCSTATUS_FAILED;
169       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
170     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
171                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
172                p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x01 &&
173                p_cmd_data[6] == 0x00) {
174       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
175       *rsp_len = 5;
176       p_rsp_data[0] = 0x40;
177       p_rsp_data[1] = 0x02;
178       p_rsp_data[2] = 0x02;
179       p_rsp_data[3] = 0x00;
180       p_rsp_data[4] = 0x00;
181       status = NFCSTATUS_FAILED;
182       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
183     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
184                p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 &&
185                p_cmd_data[4] == 0x50 && p_cmd_data[5] == 0x01 &&
186                p_cmd_data[6] == 0x00 && nxpdta_ctrl.dta_pattern_no == 0x1000) {
187       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
188       *rsp_len = 5;
189       p_rsp_data[0] = 0x40;
190       p_rsp_data[1] = 0x02;
191       p_rsp_data[2] = 0x02;
192       p_rsp_data[3] = 0x00;
193       p_rsp_data[4] = 0x00;
194       status = NFCSTATUS_FAILED;
195       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
196     } else {
197     }
198     if (nxpdta_ctrl.dta_t1t_flag == true) {
199       if (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x78 &&
200           p_cmd_data[4] == 0x00 && p_cmd_data[5] == 0x00) {
201         /*if (nxpdta_ctrl.dta_pattern_no == 0)
202         {
203           NXPLOG_NCIHAL_D(">>>>DTA - T1T modification block RID command Custom
204         Response (pattern 0)");
205           phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
206           *rsp_len = 10;
207           p_rsp_data[0] = 0x00;
208           p_rsp_data[1] = 0x00;
209           p_rsp_data[2] = 0x07;
210           p_rsp_data[3] = 0x12;
211           p_rsp_data[4] = 0x49;
212           p_rsp_data[5] = 0x00;
213           p_rsp_data[6] = 0x00;
214           p_rsp_data[7] = 0x00;
215           p_rsp_data[8] = 0x00;
216           p_rsp_data[9] = 0x00;
217 
218           status = NFCSTATUS_FAILED;
219 
220           phNxpNciHal_print_packet("DTARECV", p_rsp_data, *rsp_len);
221         }
222         else
223         {*/
224         NXPLOG_NCIHAL_D("Change RID command's UID echo bytes to 0");
225 
226         nxpdta_ctrl.dta_t1t_flag = false;
227         p_cmd_data[6] = 0x00;
228         p_cmd_data[7] = 0x00;
229         p_cmd_data[8] = 0x00;
230         p_cmd_data[9] = 0x00;
231         status = NFCSTATUS_SUCCESS;
232         /*}*/
233       }
234     }
235   }
236   return status;
237 }
238