
本文共 2968 字,大约阅读时间需要 9 分钟。
软件环境:vivado 2017.4 硬件平台:XC7Z020
通常来说,系统做好以后是放SD卡里,上电以后,根据boot引脚的配置,从SD卡引导系统启动。如果你像我一样,板子上还带有QSPI+EMMC,当然也可以选择另外一种启动方式,从QSPI启动,文件系统从EMMC加载,摆脱SD卡束缚,如果工程上用的话,最好也使用这种引导方法,因为可以避免SD卡槽松动或者插拔次数过多引起的接触不良等问题。
既然说到了QSPI+EMMC,那么在配置ZYNQ核的时候,这两项自然要配置好, 下面的SD0和SD1一个是我的SD卡槽,另一个是EMMC,接下来编译,生成bitstream,导入SDK,都是跟以前一样的步骤,但是但是,如果你使用默认的设备树,不做修改的话,系统当然是可以正常启动,但是在烧写到QSPI时候会遇到各种问题,接下来说下我遇到的问题,和怎么解决的这些问题。
当使用默认设备树,启动以后,准备给EMMC进行分区并烧写QSPI,一顿操作以后,但是会看到提示/dev/mtdblock0 is missing!找不到QSPI设备,什么鬼?。
接下来顺着去看下/dev下面确实没有QSPI相关的mtd设备文件,怀疑是不是设备树没有加对。
看了下生成的设备树顶层system-top.dts,确实只有短短这么几行。
/dts-v1/;/include/ "zynq-7000.dtsi"/include/ "pl.dtsi"/include/ "pcw.dtsi"/ { chosen { bootargs = "earlycon"; stdout-path = "serial0:115200n8"; }; aliases { ethernet0 = &gem0; serial0 = &uart1; spi0 = &qspi; }; memory { device_type = "memory"; reg = <0x0 0x40000000>; };};
那肯定是有问题的呀,接着在里面把相关描述加上后如下。
/* * CAUTION: This file is automatically generated by Xilinx. * Version: * Today is: Sun Nov 3 03:02:17 2019 *//dts-v1/;/include/ "zynq-7000.dtsi"/include/ "pl.dtsi"/include/ "pcw.dtsi"/ { chosen { bootargs = "earlycon"; stdout-path = "serial0:115200n8"; }; aliases { ethernet0 = &gem0; serial0 = &uart1; spi0 = &qspi; mmc0 = &sdhci0; mmc1 = &sdhci1; }; memory { device_type = "memory"; reg = <0x0 0x40000000>; };};&qspi { u-boot,dm-pre-reloc; status = "okay"; is-dual = <0>; num-cs = <1>; flash@0 { compatible = "n25q128a11"; reg = <0x0>; spi-tx-bus-width = <4>; spi-rx-bus-width = <4>; spi-max-frequency = <125000000>; };};&sdhci0 { u-boot,dm-pre-reloc; status = "okay"; xlnx,has-cd = <0x1>; xlnx,has-power = <0x0>; xlnx,has-wp = <0x0>;};&sdhci1 { status = "okay"; xlnx,has-cd = <0x0>; xlnx,has-power = <0x0>; xlnx,has-wp = <0x0>;};
主要是两个地方,一个是aliases里面,把spi0 = &qspi,mmc0 = &sdhci0和mmc1 = &sdhci1这三句加上,另外就是下面&qspi、&sdhci0和&sdhci1的对应部分加上。系统重新跑起来以后,再去/dev下,已经能看到刚才提示缺少的mtdblock0设备了。
上面的mmcblk0和mmcblk1就是SD卡和EMMC设备文件了,设备都能看到以后,就能正常的进行格式化、分区、烧写等操作了,一切都进行完毕后,拔出SD卡,调整BOOT引脚的拨码开关状态,上电启动以后,可以看到正常从QSPI引导了。
本来写到这里就应该是结束了的,但其实不是这样,因为想从QSPI启动板子是几个月前遇到的问题,而上面的一系列操作是今天为了写这篇文章补上的,还有一个问题是我当时解决了,但是今天却各种尝试,没有办法复现的,只说一下现象,和当时的解决办法,可能问题的细节记得不是特别清楚,但是大概的解决方向肯定是没问题的。
在向system-top.dts添加QSPI和EMMC部分后,EMMC的格式化是可以正常进行了,但是改变BOOT引导方式以后,没法正常启动,会提示MMC device1 not found,结果发现,原来UBOOT里还有个devicetree而那个devicetree中,也要进行QSPI和EMMC部分的添加,添加完毕以后生成的工程,才能正常在uboot阶段完毕以后,正确的从EMMC中的程序段引导系统。
uboot中devicetree的路径大概是在/uboot/arch/arm/dts/xxx.dts。
2020-03-03更新 qspi内系统启动说明
上面所有的介绍说的都是从SD卡启动的系统应该如何操作的说明,这里有一点需要注意的,就是从QSPI启动的系统的设备树system-top.dts中,也同样别忘了添加qspi和emmc部分,不然从qspi启动的时候,会卡在uboot结束,进入kernel的地方。
&qspi { u-boot,dm-pre-reloc; status = "okay"; is-dual = <0>; num-cs = <1>; flash@0 { compatible = "n25q128a11"; reg = <0x0>; spi-tx-bus-width = <4>; spi-rx-bus-width = <4>; spi-max-frequency = <125000000>; };};&sdhci0 { u-boot,dm-pre-reloc; status = "okay"; xlnx,has-cd = <0x1>; xlnx,has-power = <0x0>; xlnx,has-wp = <0x0>;};&sdhci1 { status = "okay"; xlnx,has-cd = <0x0>; xlnx,has-power = <0x0>; xlnx,has-wp = <0x0>;};
发表评论
最新留言
关于作者
