NonVolatileStore.cpp revision edbfba90df8e223fadd787a10cb131e1dcfa7347
1e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith/****************************************************************************** 2e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * 3e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * Copyright (C) 1999-2012 Broadcom Corporation 4e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * 5e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * Licensed under the Apache License, Version 2.0 (the "License"); 6e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * you may not use this file except in compliance with the License. 7e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * You may obtain a copy of the License at: 8e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * 9e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * http://www.apache.org/licenses/LICENSE-2.0 10e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * 11e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * Unless required by applicable law or agreed to in writing, software 12e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * distributed under the License is distributed on an "AS IS" BASIS, 13e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * See the License for the specific language governing permissions and 15e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * limitations under the License. 16e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith * 17e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ******************************************************************************/ 18e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "OverrideLog.h" 19e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#define LOG_TAG "NfcNciHal" 20e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "gki.h" 21e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithextern "C" 22e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith{ 23e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith #include "nfc_hal_nv_co.h" 24e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 25e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "nfc_hal_nv_ci.h" 26e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "nfc_hal_int.h" 27e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "config.h" 28e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include "CrcChecksum.h" 29e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include <sys/types.h> 30e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include <sys/stat.h> 31e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include <fcntl.h> 32e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include <errno.h> 33e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith#include <string> 34e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 35e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 36a189d8976f1193b788508a1a29b2e9d0aca06acaAlexander Kornienko//directory of HAL's non-volatile storage 37a189d8976f1193b788508a1a29b2e9d0aca06acaAlexander Kornienkostatic const char* default_location = "/data/nfc"; 38e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithstatic const char* filename_prefix = "/halStorage.bin"; 39e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithstatic const std::string get_storage_location (); 40e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithvoid delete_hal_non_volatile_store (bool forceDelete); 41e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithvoid verify_hal_non_volatile_store (); 42e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 43e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 44e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith/******************************************************************************* 45e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 46e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Function nfc_hal_nv_co_read 47e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 48e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Description This function is called by NFA to read in data from the 49e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** previously opened file. 50e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 51e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Parameters p_buf - buffer to read the data into. 52e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** nbytes - number of bytes to read into the buffer. 53e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 54e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Returns void 55e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 56e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Note: Upon completion of the request, nfc_hal_nv_ci_read () is 57e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** called with the buffer of data, along with the number 58e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** of bytes read into the buffer, and a status. The 59e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** call-in function should only be called when ALL requested 60e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** bytes have been read, the end of file has been detected, 61e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** or an error has occurred. 62e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 63e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith*******************************************************************************/ 64e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithvoid nfc_hal_nv_co_read (UINT8 *p_buf, UINT16 nbytes, UINT8 block) 65e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith{ 66e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith std::string fn = get_storage_location(); 67e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith char filename[256]; 68e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 69e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith fn.append (filename_prefix); 70e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (fn.length() > 200) 71e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 72e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGE ("%s: filename too long", __FUNCTION__); 73e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return; 74e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 75e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith sprintf (filename, "%s%u", fn.c_str(), block); 76e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 77e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename); 78e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith int fileStream = open (filename, O_RDONLY); 79e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (fileStream >= 0) 80e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 81e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith unsigned short checksum = 0; 82e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith size_t actualReadCrc = read (fileStream, &checksum, sizeof(checksum)); 83e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith size_t actualReadData = read (fileStream, p_buf, nbytes); 84e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith close (fileStream); 85e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (actualReadData > 0) 86e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 87e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGD ("%s: data size=%u", __FUNCTION__, actualReadData); 88e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_read (actualReadData, NFC_HAL_NV_CO_OK, block); 89e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 90e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith else 91e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 92e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGE ("%s: fail to read", __FUNCTION__); 93e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block); 94e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 95e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 96e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith else 97e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 98e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGD ("%s: fail to open", __FUNCTION__); 99e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block); 100e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 101e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 102e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 103e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 104e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith/******************************************************************************* 105e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 106e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Function nfc_hal_nv_co_write 107e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 108e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Description This function is called by io to send file data to the 109e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** phone. 110e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 111e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Parameters p_buf - buffer to read the data from. 112e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** nbytes - number of bytes to write out to the file. 113e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 114e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Returns void 115e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 116e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Note: Upon completion of the request, nfc_hal_nv_ci_write () is 117e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** called with the file descriptor and the status. The 118e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** call-in function should only be called when ALL requested 119e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** bytes have been written, or an error has been detected, 120e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 121e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith*******************************************************************************/ 122e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithvoid nfc_hal_nv_co_write (const UINT8 *p_buf, UINT16 nbytes, UINT8 block) 123e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith{ 124e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith std::string fn = get_storage_location(); 125e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith char filename[256]; 126e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith int fileStream = 0; 127e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 128e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith fn.append (filename_prefix); 129e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (fn.length() > 200) 130e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 131e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGE ("%s: filename too long", __FUNCTION__); 132e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return; 133e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 134e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith sprintf (filename, "%s%u", fn.c_str(), block); 135e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename); 136e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 137e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 138e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (fileStream >= 0) 139e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 140e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith unsigned short checksum = crcChecksumCompute (p_buf, nbytes); 141e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith size_t actualWrittenCrc = write (fileStream, &checksum, sizeof(checksum)); 142e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith size_t actualWrittenData = write (fileStream, p_buf, nbytes); 143e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGD ("%s: %d bytes written", __FUNCTION__, actualWrittenData); 144e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if ((actualWrittenData == nbytes) && (actualWrittenCrc == sizeof(checksum))) 145e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 146e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_write (NFC_HAL_NV_CO_OK); 147e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 148e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith else 149e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 150e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGE ("%s: fail to write", __FUNCTION__); 151e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL); 152e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 153e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith close (fileStream); 154e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 155e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith else 156e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith { 157e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno); 158e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL); 159e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith } 160e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith} 161e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 162e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith 163e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith/******************************************************************************* 164e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 165e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Function get_storage_location 166e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 167e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Description Get the absolute directory path of the HAL's storage location. 168e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 169e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Parameters none 170e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 171e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** Returns Absolute path. 172e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith** 173e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith*******************************************************************************/ 174e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smithconst std::string get_storage_location () 175e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith{ 176e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith char buffer [100]; 177e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith memset (buffer, 0, sizeof(buffer)); 178e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith if (!GetStrValue (NAME_NFA_STORAGE, buffer, sizeof(buffer))) 179e0d3b4cd2b66f1cef26cacbed5820ab7c22ad5b3Richard Smith return default_location; 180 else 181 return std::string (buffer); 182} 183 184 185/******************************************************************************* 186** 187** Function delete_hal_non_volatile_store 188** 189** Description Delete all the content of the HAL's storage location. 190** 191** Parameters forceDelete: unconditionally delete the storage. 192** 193** Returns none 194** 195*******************************************************************************/ 196void delete_hal_non_volatile_store (bool forceDelete) 197{ 198 static bool firstTime = true; 199 std::string fn = get_storage_location(); 200 char filename[256]; 201 int stat = 0; 202 203 if ((firstTime == false) && (forceDelete == false)) 204 return; 205 firstTime = false; 206 207 ALOGD ("%s", __FUNCTION__); 208 209 fn.append (filename_prefix); 210 if (fn.length() > 200) 211 { 212 ALOGE ("%s: filename too long", __FUNCTION__); 213 return; 214 } 215 216 sprintf (filename, "%s%u", fn.c_str(), DH_NV_BLOCK); 217 remove (filename); 218 sprintf (filename, "%s%u", fn.c_str(), HC_F3_NV_BLOCK); 219 remove (filename); 220 sprintf (filename, "%s%u", fn.c_str(), HC_F4_NV_BLOCK); 221 remove (filename); 222 sprintf (filename, "%s%u", fn.c_str(), HC_F2_NV_BLOCK); 223 remove (filename); 224} 225 226 227/******************************************************************************* 228** 229** Function verify_hal_non_volatile_store 230** 231** Description Verify the content of all non-volatile store. 232** 233** Parameters none 234** 235** Returns none 236** 237*******************************************************************************/ 238void verify_hal_non_volatile_store () 239{ 240 ALOGD ("%s", __FUNCTION__); 241 std::string fn = get_storage_location(); 242 char filename[256]; 243 bool isValid = false; 244 245 fn.append (filename_prefix); 246 if (fn.length() > 200) 247 { 248 ALOGE ("%s: filename too long", __FUNCTION__); 249 return; 250 } 251 252 sprintf (filename, "%s%u", fn.c_str(), DH_NV_BLOCK); 253 if (crcChecksumVerifyIntegrity (filename)) 254 { 255 sprintf (filename, "%s%u", fn.c_str(), HC_F3_NV_BLOCK); 256 if (crcChecksumVerifyIntegrity (filename)) 257 { 258 sprintf (filename, "%s%u", fn.c_str(), HC_F4_NV_BLOCK); 259 if (crcChecksumVerifyIntegrity (filename)) 260 { 261 sprintf (filename, "%s%u", fn.c_str(), HC_F2_NV_BLOCK); 262 if (crcChecksumVerifyIntegrity (filename)) 263 isValid = true; 264 } 265 } 266 } 267 268 if (isValid == false) 269 delete_hal_non_volatile_store (true); 270} 271