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

一、现象

   自从移植好 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";
 
         demo0@51 {
             compatible = "demo0";

也可以都是 dts 文件,或者一个 dts 一个 dtb 文件。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值