一 lk/uboot 区域读取NVRAM数据
参考代码
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6739\load_image.c
vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6739\mt_logo.c
int get_bootlogo_flag(unsigned char *out,int size){
long len,length;
u64 offset, start_address;
part_t *part;
part_dev_t *part_dev;
char part_name[]="proinfo";
part_dev = mt_part_get_device();//获取一个设备
if (!part_dev){
return -ENODEV;
}
part = mt_part_get_partition(part_name);;//获取设备上的一个分区
if (part == NULL){
dprintf(INFO, "mboot_get_boot_logo_flag--- part = NULL");
return -ENOENT;
}
dprintf(INFO, "mboot_get_boot_logo_flag--- get_partition 1\n");
length=1024;
#ifdef MTK_EMMC_SUPPORT
start_address = (u64)part->start_sect * part_dev->blkdev->blksz;
#else
start_address = part->startblk * BLK_SIZE;
#endif
//dprintf(INFO, "mboot_get_boot_logo_flag--- start_address =%lld\n",start_address);
int index=partition_get_index(part_name);
if(index==-1){
dprintf(INFO, "mboot_get_boot_logo_flag--- partition_get_index =%d\n",index);
return -ENOENT;
}
unsigned int part_id=partition_get_region(index);//加载分区的数据
//begin=get_timer(0);
unsigned char *addr;
addr = (unsigned char *)malloc(length*sizeof(unsigned char));
len = part_dev->read(part_dev,start_address,(uchar *)addr, length,part_id);//读取分区上的数据
if(len<0){
dprintf(INFO, "mboot_get_boot_logo_flag--- part_dev->read len=%ld\n",len);
return -EIO;
}
//dprintf(INFO, "mboot_get_boot_logo_flag--- part_dev->read len=%u\n",*(addr+553));
int result = *(addr+553);//boot logo flag
for(int i=0;i<size;i++){
out[i]=*(addr+553+i);
dprintf(INFO,"mboot_get_boot_logo_flag result[%d] = %u\n",553+i,out[i]);
}
//dprintf(INFO,"mboot_get_boot_logo_flag addr-553 = %d\n",result);
//for(int i=0;i<length;i++,addr++){
// dprintf(INFO, "mboot_get_boot_logo_flag--- i=%d , result =%d\n",i,*addr);
//}
return 1;
}
(因为NVRAM分区、proinfo分区是 raw分区)
二native层读取NVRAM值
1 引入头文件
#include "libnvram.h"
#include "CFG_PRODUCT_INFO_File.h"
#include "Custom_NvRam_LID.h"
#define TAG "[BootAnimation] "
2
#define MAX_RETRY_COUNT 100
int BootAnimation::readData() {
int read_nvram_ready_retry = 0;
F_ID fid;
int rec_size = 0;
int rec_num = 0;
int barcode_lid = AP_CFG_REEB_PRODUCT_INFO_LID;
PRODUCT_INFO *barcode_struct;
char *barcode_result;
bool isread = false;
char nvram_init_val[128] = {0};
ALOGE(TAG "Entry get_barcode_from_nvram");
while(read_nvram_ready_retry < MAX_RETRY_COUNT)
{
read_nvram_ready_retry++;
property_get("service.nvram_init", nvram_init_val, NULL);
if(strcmp(nvram_init_val, "Ready") == 0)
{
break;
}
else
{
usleep(500*1000);
}
}
if(read_nvram_ready_retry >= MAX_RETRY_COUNT)
{
ALOGE(TAG "Get nvram restore ready failed!");
return 0;
}
barcode_struct= (PRODUCT_INFO *)malloc(sizeof(PRODUCT_INFO));
if(barcode_struct == NULL)
{
return 0;
}
fid = NVM_GetFileDesc(barcode_lid, &rec_size, &rec_num, isread);
if(fid.iFileDesc < 0)
{
ALOGE(TAG "fid.iFileDesc < 0");
free(barcode_struct);
return 0;
}
if(rec_size != read(fid.iFileDesc, barcode_struct, rec_size))
{
free(barcode_struct);
return 0;
}
barcode_result= (char *)malloc(1024);
if(strlen((const char *)barcode_struct->barcode) > 0)
{
strncpy(barcode_result, (const char *)barcode_struct->barcode, strlen("(const char *)barcode_struct->barcode"));
}
else
{
strncpy(barcode_result, "unknown", strlen("unknown"));
}
free(barcode_struct);
if(!NVM_CloseFileDesc(fid))
{
return 0;
}
ALOGE(TAG "The size of barcode_struct:%d\n", sizeof(barcode_struct));
ALOGE(TAG "Barcode is %s", barcode_result);
return 1;
}
3 Android.mk
LOCAL_SHARED_LIBRARIES 加入
libnvram_mtk \
libcustom_nvram_mtk
LOCAL_C_INCLUDES 加入
vendor/mediatek/proprietary/external/nvram/libnvram \
vendor/mediatek/proprietary/custom/ \
$(MTK_PATH_SOURCE)/external/nvram/libfile_op \
$(MTK_PATH_CUSTOM)/cgen/inc \
$(MTK_PATH_CUSTOM)/cgen/cfgfileinc \
vendor/mediatek/proprietary/custom/common/cgen/cfgfileinc \
vendor/mediatek/proprietary/custom/common/cgen/inc
三 Java层读取NVRAM代码
1 android.mk
LOCAL_STATIC_JAVA_LIBRARIES加入
vendor.mediatek.hardware.nvram-V1.0-java-static
2 引入头文件
import java.util.ArrayList;
import java.util.Arrays;
import vendor.mediatek.hardware.nvram.V1_0.INvram;
import com.android.internal.util.HexDump;
3
public static final String PRODUCT_INFO_FILENAME = "/vendor/nvdata/APCFG/APRDEB/PRODUCT_INFO";
private static final void writeData(int n){
byte[] write_buff = new byte[]{0,0,0,0};
byte[] by = getBytes(n);
for(int i=0;i<4;i++){
write_buff[i] = by[i];
}
try {
INvram agent = INvram.getService();
if (agent != null) {
ArrayList<Byte> dataArray = new ArrayList<>(4);
for (byte b : write_buff) {
dataArray.add(new Byte(b));
}
int ret_1 = agent.writeFileByNamevec(PRODUCT_INFO_FILENAME, 537, dataArray);
} else {
Log.e(TAG, "writeData: agent null");
}
} catch (Exception e) {
Log.e(TAG, "writeData exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
}
private static final byte[] getBytes(int data){
byte[] bytes = new byte[4];
bytes[0] = (byte)(data&0xff);
bytes[1] = (byte)((data&0xff00)>>8);
bytes[2] = (byte)((data&0xff0000)>>16);
bytes[3] = (byte)((data&0xff000000)>>24);
return bytes;
}
public static final int readData(){
int targets = 0;
try {
String buff = null;
INvram agent = INvram.getService();
Log.i(TAG, "readData from PRODUCT_INFO_FILENAME");
if (agent != null) {
buff = agent.readFileByName(PRODUCT_INFO_FILENAME, 537);
}
buffArr = HexDump.hexStringToByteArray(buff.substring(0, buff.length() - 1));
targets = (buffArr[0] & 0xff) | ((buffArr[1] << 8) & 0xff00) | ((buffArr[2] << 24) >>> 8) | (buffArr[3] << 24);
}
Log.i(TAG, "readData: buffArr=" + Arrays.toString(buffArr)+", targets == "+targets);
} catch (Exception e) {
Log.e(TAG, "readData exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
return targets;
}