1、需要准备的文件uImage,devicetree,BOOT.BIN(包含了fsbl以及uboot),uramdisk.image.gz,FPGA程序design.bin(注意不是bit)
2、其中设备树中进行的更改为在zynq-zed.dts中添加如下节点,其中compatible = "s25fl256s1";这是因为zedboard用的flash型号为S25FL256SAGMFI00,可以在原理图中看到,而在st_spi_fsm.c中有s25fl256s0和s25fl256s1两个选择,两者同样为256Mb,区别为扇区大小一个为 256 * 1024另一个为64 * 1024。那么到底选哪个呢,可以在uboot下查看,可以看到识别到的flash擦除大小为64kB,所以应该选择s25fl256s1。
Zynq> sf probe
SF: Detected S25FL256S_64K with page size 256 Bytes, erase size 64 KiB, total 32 MiB
&qspi {
u-boot,dm-pre-reloc;
status = "okay";
is-dual = <0>;
num-cs = <1>;
flash@0 {
compatible = "s25fl256s1";
reg = <0x0>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <4>;
spi-max-frequency = <50000000>;
#address-cells = <1>;
#size-cells = <1>;
partition@qspi-fsbl-uboot {
label = "qspi-fsbl-uboot";
reg = <0x0 0x100000>;
};
partition@qspi-linux {
label = "qspi-linux";
reg = <0x300000 0x400000>;
};
partition@qspi-device-tree {
label = "qspi-device-tree";
reg = <0x700000 0x20000>;
};
partition@qspi-rootfs {
label = "qspi-rootfs";
reg = <0x720000 0x2E0000>;
};
partition@qspi-bitstream {
label = "qspi-bitstream";
reg = <0xa00000 0x400000>;
};
partition@app {
label = "app";
reg = <0x1000000 0x100000>;
};
};
};
3、其中uboot中进行的更改为uboot/include/configs/zynq-common.h
"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
"sf probe 0 50000000 0 && " \
"sf read 0x800000 0xA00000 0x400000 && " \
"fpga load 0 0x800000 0x400000 &&" \
"sf read ${kernel_load_address} 0x300000 ${kernel_size} && " \
"sf read ${devicetree_load_address} 0x700000 ${devicetree_size} && " \
"echo Copying ramdisk... && " \
"sf read ${ramdisk_load_address} 0x720000 ${ramdisk_size} && " \
"bootm ${kernel_load_address} ${ramdisk_load_address}
${devicetree_load_address}\0" \
4、注意设备树地址范围与uboot中的地址范围要一致,而且要与5中烧写的地址范围匹配,然后编译即可。
5、首先使用SD卡启动,进入u-boot命令行,利用tftp服务器进行烧写。
tftpboot 0x800000 BOOT.bin && sf probe 0 0 0 && sf erase 0x0 0x100000 && sf write 0x800000 0x0 0x100000
tftpboot 0x800000 uImage && sf erase 0x300000 0x400000 && sf write 0x800000 0x300000 0x400000
tftpboot 0x800000 zynq-zed.dtb && sf erase 0x700000 0x20000 && sf write 0x800000 0x700000 0x20000
tftpboot 0x800000 uramdisk.image.gz && sf erase 0x720000 0x2e0000 && sf write 0x800000 0x720000 0x2e0000
tftpboot 0x800000 design.bin && sf erase 0xA00000 0x400000 && sf write 0x800000 0xA00000 0x400000
6、烧写成功后从spi启动,可以在dev下看到mtdblock0-5,也可以通过cat /proc/mtd查看
zynq> cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00010000 "qspi-fsbl-uboot"
mtd1: 00400000 00010000 "qspi-linux"
mtd2: 00020000 00010000 "qspi-device-tree"
mtd3: 002e0000 00010000 "qspi-rootfs"
mtd4: 00400000 00010000 "qspi-bitstream"
mtd5: 00100000 00010000 "app"
7、可以看到6中有一个app分区,这个是我用来存放应用程序。当然以上分区大小并不是固定的,可以调节,但是地址范围一定要匹配,而且分区大小也一定要大于此分区所存文件的大小,比如内核大小一定不能超过mtd1分区大小,如果超过了,可以裁剪内核,要不就得增加分区大小。