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