按照【博客大赛】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和我们用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文件的,搞清楚整个解析过程,就可以轻松定位到出错的原因