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

锋影

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,其大概格式如下:

     

         。。。。。

         。。。。

         。。。。。

         。。。。。。。

     

其中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 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(操作系统平台)