ZYNQ无SD卡配置Linux系统到QSPI Flash和eMMC

硬件:黑金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系统,做如下修改:

  1. 根文件系统类型改成 SD card,修改根文件系统所在文件夹名称为/dev/mmcblk1p2。
  2. 修改/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系统。
在这里插入图片描述

### ZYNQ 平台中 eMMC QSPI 接口详解 #### 一、eMMC接口概述 对于ZYNQ平台而言,eMMC是一种常用的存储介质。在特定硬件设备上,存在一颗型号为MTFC4GACAJCN-4M IT的eMMC芯片,具备4GB容量[^2]。此类型的嵌入式多媒体(eMMC)集成了控制器与NAND闪存于一体,在ZYNQ SoC系统里能够作为启动设备使用。 #### 二、QSPI接口介绍 QSPI(Quad SPI),即四线串行外设接口,允许处理器通过较少的数据线实现高速数据传输。针对ZYNQ系列器件来说,可以利用BOOT.BIN文件按照指定流程烧写至QSPI Flash内完成程序加载过程,并借助调试串口输出日志来监控当前状态;一旦发现网络端口或是QSPI驱动存在问题,则需进一步调整优化直至正常工作为止[^1]。 #### 三、两者对比及应用场景 尽管两种接口都能满足一定条件下应用程序的需求,但在实际应用中有各自特点: - **性能方面**:通常情况下,基于相同频率下,由于并行度差异(单/双通道vs四条信号线),eMMC读取速度要优于QSPI。 - **成本考量**:考虑到BOM清单上的价格因素以及占用PCB空间大小的不同,开发者可能会倾向于选择性价比更高的方案。 - **可靠性保障**:特别是在工业控制领域,某些场景可能更看重长期稳定运行的能力而非极致效能表现,这时就需要综合评估两者的优劣再做决定。 ```c++ // 示例代码展示如何初始化QSPI接口 (伪代码) void init_qspi(){ configure_clocks(); // 配置时钟源 setup_pins_as_qspi_mode(); // 设置引脚模式为QSPI功能 } ```
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值