2. 硬件平台开发环境搭建
Ryzen Embedded 平台的适配工作,本质上是在“硬件设计资料”和“可运行软件镜像”之间建立一条可复现的通道。这条通道由四类工具共同支撑:用于读懂板级连接的原理图/PCB 查看工具、用于获得官方软件基线的 BSP 包、用于在 x86 主机上产出目标板可执行文件的交叉编译链,以及用于把镜像烧进板子并观察启动过程的调试工具链。本节按“先看硬件、再取软件、后建工具”的顺序展开,并给出可直接照做的配置示例。
一、原理图与 PCB 工具:先建立板级“地图”
拿到一块 Ryzen Embedded 参考板或自研板,第一步不是上电,而是确认三件事:电源树、启动介质、调试接口。原理图工具负责回答这些问题。常见选择包括 Altium Designer、Cadence Allegro、KiCad,以及用于查看 PDF 原理图的 Foxit/Adobe Reader。若供应商只提供 PDF,至少要用支持“网络标号搜索”的阅读器,便于按信号名跳转。
阅读原理图时建议按以下顺序建立认知:
- 电源域:确认 VDDCR_SOC、VDDCR_GFX、1.8V、3.3V、5V 等轨的先后上电顺序,以及 PMIC 或分立 DCDC 的使能信号(如 PWR_GOOD、S5_EN)。
- 启动介质:找到 SPI ROM(通常 16MB/32MB)、eMMC 或 NVMe 的连接,记录片选、时钟与数据线对应的 SoC 引脚。
- 调试接口:定位 UART0 的 TX/RX/GND 测试点、JTAG/SWD 排针、以及可能存在的 EC(嵌入式控制器)调试口。
- 关键外设:列出本板实际使用的 PCIe 通道、USB 端口、I2C 总线编号与从设备地址。
PCB 工具则用于确认层叠、阻抗与关键走线。对适配工程师而言,最需要关注的是 DDR 走线长度匹配、PCIe 差分对是否等长、以及时钟线的参考平面是否完整。这些信息决定了后续内存训练和高速链路能否稳定。若板子由第三方设计,应索取层叠报告和阻抗表,而不是仅凭丝印判断。
二、BSP 获取:拿到官方软件基线
BSP(Board Support Package)是 AMD 及其合作伙伴为特定 SoC 系列发布的软件集合,通常包含 UEFI/BIOS 源码或二进制、coreboot 支持、Linux 内核补丁、设备树/ACPI 表、以及预编译的固件。获取渠道主要有三类:AMD 官方开发者门户、板卡厂商(如 Advantech、DFI、Kontron)的支持网站、以及 GitHub 上的开源仓库(如 coreboot、edk2-platforms)。
以 Ryzen Embedded V2000/R2000 系列为例,典型 BSP 包结构如下:
bsp_v2000_v1.2/
├── bios/ # UEFI 固件镜像与刷写工具
├── coreboot/ # coreboot 源码与板级配置
├── kernel/ # Linux 内核补丁(基于 5.15/6.1 LTS)
├── acpi/ # ACPI 表与设备描述
├── drivers/ # GPU、音频、网卡等外设驱动
└── docs/ # 发布说明、已知问题、引脚复用表
获取后应先核对版本号与 SoC 型号是否匹配,再检查 docs/release_notes 中的已知问题。建议把 BSP 包纳入 Git 管理,并打上标签,例如 git tag v2000-bsp-v1.2,便于后续回溯。若官方只提供二进制固件,应同时保存其校验值(SHA-256),烧写前先验证完整性。
三、交叉编译链:在 x86 主机上产出目标代码
虽然 Ryzen Embedded 本身是 x86_64 架构,理论上可在板上本地编译,但实际开发中仍推荐在性能更强的 x86 主机上使用交叉编译或 SDK 方式构建,以缩短迭代时间。对于 x86_64 目标,交叉编译链通常就是本机工具链加上目标 sysroot;若涉及 32 位或特定 ABI,则需显式指定。
推荐使用 Yocto 或 Buildroot 生成 SDK。以 Yocto 为例,配置流程如下:
# 1. 初始化构建环境
source poky/oe-init-build-env build-v2000
# 2. 在 conf/local.conf 中指定目标机器
MACHINE = "ryzen-v2000"
DISTRO = "poky"
# 3. 生成 SDK
bitbake core-image-minimal -c populate_sdk
# 4. 安装 SDK 到主机
./tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-*.sh
安装后,SDK 会提供 environment-setup-x86_64-poky-linux 脚本,执行后即可使用 $CC、$CXX、$LD 等变量。验证方法:
source /opt/poky/4.0/environment-setup-x86_64-poky-linux
$CC --version
# 应输出 x86_64-poky-linux-gcc 版本信息
$CC -o hello hello.c
file hello
# 应显示 ELF 64-bit LSB executable, x86-64
若使用 Buildroot,则通过 make sdk 生成 output/host 目录,其中包含 usr/bin 下的交叉工具链。关键参数是 BR2_TOOLCHAIN_BUILDROOT_GLIBC 或 BR2_TOOLCHAIN_BUILDROOT_MUSL,需与目标根文件系统保持一致,否则会出现动态链接库不匹配。
四、调试工具链:烧写、串口与 JTAG
调试工具链负责把镜像送到板子并观察运行状态。核心组件包括:
- 烧写工具:SPI Flash 常用
flashrom或厂商提供的afuflash;eMMC/NVMe 可用dd或balenaEtcher。 - 串口终端:
minicom、picocom或screen,参数通常为 115200-8-N-1。 - JTAG/SWD:若 SoC 支持,可用 OpenOCD 配合 FTDI 或 J-Link 进行早期初始化调试。
- 网络调试:
tftp用于加载内核,ssh/scp用于传输文件,gdbserver用于远程断点。
串口连接示例:
# 查看串口设备
ls /dev/ttyUSB*
# 连接
picocom -b 115200 /dev/ttyUSB0
# 退出:Ctrl-A 然后 Ctrl-X
烧写 SPI Flash 示例(假设使用 flashrom 与 CH341A 编程器):
flashrom -p ch341a_spi -r backup.bin
flashrom -p ch341a_spi -w bios_v2000.bin
flashrom -p ch341a_spi -v bios_v2000.bin
上电后,串口应输出 UEFI 或 coreboot 的启动日志。若长时间无输出,按以下顺序排查:串口线序是否 TX/RX 交叉、波特率是否匹配、板子是否真正上电、SPI Flash 是否焊接良好。若日志停在内存训练阶段,则需检查 DDR 配置与 BSP 是否匹配。
五、环境搭建的验收标准
完成上述四类工具配置后,建议用一张检查表确认环境可用。以下为可直接填写的示例:
| 检查项 | 预期结果 | 实际结果 | 备注 |
|---|---|---|---|
| 原理图可搜索网络标号 | 能定位 UART0_TX 测试点 | ||
| BSP 版本与 SoC 匹配 | release_notes 中型号一致 | ||
| SDK 环境脚本可执行 | $CC --version 输出正常 | ||
| 串口终端可连接 | 上电后出现启动日志 | ||
| 烧写工具可识别芯片 | flashrom -p ch341a_spi 探测到 SPI Flash |
需要强调的是,交叉编译链与目标根文件系统的 libc 必须一致。若 SDK 使用 glibc 而目标镜像使用 musl,程序在板上运行时会报 No such file or directory,但文件明明存在——这通常是动态链接器路径不匹配。此时用 readelf -l hello | grep interpreter 查看解释器路径,并与板上 /lib/ld-musl-x86_64.so.1 或 /lib64/ld-linux-x86-64.so.2 对照即可确认。
env-setup.md 中,并纳入版本控制。这样换一台主机时,按文档执行即可在半小时内恢复完整开发环境。