热度 26
2016-3-28 21:18
1043 次阅读|
0 个评论
版权声明: 本文由博主 “cuter” 发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。 博客官方地址: ChinaAETna : http://blog.chinaaet.com/cuter521 EDN China : http://bbs.ednchina.com/BLOG_cuter521_356737.HTM 按照 【 博客大赛 】 创建 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 文件的,搞清楚整个解析过程,就可以轻松定位到出错的原因。