NonVolatileStore.cpp revision a24be4f06674b2707b57904deaa0dff5a95823bd
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{
23a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    #include "nfc_hal_target.h"
24a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    #include "nfc_hal_nv_ci.h"
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "config.h"
27edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu#include "CrcChecksum.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/types.h>
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/stat.h>
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <fcntl.h>
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h>
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string>
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project//directory of HAL's non-volatile storage
365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic const char* default_location = "/data/nfc";
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic const char* filename_prefix = "/halStorage.bin";
385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic const std::string get_storage_location ();
39edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid delete_hal_non_volatile_store (bool forceDelete);
40edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid verify_hal_non_volatile_store ();
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nv_co_read
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by NFA to read in data from the
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  previously opened file.
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data into.
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to read into the buffer.
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_read () is
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the buffer of data, along with the number
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        of bytes read into the buffer, and a status.  The
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been read, the end of file has been detected,
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        or an error has occurred.
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_read (UINT8 *p_buf, UINT16 nbytes, UINT8 block)
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
74d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), block);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = open (filename, O_RDONLY);
785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
80edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = 0;
81edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadCrc = read (fileStream, &checksum, sizeof(checksum));
82edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadData = read (fileStream, p_buf, nbytes);
83edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        close (fileStream);
84edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (actualReadData > 0)
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
86edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            ALOGD ("%s: data size=%u", __FUNCTION__, actualReadData);
87edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfc_hal_nv_ci_read (actualReadData, NFC_HAL_NV_CO_OK, block);
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to read", __FUNCTION__);
92edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block);
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD ("%s: fail to open", __FUNCTION__);
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block);
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
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** Function         nfc_hal_nv_co_write
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by io to send file data to the
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  phone.
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data from.
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to write out to the file.
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_write () is
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the file descriptor and the status.  The
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been written, or an error has been detected,
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_write (const UINT8 *p_buf, UINT16 nbytes, UINT8 block)
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = 0;
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
133d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), block);
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
139edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = crcChecksumCompute (p_buf, nbytes);
140edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenCrc = write (fileStream, &checksum, sizeof(checksum));
141edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenData = write (fileStream, p_buf, nbytes);
142edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWrittenData);
143edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if ((actualWrittenData == nbytes) && (actualWrittenCrc == sizeof(checksum)))
144edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_OK);
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to write", __FUNCTION__);
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL);
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        close (fileStream);
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL);
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         get_storage_location
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Get the absolute directory path of the HAL's storage location.
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters       none
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          Absolute path.
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst std::string get_storage_location ()
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char buffer [100];
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (buffer, 0, sizeof(buffer));
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!GetStrValue (NAME_NFA_STORAGE, buffer, sizeof(buffer)))
1785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return default_location;
1795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return std::string (buffer);
1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         delete_hal_non_volatile_store
1875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Delete all the content of the HAL's storage location.
1895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
190edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       forceDelete: unconditionally delete the storage.
1915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          none
1935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
195edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid delete_hal_non_volatile_store (bool forceDelete)
1965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    static bool firstTime = true;
1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char filename[256];
2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    int stat = 0;
2015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
202edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if ((firstTime == false) && (forceDelete == false))
2035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    firstTime = false;
2055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s", __FUNCTION__);
2075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    fn.append (filename_prefix);
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fn.length() > 200)
2105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
2115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGE ("%s: filename too long", __FUNCTION__);
2125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
2145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
215d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), DH_NV_BLOCK);
2165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
217d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
2185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
219d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
2205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
221d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
2225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
224edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
225edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
226edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu/*******************************************************************************
227edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
228edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Function         verify_hal_non_volatile_store
229edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
230edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Description      Verify the content of all non-volatile store.
231edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
232edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       none
233edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
234edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Returns          none
235edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
236edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu*******************************************************************************/
237edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid verify_hal_non_volatile_store ()
238edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu{
239edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    ALOGD ("%s", __FUNCTION__);
240edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    std::string fn = get_storage_location();
241edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    char filename[256];
242edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    bool isValid = false;
243edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
244edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    fn.append (filename_prefix);
245edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (fn.length() > 200)
246edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
247edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
248edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        return;
249edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
250edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
251d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu    snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), DH_NV_BLOCK);
252edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (crcChecksumVerifyIntegrity (filename))
253edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
254d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu        snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
255edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (crcChecksumVerifyIntegrity (filename))
256edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
257d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu            snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
258edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            if (crcChecksumVerifyIntegrity (filename))
259edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            {
260d8f9332bd02e621ee8c38254844f80ea147c46deEvan Chu                snprintf (filename, sizeof(filename), "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
261edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                if (crcChecksumVerifyIntegrity (filename))
262edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                    isValid = true;
263edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            }
264edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        }
265edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
266edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
267edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (isValid == false)
268edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        delete_hal_non_volatile_store (true);
269edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu}
270