From 9224c881cf3f8575194823a6c779c0d65c42258a Mon Sep 17 00:00:00 2001 From: Arian Date: Mon, 30 Sep 2019 11:10:42 +0200 Subject: shinano-common: pn54x: Import from lineage-15.1 * https://github.com/LineageOS/android_system_nfc/tree/lineage-15.1/halimpl/pn54x/common * support for pn54x has been dropped in lineage-16.0 and above Change-Id: I19f2c3a6e3066bf9aaaaf4ddcd7d7ad867de0ed8 --- pn54x/hal/phNxpNciHal_dta.c | 232 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 pn54x/hal/phNxpNciHal_dta.c (limited to 'pn54x/hal/phNxpNciHal_dta.c') diff --git a/pn54x/hal/phNxpNciHal_dta.c b/pn54x/hal/phNxpNciHal_dta.c new file mode 100644 index 0000000..a6611ea --- /dev/null +++ b/pn54x/hal/phNxpNciHal_dta.c @@ -0,0 +1,232 @@ +/* +* 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 +#include +#include + +/*********************** Global Variables *************************************/ +static phNxpDta_Control_t nxpdta_ctrl = {0, 0, 0}; + +/******************************************************************************* +** +** 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; + ALOGD(">>>>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; +} -- cgit v1.2.3