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