锋影
email:[email protected]
如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意
声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即予以改正
NON-HLOS.bin文件是BP侧的一个镜像,最终被烧写到modem分区,但最近研究发现,其不仅仅包含modem镜像,它还包含ADSP镜像、Wcnss镜像、Venus镜像、Widevine镜像,还有一些安全相关的镜像。AP侧Init进程解析init.rc时,会通过kernel PIL驱动程序加载这些镜像,最终将相应的modem、ADSP等boot起来。
一、NON-HLOS.bin文件生成过程
编译文件:common/build/build.py,这个文件虽然有将近900行,但是最关键只有下面几行:
for step_elem in workflow_elem:
。。。。
step_dict = ml.XmlToDict(step_elem)
step_func = run_step[step_elem.attrib['type']]
step_func(step_dict)
其中step相关配置文件:contents.xml,其大概格式如下:
workflow>
其中run_step定义如下:
run_step = {
'copy' : workflow_copy,
'exec' : workflow_exec,
'delete': workflow_delete,
'setenv': workflow_setenv
}
workflow_copy,workflow_exec,workflow_delete三个接口,恰好对应build.py脚本定义的三个函数,本文以workflow_exec为例简要说明其编译过程:
1、解析xml文件,获取setp配置内容,并放置在step_dict
2、根据xml文件type值选取合适的接口,如果step配置内容中type=exec,则相应接口为workflow_exec函数
3、调用workflow_exec函数,并将step_dict作为参数传递进去
(1) 首先调用preprocess_step函数,从参数step_dict获取step中各项配置
(2)params = ml.evaluate_params(step_dict_flavor)获取params属性中各个变量的值
(3)lg.log_exec(params),执行params属性中的命令
根据contents.xml文件中的配置,总结编译common过程如下:
1、使用pil-splitter.py工具,将相应image中属性含有pil_split进行分解
2、如果common/build/bin/asic目录下已存在non-hlos.bin文件,则删除non-hlos.bin文件
3、使用fat_creation.py工具重新生成non-hlos.bin文件
4、使用fatadd.py工具向non-hlos.bin文件添加Ver_Info.txt中内容
5、使用ptool.py工具生成相应的分区文件
6、使用checksparse.py工具分解AP的system.img,userdata.img等镜像
二、NON-HLOS.bin文件中各个子系统镜像加载过程
1、dts配置:
pil_mss: qcom,mss@4080000 {
compatible = "qcom,pil-q6v55-mss";
。。。。。。
qcom,firmware-name = "modem";
。。。。。。
};
qcom,lpass@c200000 {
compatible = "qcom,pil-tz-generic";
。。。。。。
qcom,firmware-name = "adsp";
。。。。。
};
qcom,pronto@a21b000 {
compatible = "qcom,pil-tz-generic";
。。。。。
qcom,firmware-name = "wcnss";
。。。。。
};
qcom,venus@1de0000 {
compatible = "qcom,pil-tz-generic";
。。。。。。
qcom,firmware-name = "venus";
。。。。。。
};
相应的驱动文件如下:
kernel/drivers/soc/qcom/peripheral-loader.c
kernel/drivers/soc/qcom/subsys-pil-tz.c
kernel/drivers/soc/qcom/pil-q6v5-mss.c
还需要rc文件帮忙哦,呵呵
device/qcom/common/rootdir/etc/init.qcom.rc
on early-boot
。。。。。
write /sys/kernel/boot_adsp/boot 1
write /sys/kernel/boot_cdsp/boot 1
write /sys/kernel/boot_slpi/boot 1
从上面可知,当手机启动到kernel阶段,PIL驱动只是注册了相关设备节点,并没有发生image加载过程,直至init进程解析init.rc文件,触发了early-boot,会向对应设备节点写1,从而触发各个image加载。具体信息请参考下面log部分。
---------------------
作者:渴望成长的菜鸟
来源:CSDN
原文:https://blog.csdn.net/yxw0609131056/article/details/82020846
版权声明:本文为博主原创文章,转载请附上博文链接!