1. 程式人生 > 其它 >[xhr4412][bug fix] Stuck in “Starting kernel ...“ when boot linux-5.8.5 & DTS study

[xhr4412][bug fix] Stuck in “Starting kernel ...“ when boot linux-5.8.5 & DTS study

技術標籤:linux嵌入式dts

文章目錄

一、現象

   自從移植好 linux-5.8.5 後,在啟動 kernel 時便偶爾會卡在 Starting kernel ... ,之前可能一天一次,不知道為什麼,但是重新上電板子一般可以正常啟動,這個 bug 一直百思不得其解,困擾了好長時間。

   但是最近板子就更奇怪了,總是卡在這裡。。。很是影響心情,下決心一定要將這個 bug 解決。

二、分析

   最開始認為可能是 emmc 有問題,但是想來 uImage 已經拷貝到記憶體了,前面啟動應該用不到 emmc,那就是記憶體有問題?kernel 解壓後某一段記憶體存值不行了?在 uboot 寫了個簡易的記憶體檢查,感覺也沒有問題。

   最後折騰了一週發現應該是裝置樹的問題,主要問題為 isp_clockbus_dmc 相關的 node 所引起。

   不過這兩個東西具體是什麼作用,還沒有搞清。以後有需要可能再來補充。

三、DTS

   解決了這個 bug 也學到不少東西,還是有收穫的。對裝置樹語法也更加了解,對整塊單板有哪些 feature 也更加了解。

   特別是學到了一些關於裝置樹的技巧。

1. scripts/dtc/dt_to_config

   可以根據傳入的裝置樹解析出每個節點對應那些驅動以及核心是否已經配置,甚至可以通過傳遞 --config-format來直接修改 .config 檔案,如果嫌節點的路徑過長,可以傳遞引數 --short-name

,用法示例:

這裡的 --include-suspec 用於解析裝置樹中的include欄位
$. /scripts/dtc/dt_to_config arch/arm/boot/dts/s3c2440-tq2440-dt.dts --include-suspect --config ./.config

-dDc-E-Hx---- : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ep93xx/core.c : obj-y : x
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/avila-setup.c : CONFIG_MACH_AVILA : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/dsmg600-setup.c : CONFIG_MACH_DSMG600 : n
...

當然後面也可以直接跟 dtb 檔案:

$ ./scripts/dtc/dt_to_config arch/arm/boot/dts/s3c2440-tq2440-dt.dtb --include-suspect --config ./.config

-dDc-E-Hx---- : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ep93xx/core.c : obj-y : x
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/avila-setup.c : CONFIG_MACH_AVILA : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/dsmg600-setup.c : CONFIG_MACH_DSMG600 : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/fsg-setup.c : CONFIG_MACH_FSG : n
...

2. scripts/dtc/dtx_diff

這個工具用於比較兩個裝置樹,也可以對裝置樹反編譯。示例:

#傳遞一個裝置樹,表示反編譯
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dtb

#也可以直接傳遞一個dts檔案,這個工具會將該dts檔案展開
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dts

#傳遞兩個裝置樹表示比較
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dtb /tftpboot/dtb

--- /dev/fd/63    2017-09-23 22:01:48.407691984 +0800
+++ /dev/fd/62    2017-09-23 22:01:48.407691984 +0800
@@ -125,7 +125,7 @@
         pinctrl-names = "default";
         reg = <0x54000000 0x100>;
         samsung,i2c-max-bus-freq = <0x30d40>;
-        status = "disabled";
+        status = "okay";
 
         [email protected] {
             compatible = "demo0";

也可以都是 dts 檔案,或者一個 dts 一個 dtb 檔案。

參考