You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
8.6 KiB
232 lines
8.6 KiB
/* |
|
* 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; |
|
}
|
|
|