3. 开发环境搭建与首次启动

LSDK(Layerscape Software Development Kit)是 NXP 为 Layerscape 系列处理器提供的完整软件开发包,它把 U-Boot、Linux 内核、设备树、根文件系统、安全固件以及各类网络加速组件的源码和构建脚本整合到一套统一的目录结构中。对于网络安全设备开发而言,LSDK 不仅是"能编译出镜像"的工具集,更是后续集成 DPDK、OpenSSL 硬件加速、IPsec 卸载、TrustZone 安全启动等功能的基础平台。本节围绕"从零到目标板跑起来"这一目标,梳理 LSDK 安装、交叉工具链配置、U-Boot 编译烧写、内核与根文件系统构建,以及通过串口和网络启动验证的完整流程。

一、LSDK 获取与目录结构

LSDK 通常以两种形式发布:一是通过 NXP 官方 Git 仓库(如 github.com/nxp-qoriq)按组件拉取,二是使用官方提供的 lsdk-<version>.tar.gz 离线包。对于首次搭建,建议使用离线包,避免网络波动导致组件版本不一致。解压后典型目录如下:

lsdk-21.08/
├── setup.env              # 环境变量初始化脚本
├── packages/
│   ├── linux/             # Linux 内核源码
│   ├── u-boot/            # U-Boot 源码
│   ├── rcw/               # Reset Configuration Word 二进制
│   ├── mc-utils/          # DPAA2 管理复杂配置
│   └── app/               # 用户态示例程序
├── build/                 # 构建输出目录
└── tools/
    └── toolchain/         # 交叉编译工具链

执行 source setup.env 后,脚本会导出 CROSS_COMPILE、ARCH、PATH 等变量,并把工具链加入搜索路径。这一步是后续所有编译命令能正确找到 aarch64-linux-gnu-gcc 的前提。

二、交叉编译工具链配置

Layerscape 主流芯片(如 LS1046A、LS2088A、LX2160A)均为 ARMv8-A 64 位架构,因此工具链选择 aarch64-linux-gnu- 前缀。LSDK 自带工具链位于 tools/toolchain/gcc-linaro-<ver>-x86_64_aarch64-linux-gnu/bin,也可使用系统安装的 gcc-aarch64-linux-gnu。验证方式:

$ aarch64-linux-gnu-gcc -v
gcc version 9.2.0 (GCC)
$ echo $CROSS_COMPILE
aarch64-linux-gnu-

若使用外部工具链,需在 setup.env 中修改 CROSS_COMPILE 与 PATH,并确保 sysroot 与目标板 glibc 版本匹配,否则会出现运行时 GLIBC_2.xx not found 错误。对于网络安全设备,建议同时确认工具链是否支持 -march=armv8-a+crypto,以便后续启用 ARMv8 加密指令加速。

三、U-Boot 编译与烧写

U-Boot 是目标板启动的第一阶段引导程序,负责初始化 DDR、SerDes、网络等关键外设,并加载内核。以 LS1046ARDB 为例,编译流程如下:

$ cd packages/u-boot
$ make distclean
$ make ls1046ardb_tfa_defconfig
$ make -j8
# 生成 u-boot.bin、u-boot-with-spl.bin、bl2_*.pbl 等

其中 ls1046ardb_tfa_defconfig 表示启用 TF-A(Trusted Firmware-A)作为 BL2 阶段,这是 Layerscape 较新 LSDK 的默认启动链。烧写方式取决于启动介质:

  • SD 卡启动:使用 dd 将 u-boot-with-spl.bin 写入 SD 卡偏移 0x1000 处,或按 LSDK 文档使用 flex-installer 工具一键写入。
  • QSPI NOR 启动:通过 CodeWarrior 或 U-Boot 自身的 sf probe + sf update 命令烧写。
  • 网络启动:在已有 U-Boot 环境下,用 tftp 加载新镜像到内存,再 cp.b 到 NOR 或写入 eMMC。

烧写完成后,将目标板启动模式拨码开关设为对应介质,上电后串口应输出类似 U-Boot 2021.04 (Jan 01 2022 - 00:00:00 +0000) 的版本信息,并进入 => 提示符。

四、Linux 内核与根文件系统构建

LSDK 内核基于 NXP 维护的 linux 分支,包含 DPAA、DPAA2、SEC 加密引擎、CAAM 等驱动。编译命令:

$ cd packages/linux
$ make ARCH=arm64 defconfig
$ make ARCH=arm64 lsdk_defconfig   # 叠加 LSDK 专用配置
$ make ARCH=arm64 -j8 Image dtbs
# 输出:arch/arm64/boot/Image
#       arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtb

根文件系统推荐使用 LSDK 提供的 lsdk-<ver>-arm64-<distro>-rootfs.tar.gz,其中已预装 restool、dpdk、openssl 等网络与安全组件。也可用 Yocto 自行构建,但首次验证建议直接用官方 rootfs,减少变量。将内核、设备树、rootfs 打包为 FIT 镜像或分别放入 SD 卡分区:

# SD 卡分区示例
p1: 64MB  FAT32  -> Image, dtb, u-boot 环境
p2: 剩余   ext4   -> rootfs 解压

五、串口与网络启动验证

串口连接使用板载 UART,参数为 115200 8N1,无流控。上电后观察 U-Boot 打印的 DDR 容量、SerDes 协议、MAC 地址等信息,确认与硬件一致。进入 U-Boot 后设置启动参数:

=> setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait'
=> setenv fdt_addr 0x90000000
=> setenv kernel_addr 0x80080000
=> fatload mmc 0:1 $kernel_addr Image
=> fatload mmc 0:1 $fdt_addr fsl-ls1046a-rdb.dtb
=> booti $kernel_addr - $fdt_addr

内核启动后应看到 Freeing unused kernel memory 并进入登录提示。登录后执行 uname -a、ip link、ls /sys/class/net 检查内核版本、网络接口是否枚举。网络启动验证可用 tftp 从主机拉取文件,或用 ping 测试目标板与主机连通性。若网络接口未出现,需检查设备树中 PHY 节点、SerDes 协议配置与 RCW 是否匹配。

LSDK 开发环境搭建与首次启动链路 主机(Ubuntu x86_64) LSDK 离线包解压 source setup.env 交叉工具链 aarch64-linux-gnu- U-Boot 编译 u-boot-with-spl.bin 内核 + DTB 编译 Image / fsl-*.dtb 根文件系统 rootfs.tar.gz(含 restool / dpdk / openssl) 烧写/加载 目标板(LS1046ARDB) BL2 / TF-A DDR / SerDes 初始化 U-Boot booti 加载内核 Linux 内核 DPAA / SEC 驱动 根文件系统 登录 / 网络接口 串口 115200 8N1 输出启动日志 首次启动验证要点 串口验证 U-Boot 版本 / DDR 容量 内核启动日志 / 登录提示 网络验证 ip link 查看接口 ping / tftp 连通性 安全组件验证 restool 枚举 DPAA2 对象 openssl speed 测试 CAAM 判断依据:串口无 panic、网络接口 up、restool 可枚举、openssl 显示 CAAM 加速可用 异常排查:检查 RCW / SerDes 协议 / 设备树 PHY 节点 / rootfs 分区挂载参数

六、常见问题与判断依据

首次启动最容易卡在三个位置:一是 DDR 初始化失败,串口无输出或反复重启,通常与 RCW 中 DDR 频率、时序参数不匹配有关;二是内核启动后找不到根文件系统,提示 VFS: Cannot open root device,需核对 bootargs 中 root= 与 SD 卡分区号;三是网络接口未枚举,需检查设备树中 fsl,dpaa 节点、PHY 地址与 SerDes 协议是否与硬件一致。建议在 U-Boot 阶段先用 mdio list 查看 PHY 是否被识别,再进入内核排查。

首次搭建建议固定一套"已知可用"的组合:LSDK 版本、工具链版本、内核分支、rootfs 发行版四者保持一致,避免混用不同版本导致驱动与用户态库不匹配。验证通过后再逐步替换组件,每次只改一个变量。

完成上述步骤后,目标板应能稳定进入 Linux 用户态,网络接口可正常收发报文,CAAM 加密引擎可被 OpenSSL 调用。这套环境是后续集成 IPsec 卸载、DPDK 数据面、安全启动与 TrustZone 功能的前提,也是排查更复杂网络与安全问题时最基础的参照平台。