4. 硬件平台认知

BSP 适配的第一步不是写代码,而是"读懂板子"。同一颗 SoC 可以衍生出几十款形态各异的板卡,BSP 工程师必须能区分哪些差异由 SoC 决定、哪些由板级设计决定,并能在原理图、数据手册、内存映射三份材料之间快速建立对应关系。本章围绕这一能力展开。

一、SoC 架构:从内核到外设的层次

现代 SoC 通常由 CPU 集群、互连总线、存储控制器、外设控制器和电源时钟域组成。以典型 ARM64 应用处理器为例,CPU 集群通过 CCI/CMN 等一致性互连接入总线,DDR 控制器、GPU、VPU、显示控制器、USB、PCIe、以太网等作为总线主设备或从设备挂载其上。BSP 关注的核心是:哪些模块由 SoC 内部固定,哪些引脚和时钟可以外引到板级。

SoC 内部还包含大量"软配置"资源:引脚复用控制器(Pinmux)、时钟控制器(CCU/CRU)、复位控制器、电源域控制器(PMU/PD)。这些模块决定了外设能否工作,也是 BSP 中设备树和驱动最常修改的部分。

关键认知:SoC 决定"能做什么",板级设计决定"实际连了什么、怎么连"。BSP 适配的本质是把板级事实翻译成内核可识别的描述。

二、参考板与目标板差异

芯片原厂通常提供一块参考设计板(EVB/Reference Board),其 BSP 已跑通全部外设。目标板(客户板)往往在参考板基础上做了裁剪、替换或扩展。差异主要集中在以下几类:

  • 引脚复用差异:同一引脚在参考板上接 UART,在目标板上可能接 I2C,Pinmux 配置必须重写。
  • 外设增减:目标板可能去掉 HDMI、增加 CAN 或第二路以太网,设备树节点需增删。
  • 器件替换:PHY、PMIC、Flash、WiFi 模组换型号,驱动兼容字符串和时序参数随之变化。
  • 电源与时钟:供电轨数量、上电时序、晶振频率不同,直接影响驱动初始化和时钟树配置。
  • 内存容量与布局:DDR 颗粒容量、位宽、频率变化,需重新做 DDR 训练参数。

实践中建议先做一张"差异对照表",把参考板与目标板逐项比对,再决定哪些直接复用、哪些必须修改。

对比项参考板目标板BSP 影响
调试串口UART2UART0修改 stdout-path 与 Pinmux
以太网 PHYRTL8211YT8531更换 PHY 驱动与复位 GPIO
DDR 容量4GB2GB调整内存节点与训练参数
PMICRK8xx分立 DCDC重写 regulator 节点

三、原理图与数据手册阅读方法

原理图回答"板子上怎么连",数据手册回答"SoC 内部怎么用",两者必须交叉阅读。推荐流程如下:

  1. 先看原理图的电源树,确认各路供电电压、上电顺序和使能信号。
  2. 再看时钟树,确认晶振频率、时钟输入引脚和分频关系。
  3. 定位目标外设,沿网络标号找到 SoC 引脚编号,记录引脚名与复用功能。
  4. 打开数据手册的 Pinmux 表和寄存器手册,确认该引脚的复用寄存器位域。
  5. 核对中断引脚、复位引脚、片选引脚,写入设备树。

阅读时重点关注网络标号命名规律,例如 GPIO1_A2、I2C3_SCL_M0,其中 M0/M1 表示复用组,选错组会导致外设无响应。数据手册中要重点查阅电气特性、时序参数和寄存器基地址。

# 从设备树反查引脚复用状态
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins

# 查看已注册的 regulator 与电压
cat /sys/kernel/debug/regulator/regulator_summary

# 查看时钟树
cat /sys/kernel/debug/clk/clk_summary

四、内存映射与地址空间

SoC 内部各控制器通过固定物理地址访问,形成内存映射(Memory Map)。BSP 工程师需要区分三类地址:

  • DRAM 地址空间:内核、设备树、ramdisk 加载位置,通常由启动参数 bootargs 指定。
  • 外设寄存器空间:如 UART、GPIO、I2C 控制器基地址,驱动通过 reg = <0x0 0xff1c0000 0x0 0x1000> 声明。
  • 保留内存:给 TrustZone、VPU、显示 framebuffer 预留的区域,需在设备树 reserved-memory 中声明,避免被内核占用。

地址映射错误是 BSP 调试中最常见的故障源之一:寄存器基地址写错会导致读写无响应,保留内存未声明会导致显示花屏或随机崩溃。建议在启动日志中核对 Memory: 行与设备树 memory 节点是否一致。

常见误区:直接照搬参考板的地址映射。目标板若更换了 DDR 容量或调整了外设基地址,必须重新核对,否则会出现"驱动加载成功但功能异常"的隐蔽问题。

五、案例:一次以太网不通的排查

某目标板以太网无法识别 PHY。排查路径:先查原理图确认 PHY 地址为 0x1,再查设备树 phy-handle 与 reg 是否匹配,发现设备树仍沿用参考板的 0x0;同时复位 GPIO 引脚号因 Pinmux 变更而错误。修正两处后网络恢复。该案例说明:原理图、数据手册、设备树三者必须闭环核对。

SoC 内存映射与板级资源关系图 SoC 内部 CPU 集群 / CCI 0x0_0000_0000 DDR 控制器 0x0_0000_0000~ UART / I2C / GPIO 0xff1c0000 等 以太网 / PCIe 0xfe300000 等 Pinmux / CCU / PMU 0xff280000 等 板级设计 电源树 / 上电时序 PMIC 或分立 DCDC 晶振 / 时钟输入 24MHz / 32.768kHz 外设器件 PHY / Flash / WiFi 引脚连接 网络标号 / 复用组 复位 / 中断 GPIO GPIO1_A2 等 BSP 描述 设备树 memory 节点 DRAM 容量与基址 reserved-memory TrustZone / VPU 外设 reg 属性 基地址 + 长度 pinctrl 节点 复用组与电气属性 regulator / clock 供电与时钟树

六、复盘与建议

硬件平台认知不是一次性工作,而是贯穿 BSP 全流程的基础能力。建议建立三份文档:板级差异对照表、关键引脚与地址清单、原理图-设备树映射表。每次修改设备树后,回到原理图和数据手册核对一遍,能显著降低"改一处、坏三处"的风险。掌握这套方法后,面对任何新板卡都能快速定位适配切入点。