[转]高通Qualcomm平台NON-HLOS.bin文件生成和镜像加载过程

本文详细解析了NON-HLOS.bin文件的生成过程及各子系统镜像加载流程,包括编译步骤、dts配置及驱动文件,揭示了其在手机启动过程中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

锋影

email:174176320@qq.com

如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额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>

     <step type="exec">

         <params>。。。。。</params>

         <tool_name>。。。。</tool_name>

         <src_file_vars>。。。。。</src_file_vars>

         <destn_dir>。。。。。。。</destn_dir>

     </step>

</ 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部分。
--------------------- 
作者:渴望成长的菜鸟 
来源:优快云 
原文:https://blog.youkuaiyun.com/yxw0609131056/article/details/82020846 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值