淮安侣拘广告传媒有限公司

分享一份關(guān)于RK3568裸機(jī)的SPL and DTB筆記

2025/2/18 13:25:34??????點(diǎn)擊:
      正在玩 firefly linux sdk 中的 uboot,對(duì)其中的 spl 做個(gè)筆記。


      firefly linux sdk 包含linux源碼,uboot源碼,rootfs 之類的東西,總共16G還大點(diǎn)!


      為便于描述,firefly linux sdk uboot 簡稱為 uboot。


      uboot 完整的編譯指令:
      make rk3568_defconfig
      ./make.sh rk3568


      生成的與 spl 相關(guān)的文件在uboot 的 ./spl/ 目錄中
      u-boot-spl 編譯鏈接輸出的 elf 格式文件
      u-boot-spl-nodtb.bin 從u-boot-spl中dump出來的二進(jìn)制代碼文件
      u-boot-spl-dtb.bin 帶spl-dtb的二進(jìn)制代碼文件
      u-boot-spl.dtb 第一階段的 dtb 文件,由 SPL 專用。


      編譯快結(jié)束時(shí)會(huì)執(zhí)行: cp spl/u-boot-spl-dtb.bin spl/u-boot-spl.bin


      spl/u-boot-spl.bin 就是用來生成 rk3568_loader.bin 的,是 loader 中的 spl 階段的代碼。


      第一階段的 dtb 被添加到 spl.bin 的尾部,它來自:
      cp dts/dt-spl.dtb spl/u-boot-spl.dtb


      dts/dt-spl.dtb 又來自:


      


      arch/arm/dts/rk3568-evb.dtb 來自 rk3568-evb.dts
      因?yàn)?rk3568-evb.dts 引用了C語言頭文件,所以在編譯為dtb之前會(huì)先由gcc編譯一遍
      然后才是由 dtc 編譯為 dtb 文件。


      arch/arm/dts/rk3568-evb.dts -> 經(jīng) gcc -> 經(jīng) dtc 得 arch/arm/dts/rk3568-evb.dtb
      arch/arm/dts/rk3568-evb.dtb -> 經(jīng) fdtgrep 得 dts/dt-spl.dtb


      以上就是第一階段的 dtb。


      SPL 運(yùn)行的時(shí)候,會(huì)在存儲(chǔ)上 0x4000 扇區(qū)處找 FIT Image 并加載之。
      (0x4000這個(gè)扇區(qū)地址并非所有 spl 版本都一樣,有可能是0x5000,0x8000, 0x9000)
      這個(gè)FIT Image 就是 uboot.img (FIT格式的img)


      這個(gè) uboot.img 里面包含有:幾個(gè) atf.bin、一個(gè) tee.bin、一個(gè)fdt、uboot.bin (uboot真身代碼)
      這里面的 fdt 就是 SPL要用的第二階段的 dtb ,但理論上用處不大,因?yàn)椋?/span>


      spl 安裝完幾個(gè) atf.bin 后會(huì), 會(huì)馬上切換到 EL2 去運(yùn)行 uboot真身代碼。


      uboot真身代碼運(yùn)行的時(shí)候,會(huì)找 rk-kernel.dtb,它不用spl的dtb!
      不過,它去哪個(gè)位置找 rk-kernel.dtb ,有幾個(gè)可能的地方:
      1). 找 resource 分區(qū)里面的 resource.img 中的 rk-kernel.dtb
      2). 找 boot 分區(qū)里面的 boot.img 里面的 resource 中的 rk-kernel.dtb
      3). recovery 啟動(dòng)模式時(shí)可能還會(huì)去 recovery 分區(qū)找,這個(gè)不確定


      當(dāng)1). 和2). 同時(shí)存在時(shí)uboot會(huì)使用哪一個(gè),沒測(cè)試過。。。


      附幾條命令:
      fdtdump uboot.img
      ./RKTools/mkimage 生成fit img
      ./scripts/fit-unpack.sh 拆解fit img
      ../rkbin/tools/resource_tool rk-kernel.dtb logo.bmp logo_kernel.bmp 生成 resource.img
      dtc -O dtb -o ./ubootSpl.dtb -b 0 -i ./scripts/ ./rk3568_u-boot-spl.dts 編譯 dts


      固件解包:僅針對(duì) firefly 官方固件(如下圖)


      


      解包fit img:
      ./scripts/fit-unpack.sh -f /mnt/e/Dev/EE/Rockchip/RKDevTool_Release_v2.84/Output/Android/Image/boot.img -o ./a_imgs


      反編譯dtb為dts:
      fdtdump ./a_imgs/rk-kernel.dtb >./a_imgs/rk-kernel.dis


      解壓資源img:
      ../rkbin/tools/resource_tool --unpack --verbose --image=./a_imgs/resource ./a_imgs/
聂拉木县| 辽阳县| 巴彦县| 华亭县| 曲沃县| 揭东县| 兰考县| 通河县| 台中县| 黔江区| 无棣县| 交口县| 垫江县| 邢台市| 五华县| 阿拉善右旗| 周至县| 濮阳市| 和田市| 唐山市| 准格尔旗| 三明市| 谷城县| 新津县| 隆德县| 太白县| 中山市| 淮滨县| 孟津县| 阜宁县| 连云港市| 中超| 彰武县| 荃湾区| 安乡县| 临邑县| 南开区| 当雄县| 东光县| 清苑县| 临清市|