IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 展讯 Android10:将lk(u-boot)下的.C文件接口读取的值写入cmdline,并解析成prop属性,通过属性供上层读取 -> 正文阅读

[C++知识库]展讯 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上做的修改,其他平台文件可能路径不太一样,这里只是记录下方法

本文参考:
https://blog.csdn.net/liaochaoyun/article/details/83010140
https://blog.csdn.net/weixin_43819696/article/details/105703158

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:14:26  更:2022-03-12 17:16:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:33:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码