NonVolatileStore.cpp revision b58ba0e89a3767e6174c42d3e90540d1eae10f81
1/****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18#include "OverrideLog.h" 19#include "gki.h" 20extern "C" 21{ 22 #include "nfc_hal_nv_co.h" 23} 24#include "nfc_hal_nv_ci.h" 25#include "nfc_hal_int.h" 26#include <sys/types.h> 27#include <sys/stat.h> 28#include <fcntl.h> 29#include <errno.h> 30#include <string> 31 32 33//directory of HAL's non-volatile storage 34static const char* bcm_nfc_location = "/data/nfc"; 35static const char* filename_prefix = "/halStorage.bin"; 36 37 38/******************************************************************************* 39** 40** Function nfc_hal_nv_co_read 41** 42** Description This function is called by NFA to read in data from the 43** previously opened file. 44** 45** Parameters p_buf - buffer to read the data into. 46** nbytes - number of bytes to read into the buffer. 47** 48** Returns void 49** 50** Note: Upon completion of the request, nfc_hal_nv_ci_read () is 51** called with the buffer of data, along with the number 52** of bytes read into the buffer, and a status. The 53** call-in function should only be called when ALL requested 54** bytes have been read, the end of file has been detected, 55** or an error has occurred. 56** 57*******************************************************************************/ 58void nfc_hal_nv_co_read (UINT8 *p_buf, UINT16 nbytes, UINT8 block) 59{ 60 std::string fn (bcm_nfc_location); 61 char filename[256]; 62 63 fn.append (filename_prefix); 64 if (fn.length() > 200) 65 { 66 ALOGE ("%s: filename too long", __FUNCTION__); 67 return; 68 } 69 sprintf (filename, "%s%u", fn.c_str(), block); 70 71 ALOGD ("%s: buffer len=%u; file=%s", __FUNCTION__, nbytes, filename); 72 int fileStream = open (filename, O_RDONLY); 73 if (fileStream > 0) 74 { 75 size_t actualRead = read (fileStream, p_buf, nbytes); 76 if (actualRead > 0) 77 { 78 ALOGD ("%s: read bytes=%u", __FUNCTION__, actualRead); 79 nfc_hal_nv_ci_read (actualRead, NFC_HAL_NV_CO_OK, block); 80 } 81 else 82 { 83 ALOGE ("%s: fail to read", __FUNCTION__); 84 nfc_hal_nv_ci_read (actualRead, NFC_HAL_NV_CO_FAIL, block); 85 } 86 close (fileStream); 87 } 88 else 89 { 90 ALOGE ("%s: fail to open", __FUNCTION__); 91 nfc_hal_nv_ci_read (0, NFC_HAL_NV_CO_FAIL, block); 92 } 93} 94 95 96/******************************************************************************* 97** 98** Function nfc_hal_nv_co_write 99** 100** Description This function is called by io to send file data to the 101** phone. 102** 103** Parameters p_buf - buffer to read the data from. 104** nbytes - number of bytes to write out to the file. 105** 106** Returns void 107** 108** Note: Upon completion of the request, nfc_hal_nv_ci_write () is 109** called with the file descriptor and the status. The 110** call-in function should only be called when ALL requested 111** bytes have been written, or an error has been detected, 112** 113*******************************************************************************/ 114void nfc_hal_nv_co_write (const UINT8 *p_buf, UINT16 nbytes, UINT8 block) 115{ 116 std::string fn (bcm_nfc_location); 117 char filename[256]; 118 int fileStream = 0; 119 120 fn.append (filename_prefix); 121 if (fn.length() > 200) 122 { 123 ALOGE ("%s: filename too long", __FUNCTION__); 124 return; 125 } 126 sprintf (filename, "%s%u", fn.c_str(), block); 127 ALOGD ("%s: bytes=%u; file=%s", __FUNCTION__, nbytes, filename); 128 129 fileStream = open (filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 130 if (fileStream > 0) 131 { 132 size_t actualWritten = write (fileStream, p_buf, nbytes); 133 ALOGD ("%s: %d bytes written", __FUNCTION__, actualWritten); 134 if (actualWritten > 0) { 135 nfc_hal_nv_ci_write (NFC_HAL_NV_CO_OK); 136 } 137 else 138 { 139 ALOGE ("%s: fail to write", __FUNCTION__); 140 nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL); 141 } 142 close (fileStream); 143 } 144 else 145 { 146 ALOGE ("%s: fail to open, error = %d", __FUNCTION__, errno); 147 nfc_hal_nv_ci_write (NFC_HAL_NV_CO_FAIL); 148 } 149} 150