ZYNQ嵌入式Linux开发流程
使用petalinux可根据XSA文件自动生成设备树
使用单独编译uboot、及kernel,自由度更高,但需手动修改设备树,本实验采用此方式
- 使用VIVADO创建板子硬件平台,生成XSA硬件描述文件
- 编译uboot,得到uboot.elf文件
- 使用VITIS创建FSBL模板APP工程
- 使用fsbl、uboot.elf制作BOOT.BIN启动文件
- 制作debian文件系统
开发环境
开发板 | ZYNQ PI extend R2 2022A版 (zynq7020) |
---|---|
开发主机 | Win11 and ubuntu20.04 |
IDE版本 | Xilinx Vitis IDE v2021.2.0 (64-bit) |
uboot源码 | Xilinx官方 |
linux源码 | Xilinx官方 |
启动模式
模式 | 1 | 2 |
---|---|---|
JTAG | 0 | 0 |
QSPI | 1 | 0 |
SD | 1 | 1 |
1 制作xsa
xsa文件是硬件描述文件,旧版vivado为hdf;启动linux必备器件如下
- 内存
- 串口
- 时钟
- flash(可选)
- 以太网(可选)
1.1 制作XSA文件步骤
打开vivado,创建工程;创建Block Design(框图设计)
添加ZYNQ7 Processing System处理系统
配置PS端器件
DDR
串口1
SD卡
QSPI
ETH
引脚分配
引脚模式
生成输出;封装PS端的IP,生成顶层文件
导出硬件描述文件,由于没有使用PL资源,所以不生成bitstream文件
2 编译
为了不破坏主机环境,同时方便保存编译环境,所有编译在容器进行
2.1 制作编译容器
创建容器,将主机**/root/workspaces/挂载到容器/root/workspaces**目录,方便文件传输、保证删容不删库
docker run -it --name=zynq -v /root/workspaces/:/root/workspaces ubuntu /bin/bash
换源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
2.2 编译uboot
下载uboot,检出xilinx-v2019.2版本
git clone https://github.com/Xilinx/u-boot-xlnx.git
git checkout xilinx-v2019.2
安装依赖
apt install make
apt install gcc
apt install bison
apt install flex
apt install ncurses-dev
apt install gcc-arm-linux-gnueabihf
apt install libssl-dev
使能CONFIG_OF_EMBED
,使DTB集成到uboot中
执行编译脚本
#!/bin/bash
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
得到uboot文件,将其改名为uboot.elf
注意!制作UBOOT.BIN时,一定要将u-boot文件重命名为 u-boot.elf,以便vitis将其识别为可执行文件,否则它可能会被视为数据文件,造成偏移不对
编译工具,mkimage工具在制作uImage时会用到
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tools
2.3 编译linux
获取xilinx提供的linux源码
git clone https://github.com/Xilinx/linux-xlnx.git
创建build.sh文件,执行编译
#!/bin/bash
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage -j8
启动命令
bootcmd=sf probe;sf read 0x4100000 0x100000 0x500000;sf read 0x4600000 0x600000 0x100000;bootm 0x4100000 - 0x4600000;
bootargs=root=/dev/mmcblk0p1 rootwait rw console=ttyPS0,115200
启动失败,错误为没mmcblk0p2设备;换pynq镜像启动,使用fdt命令查看pynq镜像的设备树,将sdhci0节点改为和pynq一致
&sdhci0 {
status = "okay";
xlnx,has-cd = <0x00000000>;
xlnx,has-power = <0x00000000>;
xlnx,has-wp = <0x00000000>;
};
修改后,启动成功-
2.4 构建(armhf平台)debian根文件系统
2.4.1 安装工具
debootstrap用于构建根文件系统,qemu-user-static用于arm仿真
apt install qemu-user-static
apt install debootstrap
创建目录,用于构建
mkdir rootfs
2.4.2 debootstrap第一阶段(下载)
debootstrap --foreign --verbose --arch=armhf buster rootfs http://ftp2.cn.debian.org/debian
- –-foreign:仅做初始化的解包。当目标架构和宿主机架构不一致时需要指定此选项。需要指定–second-stage。
- –verbose:输出更多下载过程的信息
- –arch:目标系统架构
发行版信息
- 下一代 Debian 正式发行版的代号为 bullseye — 测试中,发布时间尚未确定
- Debian 10(buster) — 当前的稳定(stable)版
- Debian 9(stretch) — 旧的稳定(oldstable)版,现有长期支持
- Debian 8(jessie) — 更旧的稳定(oldoldstable)版,现有扩展长期支持
- Debian 7(wheezy) — 被淘汰的稳定版
- Debian 6.0(squeeze) — 被淘汰的稳定版
- Debian GNU/Linux 5.0(lenny) — 被淘汰的稳定版
- Debian GNU/Linux 4.0(etch) — 被淘汰的稳定版
- Debian GNU/Linux 3.1(sarge) — 被淘汰的稳定版
- Debian GNU/Linux 3.0(woody) — 被淘汰的稳定版
- Debian GNU/Linux 2.2(potato) — 被淘汰的稳定版
- Debian GNU/Linux 2.1(slink) — 被淘汰的稳定版
- Debian GNU/Linux 2.0(hamm) — 被淘汰的稳定版
2.4.4 配置rootfs
挂载系统相关目录到rootfs,相当于给文件系统提供kernel
sudo mount --bind /dev rootfs/dev/
sudo mount --bind /sys rootfs/sys/
sudo mount --bind /proc rootfs/proc/
sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
2.4.5 debootstrap第二阶段(解包)
sudo chroot rootfs
/debootstrap/debootstrap --second-stage --verbose
exit
LC_ALL=C:去除所有本地化的设置,”C”是系统默认的locale,”POSIX”是”C”的别名
2.4.6 模拟运行及配置
切换根目录到rootfs,模拟arm上运行debian
sudo chroot rootfs
添加用户设置密码
adduser sammy
修改主机名
vim etc/hostname
安装软件
apt install vim net-tools
使用文件做swap分区
touch /var/swap
dd if=/dev/zero of=/var/swap bs=1M count=1024
mkswap /var/swap
swapon /var/swap
在文件/etc/fstab中添加
/var/swap swap swap defaults 0 0
卸载
sudo umount rootfs/sys/
sudo umount rootfs/proc/
sudo umount rootfs/dev/
sudo rm -rf rootfs/usr/bin/qemu-arm-static
根文件系统就制作完毕,放到SD卡分区,设置bootargs,root指定此分区
3 烧录
3.1 QSPI烧录UBOOT.bin
3.1.1 创建烧录工程
打开vitis,创建fsbl-for-download(app工程);选择之前步骤生成的XSA文件,一同创建platform工程
注意,platform工程bsp要包含xilffs库
3.1.2 制作UBOOT.bin
打开vitis,创建boot镜像
添加fsbl和uboot,顺序如下;由于没使用fpga,所以没添加bit文件;得到BOOT.bin文件
bif(启动信息文件)文件如下:
//arch = zynq; split = false; format = BIN
the_ROM_image:
{
[bootloader]C:\Users\31082\Desktop\zynq\zynq_petaLinux_wrapper\zynq_fsbl\fsbl.elf
C:\Users\31082\Desktop\zynq\img\u-boot.elf
[offset = 0x100000]C:\Users\31082\Desktop\zynq\img\uImage
[offset = 0x600000]C:\Users\31082\Desktop\zynq\img\zynq-zc702.dtb
}
注意!这里的offset和启动命令的加载地址对应
3.1.3 烧录UBOOT.bin
烧录时,将拨码开关调为JTAG模式
插上含文件系统的SD卡,将拨码开关调为QSPI启动模式,启动成功
关注博主公众号,优质文章不断更新