2. 开发环境搭建与源码获取
Layerscape 平台的 BSP 开发与普通 ARM 嵌入式开发最大的区别在于:它同时涉及多核 SoC 固件(RCW、U-Boot、ATF)、Linux 内核、设备树、用户态网络组件以及 NXP 自有的 DPAA/DPAA2 网络加速框架。这些组件版本耦合紧密,手工逐个下载极易出现版本错配。因此本节的核心任务是:搭好一台可复现的构建主机,用 NXP 官方推荐的 manifest 机制一次性拉取整套源码,并完成一次最小系统镜像的编译与烧写,为后续网络驱动适配提供稳定基线。
2.1 构建主机与交叉编译工具链
NXP LSDK(Layerscape Software Development Kit)官方推荐在 Ubuntu 20.04/22.04 LTS x86_64 上构建,磁盘建议预留 120 GB 以上(源码 + 构建产物 + 镜像),内存 16 GB 起步,若使用 Yocto 构建完整发行版建议 32 GB 并配置 8 GB 以上 swap。先安装宿主依赖:
sudo apt update
sudo apt install -y build-essential git python3 python3-pip \
bison flex libssl-dev libncurses5-dev bc device-tree-compiler \
u-boot-tools rsync cpio file wget xz-utils qemu-user-static \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
交叉工具链有两种选择。第一种是发行版自带的 gcc-aarch64-linux-gnu,安装快、适合快速验证,但 glibc 版本与 NXP 预编译库可能不一致。第二种是 NXP LSDK 随附的 GNU 工具链,例如 gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu,它经过 NXP 验证,与 DPAA2 用户态库、restool、dpdk 等二进制组件 ABI 匹配,是正式开发的首选。解压后加入环境变量:
export TOOLCHAIN=/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu
export PATH=$TOOLCHAIN/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
aarch64-none-linux-gnu-gcc --version # 验证
注意 CROSS_COMPILE 必须以连字符结尾,内核与 U-Boot 的 Makefile 会把它与 gcc、ld 等拼接。若同时维护 32 位 LS1043A 与 64 位 LS1046A,建议用脚本按目标切换 CROSS_COMPILE,避免污染当前 shell。
2.2 用 repo/manifest 管理 BSP 源码
LSDK 的源码不是一个巨型仓库,而是由数十个 Git 仓库组成,通过 Google repo 工具和一份 manifest.xml 统一描述。manifest 记录了每个仓库的远程地址、默认分支、revision(通常是 tag 或 commit)以及本地路径。这样做的价值是:只要 manifest 固定,任何人拉取到的源码组合完全一致,可复现构建。
mkdir -p ~/lsdk && cd ~/lsdk
repo init -u https://github.com/nxp-qoriq/lsdk -b LSDK-21.08-V4.19 -m default.xml
repo sync -j8 --no-clone-bundle
repo init 只下载 manifest 仓库,repo sync 才真正拉取全部组件。首次同步约 20~40 GB,视网络情况耗时较长。同步完成后可用 repo manifest -r -o pinned.xml 导出锁定版本,作为团队基线存档。若只需内核与 U-Boot,可在 manifest 中裁剪不需要的仓库,或使用 repo sync <project> 只同步指定项目。
需要区分三种构建环境:LSDK 自带 flex-builder 脚本,适合快速产出官方镜像;Yocto 适合定制发行版与软件包管理;OpenWrt 适合网络设备形态的精简固件。三者共用同一份源码树,但构建入口不同。下图展示了从 manifest 到最终镜像的组件依赖与产物关系。
2.3 编译最小系统镜像
以 LS1046ARDB 为例,使用 LSDK 的 flex-builder 构建最小镜像:
cd ~/lsdk
source setup.env
flex-builder -m ls1046ardb -a arm64 -b nor -B sd
# -m 目标板 -a 架构 -b 启动介质 -B 镜像打包方式
构建过程依次编译 RCW、ATF、U-Boot、内核与设备树、rootfs,最终产物位于 build/images/。若只想验证内核与网络驱动,可单独构建内核:
flex-builder -c linux -a arm64 -m ls1046ardb
# 或进入源码目录手工构建
cd build/linux/linux-5.15
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc) Image dtbs modules
构建完成后检查关键产物是否存在:rcw_1600_default.bin、bl2_arm64.pbl、fip.bin、fsl-ls1046ardb-sdk.itb、rootfs.cpio.gz。若使用 DPAA2 网络,还需确认 mc.itb 与 restool 已生成。
2.4 烧写与启动验证
SD 卡烧写最直接:
sudo dd if=build/images/fsl-ls1046ardb-sdk.sd.img of=/dev/sdX bs=4M conv=fsync
sync
NOR 启动则通过 U-Boot 的 tftp 与 flash_write 写入各分区。烧写后接串口(115200 8N1),上电观察日志。最小系统的成功判据是:U-Boot 打印版本与板型 → 加载 ITB 并解压内核 → 内核识别 CPU 核数与内存 → 挂载 rootfs → 出现登录提示符。若卡在 RCW 阶段,多为 SerDes 配置与板型不匹配;若内核启动后找不到网口,则需检查设备树中 DPAA/DPAA2 节点与 MC 固件是否加载。
repo manifest -r 导出的 pinned.xml、工具链版本号、flex-builder 命令行三者一起记入构建记录,后续网络驱动适配出现回归时可快速定位是源码、工具链还是配置变更导致。完成本节后,你应得到一份可重复构建的源码树、一条可用的交叉工具链,以及一块能正常启动到登录提示符的目标板。这套基线是后续内核网络驱动、DPAA2 以太网与卸载功能适配的前提。