以前只会使用 SD 卡方式启动开发板:
搭建驱动开发使用的 ZYNQ 镜像
新的项目开发板没有 SD 卡,也没有办法直接将 BOOT.BIN 、 zImage 、 boot.scr 等文件直接存入 eMMC
就学习了从 QSPI Flash 加载 U-Boot,再使用 TFTP 和 NFS 启动 Linux 操作系统
U-Boot
制作 BOOT.BIN
配置 U-Boot
petalinux-config -c u-boot
生成 BOOT.BIN
petalinux-package --boot --fsbl --u-boot --dtb no --force
这个 BOOT.BIN 中只包含了 fsbl 和 u-boot
烧录到 FLASH
切换至 JTAG 模式
使用 Vitis Program Flash 进行烧录操作
切换至 QSPI 模式
U-Boot 启动成功
参考资料
TFTP
安装 TFTP 服务器
1、安装 tftp-hpa、tftpd-hpa、xinetd
sudo apt-get install tftp-hpa tftpd-hpa xinetd
2、修改配置文件
vim /etc/default/tftpd-hpa
我只修改了文件存放的目录
文件存放的目录默认是 /var/lib/tftpboot
下
加载内核镜像和设备树文件到内存
参考资料
uBoot使用tftp的方式加载Linux内核文件
tftp服务配置的详细过程,简单快速
NFS
在 U-Boot 模式下
设置环境变量 bootargs ,让内核通过 NFS 方式从 Ubuntu 主机中挂载根文件系统
setenv bootargs 'console=ttyPS0,115200 root=/dev/nfs rw nfsroot=192.168.1.213:/home/yz/nfs/rootfs,nfsvers=3 ip=192.168.1.54:192.168.1.213:192.168.1.1:255.255.255.0::eth0:off'
开启 NFS 服务及配置部分可以参照我以前的博客:NFS 挂载根文件并启动开发板
使用 U-Boot 从内存加载并引导 Linux 内核
1、准备工作
设置 TFTP 服务器 IP 地址
setenv serverip 192.168.1.213
在 TFTP 服务器中准备好 zImage 和 设备树文件
2、加载内核镜像和设备树文件到内存
内存布局规划
初始内存地址为 0x2000000
- system.dtb:
- 地址:0x2000000
- 大小:13KB(0x2000000 ~ 0x2003400)
- zImage:
- 地址:0x2003400
- 大小:4091KB(0x2003400 ~ 0x204D400)
加载内核镜像和设备树文件到内存
tftpboot 0x2000000 system.dtb
tftpboot 0x2003400 zImage
3、启动内核
在 U-Boot 命令行中使用 bootz 命令启动内核
bootz 命令的格式为:
bootz <kernel_addr> [<initrd_addr> [<fdt_addr>]]
对于本项目:
- kernel_addr:0x2003400(内核镜像地址)
- fdt_addr:0x2000000(设备树文件地址)
- initrd_addr:如果没有初始内存盘,则为 -
U-Boot 命令为
bootz 0x2003400 - 0x2000000
成功启动 Linux