聲明:本文只用於個人學習交流,若不慎造成侵權,請及時聯繫我,立即予以改正
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
如果你覺得本文有用,請不要忘記點贊或者評論哦,你們任何一個小舉動,對我來說都是極大的鼓舞,感謝!