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.
233 lines
8.6 KiB
233 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};
|
|
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;
|
|
}
|