1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 2011-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"
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/types.h>
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <sys/stat.h>
2182c3eede067007cf74632c9cec00aa9bf7801f2fElliott Hughes#include <malloc.h>
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <fcntl.h>
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <errno.h>
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "buildcfg.h"
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfa_nv_co.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "config.h"
27a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#include "nfc_hal_target.h"
285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "nfc_hal_nv_co.h"
2982c3eede067007cf74632c9cec00aa9bf7801f2fElliott Hughes#include "nfa_nv_ci.h"
3082c3eede067007cf74632c9cec00aa9bf7801f2fElliott Hughes#include "CrcChecksum.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern char bcm_nfc_location[];
325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic const char* sNfaStorageBin = "/nfaStorage.bin";
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_mem_co_alloc
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      allocate a buffer from platform's memory pool
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  pointer to buffer if successful
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NULL otherwise
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
45a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuextern void *nfa_mem_co_alloc(UINT32 num_bytes)
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return malloc(num_bytes);
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_mem_co_free
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      free buffer previously allocated using nfa_mem_co_alloc
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns:
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Nothing
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
61a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuextern void nfa_mem_co_free(void *pBuffer)
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    free(pBuffer);
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_nv_co_read
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by NFA to read in data from the
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  previously opened file.
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       pBuffer   - buffer to read the data into.
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to read into the buffer.
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfa_nv_ci_read() is
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the buffer of data, along with the number
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        of bytes read into the buffer, and a status.  The
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been read, the end of file has been detected,
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        or an error has occurred.
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
87a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuextern void nfa_nv_co_read(UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256], filename2[256];
905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename, 0, sizeof(filename));
925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename2, 0, sizeof(filename2));
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    strcpy(filename2, bcm_nfc_location);
945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    strncat(filename2, sNfaStorageBin, sizeof(filename2)-strlen(filename2)-1);
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (strlen(filename2) > 200)
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", filename2, block);
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = open (filename, O_RDONLY);
1045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
106edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = 0;
107edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadCrc = read (fileStream, &checksum, sizeof(checksum));
108edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualReadData = read (fileStream, pBuffer, nbytes);
109edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        close (fileStream);
110edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (actualReadData > 0)
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1120a85f658ebd49b72be39fe0fb61fcca4ee0fbc82Martijn Coenen            ALOGD ("%s: data size=%zu", __FUNCTION__, actualReadData);
113edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfa_nv_ci_read (actualReadData, NFA_NV_CO_OK, block);
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to read", __FUNCTION__);
118edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
123edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGD ("%s: fail to open", __FUNCTION__);
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_nv_ci_read (0, NFA_NV_CO_FAIL, block);
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfa_nv_co_write
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by io to send file data to the
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  phone.
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       pBuffer   - buffer to read the data from.
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to write out to the file.
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfa_nv_ci_write() is
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the file descriptor and the status.  The
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been written, or an error has been detected,
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
146a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuextern void nfa_nv_co_write(const UINT8 *pBuffer, UINT16 nbytes, UINT8 block)
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256], filename2[256];
1495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename, 0, sizeof(filename));
1515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename2, 0, sizeof(filename2));
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    strcpy(filename2, bcm_nfc_location);
1535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    strncat(filename2, sNfaStorageBin, sizeof(filename2)-strlen(filename2)-1);
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (strlen(filename2) > 200)
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", filename2, block);
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = 0;
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
167edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        unsigned short checksum = crcChecksumCompute (pBuffer, nbytes);
168edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenCrc = write (fileStream, &checksum, sizeof(checksum));
169edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        size_t actualWrittenData = write (fileStream, pBuffer, nbytes);
1700a85f658ebd49b72be39fe0fb61fcca4ee0fbc82Martijn Coenen        ALOGD ("%s: %zu bytes written", __FUNCTION__, actualWrittenData);
171edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if ((actualWrittenData == nbytes) && (actualWrittenCrc == sizeof(checksum)))
172edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_nv_ci_write (NFA_NV_CO_OK);
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to write", __FUNCTION__);
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfa_nv_ci_write (NFA_NV_CO_FAIL);
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        close (fileStream);
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno);
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfa_nv_ci_write (NFA_NV_CO_FAIL);
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         delete_stack_non_volatile_store
1925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Delete all the content of the stack's storage location.
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
195edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       forceDelete: unconditionally delete the storage.
1965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          none
1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
200edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid delete_stack_non_volatile_store (BOOLEAN forceDelete)
2015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
2025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    static BOOLEAN firstTime = TRUE;
2035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char filename[256], filename2[256];
2045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
205edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if ((firstTime == FALSE) && (forceDelete == FALSE))
2065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    firstTime = FALSE;
2085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s", __FUNCTION__);
2105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename, 0, sizeof(filename));
2125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (filename2, 0, sizeof(filename2));
2135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    strcpy(filename2, bcm_nfc_location);
2145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    strncat(filename2, sNfaStorageBin, sizeof(filename2)-strlen(filename2)-1);
2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (strlen(filename2) > 200)
2165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
2175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGE ("%s: filename too long", __FUNCTION__);
2185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
2205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", filename2, DH_NV_BLOCK);
2215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", filename2, HC_F3_NV_BLOCK);
2235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", filename2, HC_F4_NV_BLOCK);
2255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", filename2, HC_F2_NV_BLOCK);
2275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
22846f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu    sprintf (filename, "%s%u", filename2, HC_F5_NV_BLOCK);
22946f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu    remove (filename);
2305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
2315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
2335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
234edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Function         verify_stack_non_volatile_store
235edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
236edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Description      Verify the content of all non-volatile store.
237edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
238edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Parameters       none
239edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
240edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu** Returns          none
241edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu**
242edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu*******************************************************************************/
243edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chuvoid verify_stack_non_volatile_store ()
244edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu{
245edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    ALOGD ("%s", __FUNCTION__);
246edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    char filename[256], filename2[256];
247edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    BOOLEAN isValid = FALSE;
248edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
249edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    memset (filename, 0, sizeof(filename));
250edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    memset (filename2, 0, sizeof(filename2));
251edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    strcpy(filename2, bcm_nfc_location);
252edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    strncat(filename2, sNfaStorageBin, sizeof(filename2)-strlen(filename2)-1);
253edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (strlen(filename2) > 200)
254edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
255edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        ALOGE ("%s: filename too long", __FUNCTION__);
256edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        return;
257edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
258edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
259edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    sprintf (filename, "%s%u", filename2, DH_NV_BLOCK);
260edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (crcChecksumVerifyIntegrity (filename))
261edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    {
262edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        sprintf (filename, "%s%u", filename2, HC_F3_NV_BLOCK);
263edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        if (crcChecksumVerifyIntegrity (filename))
264edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        {
265edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            sprintf (filename, "%s%u", filename2, HC_F4_NV_BLOCK);
266edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            if (crcChecksumVerifyIntegrity (filename))
267edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            {
268edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                sprintf (filename, "%s%u", filename2, HC_F2_NV_BLOCK);
269edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu                if (crcChecksumVerifyIntegrity (filename))
27046f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu                {
27146f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu                    sprintf (filename, "%s%u", filename2, HC_F5_NV_BLOCK);
27246f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu                    if (crcChecksumVerifyIntegrity (filename))
27346f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu                        isValid = TRUE;
27446f4e4f7099609ff6b5e7efce7b91b4252bdbfb1Evan Chu                }
275edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu            }
276edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        }
277edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    }
278edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
279edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu    if (isValid == FALSE)
280edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu        delete_stack_non_volatile_store (TRUE);
281edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu}
282edbfba90df8e223fadd787a10cb131e1dcfa7347Evan Chu
283