diff options
author | Arian <arian.kulmer@web.de> | 2019-09-30 11:10:42 +0200 |
---|---|---|
committer | Arian <arian.kulmer@web.de> | 2019-10-25 22:17:12 +0200 |
commit | 9224c881cf3f8575194823a6c779c0d65c42258a (patch) | |
tree | ac8a018ff4fdea5a589ca7ee3d88cd88d0d460ba /pn54x/hal/phNxpNciHal_dta.c | |
parent | fbdbc276d9f25e67e49a7ca03002b838cc9c8548 (diff) |
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
Diffstat (limited to 'pn54x/hal/phNxpNciHal_dta.c')
-rw-r--r-- | pn54x/hal/phNxpNciHal_dta.c | 232 |
1 files changed, 232 insertions, 0 deletions
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 <phNxpConfig.h> +#include <phNxpLog.h> +#include <phNxpNciHal_dta.h> + +/*********************** 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; +} |