3. PetaLinux工程初始化与BSP定制
在上一节完成Vivado硬件平台导出之后,我们手里会得到一个.xsa文件。它既是硬件描述,也是PetaLinux工程的“源头”。本节要做的,是把这份硬件信息转化为一个可编译、可启动、可定制的Linux BSP工程。整个过程围绕四条主线展开:创建工程、导入XSA并配置、生成设备树、选择根文件系统。理解这四步之间的依赖关系,比记住命令本身更重要。
一、petalinux-create:工程骨架的建立
PetaLinux的所有操作都必须在已source环境变量的终端中进行。先执行source /opt/pkg/petalinux/2023.2/settings.sh(路径随安装版本变化),确认petalinux-util --version能正常回显版本号,再开始创建工程。
petalinux-create -t project --template zynqMP \
-n zynq_pl_bsp --force
cd zynq_pl_bsp
这里-t project表示创建的是完整工程而非模块;--template zynqMP对应Zynq UltraScale+ MPSoC,若使用Zynq-7000则改为zynq。模板决定了默认的机器配置、内核版本和预置配方,选错模板会导致后续XSA导入时架构不匹配。创建完成后目录中会出现project-spec/、components/等结构,其中project-spec/meta-user/是我们后续添加自定义配方和设备树的主要位置。
二、petalinux-config导入XSA与机器配置
工程创建后,第一件事是把硬件描述交给PetaLinux:
petalinux-config --get-hw-description=../hw/zynq_pl.xsa
该命令会解析XSA,提取PS端的处理器类型、DDR容量、外设使能情况、时钟与中断分配,并据此更新project-spec/configs/config中的机器配置。进入配置界面后,需要重点确认几项:
- Subsystem Hardware Settings → Machine Name:应与XSA中的板级定义一致,例如
zynqmp-generic或厂商自定义机器名。 - DTG Settings:设备树生成器的选项,包括是否自动生成PL端节点、是否保留未使用外设。
- u-boot / kernel 配置:确认内核版本与XSA中PS配置兼容,尤其是DDR和启动模式。
机器配置的本质,是把“这块板子长什么样”翻译成PetaLinux能识别的元数据。如果XSA中使能了PL端的AXI IP,DTG会在设备树中自动生成对应的amba_pl节点;如果PL未使能,则不会出现。这一步的准确性直接决定后续设备树是否完整。
三、设备树生成:从XSA到.dts
设备树不是手写的,而是由DTG根据XSA和机器配置自动生成,再允许用户覆盖。生成命令为:
petalinux-config --get-hw-description=../hw/zynq_pl.xsa
# 或单独触发设备树生成
petalinux-build -c device-tree
生成结果位于components/plnx_workspace/device-tree/device-tree/,其中system-top.dts是顶层文件,pl.dtsi描述PL端节点,pcw.dtsi描述PS端外设。用户不应直接修改这些自动生成的文件,而应在project-spec/meta-user/recipes-bsp/device-tree/files/下添加system-user.dtsi,通过/include/方式覆盖或追加节点。例如为PL端一个自定义AXI GPIO添加节点:
&amba_pl {
my_gpio: gpio@a0000000 {
compatible = "generic-uio";
reg = <0x0 0xa0000000 0x0 0x10000>;
interrupt-parent = <&gic>;
interrupts = <0 89 4>;
};
};
这种“自动生成+用户覆盖”的机制,保证了硬件变更后重新导入XSA即可刷新设备树,而用户自定义部分不会丢失。
四、根文件系统选择
根文件系统决定了目标板上跑什么用户空间。PetaLinux提供几种典型选择:
| 类型 | 适用场景 | 特点 |
|---|---|---|
| initramfs | 快速启动、无存储介质 | 打包进内核,启动快,不可持久化 |
| SD/eMMC rootfs | 常规开发与量产 | 可读写,支持包管理,启动稍慢 |
| NFS rootfs | 开发调试阶段 | 主机共享,改文件无需重新烧录 |
选择在petalinux-config的Image Packaging Configuration中完成。开发阶段常用NFS或SD卡,量产则倾向eMMC。若选择initramfs,需注意根文件系统大小受内核镜像限制,不宜放入过多软件包。
五、整体流程与依赖关系
下面这张图把本节四个环节的输入、输出和依赖关系串起来,帮助理解“谁依赖谁、改一处会影响哪里”。
六、常见问题与判断依据
导入XSA后如果petalinux-config报“machine name mismatch”,通常是模板与XSA架构不一致,需检查创建工程时是否选错--template。若设备树生成后PL节点缺失,先确认XSA中PL是否已使能,再检查DTG设置中是否关闭了PL自动生成。根文件系统选择后,可通过petalinux-build的输出日志确认rootfs类型,并在images/linux/下查看最终产物:image.ub、BOOT.BIN以及对应的根文件系统镜像。
petalinux-build -c device-tree单独验证设备树生成是否成功,再执行完整构建,这样能更快定位问题。完成本节后,工程已经具备“硬件描述→机器配置→设备树→根文件系统”的完整链路。下一步的构建与启动,将验证这条链路是否真正打通。