原创 【博客大赛】[排故]Dts导致Linux无法正常启动

2016-3-28 21:18 1043 26 26 分类: MCU/ 嵌入式

版权声明:

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

博客官方地址:

ChinaAETnahttp://blog.chinaaet.com/cuter521

EDN Chinahttp://bbs.ednchina.com/BLOG_cuter521_356737.HTM

 

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

20160328211546803001.jpg

1 Linux内核启动失败

 

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

 

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

 

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

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

20160328211551451002.jpg

2 设备数量不同

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

20160328211557695003.jpg

3 驱动程序描述不同

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

20160328211601120004.jpg

4 时钟描述不同

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

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

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

20160328211608439005.jpg

5 网口描述不同

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

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

2)其他compatible必须改;

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

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

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

20160328211613577006.jpg

6 网口描述导致的报错

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

20160328211621583007.jpg

7 QSPI导致的报错

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

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

 

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

 

文章评论0条评论)

登录后参与讨论
我要评论
0
26
关闭 站长推荐上一条 /2 下一条