Home | History | Annotate | Download | only in hal
      1 /*
      2 * Copyright (C) 2012-2014 NXP Semiconductors
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 *      http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */#include <log/log.h>
     16 
     17 #include <phNxpConfig.h>
     18 #include <phNxpLog.h>
     19 #include <phNxpNciHal_dta.h>
     20 
     21 /*********************** Global Variables *************************************/
     22 static phNxpDta_Control_t nxpdta_ctrl = {0, 0, 0};
     23 extern bool nfc_debug_enabled;
     24 /*******************************************************************************
     25 **
     26 ** Function         phNxpEnable_DtaMode
     27 **
     28 ** Description      This function configures
     29 **                  HAL in DTA mode
     30 **
     31 *******************************************************************************/
     32 void phNxpEnable_DtaMode(uint16_t pattern_no) {
     33   nxpdta_ctrl.dta_ctrl_flag = false;
     34   nxpdta_ctrl.dta_t1t_flag = false;
     35   nxpdta_ctrl.dta_pattern_no = pattern_no;
     36   NXPLOG_NCIHAL_D(">>>>DTA - Mode is enabled");
     37   nxpdta_ctrl.dta_ctrl_flag = true;
     38 }
     39 
     40 /*******************************************************************************
     41 **
     42 ** Function         phNxpDisable_DtaMode
     43 **
     44 ** Description      This function disable DTA mode
     45 **
     46 *******************************************************************************/
     47 void phNxpDisable_DtaMode(void) {
     48   nxpdta_ctrl.dta_ctrl_flag = false;
     49   nxpdta_ctrl.dta_t1t_flag = false;
     50   NXPLOG_NCIHAL_D(">>>>DTA - Mode is Disabled");
     51 }
     52 
     53 /******************************************************************************
     54  * Function         phNxpDta_IsEnable
     55  *
     56  * Description      This function checks the DTA mode is enable or not.
     57  *
     58  * Returns          It returns TRUE if DTA enabled otherwise FALSE
     59  *
     60  ******************************************************************************/
     61 NFCSTATUS phNxpDta_IsEnable(void) { return nxpdta_ctrl.dta_ctrl_flag; }
     62 
     63 /******************************************************************************
     64  * Function         phNxpDta_T1TEnable
     65  *
     66  * Description      This function  enables  DTA mode for T1T tag.
     67  *
     68  *
     69  ******************************************************************************/
     70 void phNxpDta_T1TEnable(void) { nxpdta_ctrl.dta_t1t_flag = true; }
     71 /******************************************************************************
     72  * Function         phNxpNHal_DtaUpdate
     73  *
     74  * Description      This function changes the command and responses specific
     75  *                  to make DTA application success
     76  *
     77  * Returns          It return NFCSTATUS_SUCCESS then continue with send else
     78  *                  sends NFCSTATUS_FAILED direct response is prepared and
     79  *                  do not send anything to NFCC.
     80  *
     81  ******************************************************************************/
     82 
     83 NFCSTATUS phNxpNHal_DtaUpdate(uint16_t* cmd_len, uint8_t* p_cmd_data,
     84                               uint16_t* rsp_len, uint8_t* p_rsp_data) {
     85   NFCSTATUS status = NFCSTATUS_SUCCESS;
     86 
     87   if (nxpdta_ctrl.dta_ctrl_flag == true) {
     88     // Workaround for DTA, block the set config command with general bytes */
     89     if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
     90         p_cmd_data[2] == 0x17 && p_cmd_data[3] == 0x01 &&
     91         p_cmd_data[4] == 0x29 && p_cmd_data[5] == 0x14) {
     92       *rsp_len = 5;
     93       NXPLOG_NCIHAL_D(">>>>DTA - Block set config command");
     94       phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
     95 
     96       p_rsp_data[0] = 0x40;
     97       p_rsp_data[1] = 0x02;
     98       p_rsp_data[2] = 0x02;
     99       p_rsp_data[3] = 0x00;
    100       p_rsp_data[4] = 0x00;
    101 
    102       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
    103 
    104       status = NFCSTATUS_FAILED;
    105       NXPLOG_NCIHAL_D(
    106           "Going through DTA workaround - Block set config command END");
    107 
    108     } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x08 &&
    109                p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0xFF &&
    110                p_cmd_data[4] == 0xFF) {
    111       NXPLOG_NCIHAL_D(">>>>DTA Change Felica system code");
    112       *rsp_len = 4;
    113       p_rsp_data[0] = 0x41;
    114       p_rsp_data[1] = 0x08;
    115       p_rsp_data[2] = 0x01;
    116       p_rsp_data[3] = 0x00;
    117       status = NFCSTATUS_FAILED;
    118 
    119       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 4);
    120     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
    121                p_cmd_data[2] == 0x10 && p_cmd_data[3] == 0x05 &&
    122                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
    123       NXPLOG_NCIHAL_D(">>>>DTA Update LA_SEL_INFO param");
    124 
    125       p_cmd_data[12] = 0x40;
    126       p_cmd_data[18] = 0x02;
    127       status = NFCSTATUS_SUCCESS;
    128     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
    129                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
    130                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x00) {
    131       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
    132       *rsp_len = 5;
    133       p_rsp_data[0] = 0x40;
    134       p_rsp_data[1] = 0x02;
    135       p_rsp_data[2] = 0x02;
    136       p_rsp_data[3] = 0x00;
    137       p_rsp_data[4] = 0x00;
    138       status = NFCSTATUS_FAILED;
    139       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
    140     } else if (p_cmd_data[0] == 0x21 && p_cmd_data[1] == 0x03) {
    141       NXPLOG_NCIHAL_D(">>>>DTA Add NFC-F listen tech params");
    142       p_cmd_data[2] += 6;
    143       p_cmd_data[3] += 3;
    144       p_cmd_data[*cmd_len] = 0x80;
    145       p_cmd_data[*cmd_len + 1] = 0x01;
    146       p_cmd_data[*cmd_len + 2] = 0x82;
    147       p_cmd_data[*cmd_len + 3] = 0x01;
    148       p_cmd_data[*cmd_len + 4] = 0x85;
    149       p_cmd_data[*cmd_len + 5] = 0x01;
    150 
    151       *cmd_len += 6;
    152       status = NFCSTATUS_SUCCESS;
    153     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
    154                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
    155                p_cmd_data[10] == 0x32 && p_cmd_data[12] == 0x20 &&
    156                nxpdta_ctrl.dta_pattern_no == 0x1000) {
    157       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
    158       *rsp_len = 5;
    159       p_rsp_data[0] = 0x40;
    160       p_rsp_data[1] = 0x02;
    161       p_rsp_data[2] = 0x02;
    162       p_rsp_data[3] = 0x00;
    163       p_rsp_data[4] = 0x00;
    164       status = NFCSTATUS_FAILED;
    165       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
    166     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
    167                p_cmd_data[2] == 0x0D && p_cmd_data[3] == 0x04 &&
    168                p_cmd_data[4] == 0x32 && p_cmd_data[5] == 0x01 &&
    169                p_cmd_data[6] == 0x00) {
    170       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config");
    171       *rsp_len = 5;
    172       p_rsp_data[0] = 0x40;
    173       p_rsp_data[1] = 0x02;
    174       p_rsp_data[2] = 0x02;
    175       p_rsp_data[3] = 0x00;
    176       p_rsp_data[4] = 0x00;
    177       status = NFCSTATUS_FAILED;
    178       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
    179     } else if (p_cmd_data[0] == 0x20 && p_cmd_data[1] == 0x02 &&
    180                p_cmd_data[2] == 0x04 && p_cmd_data[3] == 0x01 &&
    181                p_cmd_data[4] == 0x50 && p_cmd_data[5] == 0x01 &&
    182                p_cmd_data[6] == 0x00 && nxpdta_ctrl.dta_pattern_no == 0x1000) {
    183       NXPLOG_NCIHAL_D(">>>>DTA Blocking dirty set config for analog testing");
    184       *rsp_len = 5;
    185       p_rsp_data[0] = 0x40;
    186       p_rsp_data[1] = 0x02;
    187       p_rsp_data[2] = 0x02;
    188       p_rsp_data[3] = 0x00;
    189       p_rsp_data[4] = 0x00;
    190       status = NFCSTATUS_FAILED;
    191       phNxpNciHal_print_packet("DTARECV", p_rsp_data, 5);
    192     } else {
    193     }
    194     if (nxpdta_ctrl.dta_t1t_flag == true) {
    195       if (p_cmd_data[2] == 0x07 && p_cmd_data[3] == 0x78 &&
    196           p_cmd_data[4] == 0x00 && p_cmd_data[5] == 0x00) {
    197         /*if (nxpdta_ctrl.dta_pattern_no == 0)
    198         {
    199           NXPLOG_NCIHAL_D(">>>>DTA - T1T modification block RID command Custom
    200         Response (pattern 0)");
    201           phNxpNciHal_print_packet("DTASEND", p_cmd_data, *cmd_len);
    202           *rsp_len = 10;
    203           p_rsp_data[0] = 0x00;
    204           p_rsp_data[1] = 0x00;
    205           p_rsp_data[2] = 0x07;
    206           p_rsp_data[3] = 0x12;
    207           p_rsp_data[4] = 0x49;
    208           p_rsp_data[5] = 0x00;
    209           p_rsp_data[6] = 0x00;
    210           p_rsp_data[7] = 0x00;
    211           p_rsp_data[8] = 0x00;
    212           p_rsp_data[9] = 0x00;
    213 
    214           status = NFCSTATUS_FAILED;
    215 
    216           phNxpNciHal_print_packet("DTARECV", p_rsp_data, *rsp_len);
    217         }
    218         else
    219         {*/
    220         NXPLOG_NCIHAL_D("Change RID command's UID echo bytes to 0");
    221 
    222         nxpdta_ctrl.dta_t1t_flag = false;
    223         p_cmd_data[6] = 0x00;
    224         p_cmd_data[7] = 0x00;
    225         p_cmd_data[8] = 0x00;
    226         p_cmd_data[9] = 0x00;
    227         status = NFCSTATUS_SUCCESS;
    228         /*}*/
    229       }
    230     }
    231   }
    232   return status;
    233 }
    234