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"
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 ();
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nv_co_read
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by NFA to read in data from the
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  previously opened file.
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data into.
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to read into the buffer.
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_read () is
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the buffer of data, along with the number
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        of bytes read into the buffer, and a status.  The
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been read, the end of file has been detected,
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        or an error has occurred.
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_read (UINT8 *p_buf, UINT16 nbytes, UINT8 block)
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", fn.c_str(), block);
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename);
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = open (filename, O_RDONLY);
765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        size_t actualRead = read (fileStream, p_buf, nbytes);
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (actualRead > 0)
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead);
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_read (actualRead, NFC_HAL_NV_CO_OK, block);
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to read", __FUNCTION__);
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_read (actualRead, NFC_HAL_NV_CO_FAIL, block);
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        close (fileStream);
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD ("%s: fail to open", __FUNCTION__);
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block);
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_nv_co_write
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called by io to send file data to the
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  phone.
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Parameters       p_buf   - buffer to read the data from.
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  nbytes  - number of bytes to write out to the file.
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Note: Upon completion of the request, nfc_hal_nv_ci_write () is
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        called with the file descriptor and the status.  The
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        call-in function should only be called when ALL requested
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                        bytes have been written, or an error has been detected,
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_nv_co_write (const UINT8 *p_buf, UINT16 nbytes, UINT8 block)
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    char filename[256];
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    int fileStream = 0;
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fn.append (filename_prefix);
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (fn.length() > 200)
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGE ("%s: filename too long", __FUNCTION__);
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    sprintf (filename, "%s%u", fn.c_str(), block);
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename);
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
1335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fileStream >= 0)
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        size_t actualWritten = write (fileStream, p_buf, nbytes);
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten);
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (actualWritten > 0) {
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_OK);
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ALOGE ("%s: fail to write", __FUNCTION__);
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL);
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        close (fileStream);
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 open, error = %d", __FUNCTION__, errno);
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}
1535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         get_storage_location
1585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Get the absolute directory path of the HAL's storage location.
1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters       none
1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          Absolute path.
1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst std::string get_storage_location ()
1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char buffer [100];
1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    memset (buffer, 0, sizeof(buffer));
1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (!GetStrValue (NAME_NFA_STORAGE, buffer, sizeof(buffer)))
1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return default_location;
1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return std::string (buffer);
1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
1785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         delete_hal_non_volatile_store
1805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      Delete all the content of the HAL's storage location.
1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Parameters       none
1845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          none
1865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
1875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
1885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid delete_hal_non_volatile_store ()
1895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
1905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    static bool firstTime = true;
1915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    std::string fn = get_storage_location();
1925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    char filename[256];
1935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    int stat = 0;
1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (firstTime == false)
1965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
1975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    firstTime = false;
1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    ALOGD ("%s", __FUNCTION__);
2005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    fn.append (filename_prefix);
2025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if (fn.length() > 200)
2035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
2045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ALOGE ("%s: filename too long", __FUNCTION__);
2055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        return;
2065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
2075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
2085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), DH_NV_BLOCK);
2095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F3_NV_BLOCK);
2115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F4_NV_BLOCK);
2135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    sprintf (filename, "%s%u", fn.c_str(), HC_F2_NV_BLOCK);
2155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    remove (filename);
2165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
217