cuter

【排故】dts导致Linux无法正常启动

2
阅读(4686)

Dts导致Linux无法正常启动

版权声明:

本文由电子技术应用博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和作者单位简介。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

博客官方地址:http://blog.chinaaet.com/cuter521


按照 【原创】Zynq Linux设备树文件的学习与创建 一文提供的办法(基本上完全参考Xilinx Wiki)创建出来dts文件,然后利用dtc工具编译生成dtb文件,使用该dtb文件并不能成功启动Linux,而是卡在“UncompressingLinux... done, booting the kernel”如图1所示。

1 Linux内核启动失败

有网友说这是dts文件有问题,但是整个创建过程已经严格地按照Xilinx WiKi来了,估计是版本不匹配吧,生成的dts文件不能被内核识别。


我用的最终解决办法之一是用digilent自带的dts文件,将我的硬件环境里没有的设备全部注释掉,然后生成dtb,启动成功。

另一种就是对照digilent自带的dts文件,对自己生成的dts进行修改,过程如下:


比较digilent自带的dts和我们用SDK生成的dts文件可以发现,主要有几点不同:

1、设备有差异,如图2所示。

2 设备数量不同

2、Compitable属性不同,应该是指定的驱动程序有差别,如图3所示。

3 驱动程序描述不同

3、二者对时钟的描述方法差别比较大,如图4所示。(问题应该不大)

4 时钟描述不同

做出判断的原因是查看了driver/clk.c文件,发现对应的处理函数,虽然没有仔细分析,但可以猜测时钟能够被解析。

4、QSPI描述差别较大,如图所示4

5、网口描述差别较大,如图5所示。

5 网口描述不同

毫无疑问,把这些全改掉就可以启动,但我尝试定位到底哪些必须改:

1、compatible = "xlnx,zynq-7000"; 必须改为        compatible = "xlnx,zynq-zed";

2、其他compatible必须改;

3、多出来的设备要注释掉;

以上三个报错如图1所示。

4、网口描述必须要改,否则报错如图6所示;

6 网口描述导致的报错

5、QSPI描述必须要改,否则报错如图7所示。

7 QSPI导致的报错

从图中可以看出“couldn’t determine bus-num”:无法决定bus-num信号;

同样的,片选信号“num-chip-select”也要在dts中描述,否则会报类似的错误。


本文采用了笨方法解决了问题,但是有时间的话应当研究Linux是如何解析dts文件的,搞清楚整个解析过程,就可以轻松定位到出错的原因。