4. 开发环境搭建与目标板启动
Layerscape NFV 平台的开发环境不是“装一个 IDE 就能跑”的桌面环境,而是一条从主机工具链到目标板固件、再到串口与网络调试通道的完整链路。本节围绕交叉编译工具链、LSDK 安装、TF 卡与网络启动、串口与网络调试、首次上电与固件更新五个环节展开,目标是让读者在主机侧具备可编译、可烧写、可调试的能力,在目标板侧具备可启动、可登录、可更新的状态。
交叉编译工具链:为什么不能直接用主机 gcc
Layerscape 处理器(如 LS1046A、LS2088A)是 AArch64 架构,而开发主机通常是 x86_64。主机 gcc 生成的指令目标板无法执行,因此必须使用交叉编译工具链。NXP 官方推荐使用 LSDK 自带的 GNU 工具链,其命名形如 aarch64-linux-gnu-gcc。判断工具链是否可用,最直接的方式是查看版本并编译一个最小程序:
aarch64-linux-gnu-gcc -v
aarch64-linux-gnu-gcc -o hello hello.c
file hello
# 期望输出包含:ELF 64-bit LSB executable, ARM aarch64
如果 file 显示的是 x86-64,说明调用的是主机 gcc,交叉编译并未生效。工具链安装后需要把 bin 目录加入 PATH,并在构建内核或 U-Boot 时通过 CROSS_COMPILE=aarch64-linux-gnu- 显式指定前缀。这一步是后续所有编译工作的前提,工具链路径错误会导致内核编译在早期就报“unknown architecture”或找不到汇编器。
LSDK 安装:获取源码与构建环境
LSDK(Layerscape Software Development Kit)是 NXP 提供的集成化软件开发包,包含 U-Boot、Linux 内核、设备树、根文件系统以及各类固件。安装方式通常有两种:一是从 NXP 官网下载 ISO 或 tar 包,二是通过 GitHub 仓库克隆。以 tar 包为例,解压后目录结构大致如下:
lsdk/
├── packages/
│ ├── linux/ # 内核源码
│ ├── u-boot/ # U-Boot 源码
│ ├── rcw/ # 复位配置字
│ └── firmware/ # DPAA、SEC 等固件
├── setup.env # 环境变量脚本
└── build_lsdk.sh # 构建脚本
进入 LSDK 根目录后执行 source setup.env,脚本会设置 CROSS_COMPILE、ARCH、PATH 等变量。随后可用 ./build_lsdk.sh -h 查看支持的板型与构建目标。对于 LS1046ARDB,典型构建命令为:
./build_lsdk.sh -b ls1046ardb -t all
该命令会依次构建 U-Boot、内核、设备树和根文件系统。首次构建耗时较长,建议主机预留至少 100 GB 磁盘空间和 16 GB 内存。构建完成后,产物通常位于 build_lsdk/images/ 下,包括 u-boot.bin、Image、fsl-ls1046a-rdb.dtb 和 rootfs.tar.gz。
TF 卡启动与网络启动
目标板启动方式由拨码开关和 RCW 共同决定。以 LS1046ARDB 为例,TF 卡启动需要将拨码开关设置为 SD 启动模式,并把 U-Boot、内核、设备树和根文件系统写入 TF 卡。典型分区布局为:第一个分区 FAT32,存放 Image 和 dtb;第二个分区 ext4,存放根文件系统。写入命令示例:
sudo dd if=u-boot-with-spl.bin of=/dev/sdX bs=512 seek=8
sudo mkfs.vfat /dev/sdX1
sudo mkfs.ext4 /dev/sdX2
sudo cp Image fsl-ls1046a-rdb.dtb /mnt/boot/
sudo tar -xzf rootfs.tar.gz -C /mnt/rootfs/
网络启动则依赖 TFTP 和 NFS。目标板 U-Boot 通过 tftp 从主机下载 Image 和 dtb,再通过 NFS 挂载根文件系统。主机侧需要配置 TFTP 根目录和 NFS 导出目录,目标板侧设置 serverip、ipaddr、bootargs 等环境变量。网络启动的优势是迭代快,修改内核或设备树后无需重新烧写 TF 卡,适合开发阶段频繁调试。
串口与网络调试
串口是目标板启动阶段唯一的可见通道。主机侧使用 USB 转串口线连接板载 UART,设备节点通常为 /dev/ttyUSB0。以 picocom 为例:
sudo picocom -b 115200 /dev/ttyUSB0
上电后应看到 RCW 版本、DDR 初始化、U-Boot 版本等日志。若串口无输出,依次检查:串口线是否接在正确的 UART 口、波特率是否为 115200、拨码开关是否处于正确启动模式、板卡供电是否正常。网络调试方面,目标板启动 Linux 后,可用 ip addr 查看网口状态,用 ping 测试与主机的连通性。若使用 NFS 根文件系统,需确认 bootargs 中的 nfsroot 参数与主机导出路径一致。
首次上电与固件更新
首次上电建议先不插 TF 卡,观察 U-Boot 是否从 QSPI 或默认介质启动,确认串口日志完整。若需要更新 U-Boot 或 RCW,可通过 U-Boot 的 tftp 命令下载新固件,再用 sf probe 和 sf update 写入 QSPI:
tftp 0x82000000 u-boot-with-spl.bin
sf probe 0:0
sf update 0x82000000 0x100000 0x100000
更新完成后断电重启,再次观察串口日志中的 U-Boot 版本号是否变化。若版本未变,说明写入地址或长度有误,需要重新核对 QSPI 分区表。固件更新属于高风险操作,建议在 TF 卡启动正常后再进行,并保留一份可回退的旧固件。
sf update 的源地址、目标偏移和长度与分区表一致。
完成上述步骤后,主机侧应具备完整的交叉编译与构建能力,目标板侧应能通过串口看到启动日志、通过 TF 卡或网络进入 Linux 系统,并具备固件更新的基本手段。这是后续内核裁剪、DPAA 网络加速、虚拟化功能验证的基础环境。