淺談高通平臺NON-HLOS.bin文件生成和鏡像加載過程

      聲明:本文只用於個人學習交流,若不慎造成侵權,請及時聯繫我,立即予以改正

       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部分。

對應加載鏡像log如下:

[32m[   22.662154] [33mueventd[0m: firmware: loading 'adsp.mdt' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.mdt'
[32m[   22.673573] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.mdt took 11ms
[32m[   22.697783] [33mueventd[0m: firmware: loading 'adsp.b02' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b02'
[32m[   22.708059] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b02 took 10ms
[32m[   22.709360] [33mueventd[0m: firmware: loading 'adsp.b03' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b03'
[32m[   22.722718] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b03 took 13ms
[32m[   22.724127] [33mueventd[0m: firmware: loading 'adsp.b04' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b04'
[32m[   22.815294] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b04 took 91ms
[32m[   22.819632] [33mueventd[0m: firmware: loading 'adsp.b05' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b05'
[32m[   22.833835] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b05 took 14ms
[32m[   22.846304] [33mueventd[0m: firmware: loading 'adsp.b06' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b06'
[32m[   22.856574] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b06 took 10ms
[32m[   22.864284] [33mueventd[0m: firmware: loading 'adsp.b07' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b07'
[32m[   22.878686] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b07 took 14ms
[32m[   22.880281] [33mueventd[0m: firmware: loading 'adsp.b08' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b08'
[32m[   22.887248] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b08 took 7ms
[32m[   22.888683] [33mueventd[0m: firmware: loading 'adsp.b09' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b09'
[32m[   22.890738] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b09 took 2ms
[32m[   22.891924] [33mueventd[0m: firmware: loading 'adsp.b10' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b10'
[32m[   22.903149] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b10 took 11ms
[32m[   22.904425] [33mueventd[0m: firmware: loading 'adsp.b11' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b11'
[32m[   22.906310] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b11 took 2ms
[32m[   22.908389] [33mueventd[0m: firmware: loading 'adsp.b12' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b12'
[32m[   22.910388] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b12 took 2ms
[32m[   22.911522] [33mueventd[0m: firmware: loading 'adsp.b13' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b13'
[32m[   22.913799] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b13 took 2ms
[32m[   22.914907] [33mueventd[0m: firmware: loading 'adsp.b14' for '/devices/soc/c200000.qcom,lpass/firmware/adsp.b14'
[32m[   22.917846] [33mueventd[0m: loading /devices/soc/c200000.qcom,lpass/firmware/adsp.b14 took 3ms
[32m[   22.918879] [33mueventd (499) used greatest stack depth[0m: 11184 bytes left
[32m[   24.449519] [33mueventd[0m: firmware: loading 'modem.mdt' for '/devices/soc/4080000.qcom,mss/firmware/modem.mdt'
[32m[   24.451413] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.mdt took 2ms
[32m[   24.459602] [33mueventd[0m: firmware: loading 'mba.mbn' for '/devices/soc/4080000.qcom,mss/firmware/mba.mbn'
[32m[   24.470243] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/mba.mbn took 10ms
[32m[   24.474895] [33mueventd[0m: firmware: loading 'msadp' for '/devices/soc/4080000.qcom,mss/firmware/msadp'
[32m[   24.478516] [33mueventd[31m: firmware: could not find firmware for msadp
[32m[   24.486109] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/msadp took 11ms
[32m[   24.570507] [33mueventd[0m: firmware: loading 'a530_pm4.fw' for '/devices/soc/1c00000.qcom,kgsl-3d0/kgsl/kgsl-3d0/a530_pm4.fw'
[32m[   24.572554] [33mueventd[0m: loading /devices/soc/1c00000.qcom,kgsl-3d0/kgsl/kgsl-3d0/a530_pm4.fw took 2ms
[32m[   24.603141] [33mueventd[0m: firmware: loading 'a530_pfp.fw' for '/devices/soc/1c00000.qcom,kgsl-3d0/kgsl/kgsl-3d0/a530_pfp.fw'
[32m[   24.606785] [33mueventd[0m: loading /devices/soc/1c00000.qcom,kgsl-3d0/kgsl/kgsl-3d0/a530_pfp.fw took 4ms
[32m[   24.636679] [33mueventd[31m: selinux_android_restorecon(/sys/devices/soc/1c00000.qcom,kgsl-3d0/kgsl/kgsl-3d0/a530_pfp.fw) failed: Success
[32m[   24.649677] [33mueventd[0m: firmware: loading 'modem.b02' for '/devices/soc/4080000.qcom,mss/firmware/modem.b02'
[32m[   24.661766] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b02 took 12ms
[32m[   24.665311] [33mueventd[0m: firmware: loading 'modem.b04' for '/devices/soc/4080000.qcom,mss/firmware/modem.b04'
[32m[   24.673339] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b04 took 9ms
[32m[   24.682134] [33mueventd[0m: firmware: loading 'modem.b05' for '/devices/soc/4080000.qcom,mss/firmware/modem.b05'
[32m[   24.685698] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b05 took 3ms
[32m[   24.690788] [33mueventd[0m: firmware: loading 'modem.b06' for '/devices/soc/4080000.qcom,mss/firmware/modem.b06'
[32m[   24.701809] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b06 took 11ms
[32m[   24.706323] [33mueventd[0m: firmware: loading 'modem.b07' for '/devices/soc/4080000.qcom,mss/firmware/modem.b07'
[32m[   24.715939] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b07 took 9ms
[32m[   24.717611] [33mueventd[0m: firmware: loading 'modem.b08' for '/devices/soc/4080000.qcom,mss/firmware/modem.b08'
[32m[   24.733548] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b08 took 16ms
[32m[   24.735186] [33mueventd[0m: firmware: loading 'modem.b09' for '/devices/soc/4080000.qcom,mss/firmware/modem.b09'
[32m[   24.756318] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b09 took 21ms
[32m[   24.761443] [33mueventd[0m: firmware: loading 'modem.b10' for '/devices/soc/4080000.qcom,mss/firmware/modem.b10'
[32m[   24.940472] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b10 took 179ms
[32m[   24.942092] [33mueventd[0m: firmware: loading 'modem.b11' for '/devices/soc/4080000.qcom,mss/firmware/modem.b11'
[32m[   24.951367] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b11 took 9ms
[32m[   24.953021] [33mueventd[0m: firmware: loading 'modem.b12' for '/devices/soc/4080000.qcom,mss/firmware/modem.b12'
[32m[   25.014103] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b12 took 61ms
[32m[   25.027603] [33mueventd[0m: firmware: loading 'modem.b13' for '/devices/soc/4080000.qcom,mss/firmware/modem.b13'
[32m[   25.050447] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b13 took 23ms
[32m[   25.141670] [33mueventd[0m: firmware: loading 'modem.b16' for '/devices/soc/4080000.qcom,mss/firmware/modem.b16'
[32m[   25.153330] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b16 took 12ms
[32m[   25.170805] [33mueventd[0m: firmware: loading 'modem.b17' for '/devices/soc/4080000.qcom,mss/firmware/modem.b17'
[32m[   25.187436] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b17 took 17ms
[32m[   25.189230] [33mueventd[0m: firmware: loading 'modem.b18' for '/devices/soc/4080000.qcom,mss/firmware/modem.b18'
[32m[   25.292187] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b18 took 103ms
[32m[   25.293819] [33mueventd[0m: firmware: loading 'modem.b19' for '/devices/soc/4080000.qcom,mss/firmware/modem.b19'
[32m[   25.296124] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b19 took 2ms
[32m[   25.297689] [33mueventd[0m: firmware: loading 'modem.b20' for '/devices/soc/4080000.qcom,mss/firmware/modem.b20'
[32m[   25.308058] [33mueventd[0m: loading /devices/soc/4080000.qcom,mss/firmware/modem.b20 took 10ms
[32m[   45.810862] [33mueventd[0m: firmware: loading 'wcnss.mdt' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.mdt'
[32m[   45.815055] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.mdt took 4ms
[32m[   45.894831] [33mueventd[0m: firmware: loading 'wcnss.b02' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b02'
[32m[   45.904917] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b02 took 10ms
[32m[   45.935031] [33mueventd[0m: firmware: loading 'wcnss.b04' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b04'
[32m[   45.948467] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b04 took 13ms
[32m[   45.958084] [33mueventd[0m: firmware: loading 'wcnss.b06' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b06'
[32m[   46.062139] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b06 took 104ms
[32m[   46.067050] [33mueventd[0m: firmware: loading 'wcnss.b09' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b09'
[32m[   46.075972] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b09 took 9ms
[32m[   46.077078] [33mueventd[0m: firmware: loading 'wcnss.b10' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b10'
[32m[   46.083643] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b10 took 6ms
[32m[   46.087139] [33mueventd[0m: firmware: loading 'wcnss.b11' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b11'
[32m[   46.103695] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b11 took 17ms
[32m[   46.105562] [33mueventd[0m: firmware: loading 'wcnss.b12' for '/devices/soc/a21b000.qcom,pronto/firmware/wcnss.b12'
[32m[   46.110580] [33mueventd[0m: loading /devices/soc/a21b000.qcom,pronto/firmware/wcnss.b12 took 5ms
[32m[   49.471679] [33mueventd[0m: firmware: loading 'wlan/prima/WCNSS_qcom_wlan_nv.bin' for '/devices/soc/a000000.qcom,wcnss-wlan/firmware/wlan!prima!WCNSS_qcom_wlan_nv.bin'
[32m[   49.481196] [33mueventd[0m: loading /devices/soc/a000000.qcom,wcnss-wlan/firmware/wlan!prima!WCNSS_qcom_wlan_nv.bin took 9ms
[32m[   50.569611] [33mueventd[0m: firmware: loading 'cpp_firmware_v1_5_0.fw' for '/devices/soc/1b04000.qcom,cpp/firmware/cpp_firmware_v1_5_0.fw'
[32m[   50.571325] [33mueventd[0m: loading /devices/soc/1b04000.qcom,cpp/firmware/cpp_firmware_v1_5_0.fw took 2ms
[32m[   54.060534] [33mueventd[0m: firmware: loading 'venus.mdt' for '/devices/soc/1de0000.qcom,venus/firmware/venus.mdt'
[32m[   54.062479] [33mueventd[0m: loading /devices/soc/1de0000.qcom,venus/firmware/venus.mdt took 2ms
[32m[   54.087649] [33mueventd[0m: firmware: loading 'venus.b02' for '/devices/soc/1de0000.qcom,venus/firmware/venus.b02'
[32m[   54.097163] [33mueventd[0m: loading /devices/soc/1de0000.qcom,venus/firmware/venus.b02 took 9ms
[32m[   54.102347] [33mueventd[0m: firmware: loading 'venus.b03' for '/devices/soc/1de0000.qcom,venus/firmware/venus.b03'
[32m[   54.107897] [33mueventd[0m: loading /devices/soc/1de0000.qcom,venus/firmware/venus.b03 took 9ms
[32m[   54.108590] [33mueventd[0m: firmware: loading 'venus.b04' for '/devices/soc/1de0000.qcom,venus/firmware/venus.b04'
[32m[   54.111195] [33mueventd[0m: loading /devices/soc/1de0000.qcom,venus/firmware/venus.b04 took 2ms

如果你覺得本文有用,請不要忘記點贊或者評論哦,你們任何一個小舉動,對我來說都是極大的鼓舞,感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章