最近需要在上层显示一个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:/
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上做的修改,其他平台文件可能路径不太一样,这里只是记录下方法
本文参考: https://blog.csdn.net/liaochaoyun/article/details/83010140 https://blog.csdn.net/weixin_43819696/article/details/105703158
|