展讯 Android10:将lk(u-boot)下的.C文件接口读取的值写入cmdline,并解析成prop属性,通过属性供上层读取

最近需要在上层显示一个BoardId,驱动给了个Bsp下的.C文件接口
在这里插入图片描述
上图是接口信息
我们上层无法直接调用Bsp下的.C文件接口,通过查找资料发现可以使用cmdline来做相关的数据传递

一、通过接口获取的数据写入cmdline

相关文件路径:
proc/cmdline
bsp/bootloader/u-boot15/common/loader/sprd_fdt_support.c
bsp/bootloader/u-boot15/common/loader/loader_common.c

首先查看cmdline中当前都传递了哪些数据,adb shell cat proc/cmdline

sy@sy:~/work1/f300$ adb shell
F300:/ # cat proc/cmdline                                                                                                                                                                                  
init=/init root=/dev/ram0 rw androidboot.hardware=sl8541e_1h10_32b vmalloc=360M androidboot.dtbo_idx=0 printk.devkmsg=on androidboot.boot_devices=soc/soc:ap-ahb/20600000.sdio lcd_id=ID4000 lcd_name=lcd_sh1282g_truly_mipi_hd lcd_base=9e000000 lcd_size=800x480 pixel_clock=32000000 logo_bpix=24 androidboot.ddrsize=1024M androidboot.ddrsize.range=[1024,2048)  sysdump_magic=85500000 modem=shutdown ltemode=lcsfb rfboard.id=-1 rfhw.id=0 crystal=2 32k.less=1 androidboot.pmic.chipid=2721 modemboot.method=emmcboot  androidboot.verifiedbootstate=green androidboot.flash.locked=1  
androidboot.serialno=0123456789ABCDEF androidboot.vbmeta.device=PARTUUID=1.0 androidboot.vbmeta.avb_version=1.1 androidboot.vbmeta.device_state=locked androidboot.vbmeta.hash_alg=sha256 androidboot.vbmeta.size=38592 androidboot.vbmeta.digest=6b36ad12f6a6c2cba0f5b8ba744ed02992743dcf1cb1d521dd353e9b9c8b9eb5 androidboot.vbmeta.invalidate_on_error=yes androidboot.veritymode=enforcing
F300:/ # 

这里我使用androidboot.serialno作为参照,看它是如何从uBoot写到cmdline的,
bsp/bootloader/u-boot15下搜索“androidboot.serialno”

sy@sy:~/work1/f300/bsp/bootloader/u-boot15$ grep -rin "androidboot.serialno" .
./common/loader/sprd_fdt_support.c:994:	sprintf(buf, " androidboot.serialno=%s", get_product_sn());

打开sprd_fdt_support.c,找到这个方法并仿照重写一个方法

//参照此方法
int fdt_fixup_serialno(void *fdt)
{
	char buf[255];
	int str_len;
	int ret;
	memset(buf, 0, 255);
	sprintf(buf, "androidboot.serialno=%s", get_product_sn());
	str_len = strlen(buf);
	buf[str_len] = '\0';
	ret = fdt_chosen_bootargs_append(fdt, buf, 1);
	return ret;
}

//仿照写一个我们自己属性的方法
int fdt_fixup_boardid(void *fdt)
{
	char buf[255];
	int str_len;
	int ret;
	memset(buf, 0, 255);
	sprintf(buf, "boardid=%d", sprd_get_bandinfo());//这里调用驱动给的接口
	str_len = strlen(buf);
	buf[str_len] = '\0';
	ret = fdt_chosen_bootargs_append(fdt, buf, 1);
	return ret;
}

然后找到fdt_fixup_serialno方法调用的地方,把我们的方法也加上,

//在下面搜到的loader_common.c文件中加上调用我们自己的方法
sy@sy:~/work1/f300/bsp/bootloader/u-boot15$ grep -rin "fdt_fixup_serialno" .
./common/loader/sprd_fdt_support.c:987:int fdt_fixup_serialno(void *fdt)
./common/loader/loader_common.c:170:	fdt_fixup_serialno(fdt_blob);
./common/loader/loader_common.c:230:	fdt_fixup_serialno(fdt_blob);

以上修改会将我们获取到的数据追加写入cmdline中,编译后刷机,重新adb shell cat proc/cmdline就可以看到我们自己新增的数据了

二、解析cmdline,生成prop属性

相关文件路径:system/core/init/init.c
方法:import_kernel_nv

import_kernel_nv方法中,将cmdline文件中对应的数据串生成不同的prop属性
这里增加一个判断条件,当解析到我们增加的数据时,定义自定义属性ro.boot.boardid并赋值

static void import_kernel_nv(const std::string& key, const std::string& value, bool for_emulator) {
    if (key.empty()) return;
    if (for_emulator) {
        // In the emulator, export any kernel option with the "ro.kernel." prefix.
        property_set("ro.kernel." + key, value);
        return;
    }
    if (key == "qemu") {
        strlcpy(qemu, value.c_str(), sizeof(qemu));
    } else if (android::base::StartsWith(key, "androidboot.")) {
        property_set("ro.boot." + key.substr(12), value);
    } else if(android::base::StartsWith(key, "wifionly")) {
        property_set("ro.radio.noril", value);
        LOG(INFO) << "is wifionly version: " << value;
    } else if(android::base::StartsWith(key, "boardid")) {
        property_set("ro.boot.boardid", value);
        LOG(INFO) << "ro.boot.boardid: " << value;
    }
}

三、上层通过属性,获取目标值

String product = SystemProperties.get("ro.boot.boardid");
Log.d("sytest","product=" +product);

ps:由于平台不一样,本文是在展讯10.0上做的修改,其他平台文件可能路径不太一样,这里只是记录下方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值