不同区域读取NVRAM数据

一  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;

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;

    }


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值