1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/****************************************************************************** 2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Copyright (C) 2012 Broadcom Corporation 4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Licensed under the Apache License, Version 2.0 (the "License"); 6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * you may not use this file except in compliance with the License. 7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * You may obtain a copy of the License at: 8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * http://www.apache.org/licenses/LICENSE-2.0 10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * Unless required by applicable law or agreed to in writing, software 12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * distributed under the License is distributed on an "AS IS" BASIS, 13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * See the License for the specific language governing permissions and 15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * limitations under the License. 16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu * 17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/ 18eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include <string.h> 19eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "nfc_hal_int.h" 20eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#include "userial.h" 21eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 22eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/***************************************************************************** 23eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu* Definitions 24eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*****************************************************************************/ 25eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 26eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Internal flags */ 27eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF 0x01 /* Application provided patchram in a single buffer */ 28eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_RFU 0x02 /* Reserved for future use */ 29eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_SIGNATURE_SENT 0x04 /* Signature sent to NFCC */ 30eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED 0x08 /* PreI2C patch required */ 31eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NO_NVM 0x10 /* Not NVM available (patch downloaded to SRAM) */ 32eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF 0x20 /* Support RESET_NTF from NFCC after sending signature */ 33eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED 0x40 /* FPM patch in NVM failed CRC check */ 34eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED 0x80 /* LPM patch in NVM failed CRC check */ 35eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 36eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Secure patch download definitions */ 37eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN 7 /* PRJID + MAJORVER + MINORVER + COUNT */ 38eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_NCD_PATCH_VERSION_LEN 16 39eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 40eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_PRE_DOWNLOAD_DELAY (500) /* Delay before starting to patch download (in ms) */ 41eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 42eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Enumeration of power modes IDs */ 43eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_POWER_MODE_LPM 0 44eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_POWER_MODE_FPM 1 45eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 46eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* Version string for BCM20791B3 */ 47eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuconst UINT8 NFC_HAL_PRM_BCM20791B3_STR[] = "20791B3"; 48eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_BCM20791B3_STR_LEN (sizeof (NFC_HAL_PRM_BCM20791B3_STR)-1) 49eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 50eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_SPD_TOUT (6000) /* timeout for SPD events (in ms) */ 51eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_END_DELAY (250) /* delay before sending any new command (ms)*/ 52eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 53eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/* command to get currently downloaded patch version */ 54eb190654c5fbaea2f396bb5523f57062f291879aEvan Chustatic UINT8 nfc_hal_prm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] = 55eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 56eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_MTS_CMD|NCI_GID_PROP, 57eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_MSG_GET_PATCH_VERSION, 58eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 0x00 59eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu}; 60eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 61eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_PRM_DEBUG == TRUE) 62eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_STATE(str) NCI_TRACE_DEBUG2 ("%s st: %d", str, nfc_hal_cb.prm.state) 63eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else 64eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#define NFC_HAL_PRM_STATE(str) 65eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif 66eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 67eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_post_baud_update (tHAL_NFC_STATUS status); 68eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 69794a3220e013b6c679f2127792859e6b751ee280Evan Chu/***************************************************************************** 70794a3220e013b6c679f2127792859e6b751ee280Evan Chu** Extern variable from nfc_hal_dm_cfg.c 71794a3220e013b6c679f2127792859e6b751ee280Evan Chu*****************************************************************************/ 72794a3220e013b6c679f2127792859e6b751ee280Evan Chuextern BOOLEAN nfc_hal_prm_nvm_required; 73794a3220e013b6c679f2127792859e6b751ee280Evan Chu 74eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 75eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 76eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_handle_download_complete 77eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 78eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Patch download complete (for secure patch download) 79eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 80eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 81eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 82eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 83eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_handle_download_complete (UINT8 event) 84eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 85eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_IDLE; 86eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 87eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify application now */ 88eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.p_cback) 89eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (event); 90eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 91eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 92eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 93eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 94eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_send_next_segment 95eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 96eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Send next patch segment (for secure patch download) 97eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 98eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 99eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_send_next_segment (void) 102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 *p_src; 104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 len, offset = nfc_hal_cb.prm.cur_patch_offset; 105eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 hcit, oid, hdr0, type; 106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 chipverlen; 107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 chipverstr[NCI_SPD_HEADER_CHIPVER_LEN]; 108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 patch_hdr_size = NCI_MSG_HDR_SIZE + 1; /* 1 is for HCIT */ 109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Validate that segment is at least big enought to have NCI_MSG_HDR_SIZE + 1 (hcit) */ 111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.cur_patch_len_remaining < patch_hdr_size) 112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Unexpected end of patch."); 114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT); 115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Parse NCI command header */ 119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_src = (UINT8*) (nfc_hal_cb.prm.p_cur_patch_data + offset); 120eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (hcit, p_src); 121eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (hdr0, p_src); 122eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (oid, p_src); 123eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (len, p_src); 124eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (type, p_src); 125eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 126eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 127eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Update number of bytes comsumed */ 128eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset += (len + patch_hdr_size); 129eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining -= (len + patch_hdr_size); 130eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 131eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if sending signature byte */ 132eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ( (oid == NCI_MSG_SECURE_PATCH_DOWNLOAD ) 133eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(type == NCI_SPD_TYPE_SIGNATURE) ) 134eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 135eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_SIGNATURE_SENT; 136eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 137eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check for header */ 138eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if ( (oid == NCI_MSG_SECURE_PATCH_DOWNLOAD ) 139eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(type == NCI_SPD_TYPE_HEADER) ) 140eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 141eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if patch is for BCM20791B3 */ 142eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_src += NCI_SPD_HEADER_OFFSET_CHIPVERLEN; 143eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (chipverlen, p_src); 144eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_ARRAY (chipverstr, p_src, NCI_SPD_HEADER_CHIPVER_LEN); 145eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 146eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (memcmp (NFC_HAL_PRM_BCM20791B3_STR, chipverstr, NFC_HAL_PRM_BCM20791B3_STR_LEN) == 0) 147eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 148eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Patch is for BCM2079B3 - do not wait for RESET_NTF after patch download */ 149eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF; 150eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 151eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 152eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 153eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Patch is for BCM2079B4 or newer - wait for RESET_NTF after patch download */ 154eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF; 155eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 156eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 157eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 158eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Send the command (not including HCIT here) */ 159eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_dm_send_nci_cmd ((UINT8*) (nfc_hal_cb.prm.p_cur_patch_data + offset + 1), (UINT8) (len + NCI_MSG_HDR_SIZE), 160eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_nci_command_complete_cback); 161eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 162eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 163eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 164eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 165eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_handle_next_patch_start 166eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 167eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Handle start of next patch (for secure patch download) 168eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 169eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 170eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 171eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 172eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_handle_next_patch_start (void) 173eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 174eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 cur_patch_mask; 175eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 cur_patch_len; 176eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu BOOLEAN found_patch_to_download = FALSE; 177eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 178eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu while (!found_patch_to_download) 179eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 180eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get length of current patch */ 181eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu cur_patch_len = nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len; 182eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 183eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if this is a patch we need to download */ 184eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu cur_patch_mask = ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode); 185eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.spd_patch_needed_mask & cur_patch_mask) 186eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 187eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu found_patch_to_download = TRUE; 188eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 189eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 190eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 191eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Do not need to download this patch. Skip to next patch */ 192eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("Skipping patch for power_mode %i.", nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode); 193eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 194eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_cur_patch_idx++; 195eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.spd_cur_patch_idx >= nfc_hal_cb.prm.spd_patch_count) 196eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 197eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* No more to download */ 198eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_COMPLETE_EVT); 199eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 200eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 201eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)) 202eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 203eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the next patch header */ 204eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH); 205eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 206eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 207eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 208eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 209eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Patch in buffer. Skip over current patch. Check next patch */ 210eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) cur_patch_len; 211eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset += (UINT16) cur_patch_len; 212eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 213eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 214eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 215eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 216eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 217eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Begin downloading patch */ 218eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("Downloading patch for power_mode %i.", nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode); 219eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_DOWNLOADING; 220eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_send_next_segment (); 221eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 222eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 223eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)) 224eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 225eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 226eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_download_i2c_fix 227eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 228eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Start downloading patch for i2c fix 229eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 230eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 231eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 232eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 233eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_download_i2c_fix (void) 234eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 235eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 *p, *p_start; 236eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_project_id; 237eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_ver_major; 238eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_ver_minor; 239eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_patchsize; 240eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 u8; 241eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 242eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG0 ("Downloading I2C fix..."); 243eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 244eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Save pointer and offset of patchfile, so we can resume after downloading the i2c fix */ 245eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_offset = nfc_hal_cb.prm.cur_patch_offset; 246eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_len_remaining = nfc_hal_cb.prm.cur_patch_len_remaining; 247eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 248eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Initialize pointers for downloading i2c fix */ 249eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm_i2c.p_patch; 250eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset = 0; 251eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining = nfc_hal_cb.prm_i2c.len; 252eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 253eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Parse the i2c patchfile */ 254eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.cur_patch_len_remaining >= NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN) 255eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 256eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Parse patchfile header */ 257eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p = (UINT8 *) nfc_hal_cb.prm.p_cur_patch_data; 258eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_start = p; 259eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_project_id, p); 260eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_ver_major, p); 261eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_ver_minor, p); 262eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 263eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* RFU */ 264eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p++; 265eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 266eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check how many patches are in the patch file */ 267eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 268eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 269eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Should only be one patch */ 270eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (u8 > 1) 271eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 272eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR1 ("Invalid i2c fix: invalid number of patches (%i)", u8); 273eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT); 274eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 275eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 276eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 277eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 278eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get info about the i2c patch*/ 279eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); /* power mode (not needed for i2c patch) */ 280eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_patchsize, p); /* size of patch */ 281eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 282eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* 5 byte RFU */ 283eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p += 5; 284eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 285eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Adjust length to exclude patchfiloe header */ 286eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) (p - p_start); /* Adjust size of patchfile */ 287eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset += (UINT16) (p - p_start); /* Bytes of patchfile transmitted/processed so far */ 288eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 289eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Begin sending patch to the NFCC */ 290eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_send_next_segment (); 291eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 292eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 293eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 294eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* ERROR: Bad length for patchfile */ 295eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Invalid i2c fix: unexpected end of patch"); 296eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT); 297eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 298eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 299eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */ 300eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 301eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 302eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 303eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_check_version 304eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 305eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Check patchfile version with current downloaded version 306eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 307eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 308eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 309eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 310eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_check_version (void) 311eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 312eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 *p, *p_start, i; 313eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 patchfile_patch_present_mask; 314eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_project_id; 315eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_ver_major = 0; 316eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_ver_minor; 317eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patchfile_patchsize; 318eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 319eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 return_code = NFC_HAL_PRM_COMPLETE_EVT; 320eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 321eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Initialize patchfile offset pointers */ 322eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p = p_start = NULL; 323eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_patchsize = 0; 324eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 325eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get patchfile version */ 326eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.cur_patch_len_remaining >= NFC_HAL_PRM_NCD_PATCHFILE_HDR_LEN) 327eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 328eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Parse patchfile header */ 329eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p = (UINT8 *) nfc_hal_cb.prm.p_cur_patch_data; 330eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_start = p; 331eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_project_id, p); 332eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_ver_major, p); 333eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (patchfile_ver_minor, p); 334eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 335eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* RFU */ 336eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p++; 337eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 338eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check how many patches are in the patch file */ 339eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (nfc_hal_cb.prm.spd_patch_count, p); 340eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 341eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.spd_patch_count > NFC_HAL_PRM_MAX_PATCH_COUNT) 342eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 343eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR2 ("Unsupported patchfile (number of patches (%i) exceeds maximum (%i)", 344eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_count, NFC_HAL_PRM_MAX_PATCH_COUNT); 345eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 346eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 347eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Mask of patches that are present in the patchfile */ 348eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_patch_present_mask = 0; 349eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 350eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get lengths for each patch */ 351eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu for (i = 0; i < nfc_hal_cb.prm.spd_patch_count; i++) 352eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 353eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get power mode for this patch */ 354eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (nfc_hal_cb.prm.spd_patch_desc[i].power_mode, p); 355eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 356eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Update mask of power-modes present in the patchfile */ 357eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_patch_present_mask |= ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[i].power_mode); 358eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 359eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get length of patch */ 360eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_patch_desc[i].len, p); 361eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 362eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Add total size of patches */ 363eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_patchsize += nfc_hal_cb.prm.spd_patch_desc[i].len; 364eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 365eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* 5 byte RFU */ 366eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p += 5; 367eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 368eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 369eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Adjust offset to after the patch file header */ 370eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset += (UINT16) (p - p_start); /* Bytes of patchfile transmitted/processed so far */ 371eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining -= (UINT16) (p - p_start); /* Adjust size of patchfile */ 372eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 373eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 374eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG6 ("Patchfile info: ProjID=0x%04x, Ver=%i.%i, Num patches=%i, PatchMask=0x%08x, PatchSize=%i", 375eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_project_id, patchfile_ver_major, patchfile_ver_minor, 376eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_count, patchfile_patch_present_mask, patchfile_patchsize); 377eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 378eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /********************************************************************* 379eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu * Version check of patchfile against NVM 380eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu *********************************************************************/ 381eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 382eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (!defined (NFC_HAL_PRM_SKIP_VERSION_CHECK) || (NFC_HAL_PRM_SKIP_VERSION_CHECK == FALSE)) 383eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download the patchfile if no patches in NVM */ 384eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ((nfc_hal_cb.prm.spd_project_id == 0) || (nfc_hal_cb.prm.spd_nvm_patch_mask == 0)) 385eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 386eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* No patch in NVM, need to download all */ 387eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask; 388eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 389eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG2 ("No previous patch detected. Downloading patch %i.%i", 390eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_ver_major, patchfile_ver_minor); 391eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 392eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Skip download if project ID of patchfile does not match NVM */ 393eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.spd_project_id != patchfile_project_id) 394eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 395eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Project IDs mismatch */ 396eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG2 ("Patch download skipped: Mismatched Project ID (NVM ProjId: 0x%04x, Patchfile ProjId: 0x%04x)", 397eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_project_id, patchfile_project_id); 398eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 399eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT; 400eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 401eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Skip download if version of patchfile older or equal to version in NVM */ 402eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* unless NVM is corrupted (then don't skip download if patchfile has the same major ver)*/ 403eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if ( (nfc_hal_cb.prm.spd_ver_major > patchfile_ver_major) 404eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||( (nfc_hal_cb.prm.spd_ver_major == patchfile_ver_major) && (nfc_hal_cb.prm.spd_ver_minor == patchfile_ver_minor) 405eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu && !((patchfile_patch_present_mask & ( 1 << NFC_HAL_PRM_SPD_POWER_MODE_LPM)) && (nfc_hal_cb.prm.spd_lpm_patch_size == 0)) /* Do not skip download: patchfile has LPM, but NVM does not */ 406eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu && !((patchfile_patch_present_mask & ( 1 << NFC_HAL_PRM_SPD_POWER_MODE_FPM)) && (nfc_hal_cb.prm.spd_fpm_patch_size == 0)) /* Do not skip download: patchfile has FPM, but NVM does not */ 407eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu && !(nfc_hal_cb.prm.flags & (NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED |NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED)) ) ) 408eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 409eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* NVM version is newer than patchfile */ 410eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG2 ("Patch download skipped. NVM patch (version %i.%i) is newer than the patchfile ", 411eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor); 412eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 413eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return_code = NFC_HAL_PRM_COMPLETE_EVT; 414eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 415eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Remaining cases: patchfile major version is newer than NVM; or major version is the same with different minor version */ 416eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download all patches in the patchfile */ 417eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 418eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 419eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask; 420eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 421eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG4 ("Downloading patch version: %i.%i (previous version in NVM: %i.%i)...", 422eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu patchfile_ver_major, patchfile_ver_minor, 423eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor); 424eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 425eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else /* NFC_HAL_PRM_SKIP_VERSION_CHECK */ 426eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_needed_mask = patchfile_patch_present_mask; 427eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif 428eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 429eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 430eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 431eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Invalid patch file header */ 432eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Invalid patch file header."); 433eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 434eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return_code = NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT; 435eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 436eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 437eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* If we need to download anything, get the first patch to download */ 438eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.spd_patch_needed_mask) 439eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 44038666aab1397040df51ab6d28520b3930df1df3fEvan Chu NCI_TRACE_ERROR4 ("Downloading patch version: %i.%i (previous version in NVM: %i.%i)...", 441794a3220e013b6c679f2127792859e6b751ee280Evan Chu patchfile_ver_major, patchfile_ver_minor, 442794a3220e013b6c679f2127792859e6b751ee280Evan Chu nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor); 443eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)) 444eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if I2C patch is needed: if */ 445eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* - I2C patch file was provided using HAL_NfcPrmSetI2cPatch, and */ 446eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* - current patch in NVM has ProjectID=0, or */ 447eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* FPM is not present or corrupted, or */ 448eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* or patchfile is major-ver 76+ */ 449eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ( (nfc_hal_cb.prm_i2c.p_patch) 450eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&( (nfc_hal_cb.prm.spd_project_id == 0) 451eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfc_hal_cb.prm.spd_fpm_patch_size == 0) 452eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED) 453eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu ||(patchfile_ver_major >= 76))) 454eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 455eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG0 ("I2C patch fix required."); 456eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED; 457eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 458eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download i2c fix first */ 459eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_download_i2c_fix (); 460eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 461eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 462eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */ 463eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 464eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download first segment */ 465eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER; 466eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!(nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF)) 467eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 468eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify adaptation layer to call HAL_NfcPrmDownloadContinue with the next patch segment */ 469eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH); 470eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 471eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 472eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 473eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_next_patch_start (); 474eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 475eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 476eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 477eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 478794a3220e013b6c679f2127792859e6b751ee280Evan Chu static BOOLEAN firstTime = TRUE; 479794a3220e013b6c679f2127792859e6b751ee280Evan Chu if (firstTime) { 480794a3220e013b6c679f2127792859e6b751ee280Evan Chu NCI_TRACE_ERROR2 ("BCM2079x: NVM patch version is %d.%d", 481794a3220e013b6c679f2127792859e6b751ee280Evan Chu nfc_hal_cb.prm.spd_ver_major, nfc_hal_cb.prm.spd_ver_minor); 482794a3220e013b6c679f2127792859e6b751ee280Evan Chu firstTime = FALSE; 483794a3220e013b6c679f2127792859e6b751ee280Evan Chu } 484eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download complete */ 485eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (return_code); 486eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 487eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 488eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 489eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_TRACE_VERBOSE == TRUE) 490eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 491eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 492eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_status_str 493eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 494eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Return status string for a given spd status code 495eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 496eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns Status string 497eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 498eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 499eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuUINT8 *nfc_hal_prm_spd_status_str (UINT8 spd_status_code) 500eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 501eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu char *p_str; 502eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 503eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu switch (spd_status_code) 504eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 505eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_DEST: 506eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_DEST"; 507eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 508eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 509eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_PROJECTID: 510eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_PROJECTID"; 511eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 512eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 513eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_CHIPVER: 514eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_CHIPVER"; 515eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 516eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 517eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_MAJORVER: 518eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_MAJORVER"; 519eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 520eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 521eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_INVALID_PARAM: 522eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_INVALID_PARAM"; 523eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 524eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 525eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_INVALID_SIG: 526eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_INVALID_SIG"; 527eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 528eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 529eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_NVM_CORRUPTED: 530eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_NVM_CORRUPTED"; 531eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 532eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 533eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_PWR_MODE: 534eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_PWR_MODE"; 535eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 536eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 537eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_MSG_LEN: 538eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_MSG_LEN"; 539eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 540eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 541eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu case NCI_STATUS_SPD_ERROR_PATCHSIZE: 542eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "SPD_ERROR_PATCHSIZE"; 543eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 544eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 545eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu default: 546eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p_str = "Unspecified Error"; 547eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu break; 548eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 549eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 550eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 551eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return ((UINT8*) p_str); 552eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 553eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* (NFC_HAL_TRACE_VERBOSE == TRUE) */ 554eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 555eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 556eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 557eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_nci_command_complete_cback 558eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 559eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Callback for NCI vendor specific command complete 560eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** (for secure patch download) 561eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 562eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 563eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 564eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 565eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_nci_command_complete_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data) 566eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 567eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 status, u8; 568eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 *p; 569eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 post_signature_delay; 570eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 571eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NFC_HAL_PRM_STATE ("nfc_hal_prm_nci_command_complete_cback"); 572eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 573eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Stop the command-timeout timer */ 574eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer); 575eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 576eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Skip over NCI header */ 577eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p = p_data + NCI_MSG_HDR_SIZE; 578eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 579eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Handle GET_PATCH_VERSION Rsp */ 580eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (event == NFC_VS_GET_PATCH_VERSION_EVT) 581eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 582eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get project id */ 583eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_project_id, p); 584eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 585eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* RFU */ 586eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p++; 587eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 588eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get chip version string */ 589eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 590eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu p += NFC_HAL_PRM_NCD_PATCH_VERSION_LEN; 591eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 592eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get major/minor version */ 593eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_ver_major, p); 594eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_ver_minor, p); 595eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_nvm_max_size, p); 596eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_patch_max_size, p); 597eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_lpm_patch_size, p); 598eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT16 (nfc_hal_cb.prm.spd_fpm_patch_size, p); 599eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 600eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* LPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 601eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 602eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!u8) 603eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 604eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_nvm_patch_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_LPM); 605eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 606eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 607eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 608eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* LPM patch in NVM fails CRC check */ 609eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NVM_LPM_CORRUPTED; 610eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 611eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 612eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 613eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* FPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 614eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 615eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!u8) 616eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 617eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_nvm_patch_mask |= (1 << NFC_HAL_PRM_SPD_POWER_MODE_FPM); 618eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 619eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 620eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 621eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* FPM patch in NVM fails CRC check */ 622eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NVM_FPM_CORRUPTED; 623eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 624eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 625eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if downloading patch to RAM only (no NVM) */ 626eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 627eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (!u8) 628794a3220e013b6c679f2127792859e6b751ee280Evan Chu { 629794a3220e013b6c679f2127792859e6b751ee280Evan Chu if (nfc_hal_prm_nvm_required) 630794a3220e013b6c679f2127792859e6b751ee280Evan Chu { 631794a3220e013b6c679f2127792859e6b751ee280Evan Chu NCI_TRACE_ERROR0 ("This platform requires NVM and the NVM is not available - Abort"); 632794a3220e013b6c679f2127792859e6b751ee280Evan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_NO_NVM_EVT); 633794a3220e013b6c679f2127792859e6b751ee280Evan Chu return; 634794a3220e013b6c679f2127792859e6b751ee280Evan Chu } 635eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_NO_NVM; 636794a3220e013b6c679f2127792859e6b751ee280Evan Chu } 637eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get patchfile version number */ 638eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_COMPARE_VERSION; 639eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 640eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) 641eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 642eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* If patch is in a buffer, get patch version from buffer */ 643eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_check_version (); 644eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 645eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 646eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 647eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify adaptation layer to send patch version (via HAL_NfcPrmDownloadContinue) */ 648eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_PATCHFILE_HDR_EVT); 649eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 650eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 651eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 652eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Handle SECURE_PATCH_DOWNLOAD Rsp */ 653eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (event == NFC_VS_SEC_PATCH_DOWNLOAD_EVT) 654eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 655eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Status and error code */ 656eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (status, p); 657eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 658eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 659eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (status != NCI_STATUS_OK) 660eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 661eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (NFC_HAL_TRACE_VERBOSE == TRUE) 662eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR2 ("Patch download failed, reason code=0x%X (%s)", status, nfc_hal_prm_spd_status_str (status)); 663eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#else 664eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR1 ("Patch download failed, reason code=0x%X", status); 665eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif 666eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 667eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify application */ 668eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT); 669eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 670eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 671eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 672eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* If last segment (SIGNATURE) sent */ 673eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SIGNATURE_SENT) 674eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 675eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Wait for authentication complate (SECURE_PATCH_DOWNLOAD NTF) */ 676eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTHENTICATING; 677eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, 678eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (NFC_HAL_PRM_SPD_TOUT * QUICK_TIMER_TICKS_PER_SEC) / 1000); 679eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 680eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 681eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Download next segment */ 682eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) 683eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 684eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* If patch is in a buffer, get next patch from buffer */ 685eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_send_next_segment (); 686eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 687eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 688eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 689eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify adaptation layer to get next patch segment (via HAL_NfcPrmDownloadContinue) */ 690eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_CONTINUE_EVT); 691eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 692eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 693eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Handle SECURE_PATCH_DOWNLOAD NTF */ 694eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (event == NFC_VS_SEC_PATCH_AUTH_EVT) 695eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 696eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("prm flags:0x%x.", nfc_hal_cb.prm.flags); 697eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Status and error code */ 698eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (status, p); 699eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu STREAM_TO_UINT8 (u8, p); 700eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 701eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Sanity check - should only get this NTF while in AUTHENTICATING stage */ 702eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTHENTICATING) 703eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 704eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (status != NCI_STATUS_OK) 705eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 706eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Patch authentication failed"); 707eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_BAD_SIGNATURE_EVT); 708eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 709eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 710eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 711eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)) 712eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED) 713eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 714eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("PreI2C patch downloaded...waiting %i ms for NFCC to reboot.", nfc_hal_cb.prm_i2c.prei2c_delay); 715eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 716eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Restore pointers to patchfile */ 717eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_I2C_FIX_REQUIRED; 718eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_cur_patch_data = nfc_hal_cb.prm.p_spd_patch; 719eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset = nfc_hal_cb.prm.spd_patch_offset; 720eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining = nfc_hal_cb.prm.spd_patch_len_remaining; 721eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 722eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Resume normal patch download */ 723eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER; 724eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT; 725eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 726eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Post PreI2C delay */ 727eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, (nfc_hal_cb.prm_i2c.prei2c_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000); 728eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 729eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return; 730eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 731eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */ 732eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 733eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 734eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Wait for NFCC to save the patch to NVM */ 735eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF) 736eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 737eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* 20791B4 or newer - wait for RESET_NTF */ 738eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu post_signature_delay = NFC_HAL_PRM_RESET_NTF_DELAY; 739eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for RESET NTF...", post_signature_delay); 740eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 741eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 742eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_NO_NVM) 743eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 744eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* No NVM. Wait for NFCC to restart */ 745eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu post_signature_delay = NFC_HAL_PRM_END_DELAY; 746eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for NFCC to restart...", post_signature_delay); 747eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 748eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 749eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 750eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Wait for NFCC to save the patch to NVM (need about 1 ms per byte) */ 751eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu post_signature_delay = nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].len; 752eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (post_signature_delay < nfc_hal_cb.prm.patchram_delay) 753eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu post_signature_delay = nfc_hal_cb.prm.patchram_delay; 754eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG1 ("Patch downloaded and authenticated. Waiting %i ms for NVM update to complete...", post_signature_delay); 755eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 756eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 757eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_AUTH_DONE; 758eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 759eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, 760eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (post_signature_delay * QUICK_TIMER_TICKS_PER_SEC) / 1000); 761eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 762eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 763eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 764eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Got unexpected SECURE_PATCH_DOWNLOAD NTF"); 765eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT); 766eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 767eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 768eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 769eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 770eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Invalid response from NFCC during patch download */ 771eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR1 ("Invalid response from NFCC during patch download (opcode=0x%02X)", event); 772eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_INVALID_PATCH_EVT); 773eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 774eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 775eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NFC_HAL_PRM_STATE ("prm_nci_command_complete_cback"); 776eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 777eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 778eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 779eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 780eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_nfcc_ready_to_continue 781eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 782eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Continue to download patch or notify application completition 783eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 784eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 785eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 786eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 787eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_nfcc_ready_to_continue (void) 788eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 789eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Clear the bit for the patch we just downloaded */ 790eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_needed_mask &= ~ ((UINT32) 1 << nfc_hal_cb.prm.spd_patch_desc[nfc_hal_cb.prm.spd_cur_patch_idx].power_mode); 791eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 792eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if another patch to download */ 793eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_cur_patch_idx++; 794eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ((nfc_hal_cb.prm.spd_patch_needed_mask) && (nfc_hal_cb.prm.spd_cur_patch_idx < nfc_hal_cb.prm.spd_patch_count)) 795eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 796eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER; 797eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags &= ~NFC_HAL_PRM_FLAGS_SIGNATURE_SENT; 798eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 799eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF) 800eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 801eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* If patch is in a buffer, get next patch from buffer */ 802eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_next_patch_start (); 803eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 804eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 805eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 806eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Notify adaptation layer to get next patch header (via HAL_NfcPrmDownloadContinue) */ 807eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (nfc_hal_cb.prm.p_cback) (NFC_HAL_PRM_SPD_GET_NEXT_PATCH); 808eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 809eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 810eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 811eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 812eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 813eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Done downloading */ 814eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG0 ("Patch downloaded and authenticated."); 815eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_COMPLETE_EVT); 816eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 817eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 818eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 819eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 820eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 821eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_spd_reset_ntf 822eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 823eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Received RESET NTF from NFCC, indicating it has completed 824eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** reset after patch download. 825eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 826eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 827eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 828eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 829eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_spd_reset_ntf (UINT8 reset_reason, UINT8 reset_type) 830eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 831eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if we were expecting a RESET NTF */ 832eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) 833eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 834eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG2 ("Received RESET NTF after patch download (reset_reason=%i, reset_type=%i)", reset_reason, reset_type); 835eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 836eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Stop waiting for RESET NTF */ 837eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer); 838eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 839eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 840eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Continue with patch download */ 841eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_nfcc_ready_to_continue (); 842eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 843eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 844eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 845eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 846eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR2 ("Received unexpected RESET NTF (reset_reason=%i, reset_type=%i)", reset_reason, reset_type); 847eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 848eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 849eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 850eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 851eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 852eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function: nfc_post_final_baud_update 853eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 854eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description: Called after baud rate udate 855eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 856eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns: Nothing 857eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 858eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 859eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid nfc_hal_prm_post_baud_update (tHAL_NFC_STATUS status) 860eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 861eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NFC_HAL_PRM_STATE ("nfc_hal_prm_post_baud_update"); 862eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 863eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) 864eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 865eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Proceed with next step of patch download sequence */ 866eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_nfcc_ready_to_continue (); 867eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 868eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 869eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 870eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 871eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 872eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function nfc_hal_prm_process_timeout 873eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 874eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Process timer expireation for patch download 875eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 876eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns void 877eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 878eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 879ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuvoid nfc_hal_prm_process_timeout (void *p_tle) 880eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 881eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NFC_HAL_PRM_STATE ("nfc_hal_prm_process_timeout"); 882eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 883eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_IDLE) 884eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 885eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state = NFC_HAL_PRM_ST_SPD_GET_VERSION; 886eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 887eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Get currently downloaded patch version */ 888eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_dm_send_nci_cmd (nfc_hal_prm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, nfc_hal_prm_nci_command_complete_cback); 889eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 890eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_AUTH_DONE) 891eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 892eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.flags & NFC_HAL_PRM_FLAGS_SUPPORT_RESET_NTF) 893eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 894eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Timeout waiting for RESET NTF after signature sent */ 895eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Timeout waiting for RESET NTF after patch download"); 896eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT); 897eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 898eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 899eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 900eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_nfcc_ready_to_continue (); 901eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 902eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 903eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) 904eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 905eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_DEBUG0 ("Delay after PreI2C patch download...proceeding to download firmware patch"); 906eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_next_patch_start (); 907eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 908eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 909eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 910eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR1 ("Patch download: command timeout (state=%i)", nfc_hal_cb.prm.state); 911eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 912eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_download_complete (NFC_HAL_PRM_ABORT_EVT); 913eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 914eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 915eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NFC_HAL_PRM_STATE ("nfc_hal_prm_process_timeout"); 916eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 917eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 918eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 919eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 920eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 921eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function HAL_NfcPrmDownloadStart 922eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 923eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Initiate patch download 924eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 925eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params 926eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** format_type patch format type 927eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** (NFC_HAL_PRM_FORMAT_BIN, NFC_HAL_PRM_FORMAT_HCD, or 928eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** NFC_HAL_PRM_FORMAT_NCD) 929eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 930eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** dest_address destination adderess (needed for BIN format only) 931eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 932eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** p_patchram_buf pointer to patchram buffer. If NULL, 933eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** then app must call HAL_NfcPrmDownloadContinue when 934eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** NFC_HAL_PRM_CONTINUE_EVT is received, to send the next 935eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** segment of patchram 936eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 937eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** patchram_len size of p_patchram_buf (if non-NULL) 938eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 939eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** patchram_delay The delay after each patch. 940eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** If the given value is less than the size of the patchram, 941eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** the size of patchram is used instead. 942eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 943eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** p_cback callback for download status 944eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 945eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 946eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns TRUE if successful, otherwise FALSE 947eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 948eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 949eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 950eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuBOOLEAN HAL_NfcPrmDownloadStart (tNFC_HAL_PRM_FORMAT format_type, 951eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 dest_address, 952eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT8 *p_patchram_buf, 953eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 patchram_len, 954eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT32 patchram_delay, 955eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu tNFC_HAL_PRM_CBACK *p_cback) 956eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 957eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_API0 ("HAL_NfcPrmDownloadStart ()"); 958eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 959eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu memset (&nfc_hal_cb.prm, 0, sizeof (tNFC_HAL_PRM_CB)); 960eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 961eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (p_patchram_buf) 962eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 963eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_cur_patch_data = p_patchram_buf; 964eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset = 0; 965eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining = (UINT16) patchram_len; 966eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.flags |= NFC_HAL_PRM_FLAGS_USE_PATCHRAM_BUF; 967eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 968eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (patchram_len == 0) 969eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return FALSE; 970eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 971eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 972eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_cback = p_cback; 973eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.dest_ram = dest_address; 974eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.format = format_type; 975eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.patchram_delay = patchram_delay; 976eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 977eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.timer.p_cback = nfc_hal_prm_process_timeout; 978eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 979eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (format_type == NFC_HAL_PRM_FORMAT_NCD) 980eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 981eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Store patch buffer pointer and length */ 982eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_spd_patch = p_patchram_buf; 983eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_len_remaining = (UINT16)patchram_len; 984eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.spd_patch_offset = 0; 985eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 986eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Need delay for controller to finish resetting */ 987eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_main_start_quick_timer (&nfc_hal_cb.prm.timer, 0x00, 988eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu (NFC_HAL_PRM_SPD_PRE_DOWNLOAD_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000); 989eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 990eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 991eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 992eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR0 ("Unexpected patch format."); 993eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return FALSE; 994eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 995eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 996eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return TRUE; 997eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 998eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 999eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 1000eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1001eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function HAL_NfcPrmDownloadContinue 1002eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1003eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Send next segment of patchram to controller. Called when 1004eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** NFC_HAL_PRM_CONTINUE_EVT is received. 1005eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1006eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Only needed if HAL_NfcPrmDownloadStart was called with 1007eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** p_patchram_buf=NULL 1008eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1009eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params p_patch_data pointer to patch data 1010eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** patch_data_len patch data len 1011eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1012eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns TRUE if successful, otherwise FALSE 1013eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1014eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 1015eb190654c5fbaea2f396bb5523f57062f291879aEvan ChuBOOLEAN HAL_NfcPrmDownloadContinue (UINT8 *p_patch_data, 1016eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu UINT16 patch_data_len) 1017eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 1018eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_API2 ("HAL_NfcPrmDownloadContinue ():state = %d, patch_data_len=%d", 1019eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.state, patch_data_len); 1020eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1021eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Check if we are in a valid state for this API */ 1022eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if ( (nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_COMPARE_VERSION) 1023eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) 1024eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu &&(nfc_hal_cb.prm.state != NFC_HAL_PRM_ST_SPD_DOWNLOADING) ) 1025eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return FALSE; 1026eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1027eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (patch_data_len == 0) 1028eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return FALSE; 1029eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1030eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_offset = 0; 1031eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.p_cur_patch_data = p_patch_data; 1032eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm.cur_patch_len_remaining = patch_data_len; 1033eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1034eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Call appropriate handler */ 1035eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_COMPARE_VERSION) 1036eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1037eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_check_version (); 1038eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1039eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_GET_PATCH_HEADER) 1040eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1041eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_handle_next_patch_start (); 1042eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1043eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else if (nfc_hal_cb.prm.state == NFC_HAL_PRM_ST_SPD_DOWNLOADING) 1044eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1045eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_prm_spd_send_next_segment (); 1046eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1047eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 1048eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1049eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR1 ("Unexpected patch state:%d.", nfc_hal_cb.prm.state); 1050eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1051eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1052eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return TRUE; 1053eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 1054eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1055eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 1056eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1057eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function HAL_NfcPrmSetI2cPatch 1058eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1059eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Specify patchfile for BCM20791B3 I2C fix. This fix 1060eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** must be downloaded prior to initial patch download for I2C 1061eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** transport 1062eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1063eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Input Params p_i2c_patchfile_buf: pointer to patch for i2c fix 1064eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** i2c_patchfile_len: length of patch 1065eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** prei2c_delay: the delay before downloading main patch 1066eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** if 0 is given, NFC_HAL_PRM_POST_I2C_FIX_DELAY is used instead. 1067eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1068eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns Nothing 1069eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1070eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1071eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 1072eb190654c5fbaea2f396bb5523f57062f291879aEvan Chuvoid HAL_NfcPrmSetI2cPatch (UINT8 *p_i2c_patchfile_buf, UINT16 i2c_patchfile_len, UINT32 prei2c_delay) 1073eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 1074eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#if (defined (NFC_HAL_PRE_I2C_PATCH_INCLUDED) && (NFC_HAL_PRE_I2C_PATCH_INCLUDED == TRUE)) 1075eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_API0 ("HAL_NfcPrmSetI2cPatch ()"); 1076eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1077eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm_i2c.prei2c_delay = NFC_HAL_PRM_POST_I2C_FIX_DELAY; 1078eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (prei2c_delay) 1079eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm_i2c.prei2c_delay = prei2c_delay; 1080eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm_i2c.p_patch = p_i2c_patchfile_buf; 1081eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.prm_i2c.len = i2c_patchfile_len; 1082eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu#endif /* NFC_HAL_PRE_I2C_PATCH_INCLUDED */ 1083eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 1084eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu 1085eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu/******************************************************************************* 1086eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1087eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Function HAL_NfcPrmSetSpdNciCmdPayloadSize 1088eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1089eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Description Set Host-to-NFCC NCI message size for secure patch download 1090eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1091eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** This API must be called before calling HAL_NfcPrmDownloadStart. 1092eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** If the API is not called, then PRM will use the default 1093eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** message size. 1094eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1095eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Typically, this API is only called for platforms that have 1096eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** message-size limitations in the transport/driver. 1097eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1098eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Valid message size range: NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE to 255. 1099eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1100eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** Returns HAL_NFC_STATUS_OK if successful 1101eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** HAL_NFC_STATUS_FAILED otherwise 1102eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1103eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu** 1104eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu*******************************************************************************/ 1105eb190654c5fbaea2f396bb5523f57062f291879aEvan ChutHAL_NFC_STATUS HAL_NfcPrmSetSpdNciCmdPayloadSize (UINT8 max_payload_size) 1106eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu{ 1107eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu /* Validate: minimum size is NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE */ 1108eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu if (max_payload_size < NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE) 1109eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1110eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_ERROR2 ("HAL_NfcPrmSetSpdNciCmdPayloadSize: invalid size (%i). Must be between %i and 255", max_payload_size, NFC_HAL_PRM_MIN_NCI_CMD_PAYLOAD_SIZE); 1111eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return (HAL_NFC_STATUS_FAILED); 1112eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1113eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu else 1114eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu { 1115eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu NCI_TRACE_API1 ("HAL_NfcPrmSetSpdNciCmdPayloadSize: new message size during download: %i", max_payload_size); 1116eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu nfc_hal_cb.ncit_cb.nci_ctrl_size = max_payload_size; 1117eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu return (HAL_NFC_STATUS_OK); 1118eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu } 1119eb190654c5fbaea2f396bb5523f57062f291879aEvan Chu} 1120