4. Kria 启动流程与系统部署
Kria SOM(以 K26 为例)上电后并不是直接运行 Linux,而是经历一条由 BootROM 主导的多级引导链。理解这条链,才能正确选择 QSPI、SD 卡或 eMMC 作为启动介质,并生成可量产的 BOOT.BIN。Kria 的 PS 端集成 BootROM,上电复位后先执行片内 BootROM,它根据 MODE[3:0] 引脚采样结果决定从哪个外设读取引导头(Boot Header)。K26 常见的启动模式包括:QSPI24/QSPI32(片内 QSPI 闪存)、SD0/SD1(SD 卡)、eMMC(板载 eMMC),以及 JTAG 从模式。BootROM 只认识 Boot Header 和 FSBL,后续的 PL 配置、U-Boot、Linux 内核都由 FSBL 与 U-Boot 接力加载。
因此,Kria 的启动镜像不是单一文件,而是一个按固定顺序拼接的镜像包,通常命名为 BOOT.BIN。它至少包含:FSBL(zynqmp_fsbl.elf)、PMU 固件(pmufw.elf)、PL 比特流(system.bit,可选)、ATF(bl31.elf)以及 U-Boot(u-boot.elf)。BootROM 读取 Boot Header 后把 FSBL 载入 OCM 运行,FSBL 再按镜像分区表依次加载后续组件。下图给出 Kria 从复位到 Linux 用户空间的完整启动链与各介质所处位置。
启动介质的选择直接决定部署策略。开发阶段通常用 SD 卡:把 BOOT.BIN、image.ub(内核+DTB+initramfs 打包)和根文件系统分区写入 SD 卡,插卡上电即可运行,修改设备树后只需替换 image.ub,迭代最快。量产阶段则把 BOOT.BIN 烧进 QSPI,根文件系统放在 eMMC,这样无需外插卡、启动可靠、抗振动,适合工业现场。Kria 的 QSPI 容量有限(常见 64MB 级别),因此 QSPI 一般只放引导组件,不放完整根文件系统。
生成 BOOT.BIN 的标准工具是 Xilinx 的 bootgen,输入是一个 BIF(Boot Image Format)文件。下面给出一个面向 Kria K26、QSPI32 启动的 BIF 示例,其中 fsbl 属性指定 FSBL,destination_cpu 指定各组件运行核,exception_level 指定 ATF 运行在 EL3:
// kria_qspi.bif
the_ROM_image:
{
[fsbl_config] a53_x64
[bootloader, destination_cpu=a53-0] zynqmp_fsbl.elf
[pmufw_image] pmufw.elf
[destination_device=pl] system.bit
[destination_cpu=a53-0, exception_level=el-3, trustzone] bl31.elf
[destination_cpu=a53-0, exception_level=el-2] u-boot.elf
}
执行 bootgen -image kria_qspi.bif -arch zynqmp -o BOOT.BIN -w on 即可生成镜像,-w on 表示覆盖已有文件。生成后可用 bootgen -image kria_qspi.bif -arch zynqmp -read BOOT.BIN 反读校验分区顺序是否正确。若顺序错乱,BootROM 可能找不到 FSBL 而卡在无输出状态。
PetaLinux 工程是组织这些组件的载体。创建流程为:petalinux-create -t project -n kria_ctrl --template zynqMP,随后 petalinux-config --get-hw-description=./xsa 导入 Vivado 导出的 XSA,在菜单中设置启动介质(Subsystem AUTO Hardware Settings → Advanced bootable images storage Settings → boot image settings 选择 primary flash 或 primary sd)。设备树定制通过 petalinux-config -c device-tree 或直接编辑 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 完成。例如为工业通信增加一路 UART 和一路 CAN:
&uart1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1_default>;
};
&can1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_can1_default>;
};
修改后执行 petalinux-build,产物位于 images/linux/:BOOT.BIN、image.ub、rootfs.ext4、system.dtb。打包启动镜像用 petalinux-package --boot --fsbl zynqmp_fsbl.elf --fpga system.bit --u-boot --force,它会自动调用 bootgen 生成 BOOT.BIN。若使用 QSPI 启动,还需 petalinux-package --boot --format BIN --qspi 生成适合烧录的镜像。
量产烧录有两种典型路径。其一是通过 SD 卡启动进入 Linux 后,用 flashcp 把 BOOT.BIN 写入 QSPI 的 /dev/mtd0:flashcp -v BOOT.BIN /dev/mtd0,再用 dd 把 rootfs.ext4 写入 eMMC:dd if=rootfs.ext4 of=/dev/mmcblk0p2 bs=4M conv=fsync。其二是通过 JTAG 用 Vivado 或 xsct 直接烧写 QSPI,适合产线批量。烧录完成后必须断电重启,把 MODE[3:0] 拨到目标介质对应档位,观察串口是否打印 FSBL 版本、U-Boot 版本和内核启动日志。若串口无任何输出,优先检查启动模式引脚、QSPI 是否烧录成功、Boot Header 是否有效;若卡在 U-Boot 提示符,则检查 image.ub 是否存在于对应分区、bootargs 中的根文件系统路径是否正确。
BOOT.BIN、image.ub、rootfs.ext4 及对应 BIF、设备树源文件一并归档,并记录启动模式引脚档位与烧录命令,便于产线复现。判断部署是否成功,可依次核对:串口是否输出 FSBL 与 U-Boot 版本;内核是否成功挂载根文件系统并进入登录提示;ls /dev/mtd* 是否能看到 QSPI 分区;lsblk 是否识别 eMMC 分区;自定义的 UART、CAN 设备节点是否出现在 /dev 下。只有这些环节全部通过,才说明从 BootROM 到用户应用的整条启动链与设备树定制都已正确落地。