2. 开发环境与工具链搭建

Layerscape 板级 Bring-up 的第一步不是上电,而是把主机侧环境准备好。LSDK 提供 BSP、内核、U-Boot 与固件,Yocto 负责生成根文件系统与完整镜像,交叉编译工具链负责在 x86 主机上产出 ARM64 目标代码,CodeWarrior/Lauterbach 负责 JTAG 级调试,串口终端与 TFTP/NFS 则构成主机与目标板之间的启动与文件传输通道。本节按“先装工具、再通链路、后验连接”的顺序展开,最终目标是让主机能够编译、下载、启动并登录目标板。

一、LSDK 与 Yocto 的安装

LSDK 通常以压缩包或 Git 仓库形式发布,内部包含 setup.env、flexbuild 等脚本。以 LSDK 21.08 为例,建议在 Ubuntu 20.04 LTS 主机上操作,磁盘预留 100 GB 以上,内存 16 GB 以上。解压后先执行环境初始化:

tar xf lf-lsdk-2108.tar.gz -C ~/
cd ~/lf-lsdk-2108
source setup.env
flex-builder -h

若使用 Yocto 独立构建,则需先克隆 poky 与 meta-freescale,再通过 bitbake 生成镜像。Yocto 对主机依赖较敏感,建议先安装 gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping 等包。首次构建时间较长,示例中 core-image-minimal 在 8 核主机上约需 40~60 分钟,具体取决于网络与磁盘性能。

LSDK 与 Yocto 二选一即可:LSDK 适合快速 Bring-up,Yocto 适合定制根文件系统与量产镜像。两者共用同一套交叉工具链时,注意不要混用环境变量。

二、交叉编译工具链配置

LSDK 自带 gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu 工具链,位于 ~/lf-lsdk-2108/toolchain/。将其加入 PATH 后验证:

export PATH=$HOME/lf-lsdk-2108/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin:$PATH
aarch64-none-linux-gnu-gcc -v
aarch64-none-linux-gnu-gcc -dumpmachine

正确输出应包含 aarch64-none-linux-gnu 与 gcc 版本号。若使用 Yocto,则通过 source oe-init-build-env 后由 bitbake -c populate_sdk 生成 SDK 安装包,安装后同样以 source environment-setup-aarch64-poky-linux 激活。判断工具链是否可用,最直接的方法是编译一个最小程序并检查 ELF 架构:

echo 'int main(){return 0;}' > t.c
aarch64-none-linux-gnu-gcc t.c -o t
file t

输出中应出现 ELF 64-bit LSB executable, ARM aarch64,说明工具链工作正常。

三、调试器与串口终端

CodeWarrior 与 Lauterbach 面向 JTAG 调试。CodeWarrior for ARMv8 需安装对应 LSDK 版本的 .bin 安装包,安装后配置目标配置文件(.cwt 或 .tcl),指定 LS1046A/LS1028A 等芯片型号与 RCW 路径。Lauterbach TRACE32 则需 t32 启动脚本与 cmm 脚本,通过 SYStem.CPU LS1046A 选择 CPU,再 SYStem.Up 建立连接。两者共同点是:先确认 JTAG 链路 IDCODE 可读,再加载 RCW 与 U-Boot 到 DDR。

串口终端推荐 minicom 或 picocom。Layerscape 开发板通常使用 115200-8-N-1,USB 转串口设备在 Linux 下识别为 /dev/ttyUSB0。连接命令示例:

sudo picocom -b 115200 /dev/ttyUSB0
# 或
sudo minicom -D /dev/ttyUSB0 -b 115200

上电后若能看到 U-Boot 打印 U-Boot 2021.04 与 Model: LS1046A RDB,说明串口链路与目标板启动正常。

四、TFTP 与 NFS 服务

TFTP 用于下载内核与设备树,NFS 用于挂载根文件系统。主机侧安装并配置:

sudo apt install tftpd-hpa nfs-kernel-server
sudo mkdir -p /srv/tftp /srv/nfs/rootfs
sudo chmod 777 /srv/tftp
# /etc/default/tftpd-hpa
TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure --create"
# /etc/exports
/srv/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
sudo systemctl restart tftpd-hpa nfs-kernel-server

将编译产物放入对应目录后,在 U-Boot 中设置 serverip、ipaddr、bootargs,即可通过 tftp 下载 Image 与 fsl-ls1046a-rdb.dtb,并用 nfsroot 挂载根文件系统。判断服务是否可用,可在主机上先自测:

tftp localhost -c get Image
showmount -e localhost

若 tftp 能取到文件、showmount 能列出导出目录,说明主机侧服务已就绪。

五、主机与目标板连接准备

连接准备的核心是“三条链路”:串口链路用于观察启动日志与进入 U-Boot,网口链路用于 TFTP/NFS 传输,JTAG 链路用于调试器接管。建议主机与目标板处于同一网段,例如主机 192.168.1.10/24,目标板 192.168.1.100/24。上电前先确认串口能打印、网口 Link 灯亮、JTAG IDCODE 可读,再进入后续 Bring-up。

Layerscape 主机—目标板连接拓扑 主机(Ubuntu x86_64) LSDK / Yocto flex-builder · bitbake · 镜像生成 交叉工具链 aarch64-none-linux-gnu-gcc TFTP / NFS 服务 /srv/tftp · /srv/nfs/rootfs 串口终端 / 调试器 picocom · CodeWarrior · TRACE32 目标板(LS1046A RDB) U-Boot tftp 下载 Image / DTB bootargs 指定 nfsroot Linux 内核 + 根文件系统 NFS 挂载 / 本地 eMMC 启动 串口登录 console JTAG 调试接口 IDCODE 读取 · RCW 加载 DDR 初始化 · 断点调试 编译产物 TFTP / NFS 串口 / JTAG 连接判据:串口有 U-Boot 打印 · 网口 Link 亮且可 ping 通 · JTAG 可读 IDCODE

完成上述配置后,主机侧应能编译出 ARM64 镜像,目标板应能通过串口进入 U-Boot,并通过 TFTP/NFS 启动 Linux。此时开发环境与工具链搭建完成,可进入下一阶段的板级 Bring-up 与系统调试。