NonVolatileStore.cpp revision edbfba90df8e223fadd787a10cb131e1dcfa7347
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "OverrideLog.h"
195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define LOG_TAG "NfcNciHal"
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern "C"
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    #include "nfc_hal_nv_co.h"
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_nv_ci.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "config.h"
28edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu#include "CrcChecksum.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/types.h>
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/stat.h>
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <fcntl.h>
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h>
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string>
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project//directory of HAL's non-volatile storage
375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic const char* default_location = "/data/nfc";
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic const char* filename_prefix = "/halStorage.bin";
395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic const std::string get_storage_location ();
40edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid delete_hal_non_volatile_store (bool forceDelete);
41edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid verify_hal_non_volatile_store ();
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nv_co_read
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by NFA to read in data from the
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  previously opened file.
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data into.
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to read into the buffer.
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_read () is
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the buffer of data, along with the number
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        of bytes read into the buffer, and a status.  The
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been read, the end of file has been detected,
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        or an error has occurred.
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_read (UINT8 *p_buf, UINT16 nbytes, UINT8 block)
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", fn.c_str(), block);
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = open (filename, O_RDONLY);
795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
81edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = 0;
82edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadCrc = read (fileStream, &checksum, sizeof(checksum));
83edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadData = read (fileStream, p_buf, nbytes);
84edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        close (fileStream);
85edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (actualReadData > 0)
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
87edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            ALOGD ("%s: data size=%u", __FUNCTION__, actualReadData);
88edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfc_hal_nv_ci_read (actualReadData, NFC_HAL_NV_CO_OK, block);
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to read", __FUNCTION__);
93edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block);
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD ("%s: fail to open", __FUNCTION__);
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block);
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nv_co_write
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by io to send file data to the
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  phone.
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data from.
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to write out to the file.
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_write () is
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the file descriptor and the status.  The
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been written, or an error has been detected,
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_write (const UINT8 *p_buf, UINT16 nbytes, UINT8 block)
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = 0;
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", fn.c_str(), block);
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
1385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
140edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = crcChecksumCompute (p_buf, nbytes);
141edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenCrc = write (fileStream, &checksum, sizeof(checksum));
142edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenData = write (fileStream, p_buf, nbytes);
143edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWrittenData);
144edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if ((actualWrittenData == nbytes) && (actualWrittenCrc == sizeof(checksum)))
145edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_OK);
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to write", __FUNCTION__);
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL);
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        close (fileStream);
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL);
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         get_storage_location
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Get the absolute directory path of the HAL's storage location.
1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters       none
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          Absolute path.
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst std::string get_storage_location ()
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char buffer [100];
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (buffer, 0, sizeof(buffer));
1785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!GetStrValue (NAME_NFA_STORAGE, buffer, sizeof(buffer)))
1795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return default_location;
1805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return std::string (buffer);
1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
1835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         delete_hal_non_volatile_store
1885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Delete all the content of the HAL's storage location.
1905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
191edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       forceDelete: unconditionally delete the storage.
1925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          none
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
196edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid delete_hal_non_volatile_store (bool forceDelete)
1975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    static bool firstTime = true;
1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char filename[256];
2015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    int stat = 0;
2025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
203edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if ((firstTime == false) && (forceDelete == false))
2045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    firstTime = false;
2065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s", __FUNCTION__);
2085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    fn.append (filename_prefix);
2105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fn.length() > 200)
2115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
2125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGE ("%s: filename too long", __FUNCTION__);
2135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), DH_NV_BLOCK);
2175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
2195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
2215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
2235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
225edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
226edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
227edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu/*******************************************************************************
228edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
229edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Function         verify_hal_non_volatile_store
230edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
231edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Description      Verify the content of all non-volatile store.
232edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
233edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       none
234edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
235edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Returns          none
236edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
237edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu*******************************************************************************/
238edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid verify_hal_non_volatile_store ()
239edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu{
240edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    ALOGD ("%s", __FUNCTION__);
241edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    std::string fn = get_storage_location();
242edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    char filename[256];
243edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    bool isValid = false;
244edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
245edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    fn.append (filename_prefix);
246edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (fn.length() > 200)
247edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
248edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
249edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        return;
250edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
251edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
252edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    sprintf (filename, "%s%u", fn.c_str(), DH_NV_BLOCK);
253edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (crcChecksumVerifyIntegrity (filename))
254edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
255edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        sprintf (filename, "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
256edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (crcChecksumVerifyIntegrity (filename))
257edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
258edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            sprintf (filename, "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
259edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            if (crcChecksumVerifyIntegrity (filename))
260edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            {
261edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                sprintf (filename, "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
262edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                if (crcChecksumVerifyIntegrity (filename))
263edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                    isValid = true;
264edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            }
265edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        }
266edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
267edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
268edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (isValid == false)
269edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        delete_hal_non_volatile_store (true);
270edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu}
271