【排故】dts导致Linux无法正常启动
2赞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文件的,搞清楚整个解析过程,就可以轻松定位到出错的原因。