4. HPS外设与接口

Agilex 5 的 HPS 侧集成了大量常用外设控制器,它们通过 HPS-FPGA 桥、Pin Mux 与 I/O 复用矩阵连接到外部器件。实际项目中,外设能否稳定工作,往往不取决于控制器本身,而取决于引脚复用、时钟源、设备树配置、驱动匹配与信号完整性这五个环节是否一致。本章围绕 UART、I2C、SPI、SD/MMC、USB 和以太网六类接口,梳理配置思路与调试方法。

一、核心原理:外设从控制器到引脚的完整链路

HPS 外设的访问路径可以概括为:CPU 通过内部总线访问外设控制器寄存器,控制器产生时序信号,经 Pin Mux 选择功能后送到 I/O Bank,再通过外部引脚连接目标器件。任何一环配置错误,都会表现为“控制器存在但通信失败”。

HPS 外设信号链路与调试观测点 CPU / 总线 L3 / L4 互连 外设控制器 UART/I2C/SPI/SD/USB/EMAC Pin Mux 功能选择 / 复用 I/O Bank 电平 / 驱动强度 外部 器件 关键观测点与常见故障 时钟:确认外设时钟门控已打开,波特率/分频与目标一致 设备树:status = "okay"、pinctrl 引用、compatible 与驱动匹配 引脚:Pin Mux 功能号、上下拉、驱动强度、电压域是否匹配 信号:示波器/逻辑分析仪观察波形、上拉电阻、地回流与走线长度

二、方法流程:六类外设的配置与验证步骤

建议按统一流程推进:先确认硬件连接与电压域,再配置 Pin Mux 与时钟,然后修改设备树,最后加载驱动并用用户态工具验证。

  1. UART:确认 TX/RX 交叉连接,设置波特率、数据位、停止位和校验位。常用 stty 或 minicom 验证。
  2. I2C:确认上拉电阻和从机地址,使用 i2cdetect 扫描总线,再用 i2cget/i2cset 读写寄存器。
  3. SPI:确认 CPOL/CPHA、片选和时钟频率,使用 spidev_test 回环验证。
  4. SD/MMC:确认卡检测引脚和供电时序,使用 mmc extcsd read 或 fdisk -l 检查枚举。
  5. USB:确认 PHY 参考时钟和 VBUS 控制,使用 lsusb、dmesg 观察枚举日志。
  6. 以太网:确认 RGMII 延时、PHY 地址和复位时序,使用 ethtool、ping 验证链路。

设备树中一个典型 UART 节点配置如下:

&uart0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = &uart0_pins;
    clock-frequency = <100000000>;
};

&uart0_pins {
    pins = "gpio1_0", "gpio1_1";
    function = "uart0";
    bias-pull-up;
};

三、案例场景:以太网与 SD 卡联合调试

某 Agilex 5 板卡上电后,SD 卡无法识别,同时以太网 PHY 链路不稳定。排查发现两个问题:一是 SD 卡检测引脚被复用为 GPIO 但未配置内部上拉,导致热插拔检测电平漂移;二是 RGMII 接口的 TX 时钟延时未按 PHY 要求设置,造成数据采样窗口偏移。

解决方法是:在设备树中为 SD 检测引脚增加 bias-pull-up,并在以太网节点中配置 tx-internal-delay-ps 与 rx-internal-delay-ps。修改后 SD 卡正常枚举,以太网在千兆模式下稳定传输。

调试外设时,优先查看 dmesg 中的驱动探测日志。若出现 probe failed 或 timeout,通常指向时钟、引脚或供电问题,而不是协议本身。

四、常见误区与复盘清单

误区 现象 正确做法
只改设备树,忽略 Pin Mux 驱动加载成功但无信号 同步检查 pinctrl 与功能号
I2C 缺少上拉电阻 扫描不到从机或随机失败 按总线速率选择 2.2k~10k 上拉
SPI 模式不匹配 读回数据全 0 或全 FF 核对 CPOL/CPHA 与从机手册
USB VBUS 未使能 设备无枚举日志 检查 VBUS 控制 GPIO 与供电
RGMII 延时未配置 链路时通时断、丢包 按 PHY 要求设置内部延时

复盘时建议记录“时钟—引脚—设备树—驱动—信号”五要素检查表。多数外设问题并非控制器故障,而是配置链路中某一环缺失或参数不一致。

掌握上述方法后,HPS 外设调试可以从“试错”转为“按链路定位”。下一阶段可结合具体板级原理图,逐项核对引脚分配与电压域,形成可复用的调试记录。