创建Petalinux工程
准备 xsa 文件
设置 petalinux 工作环境
source settings.sh
创建 petalinux 工程
petalinux-create -t project --template zynq -n ZYNQ-driver
-t project
指定了要创建的项目类型
--template zynq
指定了项目模板为 zynq
-n ZYNQ-driver
指定了新项目的名称,即 ZYNQ-driver
导入 xsa 文件
cd ZYNQ-driver
petalinux-config --get-hw-description ../zynq7100/
注:
后面更新 vivado 工程的时候,只需要从 vivado 工程中导出 xsa 文件,并在该 Petalinux 工程下使用
petalinux-config --get-hw-description <xsa文件路径>
命令重新配置即可。
petalinux 工程配置
xsa 文件导入成功之后会自动弹出 petalinux 工程配置窗口
如果配置过后想再次可以运行命令 petalinux-config
来配置
修改根文件存放位置
进入
Image Packaging Configuration
--->
Root filesystem type (INITRD)
配置选项
将其更改为 EXT4 (SD/eMMC/SATA/USB)
配置本地 sstate
为提高 PetaLinux/Yocto 的编译速度,配置本地 sstate-cache
进入
Yocto Settings
—> Local sstate feeds settings
—> local sstate feeds url
我的本地 sstate-cache 路径如下
/home/yz/tools/petalinux/sstate/sstate_arm_2020.2
进行配置,路径指定到 /arm
文件夹下
取消 Enable Network sstate feeds
使能
配置本地 downloads
进入
Yocto Settings
—> Add pre-mirror url
删除原来的内容,添加 downloads 包文件路径
添加格式为 file://<路径>
我的路径为 file:///home/yz/tools/petalinux/downloads/downloads
返回到 Yocto Settings
使能 Enable BB NO NETWORK
ERROR: qemu-xilinx-native
编译时遇到 qemu-xilinx-system-native 包获取失败,如下图所示:
解决办法:
进入 Petalinux 工程,编辑工程下的 project-spec/meta-user/conf/petalinuxbsp.conf 文件,在文件末尾添加如下内容:
PREMIRRORS_prepend = " \
git://.*/.* file:///home/yz/tools/petalinux/downloads/downloads \n \
gitsm://.*/.* file:///home/yz/tools/petalinux/downloads/downloads \n \
ftp://.*/.* file:///home/yz/tools/petalinux/downloads/downloads \n \
http://.*/.* file:///home/yz/tools/petalinux/downloads/downloads \n \
https://.*/.* file:///home/yz/tools/petalinux/downloads/downloads \n"
文件中file:///home/yz/tools/petalinux/downloads/downloads 要与 pre-mirror url 中 downloads 包文件路径相同
这里我只进行了简单地配置
详细配置本地 sstate 和 downloads 推荐看下这个大佬的博客
整合Xilinx PetaLinux工程编译和Open Source U- Boot/Linux编译
到这里 Petalinux 工程就配置好了
生成 BOOT.BIN
编译 fsbl
petalinux-build -c bootloader
编译时间非常非常长
编译 uboot
petalinux-build -c u-boot
生成 BOOT.bin
petalinux-package --boot --fsbl --u-boot --dtb no --force
--dtb no
把 dtb 文件除去
BOOT.BIN 包含 zynq_fsbl.elf 和 u-boot.elf 两个文件,没有包含 bit 文件。由于我们不再需要对这两个文件进行更改,所以无论是编写 Linux 驱动程序还是修改 Vivado 工程,都不需要再修改 BOOT.BIN 文件
生成 boot.scr
执行 petalinux-build
命令编译工程
也需要好一会
编译完成后,找到 boot.scr 文件
cd images/linux
修改 boot.scr
复制 boot.scr 并命名为 boot.cmd.default
cp boot.scr boot.cmd.default
打开 boot.cmd.default 文件,将光标移动到第一行,输入 dd
命令删除第一行,删除后如下图所示
然后将第 19 行和第 20 行内核镜像名 uImage 改成 zImage
第 30 行 bootm 改成 bootz
接下来在第 29 行添加 system.bit 的加载和启动命令,命令如下:
if test -e ${devtype} ${devnum}:${distro_bootpart} /system.bit; then
fatload ${devtype} ${devnum}:${distro_bootpart} 0x00800000 system.bit;
fpga loadb 0 ${fileaddr} ${filesize}
fi
添加后如下图所示
运行如下命令重新生成 boot.scr 文件
mkimage -c none -A arm -T script -d boot.cmd.default boot.scr
编译内核
准备 Linux 内核源码
使用 Xilinx 官方 2020.2 版本内核源码
将源码放在 ~/workspace/kernel-driver
目录下
添加设备树文件
- 将工程文件夹
components/plnx_workspace/device-tree/device-tree
目录下pl.dtsi
、pcw.dtsi
、system-conf.dtsi
、system-top.dts
和zynq-7000.dtsi
五个设备树文件直接复制到内核源码arch/arm/boot/dts
目录下
cd ~/workspace/zynq/ZYNQ-driver
cd components/plnx_workspace/device-tree/device-tree
cp pl.dtsi pcw.dtsi system-conf.dtsi system-top.dts zynq-7000.dtsi ~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/boot/dts/
- 将工程
project-spec/meta-user/recipes-bsp/device-tree/files
目录下设备树文件system-user.dtsi
复制到内核源码arch/arm/boot/dts
目录下
cd ~/workspace/zynq/ZYNQ-driver/
cd project-spec/meta-user/recipes-bsp/device-tree/files/
cp system-user.dtsi ~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/boot/dts/
- 修改 arch/arm/boot/dts 目录下 Makefile 文件
将添加后的设备树顶层文件放到 Makefile 中
cd ~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/boot/dts/
vim Makefile
使用 Petalinux 的交叉编译工具链
设置 SDK 环境变量
defconfig 配置
进入内核源码根目录
cd ~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/
在内核源码根目录下执行如下命令
make xilinx_zynq_defconfig
执行结果如下图所示
menuconfig 配置
执行命令
make menuconfig
进入配置窗口
配置以太网
进入 Device Drivers
进入 Network device support
进入 PHY Device support and infrastructure
勾选 Micrel PHYs
编译内核
make -j8
编译根文件系统
进入工程文件夹下
cd ~/workspace/zynq/ZYNQ-driver
配置根文件系统
petalinux-config -c rootfs
我们使用默认配置
编译根文件系统
petalinux-build -c rootfs
启动开发板
制作 SD 启动卡
一个分区使用 FAT32 文件系统,用于放置启动镜像文件,另一分区使用 EXT4 文件系统,用于存放根文件系统
制作好后使用 df -Th
命令查看 SD 卡分区信息
拷贝镜像文件到 FAT 分区
文件 | 文件路径 |
---|---|
BOOT.BIN | images/linux |
boot.scr | images/linux |
system.bit | images/linux |
system-top.dtb | linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/boot/dts |
zImage | linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/boot |
cd ~/workspace/zynq/ZYNQ-driver/
cd images/linux/
cp BOOT.BIN boot.scr system.bit /media/yz/BOOT/
cd ~/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/
cp arch/arm/boot/dts/system-top.dtb /media/yz/BOOT/
cp arch/arm/boot/zImage /media/yz/BOOT/
将 system-top.dtb 重命名为 system.dtb
cd /media/yz/BOOT/
mv system-top.dtb system.dtb
最终查看文件如下
将根文件系统解压到 EXT4 分区
进入工程文件目录
cd ~/workspace/zynq/ZYNQ-driver/
进入到 rootfs.tar.gz 压缩包文件所在目录 images/linux
cd image/linux/
执行解压命令
sudo tar -xzf rootfs.tar.gz -C /media/yz/rootfs
执行 sync 命令将数据同步到 SD 卡中
sync
启动开发板