硬件:黑金AX7450开发板、zynq7100、QSPI Flash、eMMC Flash
软件:Vivado 2017.4、Petalinux 2017
我用了一台Windows主机,用于设计Vivado和烧写QSPI Flash,一台Ubuntu主机,用于运行Petalinux配置Linux系统。
硬件设计
新建Vivado工程,添加ZYNQ7 Processing System IP核,根据原理图使能UART、QSPI、SD0(后续流程不插SD卡)、SD1(eMMC)、Ethernet外设接口。其他设置按黑金教程配置就好。
再写一个闪灯的模块用于看系统运行状态,编写管脚约束。然后Validate Design,Create HDL Wrapper,Generate Output Products,Generate Bitstream,Export Hardware(include bitstream),Launch SDK。在SDK里创建一个FSBL工程,用于烧录BOOT.BIN文件到QSPI Flash。
Petalinux设计
1、设置Vivado环境变量,设置petalinux环境变量
source /opt/Xilinx/Vivado/2017.4/settings64.sh
source /opt/pkg/petalinux/settings.sh
2、创建petalinux工程
petalinux-create -t project --template zynq -n linux_firmware
3、配置petalinux工程
把Vivado生成的linux_firmware.sdk拷贝到petalinux的工程目录下,在终端运行下面两条指令,进入petalinux工程配置窗口。
cd linux_firmware
petalinux-config --get-hw-description /linux_firmware.sdk
因为要从QSPI Flash启动系统,所以需要把BOOT.BIN放到QSPI Flash里。把Subsystem AUTO Hardware Settings➡Advanced bootable images➡storage Settings boot image settings的image storage media改成primary flash。
Linux内核和根文件系统要放在eMMC里,eMMC接在ZYNQ的SD1接口上,把Subsystem AUTO Hardware Settings➡SD/SDIO Settings的Primary SD/SDIO设置成ps7_sd_1(这里有Bug,后面改)。此时,根文件系统类型配置成INITRAMFS,因为后面需要先从内存启动Linux系统。其他保持默认设置。
4、配置Linux内核
执行以下命令配置Linux内核。
petalinux-config -c kernel
开发板上的以太网芯片采用Micrel公司的KSZ9031RNX以太网PHY芯片,把Device Drivers➡Network device support➡PHY Device support and infrastructure的Micrel PHYS使能。其他保持默认设置。
5、配置根文件系统
执行以下命令配置根文件系统。
petalinux-config -c rootfs
需要新增mkfs.ext4命令,后续用于格式化eMMC分区。Filesystem Packages➡base➡e2fsprogs的e2fsprogs和e2fsprogs-mke2fs使能。其他保持默认设置。
6、编译petalinux工程
petalinux-build
7、制作BOOT.BIN
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga ./images/linux/design_1_wrapper.bit --u-boot --force
如果Ubuntu已经设置好了tftp服务器,6、7步生成的文件将自动复制到/tftpboot文件夹(这个文件夹的路径可以在petalinux-config的Image Packaging Configuration的tftpboot directory修改,我采用默认设置并且在Ubuntu的根目录创建了tftpboot文件夹)里。
8、烧写QSPI Flash
把第7步生成的BOOT.BIN拷贝到Windows主机,用SDK把BOOT.BIN烧写到烧写QSPI Flash。方法和裸机开发时一样。
eMMC分区
1、启动开发版
开发板设置成QSPI启动,UART连到Windows主机上,开发板网口连接路由器,打开串口助手(我用的XShell 6),连接开发板。开发板上电,一开始是uboot程序输出的信息,在倒计时结束前按回车进入uboot模式。
2、查看eMMC
eMMC连在ZYNQ的SD1接口上,输入mmc dev 1切换当前mmc设备,输入mmc info查看eMMC信息。eMMC为5.1版本,容量为7.3GiB(8GB的eMMC),4位宽的总线
3、加载Linux内核文件到ZYNQ内存
在串口终端输入下面指令,将内核文件image.ub通过tftp加载到内存。
tftpboot image.ub
4、从内存启动Linux系统
bootm 10000000
这一步要求在petalinux配置时把Linux的根文件系统类型配成INITRAMFS类型,否则启动不了。因为现在eMMC里面还没有根文件系统,不能配置成根文件系统类型SD card类型。
5、eMMC分区
在串口终端输入下面指令查看eMMC设备文件名。
ls /dev/mmcblk*
可以看到,没插SD卡,只有eMMC,对应mmcblk1。eMMC分区和SD卡分区操作方法是一样的。输入指令
fdisk /dev/mmcblk1
开始分区。“p”打印分区表,“n”分区,“w”保存。
6、格式化分区
uImage、system.dtb放在第一个分区,格式化成FAT32。
mkfs.vfat -F 32 /dev/mmcblk1p1
根文件系统放在第二个分区,格式化成EXT4。
mkfs.ext4 /dev/mmcblk1p2
拷贝内核和根文件系统
1、创建挂载文件夹,挂载eMMC分区
2、挂载共享文件夹
Ubuntu配置好NFS服务器,在ZYNQ的串口终端执行下面命令挂载共享文件夹。
mount -t nfs -o nolock 192.168.1.104:/home/owc/workspace/all_test/Debug /mnt
3、拷贝根文件系统到eMMC
在Ubuntu主机上解压debian_roofts.tar.gz到共享文件夹/home/owc/workspace/all_test/Debug
sudo tar zxvpf debian_rootfs.tar.gz -C /home/owc/workspace/all_test/Debug
在ZYNQ的共享文件夹里能看到debian_rootfs。
将根文件系统拷贝到板子上。
cp -rf debian_rootfs/* /home/root/mmcp2
4、重新配置Linux系统
输入petalinux-config重新配置Linux系统,做如下修改:
- 根文件系统类型改成 SD card,修改根文件系统所在文件夹名称为/dev/mmcblk1p2。
- 修改/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h。这里有bug,petalinux设置SD1为主SD后,没有修改uboot启动指令为SD1。如果在Vivado上只配置了SD1,则不用改,但是要把根文件系统所在文件夹名称改为/dev/mmcblk0p2(可以像eMMC分区中的操作一样,先进到文件系统类型为INITRAMFS类型的Linux系统看一眼eMMC的文件名)。
petalinux-build编译、petalinux-package打包。
5、拷贝Linux系统到eMMC
在Ubuntu主机上把image.ub和system.dtb复制到NFS共享文件夹,在ZYNQ的串口终端上把image.ub和system.dtb复制到/home/root/mmcp1。
6、解挂eMMC。
7、把新的BOOT.BIN烧到QSPI Flash里。
快要成功了
开发板重新上电,此时能够加载Linux内核,但是因为eMMC挂载问题(/etc/fstab文件内容不对,eMMC自动挂载失败),系统会进入emergency mode。输入密码进入命令行模式,修改/etc/fstab文件中设备名称为对应eMMC的设备名称,如下图所示。
开发板重新启动,成功进入Linux系统。