Zynq7010基于qspi flash的linux移植笔记(1)
一、Zynq7010平台相关
下图本文所用开发板
qspi flash:
开发板配有一片 32MB 大小的 Quad-SPI FLASH 芯片,型号为W25Q128,它使用3.3VCMOS电压标准。
芯片类型 | 容量 | 厂家 |
---|---|---|
W25Q256BV | 32M byte | Winbond |
QSPI FLASH 连接到 ZYNQ 芯片的 PS 部分 BANK500 的 GPIO 口上, 在系统设计中需要配置这些 PS 端的 GPIO 口功能为 QSPI FLASH 接口。
二、uboot相关源码修改
1、qspi flash分区表
存放内容 | 偏移地址 | 占用空间 |
---|---|---|
FSBL+FPGA bit文件+uboot | 0x0 | 0x80000(8MByte) |
kernel | 0x800000 | 0x400000(4MByte) |
devicestree | 0xC00000 | 0x4000 |
ramdisk | 0xC04000 | 0x8000040(8MByte) |
根据上述分区表,修改./include/configs/zynq_ax7010.h文件。
kernel_size=0x400000
devicetree_size=0x4000
ramdisk_size=0x800040
其次,按照上图所示的qspi flash分区表,修改下图所示的偏移地址值。同时去掉sf probe后面的三个0,这里没有任何作用。
"qspiboot=echo Copying Linux from QSPI flash to RAM… && "
"sf probe && "
"sf read ${kernel_load_address} 0x800000 ${kernel_size} && "
"sf read ${devicetree_load_address} 0xC00000 ${devicetree_size} && "
"echo Copying ramdisk… && "
"sf read ${ramdisk_load_address} 0xC04000 ${ramdisk_size} && "
“bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0” \
sf,即spi flash,指令解释:“sf 内存首地址 flash偏移地址 大小“
2、将W25Q256 flash驱动编入uboot
观察到./driver/mtd/spi/sf_params.c文件中有关于W25Q256芯片的相关定义,但CONFIG_SPI_FLASH_WINBOND这个宏定义是没定义的,因此需要修改./configs/zynq_ax7010_defconfig文件,添加CONFIG_SPI_FLASH_WINBOND=y
该开发板就是利用该配置文件生成Makefile文件。
3、编译uboot
在命令行输入命令"make CROSS_COMPILE=arm-xilinx-linux-gnueabi-zynq_ax7010_defconfig", 生成 Makefile 文件。
在命令行输入命令" make CROSS_COMPILE=arm-xilinx-linux-gnueabi-", 编译器会自动编译 u-boot。完成后会在uboot根目录下生成u-boot文件,将其更名为u-boot.elf,留待后面制作启动文件。
4、生成启动文件
这里忽略zynq平台的fsbl文件和system bit文件的生成。打开已经准备好的Xilinx SDK工程,生成mcs文件如下:
然后连接下载器,如下:
等待烧写结束,写入过程比较慢,估计需要几分钟。烧写结束后后期,连接调试串口,上电可看见已正常进入uboot。若出现下面的打印语句,说明uboot驱动没有识别过该flash芯片,则需要查看上述第二步./driver/mtd/spi/sf_params.c文件,打开相应的宏定义即可。
SF: Unsupported flash IDs: manuf 00, jedec 0000, ext_jedec 0000
Failed to initialize SPI flash at 0:0 (error -93)
正常的uboot打印如下:
U-Boot 2016.07 (Mar 27 2019 - 20:58:16 +0800)
Model: ALINX AX7010 Development Board
Board: Xilinx Zynq
I2C: ready
DRAM: ECC disabled 512 MiB
MMC: sdhci@e0100000: 0
SF: Detected W25Q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB
*** Warning - bad CRC, using default environment
In: serial@e0001000
Out: serial@e0001000
Err: serial@e0001000
Model: ALINX AX7010 Development Board
Board: Xilinx Zynq
Net: ZYNQ GEM: e000b000, phyaddr 0, interface rgmii-id
Warning: ethernet@e000b000 MAC addresses don’t match:
Address in SROM is ff:ff:ff:ff:ff:ff
Address in environment is 00:0a:35:00:01:22
eth0: ethernet@e000b000
Hit any key to stop autoboot: 0
Zynq>
未完待续。。。