• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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