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