3. 开发环境与启动流程
Layerscape 安全网关的软件开发不是从写应用代码开始的,而是从“让板子按预期启动”开始的。一个可用的开发环境,本质上是一条从源码到可启动镜像的完整链路:获取 LSDK/BSP 源码、安装匹配的交叉编译工具链、配置并编译 U-Boot、编译 Linux 内核、定制设备树、构建根文件系统,最后通过启动介质把镜像烧到板卡上并观察串口输出。这条链路上任何一环版本不匹配,都会表现为“板子不启动”或“启动到一半卡住”,因此理解每一环的输入输出关系,比记住命令本身更重要。
一、LSDK/BSP 获取与目录结构
NXP 为 Layerscape 系列提供 LSDK(Layerscape Software Development Kit),其核心是包含 U-Boot、Linux 内核、设备树、根文件系统源码及预编译镜像的 BSP 包。获取方式通常有两种:一是从 NXP 官网下载对应芯片系列的 LSDK 发布包(如 LSDK 21.08 对应 LX2160A、LS1046A 等),二是通过 NXP 的 Git 仓库(如 github.com/nxp-qoriq)按 tag 拉取源码。以 LS1046A 为例,典型目录结构如下:
lsdk-21.08/
├── components/
│ ├── u-boot/ # U-Boot 源码
│ ├── linux/ # Linux 内核源码
│ ├── rcw/ # 复位配置字
│ └── apps/ # 用户态工具
├── configs/
│ └── ls1046ardb/ # 板级配置
├── images/ # 预编译镜像
└── setup.env # 环境变量脚本
关键点在于:setup.env 会导出 CROSS_COMPILE、ARCH、PATH 等变量,后续所有编译都依赖它。执行 source setup.env 后,工具链路径才会被正确加入。
二、交叉编译工具链
Layerscape 是 ARM64 架构,宿主机通常是 x86_64 Linux,因此必须使用 aarch64 交叉编译工具链。LSDK 自带工具链位于 toolchain/gcc-*/aarch64-linux-gnu/,也可使用 Linaro 或 ARM 官方发布的 gcc-aarch64-linux-gnu。验证方法:
aarch64-linux-gnu-gcc -v
# 应输出 gcc version 9.x 或 10.x,target 为 aarch64-linux-gnu
工具链版本必须与内核、U-Boot 源码兼容。若用 GCC 12 编译老版本 U-Boot,常出现 -Werror 导致的编译中断,此时应优先使用 BSP 自带工具链,而不是盲目升级。
三、U-Boot 配置与编译
U-Boot 负责初始化 DDR、SerDes、时钟,并加载内核。以 LS1046ARDB 为例:
cd components/u-boot
make distclean
make ls1046ardb_tfa_defconfig
make -j8
编译产物包括 u-boot.bin、u-boot-with-spl.bin 和 bl2_*.pbl。其中 SPL/TPL 负责早期初始化,RCW(复位配置字)决定 SerDes 通道和启动介质。若板卡从 SD 卡启动,需将 rcw 与 U-Boot 镜像按偏移写入;若从 QSPI 启动,则使用 flexspi 相关配置。常见错误是 RCW 与板卡实际 SerDes 配置不符,表现为串口无输出或 DDR 初始化失败。
四、Linux 内核编译与设备树定制
内核编译前先确认 ARCH=arm64、CROSS_COMPILE=aarch64-linux-gnu-。LSDK 内核通常使用 defconfig 加板级 fragment:
cd components/linux
make ARCH=arm64 defconfig
make ARCH=arm64 lsdk_ls1046ardb_defconfig
make ARCH=arm64 -j8 Image dtbs
设备树是本节最需要定制的部分。以 LS1046A 为例,arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts 描述 CPU、DDR、PCIe、网络接口和 I2C 设备。若板卡上增加了自定义 PHY 或改变了 MDIO 地址,必须修改对应节点。例如将 ethernet@e4000 的 phy-handle 指向新的 PHY 节点,并确保 phy-mode 与硬件连接一致(rgmii-id 或 sgmii)。设备树写错不会导致编译失败,但会在启动时表现为网口不识别或 PHY 无法 link,因此必须结合串口日志中的 of_phy_connect 相关打印判断。
五、根文件系统构建
根文件系统决定板卡启动后能运行什么。LSDK 提供两种方式:一是使用预编译的 rootfs_lsdk2108_arm64.cpio.gz 或 ext4 镜像;二是用 Yocto 或 Buildroot 自行构建。若只需验证启动,可直接使用预编译镜像;若需加入自定义应用,推荐用 Yocto 的 meta-freescale 层。构建完成后,根文件系统需包含 /init 或 /sbin/init,并确保 /etc/fstab 中根分区挂载参数与内核命令行 root= 一致。常见问题是内核命令行写 root=/dev/mmcblk0p2,但实际 SD 卡分区为 /dev/mmcblk0p1,导致 VFS: Cannot open root device。
六、板卡启动调试与判断依据
把镜像写入 SD 卡或 QSPI 后,用串口工具(如 minicom 或 picocom)连接板卡,参数 115200 8N1。正常启动日志应依次出现:RCW 版本、DDR 初始化、U-Boot 版本、加载 Image 与 dtb、内核解压、Uncompressing Linux...、驱动探测、最后进入登录提示。若卡在 Starting kernel ... 之后无输出,通常是设备树中 chosen 节点的 stdout-path 指向了错误串口,或内核命令行 console= 与硬件不符。若网口不识别,先检查 DTB 中 phy-handle 与 phy-mode,再用 ifconfig -a 和 ethtool 确认链路状态。