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