15e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 25e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Copyright (C) 2010 NXP Semiconductors 35e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 45e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Licensed under the Apache License, Version 2.0 (the "License"); 55e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * you may not use this file except in compliance with the License. 65e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * You may obtain a copy of the License at 75e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 85e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * http://www.apache.org/licenses/LICENSE-2.0 95e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Unless required by applicable law or agreed to in writing, software 115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * distributed under the License is distributed on an "AS IS" BASIS, 125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * See the License for the specific language governing permissions and 145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * limitations under the License. 155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/*! 185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* =========================================================================== * 195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* \file phDnldNfc.c * 225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* \brief Download Mgmt Interface Source for the Firmware Download. * 235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* Project: NFC-FRI-1.1 * 265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 278c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly* $Date: Tue Jun 28 14:25:44 2011 $ * 285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* $Author: ing04880 $ * 298c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly* $Revision: 1.33 $ * 305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* $Aliases: $ 315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* * 325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* =========================================================================== * 335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas***************************** Header File Inclusion **************************** 395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <stdlib.h> 42f15b4573a92e737e4aeef195792c6f30cac0f846Nick Pelly#include <unistd.h> 435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phNfcConfig.h> 445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phNfcCompId.h> 455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phNfcIoctlCode.h> 465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phDnldNfc.h> 475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phOsalNfc.h> 485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phOsalNfc_Timer.h> 495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#include <phDal4Nfc.h> 508c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#include <utils/Log.h> 515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas****************************** Macro Definitions ******************************* 545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef STATIC 585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define STATIC static 595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if defined (DNLD_SUMMARY) && !defined (DNLD_TRACE) 625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_TRACE 635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* #if defined(PHDBG_INFO) && defined (PHDBG_CRITICAL_ERROR) */ 665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if defined(DNLD_TRACE) 675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasextern char phOsalNfc_DbgTraceBuffer[]; 685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define MAX_TRACE_BUFFER 0x0410 705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define Trace_buffer phOsalNfc_DbgTraceBuffer 715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* #define DNLD_PRINT( str ) phOsalNfc_DbgTrace(str) */ 725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_PRINT( str ) phOsalNfc_DbgString(str) 735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_DEBUG(str, arg) \ 745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { \ 755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas snprintf(Trace_buffer,MAX_TRACE_BUFFER,str,arg); \ 765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_DbgString(Trace_buffer); \ 775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_PRINT_BUFFER(msg,buf,len) \ 795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { \ 805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas snprintf(Trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \ 815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_DbgString(Trace_buffer); \ 825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_DbgTrace(buf,len); \ 835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_DbgString("\r"); \ 845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_PRINT( str ) 875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_DEBUG(str, arg) 885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_PRINT_BUFFER(msg,buf,len) 895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 918c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define DO_DELAY(period) usleep(period) 928c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 938c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly/* delay after SW reset cmd in ms, required on uart for XTAL stability */ 948c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define PHDNLD_DNLD_DELAY 5000 956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren//#define PHDNLD_MAX_PACKET 0x0200U /* Max Total Packet Size is 512 */ 966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_MAX_PACKET 32U /* Max Total Packet Size is 512 */ 978c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define PHDNLD_DATA_SIZE ((PHDNLD_MAX_PACKET)- 8U) /* 0x01F8U */ 988c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly /* Max Data Size is 504 */ 998c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define PHDNLD_MIN_PACKET 0x03U /* Minimum Packet Size is 3*/ 1008c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 1016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_DEFAULT_RESPONSE_TIMEOUT 0x4000U 1026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define NXP_FW_MIN_TX_RX_LEN 0x0AU 1046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined( NXP_FW_MAX_TX_RX_LEN ) && \ 1076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( NXP_FW_MAX_TX_RX_LEN > NXP_FW_MIN_TX_RX_LEN ) 1086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FW_TX_RX_LEN NXP_FW_MAX_TX_RX_LEN 1106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#elif !defined( NXP_FW_MAX_TX_RX_LEN ) 1126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* To specify the Maximum TX/RX Len */ 1146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define NXP_FW_MAX_TX_RX_LEN 0x200 1156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FW_TX_RX_LEN NXP_FW_MAX_TX_RX_LEN 1166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 1186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FW_TX_RX_LEN NXP_FW_MIN_TX_RX_LEN 1206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 1226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_FRAME_LEN_SIZE 0x02U 1245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_ADDR_SIZE 0x03U 1255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_DATA_LEN_SIZE 0x02U 1266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FRAME_DATA_OFFSET 0x03U 1276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_SM_UNLOCK_MASK 0x01U 1296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_TRIM_MASK 0x02U 1306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_RESET_MASK 0x04U 1316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_VERIFY_MASK 0x08U 1326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define DNLD_CRITICAL_MASK 0x10U 1336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define NXP_NFC_IMAG_FW_MAX 0x05U 1368c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 1376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FW_PATCH_SEC 0x5FU 1388c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 1398c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define PHDNLD_PAGE_SIZE 0x80U /* Page Size Configured for 64 Bytes */ 1405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define FW_MAX_SECTION 0x15U /* Max Number of Sections */ 1425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_CRC16_SIZE 0x02U 1445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define DNLD_CRC32_SIZE 0x04U 1465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1478c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define DNLD_CFG_PG_ADDR 0x00008000U 1488c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define DNLD_FW_CODE_ADDR 0x00800000U 1498c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define DNLD_PATCH_CODE_ADDR 0x00018800U 1508c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define DNLD_PATCH_TABLE_ADDR 0x00008200U 1515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Raw Command to pass the Data in Download Mode */ 1546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_CMD_RAW 0x00U 1555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to Reset the Device in Download Mode */ 1565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_RESET 0x01U 1575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to Read from the Address specified in Download Mode */ 1585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_READ 0x07U 1595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_READ_LEN 0x0005U 1605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to write to the Address specified in Download Mode */ 1615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_WRITE 0x08U 1626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_CMD_SEC_WRITE 0x0CU 1635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_WRITE_MIN_LEN 0x0005U 1645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_WRITE_MAX_LEN PHDNLD_DATA_SIZE 1655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to verify the data written */ 1665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_CHECK 0x06U 1675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_CHECK_LEN 0x0007U 1685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to Lock the */ 1705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_LOCK 0x40U 1715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_LOCK_LEN 0x0002U 1725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to set the Host Interface properties */ 1755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_SET_HIF 0x09U 1765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to Activate the Patches Updated */ 1785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_ACTIVATE_PATCH 0x0AU 1795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Command to verify the Integrity of the data written */ 1815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_CMD_CHECK_INTEGRITY 0x0BU 1825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Command to verify the Integrity of the data written */ 1846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_CMD_ENCAPSULATE 0x0DU 1856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 1865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define CHECK_INTEGRITY_RESP_CRC16_LEN 0x03U 1875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define CHECK_INTEGRITY_RESP_CRC32_LEN 0x05U 1885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define CHECK_INTEGRITY_RESP_COMP_LEN 0x10U 1895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 1915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Success Response to a Command Sent in the Download Mode */ 1925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_SUCCESS 0x00U 1935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Timeout Response to a Command Sent in the Download Mode */ 1945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_TIMEOUT 0x01U 1955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* CRC Error Response to a Command Sent in the Download Mode */ 1965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_CRC_ERROR 0x02U 1975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Access Denied Response to a Command Sent in the Download Mode */ 1985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_ACCESS_DENIED 0x08U 1995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* PROTOCOL Error Response to a Command Sent in the Download Mode */ 2005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_PROTOCOL_ERROR 0x0BU 2015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Invalid parameter Response to a Command Sent in the Download Mode */ 2025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_INVALID_PARAMETER 0x11U 2036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Command Not Supported Response to a Command Sent in the Download Mode */ 2046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_CMD_NOT_SUPPORTED 0x13U 2055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Length parameter error Response to a Command Sent in the Download Mode */ 2065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_INVALID_LENGTH 0x18U 2076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Checksum Error Response to a Command Sent in the Download Mode */ 2086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_CHKSUM_ERROR 0x19U 2096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Version already uptodate Response to a Command Sent in the Download Mode */ 2106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_VERSION_UPTODATE 0x1DU 2116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* Memory operation error during the processing of 2126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren the Command Frame in the Download Mode */ 2136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_MEMORY_UPDATE_ERROR 0x20U 2146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* The Chaining of the Command Frame was Successful in the Download Mode */ 2156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_CHAINING_SUCCESS 0x21U 2166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* The Command is not allowed anymore in the Download Mode */ 2176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_CMD_NOT_ALLOWED 0xE0U 2186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* The Error during the Chaining the Command Frame in the Download Mode */ 2196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RESP_CHAINING_ERROR 0xE6U 2205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* Write Error Response to a Command Sent in the Download Mode */ 2215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PHDNLD_RESP_WRITE_ERROR 0x74U 2225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define PNDNLD_WORD_LEN 0x04U 2245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_MAX_DNLD_RETRY 0x02U 2265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2278c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_MAX_SECTION_WRITE 0x05U 2285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_PATCH_VER_INDEX 0x05U 2305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 2335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 2345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas******************** Enumeration and Structure Definition ********************** 2355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 2365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 2375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef enum phDnldNfc_eSeqType{ 2395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_RESET = 0x00U, 2405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_INIT, 2416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_SEQ_RAW, 2425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_LOCK, 2435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_UNLOCK, 2445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_UPDATE, 2455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_ROLLBACK, 2465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_COMPLETE 2475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} phDnldNfc_eSeqType_t; 2485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef enum phDnldNfc_eState 2505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 2515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Reset_State = 0x00, 2525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Unlock_State, 2535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Upgrade_State, 2545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Verify_State, 2555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Complete_State, 2565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Invalid_State 2575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_eState_t; 2585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef enum phDnldNfc_eSeq 2615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 2625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Reset_Seq = 0x00, 2638c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly phDnld_Activate_Patch, 2648c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly phDnld_Deactivate_Patch, 2655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Update_Patch, 2665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Update_Patchtable, 2675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Lock_System, 2685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Unlock_System, 2695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Upgrade_Section, 2705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Verify_Integrity, 2715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Verify_Section, 2725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Complete_Seq, 2736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnld_Raw_Upgrade, 2745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnld_Invalid_Seq 2755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_eSeq_t; 2765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef enum phDnldNfc_eChkCrc{ 2785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CHK_INTEGRITY_CONFIG_PAGE_CRC = 0x00U, 2795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CHK_INTEGRITY_PATCH_TABLE_CRC = 0x01U, 2805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CHK_INTEGRITY_FLASH_CODE_CRC = 0x02U, 2815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CHK_INTEGRITY_PATCH_CODE_CRC = 0x03U, 2825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CHK_INTEGRITY_COMPLETE_CRC = 0xFFU 2835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} phDnldNfc_eChkCrc_t; 2845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct hw_comp_tbl 2885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 2895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t hw_version[3]; 2905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t compatibility; 2915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}hw_comp_tbl_t; 2925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 2945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct img_data_hdr 2955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 2965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Image Identification */ 2975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t img_id; 2985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Offset of the Data from the header */ 2995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t img_data_offset; 3005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Number of fimware images available in the img_data */ 3015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t no_of_fw_img; 3026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* Fimware image Padding in the img_data */ 3035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t fw_img_pad[2]; 3045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* HW Compatiblity table for the set of the Hardwares */ 3055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas hw_comp_tbl_t comp_tbl; 3065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* This data consists of the firmware images required to download */ 3075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}img_data_hdr_t; 3085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct fw_data_hdr 3115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* The data offset from the firmware header. 3135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Just in case if in future we require to 3145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * add some more information. 3155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 3165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t fw_hdr_len; 3175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Total size of all the sections which needs to be updated */ 3185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t no_of_sections; 3195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t hw_comp_no; 3205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t fw_patch; 3215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t fw_version; 3225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}fw_data_hdr_t; 3235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* This data consists all the sections that needs to be downloaded */ 3275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct section_hdr 3285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t section_hdr_len; 3305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t section_mem_type; 3316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t section_checksum; 3326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t section_conf; 3335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t section_address; 3345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t section_length; 3355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}section_hdr_t; 3365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct section_info 3385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_hdr_t *p_sec_hdr; 3405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_trim_data; 3415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* The section data consist of the Firmware binary required 3425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * to be loaded to the particular address. 3435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 3445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_sec_data; 3456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* The Section checksum to verify the integrity of the section 3466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren * data. 3476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren */ 3486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *p_sec_chksum; 3495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Index used to refer and process the 3505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Firmware Section Data */ 3515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint32_t section_offset; 3525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Section Read Sequence */ 3545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t section_read; 3555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Section Write Sequence */ 3575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t section_write; 3585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal TRIM Write Sequence */ 3605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t trim_write; 3615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t sec_verify_retry; 3635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}section_info_t; 3655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sParam 3685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t data_addr[PHDNLD_ADDR_SIZE]; 3705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t data_len[PHDNLD_DATA_LEN_SIZE]; 3715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t data_packet[PHDNLD_DATA_SIZE]; 3725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sParam_t; 3735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sDataHdr 3755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t frame_type; 3775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE]; 3785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sData_Hdr_t; 3795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrentypedef struct phDnldNfc_sRawHdr 3816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 3826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t frame_type; 3836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE]; 3846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_sRawHdr_t; 3856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 3866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrentypedef struct phDnldNfc_sRawDataHdr 3876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 3886dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t data_addr[PHDNLD_ADDR_SIZE]; 3896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t data_len[PHDNLD_DATA_LEN_SIZE]; 3906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_sRawDataHdr_t; 3916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 3925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sChkCrc16_Resp 3935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 3945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t Chk_status; 3955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t Chk_Crc16[2]; 3965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sChkCrc16_Resp_t; 3985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 3995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sChkCrc32_Resp 4005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 4015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t Chk_status; 4025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t Chk_Crc32[4]; 4035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sChkCrc32_Resp_t; 4055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sChkCrcComplete 4085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 4095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrc16_Resp_t config_page; 4105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrc16_Resp_t patch_table; 4115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrc32_Resp_t flash_code; 4125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrc32_Resp_t patch_code; 4135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sChkCrcComplete_t; 4145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sData 4165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 4175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t frame_type; 4185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t frame_length[PHDNLD_FRAME_LEN_SIZE]; 4195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas union param 4205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 4215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sParam_t data_param; 4226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t response_data[PHDNLD_MAX_PACKET]; 4238c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly uint8_t cmd_param; 4245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas }param_info; 4255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas}phDnldNfc_sData_t; 4265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_NFC_MULTIPLE_FW 4286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrentypedef struct phDnldNfc_sFwImageInfo 4306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 4316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Data Pointer to the Firmware header section of the Firmware */ 4326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_data_hdr_t *p_fw_hdr; 4336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Buffer pointer to store the Firmware Section Data */ 4346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren section_info_t *p_fw_sec; 4356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Buffer pointer to store the Firmware Raw Data */ 4366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *p_fw_raw; 4376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_sFwImageInfo_t; 4386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #ifdef NXP_NFC_MULTIPLE_FW */ 4406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrentypedef struct phDnldNfc_TxInfo 4436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 4446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *transmit_frame; 4456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t tx_offset; 4476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Remaining amount of data to be sent */ 4496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t tx_len; 4506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t tx_total; 4526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Chain information for the data to be sent */ 4546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t tx_chain; 4556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_TxInfo_t; 4576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrentypedef struct phDnldNfc_RxInfo 4606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 4616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Total length of the received buffer */ 4626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t rx_total; 4636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Chain information of the received buffer */ 4646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t rx_chain; 4656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Remaining Data information to be read to complete the 4666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren * Data Information. 4676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren */ 4686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t rx_remain; 4696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Buffer to Send the Raw Data Frame */ 4716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t raw_buffer_data[PHDNLD_MAX_PACKET 4726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + PHDNLD_PAGE_SIZE]; 4736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_RxInfo_t; 4746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomastypedef struct phDnldNfc_sContext 4775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 4785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Structure to store the lower interface operations */ 4795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sLowerIF_t lower_interface; 4805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sData_t *p_fw_version; 4825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Pointer to the Hardware Reference Sturcture */ 4845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phHal_sHwReference_t *p_hw_ref; 4855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Pointer to the upper layer notification callback function */ 4875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify; 4885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Pointer to the upper layer context */ 4895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context; 4905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 4915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Timer ID for the Download Abort */ 4925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t timer_id; 4936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Internal Download for the Download Abort */ 4946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t dnld_timeout; 4955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Data Pointer to the Image header section of the Firmware */ 4965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas img_data_hdr_t *p_img_hdr; 4976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 4986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_NFC_MULTIPLE_FW 4996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Data Pointer to the Firmware Image Information */ 5006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sFwImageInfo_t *p_img_info; 5016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #ifdef NXP_NFC_MULTIPLE_FW */ 5026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 5035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Data Pointer to the Firmware header section of the Firmware */ 5045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_data_hdr_t *p_fw_hdr; 5055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Buffer pointer to store the Firmware Data */ 5065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_fw_sec; 5076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /** \internal Buffer pointer to store the Firmware Raw Data */ 5086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *p_fw_raw; 5095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Previous Download Size */ 5115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t prev_dnld_size; 5125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Single Data Block to download the Firmware */ 5146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t dnld_data[PHDNLD_MAX_PACKET 5156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + PHDNLD_PAGE_SIZE]; 5165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Index used to refer and process the Download Data */ 5175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint32_t dnld_index; 5185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Response Data to process the response */ 5205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sData_t dnld_resp; 5215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Previously downloaded data stored 5235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * to compare the written data */ 5245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sData_t dnld_store; 5255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Previously downloaded trimmed data stored 5275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * to compare the written data */ 5285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sData_t trim_store; 5295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_resp_buffer; 5315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrcComplete_t chk_integrity_crc; 5335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_eChkCrc_t chk_integrity_param; 5355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_FW_SW_VMID_TRIM 5375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_SW_VMID_TRIM 5385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_FW_VMID_TRIM_CHK_ADDR 0x0000813DU 5405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_FW_VMID_CARD_MODE_ADDR 0x00009931U 5415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_FW_VMID_RD_MODE_ADDR 0x00009981U 5425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t vmid_trim_update; 5445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #ifdef NXP_FW_SW_VMID_TRIM */ 5455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t cur_frame_info; 5476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 5486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t raw_mode_upgrade; 5495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_patch_table_crc; 5515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_flash_code_crc; 5535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_patch_code_crc; 5555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t resp_length; 5575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Current FW Section in Process */ 5595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t section_index; 5605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Previous Command sent */ 5625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t prev_cmd; 5635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t dnld_retry; 5655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Current Download State */ 5675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t cur_dnld_state; 5685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Next Download State */ 5695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t next_dnld_state; 5705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Current step in Download Sequence */ 5725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t cur_dnld_seq; 5735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /** \internal Next step in Download Sequence */ 5745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas volatile uint8_t next_dnld_seq; 5755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* \internal Data Transmit information */ 5776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_TxInfo_t tx_info; 5785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* \internal Data Receive information */ 5806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_RxInfo_t rx_info; 5816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 5826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 5836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren}phDnldNfc_sContext_t; 5845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 5875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 5885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas******************** Global and Static Variables Definition ******************** 5895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas################################################################################ 5905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 5918c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 5926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 5935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic phDnldNfc_sContext_t *gpphDnldContext = NULL; 5946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 5955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 5968c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#ifdef NXP_FW_DNLD_CHECK_PHASE 5978c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 5988c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_DNLD_COMPLETE_PHASE 0x00U 5998c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_DNLD_SYSTEM_PHASE 0x01U 6008c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_DNLD_CFG_PHASE 0x02U 6018c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_DNLD_DATA_PHASE 0x03U 6026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define NXP_FW_DNLD_RAW_PHASE 0x04U 6038c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_DNLD_INVALID_PHASE 0xFFU 6048c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 6058c9b94d7ff66df918290099034cddbed1fc3c485Nick Pellystatic uint8_t gphDnldPhase = NXP_FW_DNLD_COMPLETE_PHASE; 6068c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 6078c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif /* #ifdef NXP_FW_DNLD_CHECK_PHASE */ 6088c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 6095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/**/ 6105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 6125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*************************** Static Function Declaration ************************** 6135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 6145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6155e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 6165e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6175e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Send_Command( 6185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t cmd, 6215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *params, 6225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t param_length 6235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6265e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6275e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Process_FW( 6285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phHal_sHwReference_t *pHwRef 6305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_PARAM 6315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas , 6325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *nxp_nfc_fw, 6335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t fw_length 6345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 6355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6375e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 6385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 6395e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Send_Complete ( 6405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 6415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sTransactionInfo_t *pInfo 6435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6455e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 6465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 6475e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Receive_Complete ( 6485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 6495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sTransactionInfo_t *pInfo 6515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6535e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 6545e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6555e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Process_Response( 6565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 6595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 6605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6645e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6655e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Resume( 6665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 6695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 6705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6735e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6745e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Resume_Write( 6755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef 6775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6805e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6815e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Process_Write( 6825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_sec_info, 6855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t *p_sec_offset 6865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6895e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6905e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Sequence( 6915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 6925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 6935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 6945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 6955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 6965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 6975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 6985e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 6995e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Upgrade_Sequence( 7005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 7015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 7025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 7035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 7045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7065e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7075e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 7085e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Receive( 7095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 7105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 7115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pdata, 7125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 7135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7165e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7175e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 7185e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Send ( 7195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 7205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 7215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pdata, 7225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 7235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7255e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7265e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 7275e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Set_Seq( 7285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 7295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_eSeqType_t seq_type 7305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 7335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 7345e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Notify( 7355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify, 7365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context, 7375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 7385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t type, 7395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pInfo 7405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7425e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7435e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 7445e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Allocate_Resource ( 7455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void **ppBuffer, 7465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t size 7475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7495e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 7515e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Release_Resources ( 7525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t **ppsDnldContext 7535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7555e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 7575e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Release_Lower( 7585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 7595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef 7605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 7645e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 7655e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Read( 7665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 7675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 7685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_sec_info 7695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7715e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 7735e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Abort ( 7746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t abort_id 7756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 7766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , void *dnld_cntxt 7776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 7785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 7795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef DNLD_CRC_CALC 7825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 7845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 7855e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_UpdateCrc16( 7865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t crcByte, 7875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t *pCrc 7885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas); 7895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7905e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 7915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasuint16_t 7925e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_ComputeCrc16( 7935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pData, 7945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 7955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas); 7965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 7985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 7995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*************************** Function Definitions ************************** 8005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 8015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define CRC32_POLYNOMIAL 0xEDB88320L 8025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic uint32_t CRC32Table[0x100]; 8045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid BuildCRCTable() 8065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 8075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas unsigned long crc; 8085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0, j = 0; 8095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for ( i = 0; i <= 0xFF ; i++ ) 8115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 8125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = i; 8135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for ( j = 8 ; j> 0; j-- ) 8145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 8155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( crc & 1 ) 8165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 8175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = ( crc>> 1 ) ^ CRC32_POLYNOMIAL; 8185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 8195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 8205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 8215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc>>= 1; 8225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 8235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 8245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas CRC32Table[ i ] = crc; 8255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 8265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 8275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 8295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* This routine calculates the CRC for a block of data using the 8305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* table lookup method. It accepts an original value for the crc, 8315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas* and returns the updated value. 8325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 8335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasuint32_t CalculateCRC32( void *buffer , uint32_t count, uint32_t crc ) 8355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 8365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p; 8375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t temp1; 8385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t temp2; 8395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p = (uint8_t *) buffer; 8415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas while ( count-- != 0 ) { 8425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas temp1 = ( crc>> 8 ) & 0x00FFFFFFL; 8435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas temp2 = CRC32Table[ ( (int) crc ^ *p++ ) & 0xff ]; 8445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = temp1 ^ temp2; 8455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 8465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return( crc ); 8475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 8485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 8515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 8525e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_UpdateCrc16( 8535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t crcByte, 8545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t *pCrc 8555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas) 8565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 8575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crcByte = (crcByte ^ (uint8_t)((*pCrc) & 0x00FF)); 8585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crcByte = (crcByte ^ (uint8_t)(crcByte << 4)); 8595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas *pCrc = (*pCrc >> 8) ^ ((uint16_t)crcByte << 8) ^ 8605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((uint16_t)crcByte << 3) ^ 8615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((uint16_t)crcByte >> 4); 8625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 8635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8655e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 8665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasuint16_t 8675e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_ComputeCrc16( 8685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pData, 8695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 8705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas) 8715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 8725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t crc_byte = 0; 8735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t index = 0; 8745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t crc = 0; 8755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef CRC_A 8775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = 0x6363; /* ITU-V.41 */ 8785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 8795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = 0xFFFF; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */ 8805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #ifdef CRC_A */ 8815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas do 8835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 8845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc_byte = pData[index]; 8855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_UpdateCrc16(crc_byte, &crc); 8865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas index++; 8875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } while (index < length); 8885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef INVERT_CRC 8905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas crc = ~crc; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */ 8915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #ifndef INVERT_CRC */ 8925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* *pCrc1 = (uint8_t) (crc & BYTE_MASK); 8945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas *pCrc2 = (uint8_t) ((crc >> 8) & BYTE_MASK); */ 8955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return crc ; 8965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 8975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 8985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #ifdef DNLD_CRC_CALC */ 8995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/*! 9025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * \brief Allocation of the Download Interface resources. 9035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 9045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * This function releases and frees all the resources used by Download Mode 9055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Feature. 9065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 9075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9085e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 9095e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 9105e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Allocate_Resource ( 9115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void **ppBuffer, 9125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t size 9135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 9145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 9155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 9165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas *ppBuffer = (void *) phOsalNfc_GetMemory(size); 9185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( *ppBuffer != NULL ) 9195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void )memset(((void *)*ppBuffer), 0, 9215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas size); 9225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 9245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas *ppBuffer = NULL; 9265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, 9275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_INSUFFICIENT_RESOURCES); 9285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 9305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 9315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/*! 9345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * \brief Release of the Download Interface resources. 9355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 9365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * This function releases and frees all the resources used by Download layer. 9375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 9385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9395e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 9405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 9415e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Release_Resources ( 9425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t **ppsDnldContext 9435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 9445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 9456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 9465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != (*ppsDnldContext)->p_resp_buffer) 9475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory((*ppsDnldContext)->p_resp_buffer); 9495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->p_resp_buffer = NULL; 9505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != (*ppsDnldContext)->dnld_store.buffer) 9525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory((*ppsDnldContext)->dnld_store.buffer); 9545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->dnld_store.buffer = NULL; 9555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->dnld_store.length = 0; 9565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != (*ppsDnldContext)->trim_store.buffer) 9585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory((*ppsDnldContext)->trim_store.buffer); 9605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->trim_store.buffer = NULL; 9615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->trim_store.length = 0; 9625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != (*ppsDnldContext)->p_fw_sec) 9645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory((*ppsDnldContext)->p_fw_sec); 9665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->p_fw_sec = NULL; 9675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( NXP_INVALID_TIMER_ID != (*ppsDnldContext)->timer_id ) 9695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_Timer_Stop((*ppsDnldContext)->timer_id ); 9715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_Timer_Delete((*ppsDnldContext)->timer_id ); 9725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext)->timer_id = NXP_INVALID_TIMER_ID; 9735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 9745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory((*ppsDnldContext)); 9765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*ppsDnldContext) = NULL; 9775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return ; 9795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 9805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9825e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 9835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 9845e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Release_Lower( 9855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 9865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef 9875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 9885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 9895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sLowerIF_t *plower_if = 9905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas &(psDnldContext->lower_interface); 9915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 9925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHNFC_UNUSED_VARIABLE(status); 9945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 9955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != plower_if->release) 9965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 9975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef DNLD_LOWER_RELEASE 9985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = plower_if->release((void *)plower_if->pcontext, 9995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void *)pHwRef); 10005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 10015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHNFC_UNUSED_VARIABLE(pHwRef); 10025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 10045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memset((void *)plower_if, 10055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 0, sizeof(phNfc_sLowerIF_t)); 10065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Releasing the Lower Layer Resources: Status = %02X\n" 10075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ,status); 10085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 10095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return; 10115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 10125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 10165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 10175e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Notify( 10185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify, 10195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context, 10205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 10215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t type, 10225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pInfo 10235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 10245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 10255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( ( NULL != p_upper_notify) ) 10265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 10275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Notify the to the Upper Layer */ 10285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (p_upper_notify)(p_upper_context, pHwRef, type, pInfo); 10295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 10305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 10315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10335e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 10345e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 10355e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Set_Seq( 10365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 10375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_eSeqType_t seq_type 10385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 10395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 10405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 10415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t prev_temp_state = 0; 10425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t prev_temp_seq = 10438c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t) phDnld_Activate_Patch; 10445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 10455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(seq_type) 10465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 10475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_SEQ_RESET: 10485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_SEQ_INIT: 10495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 10505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = 10515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 10525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 10535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Upgrade_State; 10546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_seq = 10555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Upgrade_Section; 10565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 10575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq; 10585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 10595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 10606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case DNLD_SEQ_RAW: 10616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 10626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_state = 10636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t) phDnld_Reset_State; 10646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 10656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Upgrade_State; 10666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_seq = 10676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Raw_Upgrade; 10686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_seq = 10696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_seq; 10706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 10716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 10728c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly case DNLD_SEQ_UNLOCK: 10735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 10745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = 10755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 10768c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 10778c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#ifdef NXP_FW_DNLD_CHECK_PHASE 10788c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( NXP_FW_DNLD_SYSTEM_PHASE < gphDnldPhase ) 10798c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 10808c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_state = 10818c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Upgrade_State; 10826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_seq = 10838c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Upgrade_Section; 10848c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 10858c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else 10868c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif /* NXP_FW_DNLD_CHECK_PHASE */ 10878c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 10888c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_state = 10898c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t) phDnld_Unlock_State; 10908c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->cur_dnld_seq = 10918c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t) phDnld_Activate_Patch; 10928c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 10935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 10945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq; 10955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 10965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 10978c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly case DNLD_SEQ_LOCK: 10985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 10995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = 11005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 11015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 11028c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t) phDnld_Reset_State; 11035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq = 11048c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t) phDnld_Lock_System; 11055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 11065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq; 11075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 11085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_SEQ_UPDATE: 11105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 11115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas prev_temp_state = (uint8_t) psDnldContext->cur_dnld_state; 11125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = 11135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state; 11145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->next_dnld_state = 11155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Invalid_State ; */ 11165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas prev_temp_seq = (uint8_t) psDnldContext->cur_dnld_seq; 11175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq = 11185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq; 11195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 11205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_SEQ_ROLLBACK: 11225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 11235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq = (uint8_t) prev_temp_seq; 11245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 11255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Invalid_Seq ; 11265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas prev_temp_seq = 0; 11275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = (uint8_t) prev_temp_state; 11295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->next_dnld_state = 11305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Invalid_State ; */ 11315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas prev_temp_state = 0; 11325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 11335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_SEQ_COMPLETE: 11355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 11365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_state = 11375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 11385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 11395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Verify_State; 11405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq = 11415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Verify_Integrity; 11425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 11435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq ; 11445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 11455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 11475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 11485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 11495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 11515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 11535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 11545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/*! 11585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * \brief Sends the data the corresponding peripheral device. 11595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 11605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * This function sends the Download data to the connected NFC Pheripheral device 11615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 11625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas STATIC 11655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS 11665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Send ( 11675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 11685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 11695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pdata, 11705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 11715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 11725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 11735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext= (phDnldNfc_sContext_t *)psContext; 11745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 11755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sLowerIF_t *plower_if = &(psDnldContext->lower_interface); 11775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 11785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( (NULL != plower_if) 11795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != plower_if->send) 11805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 11815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 11825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef DNLD_SUMMARY 11835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT_BUFFER("Send Buffer",pdata,length); 11845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 11855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = plower_if->send((void *)plower_if->pcontext, 11865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void *)pHwRef, pdata, length); 11876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 11886dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined(FW_DOWNLOAD_TIMER) && \ 11896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (FW_DOWNLOAD_TIMER == 2) 11906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( 11916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (NFCSTATUS_PENDING == status) 11926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id ) 11936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 11946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 11956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_timeout = NXP_DNLD_COMPLETE_TIMEOUT; 11966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 11976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( psDnldContext->dnld_timeout 11986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren < DNLD_DEFAULT_RESPONSE_TIMEOUT) 11996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 12006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_timeout 12016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren = DNLD_DEFAULT_RESPONSE_TIMEOUT; 12026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 12036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* Start the Download Timer */ 12046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phOsalNfc_Timer_Start( psDnldContext->timer_id, 12056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_timeout, 12066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (ppCallBck_t) phDnldNfc_Abort 12076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 12086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , (void *) psDnldContext 12096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 12106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ); 12116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 12126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" DNLD : Timer %X Started ", psDnldContext->timer_id); 12136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" \t\t With %U Timeout \n", psDnldContext->dnld_timeout); 12146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 12156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 12166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* (NXP_NFC_DNLD_TIMER == 1) */ 12175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 12185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 12205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 12215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/*! 12245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * \brief Receives the Download Mode Response from the corresponding peripheral device. 12255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * 12265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * This function receives the Download Command Response to the connected NFC 12275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Pheripheral device. 12285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 12295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12305e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 12315e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 12325e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Receive( 12335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 12345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 12355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *pdata, 12365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 12375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 12385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 12395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext= (phDnldNfc_sContext_t *)psContext; 12405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sLowerIF_t *plower_if = NULL ; 12415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 12425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL == psDnldContext ) 12445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); 12465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 12475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 12485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas plower_if = &(psDnldContext->lower_interface); 12505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( (NULL != plower_if) 12525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != plower_if->receive) 12535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 12545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = plower_if->receive((void *)plower_if->pcontext, 12565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void *)pHwRef, pdata, length); 12575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 12585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 12595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 12605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 12615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 12645e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 12655e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Read( 12665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 12675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 12685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_sec_info 12695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 12705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 12715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 12726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 12736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 12746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sParam_t *p_data_param = 12756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &p_dnld_data->param_info.data_param; 12765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t read_addr = (p_sec_info->p_sec_hdr->section_address 12775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_sec_info->section_offset); 12785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static unsigned sec_type = 0; 12795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0; 12805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t read_size = 0 ; 12815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type; 12835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 12845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( ( FALSE == p_sec_info->section_read ) 12856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && ((sec_type & DNLD_TRIM_MASK)) 12865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (FALSE == p_sec_info->trim_write) ) 12875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas read_size = (uint16_t) p_sec_info->p_sec_hdr->section_length; 12895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Section Read = %X \n", read_size); 12905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 12915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 12925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12938c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if (( FALSE == p_sec_info->section_read ) 12946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && ((sec_type & DNLD_VERIFY_MASK)) 12956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 12965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 12975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas read_size = (uint16_t)(psDnldContext->prev_dnld_size ); 12985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Section Read = %X \n", read_size); 12995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 13008c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else if( ( TRUE == p_sec_info->section_read ) 13018c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && ( TRUE == p_sec_info->section_write ) 13028c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly ) 13035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /*Already Read the Data Hence Ignore the Read */ 13058c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: Already Read, Read Ignored, read_size = %X \n", read_size); 13068c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 13078c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else 13088c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 13098c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly /* Ignore the Read */ 13108c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: Section Read Status = %X \n", p_sec_info->section_read); 13118c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: Section Write Status = %X \n", p_sec_info->section_write); 13128c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: No Read Required, Read_size = %X \n", read_size); 13135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 13145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 13155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (read_size != 0) 13175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas read_size = (uint16_t)((PHDNLD_DATA_SIZE >= read_size)? 13205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas read_size: PHDNLD_DATA_SIZE); 13215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t)0; 13235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the LSB of the Data and the Address Parameter*/ 13246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)((read_addr >> 13255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK); 13266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_len[i] = (uint8_t)((read_size >> 13275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas BYTE_SIZE) & BYTE_MASK); 13285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 13295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t) 13315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ( PHDNLD_CMD_READ_LEN & BYTE_MASK); 13325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 2nd byte of the Data and the Address Parameter*/ 13336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)((read_addr >> 13345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas BYTE_SIZE) & BYTE_MASK); 13356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_len[i] = (uint8_t) (read_size & BYTE_MASK); 13365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 13375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 3rd byte of the the Address Parameter*/ 13396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)(read_addr & BYTE_MASK); 13405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 13425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_READ, NULL , 0 ); 13435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( NFCSTATUS_PENDING == status ) 13455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->section_read = TRUE ; 13475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = phDnld_Upgrade_State; 13485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Memory Read at Address %X : ", read_addr); 13495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" of Size %X \n", read_size); 13505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 13515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 13535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 13545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 13555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 13595e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 13605e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Process_Write( 13615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 13625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 13635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_sec_info, 13645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t *p_sec_offset 13655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 13665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 13675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 13686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 13696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 13705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sParam_t *dnld_data = 13716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &p_dnld_data->param_info.data_param; 13725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_sm_trim_data = (uint8_t *)psDnldContext-> 13735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_resp.param_info.response_data; 13745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t dnld_addr = 0; 13755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_SW_VMID_TRIM 13765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t trim_addr = 0; 13775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #ifdef NXP_FW_SW_VMID_TRIM */ 13785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static unsigned sec_type = 0; 13795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0; 13805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t dnld_size = 0; 13818c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly int cmp_val = 0x00; 13825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type; 13855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 13865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Read(psDnldContext, pHwRef, p_sec_info); 13875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( NFCSTATUS_PENDING != status ) 13885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( (TRUE == p_sec_info->trim_write) 13905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (TRUE == p_sec_info->section_read) 13916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && ((sec_type & DNLD_VERIFY_MASK)) 13925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 13935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != psDnldContext->trim_store.buffer) 13955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 13968c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly uint32_t trim_cmp_size = psDnldContext->prev_dnld_size; 13978c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 13988c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( p_sec_info->p_sec_hdr->section_address 13998c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly < (DNLD_CFG_PG_ADDR + PHDNLD_PAGE_SIZE) ) 14008c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 14018c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly trim_cmp_size = trim_cmp_size - 2; 14028c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 14038c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 14045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Below Comparison fails due to the checksum */ 14055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas cmp_val = phOsalNfc_MemCompare( 14065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->trim_store.buffer, 14075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas &psDnldContext->dnld_resp. 14085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas param_info.response_data[0] 14098c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly ,trim_cmp_size); 14108c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: %X Bytes Trim Write Complete ", 14118c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->prev_dnld_size); 14128c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" Comparison Status %X\n", cmp_val); 14135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->trim_write = FALSE; 14155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: TRIMMED %X Bytes Write Complete\n", psDnldContext->prev_dnld_size); 14165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 14185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if((NULL != psDnldContext->dnld_store.buffer) 14206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && ((sec_type & DNLD_VERIFY_MASK)) 14218c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && (TRUE == p_sec_info->section_write) 14228c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && (TRUE == p_sec_info->section_read) 14235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 14245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas cmp_val = phOsalNfc_MemCompare( 14265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.buffer, 14275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas &psDnldContext->dnld_resp. 14285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas param_info.response_data[0] 14295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ,psDnldContext->dnld_store.length); 14308c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info->section_read = FALSE; 14318c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info->section_write = FALSE; 14325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: %X Bytes Write Complete ", 14335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.length); 14345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Comparison Status %X\n", cmp_val); 14355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14368c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else 14378c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 14388c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if(( TRUE == p_sec_info->section_write) 14398c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && ( FALSE == p_sec_info->section_read) 14408c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly ) 14418c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 14428c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info->section_write = FALSE; 14438c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 14448c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 14455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* p_sec_info->section_read = FALSE; */ 14465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (( 0 == psDnldContext->dnld_retry ) 14495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (0 == cmp_val) 14505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 14515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->sec_verify_retry = 0; 14535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->section_offset = p_sec_info->section_offset + 14545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->prev_dnld_size; 14555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->prev_dnld_size = 0; 14565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Memory Write Retry - %X \n", 14575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry); 14585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 14605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->sec_verify_retry++; 14625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Memory Verification Failed, Retry = %X \n", 14635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->sec_verify_retry); 14645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( p_sec_info->sec_verify_retry < NXP_MAX_SECTION_WRITE ) 14675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_addr = (p_sec_info->p_sec_hdr->section_address + *p_sec_offset); 14705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size = (uint16_t)(p_sec_info->p_sec_hdr->section_length 14715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas - *p_sec_offset); 14725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 14745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = NFCSTATUS_FAILED; 14765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Memory Verification - Maximum Limit, Retry = %X \n", 14775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->sec_verify_retry); 14785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 14805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (dnld_size != 0) 14835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 14845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size = (uint16_t)((PHDNLD_DATA_SIZE >= dnld_size)? 14865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size: PHDNLD_DATA_SIZE); 14875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 14885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the LSB of the Data and the Address Parameter*/ 14895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_addr[i] = (uint8_t)((dnld_addr >> 14905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (BYTE_SIZE + BYTE_SIZE)) & BYTE_MASK); 14915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_len[i] = (uint8_t)((dnld_size >> BYTE_SIZE) 14925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 14936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t) 14945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((dnld_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE) 14955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 14965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 14975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 2nd byte of the Data and the Address Parameter*/ 14985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_addr[i] = (uint8_t)((dnld_addr >> BYTE_SIZE) 14995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 15005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_len[i] = (uint8_t) (dnld_size & BYTE_MASK); 15016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t) ((dnld_size + 15025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_WRITE_MIN_LEN) & BYTE_MASK); 15035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 15045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 3rd byte of the the Address Parameter*/ 15055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK); 15065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy( dnld_data->data_packet, 15088c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (p_sec_info->p_sec_data + *p_sec_offset), dnld_size ); 15095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( ((sec_type & DNLD_TRIM_MASK)) 15118c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && (p_sec_info->sec_verify_retry != 0) 15128c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && (NULL != psDnldContext->trim_store.buffer) 15138c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly ) 15148c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 15158c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (void)memcpy( dnld_data->data_packet, 15168c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->trim_store.buffer, dnld_size ); 15178c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 15186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if(((sec_type & DNLD_TRIM_MASK)) 15195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && ( TRUE == p_sec_info->section_read ) 15205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 15215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for(i = 0; i < *(p_sec_info->p_trim_data);i++) 15235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_SW_VMID_TRIM 15265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas/* 15285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasif(bit 0 of 0x813D is equal to 1) then 15295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas Do not overwrite 0x9931 / 0x9981 during download 15315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomaselse 15335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas @0x9931 = 0x79 // card Mode 15355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas @0x9981 = 0x79 // Reader Mode 15365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas*/ 15375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas trim_addr = p_sec_info->p_sec_hdr->section_address 15385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_sec_info->p_trim_data[i+1]; 15395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NXP_FW_VMID_TRIM_CHK_ADDR == trim_addr) 15405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->vmid_trim_update = 15425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sm_trim_data[p_sec_info->p_trim_data[i+1]] ; 15435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if((NXP_FW_VMID_CARD_MODE_ADDR == trim_addr) 15465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas || (NXP_FW_VMID_RD_MODE_ADDR == trim_addr)) 15475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (TRUE == psDnldContext->vmid_trim_update) 15495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_packet[p_sec_info->p_trim_data[i+1]] = 15515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sm_trim_data[p_sec_info->p_trim_data[i+1]] ; 15525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 15555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 15575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_packet[p_sec_info->p_trim_data[i+1]] = 15595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sm_trim_data[p_sec_info->p_trim_data[i+1]] ; 15605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != psDnldContext->trim_store.buffer) 15635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory(psDnldContext->trim_store.buffer); 15655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->trim_store.buffer = NULL; 15665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->trim_store.length = 0; 15675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if 1 15696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void) 15706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Allocate_Resource((void **) 15716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &(psDnldContext->trim_store.buffer),dnld_size); 15726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 15735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->trim_store.buffer = 15745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t *) phOsalNfc_GetMemory(dnld_size); 15756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 15765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != psDnldContext->trim_store.buffer) 15785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void )memset((void *)psDnldContext->trim_store.buffer,0, 15805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size); 15815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy( psDnldContext->trim_store.buffer, 15825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_packet, dnld_size ); 15835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->trim_store.length = dnld_size; 15845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Write with Trimming at Address %X ", dnld_addr ); 15855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" of Size %X and ", dnld_size ); 15865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" with %X Trimming Values \n", *(p_sec_info->p_trim_data) ); 15875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 15885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 15915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != psDnldContext->dnld_store.buffer) 15935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 15945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory(psDnldContext->dnld_store.buffer); 15955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.buffer = NULL; 15965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.length = 0; 15975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 15986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if 1 15996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void) 16006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Allocate_Resource((void **) 16016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &(psDnldContext->dnld_store.buffer),dnld_size); 16026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 16035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.buffer = 16045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t *) phOsalNfc_GetMemory(dnld_size); 16056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 16065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NULL != psDnldContext->dnld_store.buffer) 16075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void )memset((void *)psDnldContext->dnld_store.buffer,0, 16095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size); 16105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy( psDnldContext->dnld_store.buffer, 16115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_data->data_packet, dnld_size ); 16125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_store.length = dnld_size; 16135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Memory Write at Address %X ", dnld_addr ); 16145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" of Size %X ", dnld_size ); 16155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 16186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(PHDNLD_FW_PATCH_SEC != psDnldContext->p_fw_hdr->fw_patch) 16196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 16205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 16215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_WRITE, NULL , 0 ); 16226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 16236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 16246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 16256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 16266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHDNLD_CMD_SEC_WRITE, NULL , 0 ); 16276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 16285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16298c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_DEBUG(" FW_DNLD: Memory Write Status = %X \n", status); 16305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( NFCSTATUS_PENDING == status ) 16315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->prev_dnld_size = dnld_size; 16338c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly cmp_val = 0x00; 16346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if((sec_type & DNLD_TRIM_MASK)) 16355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->trim_write = TRUE; 16375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Bytes Downloaded (Trimming Values) = %X Bytes \n", 16385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_size); 16395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 16415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16428c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info->section_write = TRUE; 16435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Bytes Downloaded = %X : ", 16445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*p_sec_offset + dnld_size)); 16455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Bytes Remaining = %X \n", 16465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (p_sec_info->p_sec_hdr->section_length - 16475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (*p_sec_offset + dnld_size))); 16485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->section_read = FALSE; 16515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 16545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 16555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 16595e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 16605e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Resume_Write( 16615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 16625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef 16635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 16645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 16655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 16665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t sec_index = psDnldContext->section_index; 16675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_sec_info = (psDnldContext->p_fw_sec + sec_index); 16685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas while((sec_index < psDnldContext->p_fw_hdr->no_of_sections) 16705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NFCSTATUS_SUCCESS == status ) 16715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 16725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Process_Write(psDnldContext, pHwRef, 16755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info, (uint32_t *)&(p_sec_info->section_offset)); 16765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_SUCCESS == status) 16775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas unsigned sec_type = 0; 16795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sec_type = (unsigned int)p_sec_info->p_sec_hdr->section_mem_type; 16805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->section_offset = 0; 16825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->section_read = FALSE; 16838c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info->section_write = FALSE; 16845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info->trim_write = FALSE; 16855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Section %02X Download Complete\n", sec_index); 16876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if((sec_type & DNLD_RESET_MASK)) 16885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 16895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Reset After Section %02X Download \n", sec_index); 16905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 16915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_RESET , NULL, 0 ); 16925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 16935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT("*******************************************\n\n"); 16945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 16955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sec_index++; 16968c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 16978c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#ifdef NXP_FW_DNLD_CHECK_PHASE 16988c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( p_sec_info->p_sec_hdr->section_address 16998c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly < (DNLD_CFG_PG_ADDR + PHDNLD_PAGE_SIZE) ) 17008c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 17018c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly gphDnldPhase = NXP_FW_DNLD_DATA_PHASE; 17028c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 17038c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 17048c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 17055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_sec_info = (psDnldContext->p_fw_sec + sec_index); 17068c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 17078c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( (sec_index < psDnldContext->p_fw_hdr->no_of_sections) 17088c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly && ( p_sec_info->p_sec_hdr->section_address 17098c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly < (DNLD_CFG_PG_ADDR + PHDNLD_PAGE_SIZE) ) 17108c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly ) 17118c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 17128c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( NXP_FW_DNLD_CFG_PHASE >= gphDnldPhase ) 17138c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 17148c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly gphDnldPhase = NXP_FW_DNLD_CFG_PHASE; 17158c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 17168c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else 17178c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 17188c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly sec_index++; 17198c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info = (psDnldContext->p_fw_sec + sec_index); 17208c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 17218c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 17228c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#else 17238c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly p_sec_info = (psDnldContext->p_fw_sec + sec_index); 17248c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif /* #ifdef NXP_FW_DNLD_CHECK_PHASE */ 17258c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 17265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->section_index = sec_index; 17275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->next_dnld_state = (uint8_t) phDnld_Upgrade_State; */ 17285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 17295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 17305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING == status) 17315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 17325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = (uint8_t) phDnld_Upgrade_State; 17335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 17345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if (NFCSTATUS_SUCCESS == status) 17355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 17365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Reset the PN544 Device */ 17375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = (uint8_t) phDnld_Complete_State; 17385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 17395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 17405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 17415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 17435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 17445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 17455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_DNLD_SM_UNLOCK_ADDR 0x008002U 17485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if !defined (ES_HW_VER) 17505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define ES_HW_VER 32 17515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 17525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (ES_HW_VER <= 30) 17545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_DNLD_PATCH_ADDR 0x01AFFFU 17555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 17566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define NXP_DNLD_PATCH_ADDR 0x01A1E0U 17575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 17585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (ES_HW_VER <= 30) 17605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_DNLD_PATCH_TABLE_ADDR 0x008107U 17615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 17625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#define NXP_DNLD_PATCH_TABLE_ADDR 0x00825AU 17635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 17645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 17675e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 17685e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Sequence( 17695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 17705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 17715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 17725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 17735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 17745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 17755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 17765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t dnld_addr = 0; 17776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 17786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 17796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sParam_t *p_data_param = 17806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & p_dnld_data->param_info.data_param; 17815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *p_data = NULL; 17825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint32_t patch_size = 0; 17835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (ES_HW_VER == 32) 17855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren static uint8_t patch_table[] = {0xA0, 0xA1, 0xE0, 0x80, 0xA9, 0x6C }; 17875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t patch_data[] = {0xA5, 0xD0, 0xFE, 0xA5, 0xD0, 0xFD, 0xA5, 17885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 0xD0, 0xFC, 0xA5, 0x02, 0x80, 0xA9, 0x75}; 17895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#elif (ES_HW_VER == 31) 17915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t patch_table[] = {0xA0, 0xAF, 0xE0, 0x80, 0x78, 0x84 }; 17935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t patch_data[] = {0xA5, 0xD0, 0xFE, 0xA5, 0xD0, 0xFD, 0xA5, 17945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 0xD0, 0xFC, 0xD0, 0xE0, 0xA5, 0x02, 0x80, 0x78, 0x8D}; 17955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#elif (ES_HW_VER == 30) 17975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 17985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t patch_table[] = {0x80, 0x91, 0x51, 0xA0, 0xAF, 17995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 0xFF, 0x80, 0x91, 0x5A}; 18005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t patch_data[] = {0x22}; 18015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 18035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t unlock_data[] = {0x00, 0x00}; 18055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas static uint8_t lock_data[] = {0x0C, 0x00}; 18065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0; 18085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHNFC_UNUSED_VARIABLE(pdata); 18105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHNFC_UNUSED_VARIABLE(length); 18115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(psDnldContext->cur_dnld_seq) 18125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Reset_Seq: 18145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 18165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_RESET , NULL , 0 ); 18175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* status = (NFCSTATUS_PENDING == status)? NFCSTATUS_SUCCESS: 18185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status; */ 18195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Reset Seq.. Status = %X \n", status); 18205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 18225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 18238c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly case phDnld_Activate_Patch: 18248c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 18258c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly uint8_t patch_activate = 0x01; 18268c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_seq = 18278c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Update_Patch; 18288c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#ifdef NXP_FW_DNLD_CHECK_PHASE 18298c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly gphDnldPhase = NXP_FW_DNLD_SYSTEM_PHASE; 18308c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif /* NXP_FW_DNLD_CHECK_PHASE */ 18318c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 18328c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 18338c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly PHDNLD_CMD_ACTIVATE_PATCH , &patch_activate, sizeof(patch_activate) ); 18348c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_PRINT(" FW_DNLD: Activate the Patch Update .... \n"); 18358c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly break; 18368c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 18378c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly case phDnld_Deactivate_Patch: 18388c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 18398c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly uint8_t patch_activate = 0x00; 18408c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 18418c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_state = 18428c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Reset_State; 18438c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 18448c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 18458c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly PHDNLD_CMD_ACTIVATE_PATCH , &patch_activate, sizeof(patch_activate) ); 18468c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DNLD_PRINT(" FW_DNLD: Deactivate the Patch Update .... \n"); 18478c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly break; 18488c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 18495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Update_Patch: 18505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_addr = NXP_DNLD_PATCH_ADDR; 18525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_size = sizeof(patch_data) ; 18535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_data = patch_data; 18545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 18555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Update_Patchtable; 18565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Patch Update Seq.... \n"); 18575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 18585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 18595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Update_Patchtable: 18605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_addr = NXP_DNLD_PATCH_TABLE_ADDR; 18625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_size = sizeof(patch_table) ; 18635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_data = patch_table; 18645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 18665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Reset_State; 18675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Patch Table Update Seq.... \n"); 18695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 18705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 18715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Unlock_System: 18725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_addr = NXP_DNLD_SM_UNLOCK_ADDR; 18745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_size = sizeof(unlock_data) ; 18755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_data = unlock_data; 18768c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#define NXP_FW_PATCH_DISABLE 18778c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#ifdef NXP_FW_PATCH_DISABLE 18788c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_seq = 18798c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Deactivate_Patch; 18808c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#else 18815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 18825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Reset_State; 18838c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif 18845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: System Memory Unlock Seq.... \n"); 18865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 18875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 18885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Lock_System: 18895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 18905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas dnld_addr = NXP_DNLD_SM_UNLOCK_ADDR; 18915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_size = sizeof(lock_data) ; 18925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_data = lock_data; 18935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 18945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 18955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 18965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: System Memory Lock Seq.... \n"); 18975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 18985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 18995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Upgrade_Section: 19005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Resume_Write( 19025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext, pHwRef ); 19035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 19045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Verify_Integrity: 19065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 19085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Reset_State; 19095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 19115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_CHECK_INTEGRITY , NULL, 0 ); 19125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: System Memory Integrity Check Sequence.... \n"); 19135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 19145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Verify_Section: 19165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 19185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 19205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 19225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( NFCSTATUS_SUCCESS == status) 19265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the LSB of the Data and the Address Parameter*/ 19296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)((dnld_addr >> 19305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (BYTE_SIZE + BYTE_SIZE)) 19315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 19326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_len[i] = (uint8_t)((patch_size >> BYTE_SIZE) 19335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 19346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t) 19355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((patch_size + PHDNLD_CMD_WRITE_MIN_LEN) >> BYTE_SIZE) 19365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 19375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 19385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 2nd byte of the Data and the Address Parameter*/ 19396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)((dnld_addr >> BYTE_SIZE) 19405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 19416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_len[i] = (uint8_t) (patch_size & BYTE_MASK); 19426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = (uint8_t) 19435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((patch_size + PHDNLD_CMD_WRITE_MIN_LEN) 19445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas & BYTE_MASK); 19455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas i++; 19465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Update the 3rd byte of the the Address Parameter*/ 19476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_data_param->data_addr[i] = (uint8_t)(dnld_addr & BYTE_MASK); 19485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 19505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_WRITE,(void *)p_data , (uint8_t)patch_size ); 19515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING != status) 19535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 19545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Set_Seq(psDnldContext, 19555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_ROLLBACK); 19565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 19585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 19595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 19605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define FRAME_HEADER_LEN 0x03U 19626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 19635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 19656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenvoid 19666dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Tx_Reset(phDnldNfc_sContext_t *psDnldContext) 19675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 19686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.transmit_frame = NULL; 19696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_total = 0x00; 19706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_offset = 0x00; 19716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_len = 0x00; 19726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_chain = FALSE; 19736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 19745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19756dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenSTATIC 19766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenbool_t 19776dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Extract_Chunks( 19786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *frame_data, 19796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_offset, 19806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_length, 19816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t max_frame , 19826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t *chunk_length 19836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ); 19845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 19866dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenSTATIC 19876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenbool_t 19886dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Extract_Chunks( 19896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *frame_data, 19906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_offset, 19916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_length, 19926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t max_frame , 19936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t *chunk_length 19946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 19956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 19966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren bool_t chunk_present = FALSE; 19976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 19986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( 0 == frame_offset) 19996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( max_frame >= (frame_length 20016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren - frame_offset)) 20026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren *chunk_length = (frame_length - frame_offset); 20046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 20066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren *chunk_length = max_frame 20086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren - FRAME_HEADER_LEN; 20096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren chunk_present = TRUE; 20106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 20136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( max_frame >= (frame_length 20156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren - frame_offset)) 20166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren *chunk_length = (frame_length - frame_offset); 20186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 20206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren *chunk_length = max_frame 20226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren - FRAME_HEADER_LEN; 20236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren chunk_present = TRUE; 20246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 20276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return chunk_present; 20286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 20295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 20305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 20316dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenSTATIC 20325e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 20336dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Send_Raw( 20345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 20355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 20366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *raw_frame, 20376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_offset, 20386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_length 20396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 20405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 20416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_SUCCESS; 20426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sRawHdr_t *raw_frame_hdr = ( phDnldNfc_sRawHdr_t * ) raw_frame; 20435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 20446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren switch(raw_frame_hdr->frame_type) 20456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_RESET: 20475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 20486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 20496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_READ: 20516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: To Update the length and the buffer to receive data */ 20536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 20546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_WRITE: 20566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sRawDataHdr_t *raw_data_hdr = 20586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN); 20596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 20606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 20616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 20626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 20636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_SEC_WRITE: 20656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t tx_length = 0x00; 20676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t frame_offset = 20686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_offset; 20696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t chain = 20706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_chain; 20716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 20726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren chain = 20736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Extract_Chunks( 20746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren raw_frame, 20756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren frame_offset, 20766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren frame_length, 20776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHDNLD_FW_TX_RX_LEN, 20786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &tx_length 20796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ); 20806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 20816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( TRUE == chain ) 20825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 20836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Command( psDnldContext, 20846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren pHwRef, PHDNLD_CMD_ENCAPSULATE, 20856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (raw_frame + frame_offset), 20866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length); 20876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NFCSTATUS_PENDING == status) 20885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 20896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->prev_cmd = raw_frame_hdr->frame_type; 20906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Update for the Chaining */ 20916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_offset += tx_length; 20926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_chain = chain; 20935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 20946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 20956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if (0 != frame_offset) 20966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 20976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Command( psDnldContext, 20986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren pHwRef, PHDNLD_CMD_ENCAPSULATE, 20996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (raw_frame + frame_offset), 21006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length); 21016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NFCSTATUS_PENDING == status) 21025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 21036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->prev_cmd = raw_frame_hdr->frame_type; 21046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Update for the Chaining */ 21056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->prev_dnld_size = frame_length; 21066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Tx_Reset(psDnldContext); 21075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 21085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 21096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 21106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sRawDataHdr_t *raw_data_hdr = 21126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( phDnldNfc_sRawDataHdr_t * ) (raw_frame + FRAME_HEADER_LEN); 21136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 21146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 21175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 21186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_CHECK: 21195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 21206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 21215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 21225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 21236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_SET_HIF: 21245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 21256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 21266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_ACTIVATE_PATCH: 21296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 21316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_CHECK_INTEGRITY: 21346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t integrity_param = 21366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren *(raw_frame + FRAME_HEADER_LEN); 21376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren switch(integrity_param) 21386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case CHK_INTEGRITY_CONFIG_PAGE_CRC: 21406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case CHK_INTEGRITY_PATCH_TABLE_CRC: 21416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET 21436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + CHECK_INTEGRITY_RESP_CRC16_LEN; 21446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case CHK_INTEGRITY_FLASH_CODE_CRC: 21476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case CHK_INTEGRITY_PATCH_CODE_CRC: 21486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET 21506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + CHECK_INTEGRITY_RESP_CRC32_LEN; 21516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case CHK_INTEGRITY_COMPLETE_CRC: 21546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren default: 21556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET 21576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + CHECK_INTEGRITY_RESP_COMP_LEN; 21586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren default: 21646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FEATURE_NOT_SUPPORTED); 21666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 21676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if (NFCSTATUS_SUCCESS == status) 21716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send( psDnldContext, pHwRef , 21736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren raw_frame, frame_length); 21746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NFCSTATUS_PENDING == status) 21766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 21776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->prev_cmd = raw_frame_hdr->frame_type; 21786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Update for the Chaining */ 21796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->prev_dnld_size = frame_length; 21806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 21826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return status; 21846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 21856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenstatic 21886dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenNFCSTATUS 21896dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Frame_Complete(phDnldNfc_sContext_t *psDnldContext) 21906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 21916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_SUCCESS; 21926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_Hdr_t *p_dnld_raw = NULL; 21936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t dnld_index = psDnldContext->dnld_index; 21946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *p_raw_sec_hdr = NULL; 21956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t tx_length = 0x00; 21966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 21976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + psDnldContext->prev_dnld_size; 21986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index; 21996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + *p_raw_sec_hdr; 22006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_raw = (phDnldNfc_sData_Hdr_t *) (psDnldContext->p_fw_raw + 22026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_index); 22036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 22056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_raw->frame_length[1]); 22066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = tx_length + PHDNLD_MIN_PACKET; 22086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return status; 22106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 22116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenstatic 22146dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenNFCSTATUS 22156dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Raw_Write( 22166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sContext_t *psDnldContext, 22176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *pHwRef 22186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 22196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 22206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_SUCCESS; 22216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t dnld_index = psDnldContext->dnld_index; 22226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t tx_length = 0; 22236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t *p_raw_sec_hdr = NULL; 22246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t dnld_flag = FALSE; 22256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t skip_frame = FALSE; 22266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NULL != psDnldContext->p_fw_raw) 22286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 22296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( (TRUE != psDnldContext->tx_info.tx_chain) 22316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (0x00 == psDnldContext->dnld_retry) 22326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 22336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 22346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + psDnldContext->prev_dnld_size; 22356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index; 22366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + *p_raw_sec_hdr; 22376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 22386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 22396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 22406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *) 22416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->p_fw_raw + 22426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_index); 22436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 22456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_raw->frame_length[1]); 22466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = tx_length + PHDNLD_MIN_PACKET; 22486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Raw( psDnldContext, pHwRef, 22506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t *)(p_dnld_raw), 22516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_offset, 22526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint16_t)tx_length); 22536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 22546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_MAJOR_OFFSET 0x04U 22576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_MINOR_OFFSET 0x05U 22586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_PHASE_OFFSET 0x06U 22596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_FRAMETYPE_OFFSET 0x07U 22606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_NO_OPERATION 0x00U 22626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_NORMAL_OPERATION 0x10U 22636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_ADVANCED_OPERATION 0x20U 22646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_SETUP_OPERATION 0x40U 22656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_RECOVER_OPERATION 0x80U 22666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_COMPLETE_OPERATION 0xF0U 22676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_TERMINATE_TYPE 0x0EU 22696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#define PHDNLD_MARKER_MASK 0x0FU 22716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren while((NFCSTATUS_SUCCESS == status ) 22736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (FALSE == dnld_flag) 22746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 22756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 22766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_Hdr_t *p_dnld_raw = (phDnldNfc_sData_Hdr_t *) 22776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->p_fw_raw + dnld_index); 22786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t frame_type = *(p_raw_sec_hdr + PHDNLD_FRAMETYPE_OFFSET); 22796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = ((p_dnld_raw->frame_length[0] << BYTE_SIZE) | 22816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_raw->frame_length[1]); 22826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = tx_length + PHDNLD_MIN_PACKET; 22846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren skip_frame = FALSE; 22866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 22876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( (0x00 == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET)) 22886dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren || (0xFF == *(p_raw_sec_hdr + PHDNLD_PHASE_OFFSET)) 22896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren || !( psDnldContext->raw_mode_upgrade 22906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & (frame_type & (~PHDNLD_MARKER_MASK)) ) 22916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 22926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 22936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + tx_length; 22946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_raw_sec_hdr = psDnldContext->p_fw_raw + dnld_index; 22956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_index = dnld_index + *p_raw_sec_hdr; 22966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren skip_frame = TRUE; 22976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 22986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if (PHDNLD_TERMINATE_TYPE == 22996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (frame_type & PHDNLD_MARKER_MASK)) 23006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(TRUE != skip_frame) 23026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 23046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & 23056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ~(frame_type & ~PHDNLD_MARKER_MASK)); 23066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(PHDNLD_NO_OPERATION == 23096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade) 23106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren dnld_flag = TRUE; 23126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 23156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if((FALSE == skip_frame) 23206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (FALSE == dnld_flag) 23216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 23226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Raw( psDnldContext, pHwRef, 23246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t *)(p_dnld_raw), 23256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->tx_info.tx_offset, 23266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint16_t)tx_length); 23276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( NFCSTATUS_PENDING == status ) 23306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_index = dnld_index; 23326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_frame_info= frame_type; 23336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return status; 23386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 23396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenstatic 23416dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenNFCSTATUS 23426dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Upgrade_Sequence( 23436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sContext_t *psDnldContext, 23446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *pHwRef, 23456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *pdata, 23466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t length 23476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 23486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 23496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_SUCCESS; 23506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHNFC_UNUSED_VARIABLE(pdata); 23526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHNFC_UNUSED_VARIABLE(length); 23536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(phDnld_Raw_Upgrade == psDnldContext->cur_dnld_seq) 23556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Raw_Write( psDnldContext, pHwRef ); 23576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 23596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Resume_Write( psDnldContext, pHwRef ); 23616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return status; 23646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren} 23656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenstatic 23696dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenNFCSTATUS 23706dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Resume( 23716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sContext_t *psDnldContext, 23726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *pHwRef, 23736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *pdata, 23746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint16_t length 23756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 23766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 23776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_SUCCESS; 23786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_eState_t dnld_next_state = (phDnldNfc_eState_t) 23796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->cur_dnld_state; 23806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phNfc_sCompletionInfo_t comp_info = {0,0,0}; 23816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 23826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren switch( dnld_next_state ) 23836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Reset_State: 23856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 23876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHDNLD_CMD_RESET , NULL, 0 ); 23886dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren switch( psDnldContext->cur_dnld_seq ) 23896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Update_Patchtable: 23916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 23926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 23936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Unlock_State; 23946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_seq = 23956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Unlock_System; 23966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 23976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 23986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_FW_PATCH_DISABLE 23996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Deactivate_Patch: 24006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 24016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Unlock_System: 24026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 24036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 24056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Upgrade_State; 24066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_seq = 24076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Upgrade_Section; 24086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_FW_DNLD_CHECK_PHASE 24096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gphDnldPhase = NXP_FW_DNLD_CFG_PHASE; 24106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* NXP_FW_DNLD_CHECK_PHASE */ 24116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Lock_System: 24146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if (NXP_FW_INTEGRITY_CHK >= 0x01) 24166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 24176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Verify_State; 24186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_seq = 24196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)phDnld_Verify_Integrity; 24206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 24216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* (void ) memset( (void *) &psDnldContext->chk_integrity_crc, 24226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 0, sizeof(psDnldContext->chk_integrity_crc)); */ 24236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 24246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t) phDnld_Complete_State; 24256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 24266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Verify_Integrity: 24296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->next_dnld_state = 24316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t) phDnld_Complete_State; 24326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren default: 24356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = (NFCSTATUS_PENDING == status)? 24376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_SUCCESS: status; 24386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Unlock_State: 24446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 24466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Sequence( psDnldContext, pHwRef, 24476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren pdata, length); 24486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 24496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 24506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case phDnld_Upgrade_State: 24516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 24526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Upgrade_Sequence( psDnldContext, pHwRef, 24535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pdata, length); 24545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ((NFCSTATUS_SUCCESS == status ) 24555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (phDnld_Complete_State == psDnldContext->next_dnld_state)) 24565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 24575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if 0 24585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq = 24595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)phDnld_Lock_System; 24605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_seq = 24615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->cur_dnld_seq; 24625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 24638c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#if (NXP_FW_INTEGRITY_CHK >= 0x01) 24648c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_state = 24658c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Verify_State; 24668c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_seq = 24678c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (uint8_t)phDnld_Verify_Integrity; 24688c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->cur_dnld_seq = 24698c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly psDnldContext->next_dnld_seq; 24708c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly status = phDnldNfc_Sequence( psDnldContext, 24718c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly pHwRef, pdata, length); 24728c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#else 24735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* (void ) memset( (void *) &psDnldContext->chk_integrity_crc, 24745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 0, sizeof(psDnldContext->chk_integrity_crc)); */ 24755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->next_dnld_state = 24765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) phDnld_Complete_State; 24778c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 24785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 24795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 24805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 24815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Verify_State: 24825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 24835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Sequence( psDnldContext, 24845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pHwRef, pdata, length); 24855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 24865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 24875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case phDnld_Complete_State: 24885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 24895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t integrity_chk = 0xA5; 24905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 24915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (NXP_FW_INTEGRITY_CHK >= 0x01) 24925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t verify_crc = 0x96; 24935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 24945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( (NULL != psDnldContext->p_flash_code_crc) 24955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != psDnldContext->p_patch_code_crc) 24965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != psDnldContext->p_patch_table_crc) 24975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 24985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 24995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t crc_i = 0; 25005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t patch_table_crc = 0; 25015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t flash_code_crc = 0; 25025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t patch_code_crc = 0; 25035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for (crc_i = 0; crc_i < DNLD_CRC32_SIZE; crc_i++ ) 25055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (crc_i < DNLD_CRC16_SIZE ) 25075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25088c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly patch_table_crc = patch_table_crc 25095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas | psDnldContext->chk_integrity_crc.patch_table.Chk_Crc16[crc_i] 25105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas << (crc_i * BYTE_SIZE) ; 25115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas flash_code_crc = flash_code_crc 25135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas | psDnldContext->chk_integrity_crc.flash_code.Chk_Crc32[crc_i] 25145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas << (crc_i * BYTE_SIZE) ; 25155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_code_crc = patch_code_crc 25165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas | psDnldContext->chk_integrity_crc.patch_code.Chk_Crc32[crc_i] 25175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas << (crc_i * BYTE_SIZE) ; 25185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas verify_crc =(uint8_t)( (*((uint32_t *) psDnldContext->p_flash_code_crc)) != 25205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas flash_code_crc ); 25215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas verify_crc |=(uint8_t)( (*((uint32_t *) psDnldContext->p_patch_code_crc)) != 25225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_code_crc ); 25235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas verify_crc |=(uint8_t)( (*((uint16_t *) psDnldContext->p_patch_table_crc)) != 25245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas patch_table_crc ); 25255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 25275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Flash, Patch code and Patch Table CRC "); 25295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" Not Available in the Firmware \n"); 25305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 25335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas integrity_chk = psDnldContext->chk_integrity_crc.config_page.Chk_status + 25355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->chk_integrity_crc.patch_table.Chk_status + 25365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->chk_integrity_crc.flash_code.Chk_status + 25375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->chk_integrity_crc.patch_code.Chk_status; 25385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( ( 0 != integrity_chk ) 25405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (NXP_FW_INTEGRITY_CHK >= 0x01) 25415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas || ( 0 != verify_crc ) 25425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 25435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 25445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED); 25465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 25485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 25505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FAILED); 25525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 25535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING == status) 25575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Write/Receive is still pending */ 25595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 25615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 25625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify = 25635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_notify; 25645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context = 25655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_context; 25665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Resume Termination Status = %X \n", status); 25685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas comp_info.status = status; 25705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void) phDal4Nfc_Unregister( 25725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->lower_interface.pcontext, pHwRef); 25735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Release_Lower(psDnldContext, pHwRef); 25745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Release_Resources(&psDnldContext); 25756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 25766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = psDnldContext; 25776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 25785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Notify the Error/Success Scenario to the upper layer */ 25795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, (uint8_t) 25805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((NFCSTATUS_SUCCESS == comp_info.status )? NFC_IO_SUCCESS: NFC_IO_ERROR), 25815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas &comp_info ); 25825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 25835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 25845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 25855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25865e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 25875e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 25885e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Process_Response( 25895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 25905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 25915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata, 25925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length 25935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 25945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 25955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 25965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sData_Hdr_t *resp_data = 25975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (phDnldNfc_sData_Hdr_t *) pdata; 25985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 25995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHNFC_UNUSED_VARIABLE(pHwRef); 26006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" FW_DNLD: Receive Length = %X \n", length ); 26016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(( psDnldContext->rx_info.rx_total == 0 ) 26025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (PHDNLD_MIN_PACKET <= length) 26035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 26045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->rx_info.rx_total = 26065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((uint16_t)resp_data->frame_length[0] << BYTE_SIZE)| 26075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas resp_data->frame_length[1]; 26086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET == length ) 26095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Success Memory Read = %X \n", 26126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->rx_info.rx_total); 26135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef DNLD_SUMMARY 26145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* DNLD_PRINT_BUFFER("Receive Buffer",pdata,length); */ 26155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 26165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 26195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* status = phDnldNfc_Receive( psDnldContext, pHwRef, 26215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_resp_buffer, 26226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)((psDnldContext->rx_info.rx_total <= PHDNLD_MAX_PACKET)? 26236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->rx_info.rx_total: PHDNLD_MAX_PACKET) ); */ 26245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Invalid Receive length "); 26255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(": Length Expected = %X \n", 26266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->rx_info.rx_total + PHDNLD_MIN_PACKET)); 26275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, 26285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_INVALID_RECEIVE_LENGTH ); 26295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 26325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /*TODO:*/ 26346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->rx_info.rx_total = 0 ; 26355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, 26365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_INVALID_RECEIVE_LENGTH ); 26375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 26405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 26415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26445e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 26455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 26465e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Receive_Complete ( 26475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 26485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 26495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sTransactionInfo_t *pInfo 26505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 26515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 26525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS ; 26535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pdata = NULL ; 26545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sData_Hdr_t *resp_data = NULL; 26555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length = 0 ; 265634ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly phNfc_sCompletionInfo_t comp_info = {0,0,0}; 26575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT("\n FW_DNLD: Receive Response .... "); 26595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( (NULL != psContext) 26605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != pInfo) 26615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != pHwRef) 26625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 26635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext = 26655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (phDnldNfc_sContext_t *)psContext; 26665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = pInfo->status ; 26675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas length = pInfo->length ; 26685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pdata = pInfo->buffer; 26696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 26705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(status != NFCSTATUS_SUCCESS) 26715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Failed. Status = %02X\n",status); 26735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Handle the Error Scenario */ 26745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if (NULL == pdata) 26765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Failed. No data received. pdata = %02X\n",pdata); 26785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Handle the Error Scenario */ 26795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_FAILED ); 26805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ((0 == length) 26826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren || (PHDNLD_MIN_PACKET > length )) 26835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" Receive Response Length = %u .... \n",length); 26855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Handle the Error Scenario */ 26865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef HAL_SW_DNLD_RLEN 26875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, 26885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_INVALID_RECEIVE_LENGTH ); 26895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 26905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 26915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 26925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 26935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 26946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined(FW_DOWNLOAD_TIMER) && \ 26956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (FW_DOWNLOAD_TIMER == 2) 26966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id ) 26976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 26986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phOsalNfc_Timer_Stop( psDnldContext->timer_id ); 26996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 27006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 27016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 27026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 27035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifndef DNLD_SUMMARY 27045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT_BUFFER("Receive Buffer",pdata,length); 27055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 27065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Receive Response Length = %X. \n", length); 27075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 27085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas resp_data = (phDnldNfc_sData_Hdr_t *) pdata; 27095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 27105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(resp_data->frame_type) 27115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_RESP_SUCCESS: 27135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t resp_length = 27155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ((uint16_t)resp_data->frame_length[0] << BYTE_SIZE)| 27165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas resp_data->frame_length[1]; 27175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch ( psDnldContext->prev_cmd ) 27185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_READ : 27205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( PHDNLD_NO_OPERATION 27226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 27236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 27245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Process_Response( 27255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext, pHwRef, pdata , length); 27265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 27275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_SUCCESS != status) 27285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->dnld_retry++; */ 27305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 27315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY */ 27325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 27346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 27356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 27366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 27376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 27385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_CHECK_INTEGRITY : 27415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( PHDNLD_NO_OPERATION 27436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 27446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 27455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (NXP_FW_INTEGRITY_CHK >= 0x01) 27465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sChkCrcComplete_t *p_dnld_crc_all = 27475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas &psDnldContext->chk_integrity_crc; 27485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(psDnldContext->chk_integrity_param) 27495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_CONFIG_PAGE_CRC: 27515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(&p_dnld_crc_all->config_page, 27535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((uint8_t *)pdata) + PHDNLD_MIN_PACKET), resp_length); 27545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_PATCH_TABLE_CRC: 27575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(&p_dnld_crc_all->patch_table, 27595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((uint8_t *)pdata) + PHDNLD_MIN_PACKET), resp_length); 27605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_FLASH_CODE_CRC: 27635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(&p_dnld_crc_all->flash_code, 27655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((uint8_t *)pdata) + PHDNLD_MIN_PACKET), resp_length); 27665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_PATCH_CODE_CRC: 27695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(&p_dnld_crc_all->patch_code, 27715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((uint8_t *)pdata) + PHDNLD_MIN_PACKET), resp_length); 27725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_COMPLETE_CRC: 27755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(p_dnld_crc_all, 27775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (((uint8_t *)pdata) + PHDNLD_MIN_PACKET), resp_length); 27785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Check Integrity Complete Structure Size = %X \n", 27795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sizeof(psDnldContext->chk_integrity_crc)); 27805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 27835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 27845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, 27855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_FEATURE_NOT_SUPPORTED); 27865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 27875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 27895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 27906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 27916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 27926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 27936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 27946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (PHDNLD_SETUP_OPERATION | PHDNLD_ADVANCED_OPERATION); 27956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* psDnldContext->raw_mode_upgrade = 27966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & 27976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); */ 27986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 27995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 28005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_WRITE: 28025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = 0; 28045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 28055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_SEC_WRITE: 28076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry = 0; 28096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 28106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_ACTIVATE_PATCH: 28125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_CHECK: 28135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 28145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( PHDNLD_NO_OPERATION 28166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 28176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( ( (PHDNLD_MIN_PACKET > length) 28195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas || ( 0 != resp_length) ) 28205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 28215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 28235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, 28245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_INVALID_RECEIVE_LENGTH ); 28255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 28275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = 0; 28295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 28326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 28346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & ~PHDNLD_RECOVER_OPERATION); 28356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 28375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of the Previous Command Switch Case */ 28395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 28405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas }/* Case PHDNLD_RESP_SUCCESS*/ 28415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_RESP_TIMEOUT: 28425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_RESP_CRC_ERROR: 28436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_WRITE_ERROR: 28445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(psDnldContext->dnld_retry < NXP_MAX_DNLD_RETRY ) 28465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 28475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry++; 28485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, 28505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas resp_data->frame_type); 28515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 28525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 28536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* fall through */ 28546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_ACCESS_DENIED: 28556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_INVALID_PARAMETER: 28566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_INVALID_LENGTH: 28576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* Initial Frame Checksum */ 28586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_CHKSUM_ERROR: 28596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_MEMORY_UPDATE_ERROR: 28606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 28626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 28636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren resp_data->frame_type); 28646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 28656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_PROTOCOL_ERROR: 28676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(( PHDNLD_NO_OPERATION 28696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 28706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren || ( PHDNLD_ADVANCED_OPERATION 28716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 28726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 28736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 28756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 28766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_INVALID_FORMAT); 28776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if( (PHDNLD_NORMAL_OPERATION 28796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & psDnldContext->raw_mode_upgrade) 28806dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 28816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 28836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION); 28846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( PHDNLD_RECOVER_OPERATION 28866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & psDnldContext->raw_mode_upgrade ) 28876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28886dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 28896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 28906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_INVALID_FORMAT); 28916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 28936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 28946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 28956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & 28966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); 28976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 28986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 28996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_VERSION_UPTODATE: 29016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: to make sure that the Advance Frames are sent to get 29036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren * the updated status */ 29046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( PHDNLD_ADVANCED_OPERATION 29056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 29066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = ( CID_NFC_DNLD << BYTE_SIZE ) ; 29086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( PHDNLD_NO_OPERATION 29106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren != psDnldContext->raw_mode_upgrade) 29116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 29136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 29146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & 29156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); 29166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 29186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 29216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_CMD_NOT_SUPPORTED: 29236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 29256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( PHDNLD_NO_OPERATION 29266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 29276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 29296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_FEATURE_NOT_SUPPORTED); 29306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( PHDNLD_ADVANCED_OPERATION 29326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren == psDnldContext->raw_mode_upgrade) 29336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 29356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_FEATURE_NOT_SUPPORTED); 29366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if 0 29386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if( (PHDNLD_NORMAL_OPERATION 29396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & psDnldContext->raw_mode_upgrade) 29406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 29416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 29436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & ~PHDNLD_NORMAL_OPERATION); 29446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( PHDNLD_SETUP_OPERATION 29466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren & psDnldContext->raw_mode_upgrade ) 29476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 29496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & ~PHDNLD_SETUP_OPERATION); 29506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 29526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 29536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = 29556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->raw_mode_upgrade & 29566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ~( psDnldContext->cur_frame_info & ~PHDNLD_MARKER_MASK )); 29576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29586dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 29596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29606dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* The Chaining of the Command Frame 29616dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren was Successful in the Download Mode */ 29626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_CHAINING_SUCCESS: 29635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 29646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Handle the Corner Case Scenarios 29656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren * the updated status */ 29666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry = 0x00; 29675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 29685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 29696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* The Error during the Chaining the Command Frame in the Download Mode */ 29706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_CHAINING_ERROR: 29716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 29726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Restart the Chunk in Corner Case 29736dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren * the updated status */ 29746dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->dnld_retry++; 29756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Tx_Reset(psDnldContext); 29766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 29776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 29786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren/* The Command is not allowed anymore in the Download Mode */ 29796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_RESP_CMD_NOT_ALLOWED: 29805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 29815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 29825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = NXP_MAX_DNLD_RETRY; 29835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, 29846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_NOT_ALLOWED); 29855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 29865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 29876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 29885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of the Response Frame Type Switch */ 29895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 29905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING != status) 29915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 29925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ((NFCSTATUS_SUCCESS != status) && 29935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (psDnldContext->dnld_retry >= NXP_MAX_DNLD_RETRY)) 29945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 29955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify = 29965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_notify; 29975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context = 29985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_context; 29995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 30005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas comp_info.status = status; 30015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status); 30025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDal4Nfc_Unregister( 30035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->lower_interface.pcontext, pHwRef); 30045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Release_Lower(psDnldContext, pHwRef); 30055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Release_Resources(&psDnldContext); 30066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 30076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = psDnldContext; 30086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 30095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Notify the Error/Success Scenario to the upper layer */ 30105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, 30115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) NFC_IO_ERROR, &comp_info ); 30125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 30136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( (NFCSTATUS_SUCCESS != status) && 30146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (NFCSTATUS_SUCCESS == PHNFCSTATUS(status)) 30156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 30166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 30176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren pphNfcIF_Notification_CB_t p_upper_notify = 30186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_upper_notify; 30196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *p_upper_context = 30206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_upper_context; 30216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 30226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren comp_info.status = NFCSTATUS_SUCCESS; 30236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status); 30246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDal4Nfc_Unregister( 30256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->lower_interface.pcontext, pHwRef); 30266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Lower(psDnldContext, pHwRef); 30276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Resources(&psDnldContext); 30286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 30296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = psDnldContext; 30306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 30316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* Notify the Error/Success Scenario to the upper layer */ 30326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, 30336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t) NFC_IO_SUCCESS, &comp_info ); 30346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 30356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 30366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if (NFCSTATUS_FEATURE_NOT_SUPPORTED == PHNFCSTATUS(status)) 30376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 30386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren pphNfcIF_Notification_CB_t p_upper_notify = 30396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_upper_notify; 30406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren void *p_upper_context = 30416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_upper_context; 30426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 30436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren comp_info.status = status; 30446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" FW_DNLD: Termination in Receive, Status = %X \n", status); 30456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDal4Nfc_Unregister( 30466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->lower_interface.pcontext, pHwRef); 30476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Lower(psDnldContext, pHwRef); 30486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Resources(&psDnldContext); 30496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 30506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = psDnldContext; 30516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 30526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* Notify the Error/Success Scenario to the upper layer */ 30536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Notify( p_upper_notify, p_upper_context, pHwRef, 30546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t) NFC_IO_SUCCESS, &comp_info ); 30556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 30566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 30575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 30585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 30595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* DNLD_PRINT(" FW_DNLD: Successful.\n"); */ 30605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = /* PHDNLD_MIN_PACKET */ 0 ; 30615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Set_Seq(psDnldContext, 30625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_UPDATE); 30635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Resume( psDnldContext, 30645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pHwRef, pdata, length ); 30655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 30665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 30675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of status != Success */ 30685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 30695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 30705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 30715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 30725e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 30735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 30745e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Send_Complete ( 30755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *psContext, 30765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 30775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sTransactionInfo_t *pInfo 30785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 30795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 30805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS ; 30815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t length = 0; 30825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 30835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Send Data .... "); 30845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( (NULL != psContext) 30855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != pInfo) 30865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (NULL != pHwRef) 30875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 30885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 30895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext = 30905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (phDnldNfc_sContext_t *)psContext; 30915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = pInfo->status ; 30925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas length = pInfo->length ; 30935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(status != NFCSTATUS_SUCCESS) 30945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 30955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Failed. Status = %02X\n",status); 30965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Handle the Error Scenario */ 30975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 30985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 30995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" Successful.\n"); 31015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memset((void *)&psDnldContext->dnld_data, 0, 31025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sizeof(psDnldContext->dnld_data)); 31035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ((PHDNLD_CMD_SET_HIF != psDnldContext->prev_cmd) 31045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas && (PHDNLD_CMD_RESET != psDnldContext->prev_cmd)) 31055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->rx_info.rx_total = 0; 31075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Receive( psDnldContext, pHwRef, 31085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t *)(&psDnldContext->dnld_resp), 31095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length); 31105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 31125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = 0; 31145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->dnld_retry = 0; 3115f15b4573a92e737e4aeef195792c6f30cac0f846Nick Pelly /* clock unstable after SW reset command, especially on UART 3116f15b4573a92e737e4aeef195792c6f30cac0f846Nick Pelly * platform because of its sensitivity to clock. Experimentally 3117f15b4573a92e737e4aeef195792c6f30cac0f846Nick Pelly * we found clock unstable for 750us. Delay for 5ms to be sure. 3118f15b4573a92e737e4aeef195792c6f30cac0f846Nick Pelly */ 31196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( PHDNLD_CMD_RESET == psDnldContext->prev_cmd ) 31206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 31216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DO_DELAY(PHDNLD_DNLD_DELAY); 31226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 31236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined(FW_DOWNLOAD_TIMER) && \ 31246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (FW_DOWNLOAD_TIMER == 2) 31256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 31266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( NXP_INVALID_TIMER_ID != psDnldContext->timer_id ) 31276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 31286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phOsalNfc_Timer_Stop( psDnldContext->timer_id ); 31296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 31306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 31316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 31325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Set_Seq(psDnldContext, 31335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_SEQ_UPDATE); 31345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NFCSTATUS_SUCCESS == status ) 31375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Resume( psDnldContext, pHwRef, NULL, length); 31395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of status != Success */ 31425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of Context != NULL */ 31445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 31455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 31485e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 31495e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 31505e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Send_Command( 31515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext, 31525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *pHwRef, 31535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t cmd, 31545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *params, 31555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t param_length 31565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 31575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 31585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 31595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t tx_length = 0; 31605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint16_t rx_length = 0; 31615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t **pp_resp_data = &psDnldContext->p_resp_buffer; 31626dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 31636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 31645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(cmd) 31665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_RESET: 31685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memset((void *)&psDnldContext->dnld_data, 0, 31705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sizeof(psDnldContext->dnld_data)); 31715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 31725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_READ: 31745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 31766dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 31775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sParam_t *param_info = /* (phDnldNfc_sParam_t *)params */ 31786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &p_dnld_data->param_info.data_param; 31795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length = PHDNLD_CMD_READ_LEN; 31805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NULL != *pp_resp_data) 31815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_FreeMemory(*pp_resp_data); 31835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas *pp_resp_data = NULL; 31845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas rx_length = (uint16_t) (((uint16_t)param_info->data_len[0] 31865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas << BYTE_SIZE) + param_info->data_len[1]); 31875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 31885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = 31896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (( rx_length + PHDNLD_MIN_PACKET )); 31905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)phDnldNfc_Allocate_Resource( (void **) pp_resp_data, 31915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas rx_length); 31925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 31935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 31945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_WRITE: 31956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_SEC_WRITE: 31965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 31976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sData_t *p_dnld_data = 31986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (phDnldNfc_sData_t *)psDnldContext->dnld_data; 31995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sParam_t *param_info = /* (phDnldNfc_sParam_t *)params */ 32006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &p_dnld_data->param_info.data_param; 32015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length = (uint16_t) (((uint16_t)param_info->data_len[0] 32025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas << BYTE_SIZE) + param_info->data_len[1] 32035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + PHDNLD_CMD_WRITE_MIN_LEN ); 32045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 32055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET; 32065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ((0 != param_length) && (NULL != params)) 32075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)memcpy(param_info->data_packet, params, param_length); 32095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 32115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_CHECK: 32135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length = PHDNLD_CMD_CHECK_LEN; 32155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET; 32165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 32175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren case PHDNLD_CMD_ENCAPSULATE: 32196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 32206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t i = 0x00; 32216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ((0 != param_length) && (NULL != params)) 32226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 32236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_type = 32246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren PHDNLD_CMD_ENCAPSULATE; 32256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void)memcpy((void *)( ((uint8_t *)p_dnld_data) 32266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren + PHDNLD_FRAME_DATA_OFFSET) 32276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , params, param_length); 32286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length = param_length; 32296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 32306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i++] = 32316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)(tx_length >> BYTE_SIZE); 32326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = 32336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t)( tx_length & BYTE_MASK ); 32346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren tx_length += PHDNLD_FRAME_DATA_OFFSET; 32356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 32366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->resp_length = PHDNLD_MIN_PACKET; 32376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 32386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Send( psDnldContext, pHwRef , 32396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t *)p_dnld_data, tx_length); 32406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 32416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 32426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 32436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 32446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_NOT_ALLOWED); 32456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 32466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren break; 32476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 32485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_SET_HIF: 32495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length++; 32515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET; 32525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 32535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_ACTIVATE_PATCH: 32555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET; 32578c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if ((NULL != params) && ( param_length > 0 )) 32588c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 32596dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->param_info.cmd_param = 32608c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly (*(uint8_t *)params); 32618c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly tx_length = param_length; 32628c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 32638c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly else 32648c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly { 32656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->param_info.cmd_param = FALSE; 32668c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly tx_length++; 32678c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly } 32685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 32695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case PHDNLD_CMD_CHECK_INTEGRITY: 32715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (NXP_FW_INTEGRITY_CHK >= 0x01) 32735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ((NULL != params) && ( param_length > 0 )) 32745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->chk_integrity_param = 32765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (phDnldNfc_eChkCrc_t)(*(uint8_t *)params); 32778c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly tx_length = param_length; 32785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 32805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->chk_integrity_param = CHK_INTEGRITY_COMPLETE_CRC; 32825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length++; 32835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->param_info.cmd_param = 32855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) psDnldContext->chk_integrity_param; 32865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch(psDnldContext->chk_integrity_param) 32875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_CONFIG_PAGE_CRC: 32895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_PATCH_TABLE_CRC: 32905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET 32925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + CHECK_INTEGRITY_RESP_CRC16_LEN; 32935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 32945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 32955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_FLASH_CODE_CRC: 32965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_PATCH_CODE_CRC: 32975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 32985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET 32995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + CHECK_INTEGRITY_RESP_CRC32_LEN; 33005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 33015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case CHK_INTEGRITY_COMPLETE_CRC: 33035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 33045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->resp_length = PHDNLD_MIN_PACKET 33065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + CHECK_INTEGRITY_RESP_COMP_LEN; 33075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 33085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 33115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length++; 33126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->param_info.cmd_param = 33135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t) CHK_INTEGRITY_COMPLETE_CRC; 33145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 33155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 33165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 33175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 33195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_FEATURE_NOT_SUPPORTED); 33215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 33225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_SUCCESS == status) 33255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0; 33275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 33286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_type = cmd; 33296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i++] = 33305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)(tx_length >> BYTE_SIZE); 33316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_data->frame_length[i] = 33325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (uint8_t)( tx_length & BYTE_MASK ); 33335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas tx_length = tx_length + PHDNLD_MIN_PACKET; 33345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send( psDnldContext, pHwRef , 33356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (uint8_t *)p_dnld_data, tx_length); 33365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(NFCSTATUS_PENDING == status) 33375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->prev_cmd = cmd; 33398c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly 33408c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly if( PHDNLD_CMD_RESET == cmd ) 33418c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly DO_DELAY(PHDNLD_DNLD_DELAY); //this seems like its on the wrong thread 33425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 33455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 33465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 33475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 33485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasstatic 33495e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 33506dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Check_FW( 33516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phHal_sHwReference_t *pHwRef, 33526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_data_hdr_t *cur_fw_hdr 33535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 33545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 33555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_FAILED; 33565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 33575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( !pHwRef->device_info.fw_version ) 33585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Override the Firmware Version Check and upgrade*/; 33605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD_CHK: Forceful Upgrade of the Firmware .... Required \n"); 33615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = NFCSTATUS_SUCCESS; 33625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if ( (pHwRef->device_info.fw_version >> (BYTE_SIZE * 2)) 33645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas != ( cur_fw_hdr->fw_version >> (BYTE_SIZE * 2) )) 33655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Check for the Compatible Romlib Version for the Hardware */ 33675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: IC Hardware Version Mismatch.. \n"); 33685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED ); 33695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if (( pHwRef->device_info.fw_version < cur_fw_hdr->fw_version ) 33715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 33725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* TODO: Firmware Version Check and upgrade*/ 33745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Older Firmware Upgrading to newerone.... \n"); 33755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = NFCSTATUS_SUCCESS; 33765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_CHK_LATEST 33785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if (( pHwRef->device_info.fw_version > cur_fw_hdr->fw_version ) 33795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 33805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Newer than the Stored One .... \n"); 33825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, NFCSTATUS_NOT_ALLOWED ); 33835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* NXP_FW_CHK_LATEST */ 33855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 33865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 33875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Already Updated .... \n"); 33885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = ( CID_NFC_DNLD << BYTE_SIZE ) ; 33895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 33906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 33916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren return status; 33926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 33936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 33946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 33956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behrenstatic 33966dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenNFCSTATUS 33976dd948323de0f31b413c9f19a905f1c145c9c456Rob von BehrenphDnldNfc_Process_FW( 33986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sContext_t *psDnldContext, 33996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phHal_sHwReference_t *pHwRef 34006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_FW_PARAM 34016dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ,uint8_t *nxp_nfc_fw 34026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ,uint32_t nxp_fw_len 34036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 34046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 34056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren{ 34066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS status = NFCSTATUS_FAILED; 34076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren section_info_t *p_cur_sec = NULL; 34086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren static unsigned sec_type; 34096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t fw_index = 0; 34106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_NFC_MULTIPLE_FW 34116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sFwImageInfo_t *p_cur_fw = NULL; 34126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #ifdef NXP_NFC_MULTIPLE_FW */ 34136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_data_hdr_t *cur_fw_hdr = NULL; 34146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t sec_index = 0; 34156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t i = 0; 34166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw; 34186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_NFC_MULTIPLE_FW 34206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren /* TODO: Create a memory of pointers to store all the Firmwares */ 34226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( (NXP_NFC_IMAG_FW_MAX > psDnldContext->p_img_hdr->no_of_fw_img) 34236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (0 != psDnldContext->p_img_hdr->no_of_fw_img) 34246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 34256dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 34266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( void )phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_img_info, 34276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (psDnldContext->p_img_hdr->no_of_fw_img * sizeof(phDnldNfc_sFwImageInfo_t))); 34286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NULL != psDnldContext->p_img_info) 34306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 34316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_cur_fw = psDnldContext->p_img_info; 34326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 34336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 34346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #ifdef NXP_NFC_MULTIPLE_FW */ 34356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_index = sizeof (img_data_hdr_t); 34376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren for ( i=0; i < psDnldContext->p_img_hdr->no_of_fw_img; i++ ) 34396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 34406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index ); 34426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NXP_NFC_MULTIPLE_FW 34446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NULL != p_cur_fw) 34456dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 34466dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ( p_cur_fw + i)->p_fw_hdr = psDnldContext->p_fw_hdr; 34476dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 34486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #ifdef NXP_NFC_MULTIPLE_FW */ 34496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren cur_fw_hdr = psDnldContext->p_fw_hdr; 34506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN); 34526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr); 34546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 34566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if ( ( NFCSTATUS_SUCCESS == status ) 34585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if defined (NXP_FW_INTEGRITY_VERIFY) 34595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas || (NFCSTATUS_SUCCESS == PHNFCSTATUS(status) ) 34605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* !defined (NXP_FW_INTEGRITY_VERIFY) */ 34615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 34625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 34636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( (BYTE_MASK > cur_fw_hdr->no_of_sections) 34646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (0 != cur_fw_hdr->no_of_sections) 34656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 34666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 34675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void) phDnldNfc_Allocate_Resource((void **)&psDnldContext->p_fw_sec, 34685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (cur_fw_hdr->no_of_sections * sizeof(section_info_t))); 34696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 34706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if(NULL != psDnldContext->p_fw_sec) 34715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 34725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: FW Index : %x \n", 34735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_index ); 34745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: No of Sections : %x \n\n", 34765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas cur_fw_hdr->no_of_sections); 34775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for(sec_index = 0; sec_index 34795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas < cur_fw_hdr->no_of_sections; sec_index++ ) 34805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 34815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec = ((section_info_t *) 34825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (psDnldContext->p_fw_sec + sec_index )); 34835e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34845e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_hdr = (section_hdr_t *) 34855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (nxp_nfc_fw + fw_index); 34865e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Section %x \n", sec_index); 34885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Section Header Len : %x ", 34895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_hdr->section_hdr_len); 34905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Section Address : %x ", 34915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_hdr->section_address); 34925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Section Length : %x ", 34935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_hdr->section_length); 34945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" Section Memory Type : %x \n", 34955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_hdr->section_mem_type); 34965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas sec_type = (unsigned int)p_cur_sec->p_sec_hdr->section_mem_type; 34985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 34996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if((sec_type & DNLD_TRIM_MASK)) 35005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_trim_data = (uint8_t *) 35025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (nxp_nfc_fw + fw_index + sizeof(section_hdr_t)); 35035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 35055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_trim_data = NULL; 35075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35096dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if (0 == sec_index) 35106dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35116dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ((sec_type & DNLD_SM_UNLOCK_MASK)) 35126dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35136dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void)phDnldNfc_Set_Seq(psDnldContext, 35146dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_SEQ_UNLOCK); 35156dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 35166dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 35176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35186dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void)phDnldNfc_Set_Seq(psDnldContext, 35196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_SEQ_INIT); 35206dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 35216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 35225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->section_read = FALSE; 35235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->section_offset = 0; 35255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_data = ((uint8_t *) nxp_nfc_fw) + fw_index + 35275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN); 35285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_index = fw_index + 35305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (p_cur_sec->p_sec_hdr->section_hdr_len * PNDNLD_WORD_LEN) 35315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_cur_sec->p_sec_hdr->section_length; 35325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35336dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35346dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if( 0 != p_cur_sec->p_sec_hdr->section_checksum ) 35356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_DEBUG(" FW_DNLD: Section checksum : %x \n", 35376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_cur_sec->p_sec_hdr->section_checksum ); 35386dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35396dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_cur_sec->p_sec_chksum = ( uint8_t *)(nxp_nfc_fw + fw_index); 35406dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35416dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren fw_index = fw_index + 35426dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_cur_sec->p_sec_hdr->section_checksum; 35436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 35446dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: FW Index : %x \n", fw_index ); 35465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if (NXP_FW_INTEGRITY_CHK >= 0x01) 35485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas switch( p_cur_sec->p_sec_hdr->section_address ) 35495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_FW_CODE_ADDR: 35515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_flash_code_crc = 35535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_data 35545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_cur_sec->p_sec_hdr->section_length 35555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas - DNLD_CRC32_SIZE; 35565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 35575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_PATCH_CODE_ADDR: 35595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_patch_code_crc = 35615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_data 35625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_cur_sec->p_sec_hdr->section_length 35635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas - DNLD_CRC32_SIZE; 35645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 35655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas case DNLD_PATCH_TABLE_ADDR: 35675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_patch_table_crc = 35695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_cur_sec->p_sec_data 35705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas + p_cur_sec->p_sec_hdr->section_length 35715e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas - DNLD_CRC16_SIZE; 35725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 35735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas default: 35755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 35765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas break; 35775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35796dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } /* End of Address Switch */ 35805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if (NXP_FW_INTEGRITY_CHK >= 0x01) */ 35816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } /* End of For Loop */ 35826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } /* End of the Null Check */ 35836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 35846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = PHNFCSTVAL(CID_NFC_DNLD, 35866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NFCSTATUS_INSUFFICIENT_RESOURCES); 35876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 35885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 35906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else if ( 35916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (0 == cur_fw_hdr->no_of_sections) 35926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (PHDNLD_FW_PATCH_SEC == cur_fw_hdr->fw_patch) 35936dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ) 35946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 35956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->p_fw_raw = (uint8_t *)(nxp_nfc_fw + fw_index); 35965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 35976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->raw_mode_upgrade = PHDNLD_COMPLETE_OPERATION; 35986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 35996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void)phDnldNfc_Set_Seq(psDnldContext, 36006dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_SEQ_RAW); 36015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 36026dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren else 36036dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren { 36046dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_PRINT("********* Empty Section and Firmware ******************\n\n"); 36056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren } 36066dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 36076dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren DNLD_PRINT("*******************************************\n\n"); 36086dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 36095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 36105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 36115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 36125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if !defined (NXP_FW_INTEGRITY_VERIFY) 36145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36155e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 36165e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Run_Check( 36175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phHal_sHwReference_t *pHwRef 36185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_PARAM 36195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ,uint8_t *nxp_nfc_fw 36205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t fw_length 36215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 36225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 36235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 36245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_FAILED; 36255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t fw_index = 0; 36265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas img_data_hdr_t *p_img_hdr = NULL; 36275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_data_hdr_t *p_fw_hdr = NULL; 36285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_data_hdr_t *cur_fw_hdr = NULL; 36295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t i = 0; 36305e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_img_hdr = (img_data_hdr_t *) nxp_nfc_fw; 36325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_index = sizeof (img_data_hdr_t); 36345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36355e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas for ( i=0; i < p_img_hdr->no_of_fw_img; i++ ) 36365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 36375e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas p_fw_hdr = (fw_data_hdr_t *) ( nxp_nfc_fw + fw_index ); 36385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* TODO: Create a memory of pointers to store all the Firmwares */ 36395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas cur_fw_hdr = p_fw_hdr; 36405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas fw_index = fw_index + (cur_fw_hdr->fw_hdr_len * PNDNLD_WORD_LEN); 36425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36436dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren status = phDnldNfc_Check_FW( pHwRef, cur_fw_hdr); 36445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 36455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 36465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 36475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif /* #if !defined (NXP_FW_INTEGRITY_VERIFY) */ 36495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36515e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasSTATIC 36525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomasvoid 36535e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Abort ( 36546dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint32_t abort_id 36556dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 36566dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , void *dnld_cntxt 36576dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 36585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 36595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas{ 36605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 366134ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly phNfc_sCompletionInfo_t comp_info = {0,0,0}; 36625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36636dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_sContext_t *p_dnld_context = NULL; 36646dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 36656dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 36666dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_context = (phDnldNfc_sContext_t *)dnld_cntxt; 36676dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#else 36686dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_context = gpphDnldContext; 36696dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 36706dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 36716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren if ( ( NULL != p_dnld_context) 36726dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren && (abort_id == p_dnld_context->timer_id )) 36735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 36745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t p_upper_notify = 36756dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_context->p_upper_notify; 36765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *p_upper_context = 36776dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_context->p_upper_context; 36786dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phHal_sHwReference_t *pHwRef = p_dnld_context->p_hw_ref; 36795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)phDal4Nfc_Unregister( 36816dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren p_dnld_context->lower_interface.pcontext, pHwRef ); 36826dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Lower(p_dnld_context, pHwRef); 36836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Resources(&p_dnld_context); 36846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 36856dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = p_dnld_context; 36866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 36875e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* Notify the Error/Success Scenario to the upper layer */ 36895e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: FW_DNLD Aborted with %x Timer Timeout \n", 36905e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas abort_id); 36915e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas comp_info.status = NFCSTATUS_FAILED ; 36925e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_Notify( p_upper_notify, p_upper_context, 36935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pHwRef, (uint8_t) NFC_IO_ERROR, &comp_info ); 36945e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 36955e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36965e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return ; 36975e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas} 36985e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 36995e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37015e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasNFCSTATUS 37025e97605ca8d83414b122bae72e65ea388b66718adaniel_TomasphDnldNfc_Upgrade ( 37035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phHal_sHwReference_t *pHwRef, 37045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_PARAM 37056dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren uint8_t type, 37065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint8_t *nxp_nfc_fw, 37075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas uint32_t fw_length, 37085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 37095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas pphNfcIF_Notification_CB_t upgrade_complete, 37105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas void *context 37115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 37125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phDnldNfc_sContext_t *psDnldContext = NULL; 37148c9b94d7ff66df918290099034cddbed1fc3c485Nick Pelly phNfcIF_sReference_t dnldReference = { NULL,0,0 }; 37155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfcIF_sCallBack_t if_callback = { NULL, NULL, NULL, NULL }; 37165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phNfc_sLowerIF_t *plower_if = NULL; 37175e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS status = NFCSTATUS_SUCCESS; 37185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas section_info_t *p_cur_sec = NULL; 37195e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas unsigned sec_type = 0; 37205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37215e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( (NULL == pHwRef) 37225e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ) 37235e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37245e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); 37255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 37265e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 37275e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37285e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Starting the FW Upgrade Sequence .... \n"); 37295e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (void) 37316dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Allocate_Resource((void **) 37326dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren &psDnldContext,sizeof(phDnldNfc_sContext_t)); 37335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if(psDnldContext != NULL) 37345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 37365e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas gpphDnldContext = psDnldContext; 37376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 37385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_hw_ref = pHwRef; 37395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->timer_id = NXP_INVALID_TIMER_ID; 37405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Initialisation in Progress.... \n"); 37425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if_callback.pif_ctxt = psDnldContext ; 37445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if_callback.send_complete = &phDnldNfc_Send_Complete; 37455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if_callback.receive_complete= &phDnldNfc_Receive_Complete; 37465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* if_callback.notify = &phDnldNfc_Notify_Event; */ 37475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas plower_if = dnldReference.plower_if = &(psDnldContext->lower_interface); 37485e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDal4Nfc_Register(&dnldReference, if_callback, 37495e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NULL); 37505e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Lower Layer Register, Status = %02X\n",status); 37515e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37525e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if( (NFCSTATUS_SUCCESS == status) && (NULL != plower_if->init)) 37535e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* psDnldContext->p_config_params = pHwConfig ; */ 37555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = plower_if->init((void *)plower_if->pcontext, 37565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void *)pHwRef); 37575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_DEBUG(" FW_DNLD: Lower Layer Initialisation, Status = %02X\n",status); 37585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 37595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 37605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* TODO: Handle Initialisation in the Invalid State */ 37625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 37635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* The Lower layer Initialisation successful */ 37645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_SUCCESS == status) 37655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37665e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_notify = upgrade_complete; 37675e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->p_upper_context = context; 37685e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37695e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Process_FW( psDnldContext, pHwRef 37705e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#ifdef NXP_FW_PARAM 37716dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ,*nxp_nfc_fw , fw_length 37725e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 37735e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas ); 37745e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37755e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_SUCCESS == status) 37765e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37775e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 37785e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_RESET , NULL , 0 ); 37795e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING == status) 37805e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 37815e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT("\n FW_DNLD: Initial Reset .... \n"); 37825e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 37836dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined(FW_DOWNLOAD_TIMER) 37846dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 37855e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->timer_id = phOsalNfc_Timer_Create( ); 37866dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 37876dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if (FW_DOWNLOAD_TIMER < 2) 37885e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_Timer_Start( psDnldContext->timer_id, 37896dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NXP_DNLD_COMPLETE_TIMEOUT, 37906dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (ppCallBck_t) phDnldNfc_Abort 37916dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 37926dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , (void *) psDnldContext 37935e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 37946dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ); 37956dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 37966dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if (FW_DOWNLOAD_TIMER < 2) */ 37976dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 37986dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if defined(FW_DOWNLOAD_TIMER) */ 37996dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 38005e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38015e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38025e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else if (NFCSTATUS_SUCCESS == PHNFCSTATUS(status)) 38035e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 38045e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#if defined (NXP_FW_INTEGRITY_VERIFY) 38055e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas /* 38065e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * To check for the integrity if the firmware is already 38075e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas * Upgraded. 38085e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas */ 38095e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = phDnldNfc_Send_Command( psDnldContext, pHwRef, 38105e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas PHDNLD_CMD_RESET , NULL , 0 ); 38115e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING == status) 38125e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 38135e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT("\n FW_DNLD: Integrity Reset .... \n"); 38145e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)phDnldNfc_Set_Seq(psDnldContext, DNLD_SEQ_COMPLETE); 38155e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL( CID_NFC_DNLD, 38165e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas NFCSTATUS_PENDING ); 38176dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if defined(FW_DOWNLOAD_TIMER) 38185e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas psDnldContext->timer_id = phOsalNfc_Timer_Create( ); 38196dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#if (FW_DOWNLOAD_TIMER < 2) 38205e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas phOsalNfc_Timer_Start( psDnldContext->timer_id, 38216dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren NXP_DNLD_COMPLETE_TIMEOUT, 38226dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren (ppCallBck_t) phDnldNfc_Abort 38236dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifdef NFC_TIMER_CONTEXT 38246dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren , (void *) psDnldContext 38255e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#endif 38266dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren ); 38276dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 38286dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if (FW_DOWNLOAD_TIMER < 2) */ 38296dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 38306dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if defined(FW_DOWNLOAD_TIMER) */ 38315e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38325e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 38335e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas#else 38345e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = NFCSTATUS_SUCCESS; 38356dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 38366dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif /* #if defined (NXP_FW_INTEGRITY_VERIFY) */ 38376dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren 38385e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38395e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 38405e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 38415e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD Initialisation in Failed \n"); 38425e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38435e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38445e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 38455e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas if (NFCSTATUS_PENDING != PHNFCSTATUS(status)) 38465e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 38475e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas (void)phDal4Nfc_Unregister( 38486dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren psDnldContext->lower_interface.pcontext, pHwRef); 38496dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Lower(psDnldContext, pHwRef); 38506dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren phDnldNfc_Release_Resources(&psDnldContext); 38516dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#ifndef NFC_TIMER_CONTEXT 38526dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren gpphDnldContext = psDnldContext; 38536dd948323de0f31b413c9f19a905f1c145c9c456Rob von Behren#endif 38545e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38555e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } /* End of Status Check for Memory */ 38565e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas else 38575e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas { 38585e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas status = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INSUFFICIENT_RESOURCES); 38595e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 38605e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas DNLD_PRINT(" FW_DNLD: Memory Allocation of Context Failed\n"); 38615e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38625e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 38635e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas 38645e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas return status; 38655e97605ca8d83414b122bae72e65ea388b66718adaniel_Tomas } 3866