| /* |
| * Copyright (C) 2012-2014 NXP Semiconductors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include <phNxpConfig.h> |
| #include <phNxpLog.h> |
| #include <phNxpNciHal_dta.h> |
| |
| /*********************** Global Variables *************************************/ |
| static phNxpDta_Control_t nxpdta_ctrl = {0, 0, 0}; |
| extern bool nfc_debug_enabled; |
| /******************************************************************************* |
| ** |
| ** Function phNxpEnable_DtaMode |
| ** |
| ** Description This function configures |
| ** HAL in DTA mode |
| ** |
| *******************************************************************************/ |
| void phNxpEnable_DtaMode(uint16_t pattern_no) { |
| nxpdta_ctrl.dta_ctrl_flag = false; |
| nxpdta_ctrl.dta_t1t_flag = false; |
| nxpdta_ctrl.dta_pattern_no = pattern_no; |
| NXPLOG_NCIHAL_D(">>>>DTA - Mode is enabled"); |
| nxpdta_ctrl.dta_ctrl_flag = true; |
| } |
| |
| /******************************************************************************* |
| ** |
| ** Function phNxpDisable_DtaMode |
| ** |
| ** Description This function disable DTA mode |
| ** |
| *******************************************************************************/ |
| void phNxpDisable_DtaMode(void) { |
| nxpdta_ctrl.dta_ctrl_flag = false; |
| nxpdta_ctrl.dta_t1t_flag = false; |
| NXPLOG_NCIHAL_D(">>>>DTA - Mode is Disabled"); |
| } |
| |
| /****************************************************************************** |
| * Function phNxpDta_IsEnable |
| * |
| * Description This function checks the DTA mode is enable or not. |
| * |
| * Returns It returns TRUE if DTA enabled otherwise FALSE |
| * |
| ******************************************************************************/ |
| NFCSTATUS phNxpDta_IsEnable(void) { return nxpdta_ctrl.dta_ctrl_flag; } |
| |
| /****************************************************************************** |
| * Function phNxpDta_T1TEnable |
| * |
| * Description This function enables DTA mode for T1T tag. |
| * |
| * |
| ******************************************************************************/ |
| void phNxpDta_T1TEnable(void) { nxpdta_ctrl.dta_t1t_flag = true; } |
| /****************************************************************************** |
| * Function phNxpNHal_DtaUpdate |
| * |
| * Description This function changes the command and responses specific |
| * to make DTA application success |
| * |
| * Returns It return NFCSTATUS_SUCCESS then continue with send else |
| * sends NFCSTATUS_FAILED direct response is prepared and |
| * do not send anything to NFCC. |
| * |
| ******************************************************************************/ |
| |
| NFCSTATUS phNxpNHal_DtaUpdate(uint16_t* cmd_len, uint8_t* p_cmd_data, |
| uint16_t* rsp_len, uint8_t* p_rsp_data) { |
| NFCSTATUS status = NFCSTATUS_SUCCESS; |
| |
| if (nxpdta_ctrl.dta_ctrl_flag == true) { |
| // Workaround for DTA, block the set config command with general bytes */ |
| if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x17 && p_cmd_data[3] == 0x01 && |
| p_cmd_data[4] == 0x29 && p_cmd_data[5] == 0x14) { |
| *rsp_len = 5; |
| NXPLOG_NCIHAL_D(">>>>DTA - Block set config command"); |
| phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len); |
| |
| p_rsp_data[0] = 0x40; |
| p_rsp_data[1] = 0x02; |
| p_rsp_data[2] = 0x02; |
| p_rsp_data[3] = 0x00; |
| p_rsp_data[4] = 0x00; |
| |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5); |
| |
| status = NFCSTATUS_FAILED; |
| NXPLOG_NCIHAL_D( |
| "Going through DTA workaround - Block set config command END"); |
| |
| } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x08 && |
| p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0xFF && |
| p_cmd_data[4] == 0xFF) { |
| NXPLOG_NCIHAL_D(">>>>DTA Change Felica system code"); |
| *rsp_len = 4; |
| p_rsp_data[0] = 0x41; |
| p_rsp_data[1] = 0x08; |
| p_rsp_data[2] = 0x01; |
| p_rsp_data[3] = 0x00; |
| status = NFCSTATUS_FAILED; |
| |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 4); |
| } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x10 && p_cmd_data[3] == 0x05 && |
| p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) { |
| NXPLOG_NCIHAL_D(">>>>DTA Update LA_SEL_INFO param"); |
| |
| p_cmd_data[12] = 0x40; |
| p_cmd_data[18] = 0x02; |
| status = NFCSTATUS_SUCCESS; |
| } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 && |
| p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) { |
| NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config"); |
| *rsp_len = 5; |
| p_rsp_data[0] = 0x40; |
| p_rsp_data[1] = 0x02; |
| p_rsp_data[2] = 0x02; |
| p_rsp_data[3] = 0x00; |
| p_rsp_data[4] = 0x00; |
| status = NFCSTATUS_FAILED; |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5); |
| } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) { |
| NXPLOG_NCIHAL_D(">>>>DTA Add NFC-F listen tech params"); |
| p_cmd_data[2] += 6; |
| p_cmd_data[3] += 3; |
| p_cmd_data[*cmd_len] = 0x80; |
| p_cmd_data[*cmd_len + 1] = 0x01; |
| p_cmd_data[*cmd_len + 2] = 0x82; |
| p_cmd_data[*cmd_len + 3] = 0x01; |
| p_cmd_data[*cmd_len + 4] = 0x85; |
| p_cmd_data[*cmd_len + 5] = 0x01; |
| |
| *cmd_len += 6; |
| status = NFCSTATUS_SUCCESS; |
| } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 && |
| p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x20 && |
| nxpdta_ctrl.dta_pattern_no == 0x1000) { |
| NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing"); |
| *rsp_len = 5; |
| p_rsp_data[0] = 0x40; |
| p_rsp_data[1] = 0x02; |
| p_rsp_data[2] = 0x02; |
| p_rsp_data[3] = 0x00; |
| p_rsp_data[4] = 0x00; |
| status = NFCSTATUS_FAILED; |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5); |
| } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 && |
| p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x01 && |
| p_cmd_data[6] == 0x00) { |
| NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config"); |
| *rsp_len = 5; |
| p_rsp_data[0] = 0x40; |
| p_rsp_data[1] = 0x02; |
| p_rsp_data[2] = 0x02; |
| p_rsp_data[3] = 0x00; |
| p_rsp_data[4] = 0x00; |
| status = NFCSTATUS_FAILED; |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5); |
| } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 && |
| p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 && |
| p_cmd_data[4] == 0x50 && p_cmd_data[5] == 0x01 && |
| p_cmd_data[6] == 0x00 && nxpdta_ctrl.dta_pattern_no == 0x1000) { |
| NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing"); |
| *rsp_len = 5; |
| p_rsp_data[0] = 0x40; |
| p_rsp_data[1] = 0x02; |
| p_rsp_data[2] = 0x02; |
| p_rsp_data[3] = 0x00; |
| p_rsp_data[4] = 0x00; |
| status = NFCSTATUS_FAILED; |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5); |
| } else { |
| } |
| if (nxpdta_ctrl.dta_t1t_flag == true) { |
| if (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x78 && |
| p_cmd_data[4] == 0x00 && p_cmd_data[5] == 0x00) { |
| /*if (nxpdta_ctrl.dta_pattern_no == 0) |
| { |
| NXPLOG_NCIHAL_D(">>>>DTA - T1T modification block RID command Custom |
| Response (pattern 0)"); |
| phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len); |
| *rsp_len = 10; |
| p_rsp_data[0] = 0x00; |
| p_rsp_data[1] = 0x00; |
| p_rsp_data[2] = 0x07; |
| p_rsp_data[3] = 0x12; |
| p_rsp_data[4] = 0x49; |
| p_rsp_data[5] = 0x00; |
| p_rsp_data[6] = 0x00; |
| p_rsp_data[7] = 0x00; |
| p_rsp_data[8] = 0x00; |
| p_rsp_data[9] = 0x00; |
| |
| status = NFCSTATUS_FAILED; |
| |
| phNxpNciHal_print_packet("DTARECV", p_rsp_data, *rsp_len); |
| } |
| else |
| {*/ |
| NXPLOG_NCIHAL_D("Change RID command's UID echo bytes to 0"); |
| |
| nxpdta_ctrl.dta_t1t_flag = false; |
| p_cmd_data[6] = 0x00; |
| p_cmd_data[7] = 0x00; |
| p_cmd_data[8] = 0x00; |
| p_cmd_data[9] = 0x00; |
| status = NFCSTATUS_SUCCESS; |
| /*}*/ |
| } |
| } |
| } |
| return status; |
| } |