【JokerのZYNQ7020】QSPI启动。

软件环境: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>;
};

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值