Bus 驱动架构与源码总览
1. 目录定位
drivers/bus收纳无法自然归入PCI、USB、I2C、SPI等标准目录的总线控制器。这里的“bus”至少有四种含义:
- Linux device model中的
struct bus_type; - SoC内部互连及错误监控器;
- 外部并行/串行扩展总线控制器;
- 仅负责供电后再枚举子节点的容器设备。
因此不能假设目录中所有驱动共享同一Core或API。
2. 主要分类
| 类别 | 代表代码 | 作用 |
|---|---|---|
| 自定义设备总线 | MHI、FSL-MC、RSB、MOXTET、MIPS CDMM | 注册bus、device、driver并进行专用匹配 |
| OF容器 | simple-pm-bus.c |
runtime PM并populate子platform device |
| 内部互连 | ARM CCI、OMAP L3、Tegra ACONNECT | coherency、子模块访问或互连错误 |
| 外部存储/扩展 | WEIM、EBI2、GMI、MBUS、UniPhier | chip-select、timing、地址窗口 |
| 错误/QoS | GISB、BT1 AXI/APB、DA8xx MSTPRI | timeout、错误解码、master优先级 |
| SoC功能域 | TI SYSC/PWMSS、Sun50i DE2、QCOM SSC | clock/reset/PM后创建内部设备 |
3. 两种设备模型
多数单文件驱动是platform driver:
1 | DT node |
MHI、FSL-MC等会进一步注册自定义总线:
1 | controller/firmware discovery |
4. 与系统其它目录边界
drivers/base实现通用bus/device/driver Core;drivers/interconnect实现带宽投票框架,不等于本目录互连驱动;drivers/soc/rockchip承载RK3588 PM domain、QoS、system monitor等厂商逻辑;drivers/pci/controller管理RK3588 PCIe Root Complex;- AMBA PrimeCell通用总线位于
drivers/amba; - clock/reset/genpd/syscon分别由各自框架管理。
5. 构建结构
顶层Kconfig定义二十余个平台选项,并source:
drivers/bus/fsl-mc/Kconfig;drivers/bus/mhi/Kconfig。
Makefile无统一bus core目标。simple-pm-bus.o随CONFIG_OF构建;mhi/目录总是进入递归Makefile,但其中对象仍由CONFIG_MHI_*决定。
6. 生命周期共性
总线控制器probe通常按以下顺序:
1 | map resource |
remove必须逆序,且先阻止新I/O、删除子设备,再关clock/power。错误路径若顺序不完整,容易产生访问断电寄存器、DMA仍运行或子设备悬挂。
7. RK3588结论
本目录没有rockchip-*源文件,RK3588 DTS也没有匹配这里平台专用compatible。该平台的NoC/QoS/PM/PCIe等由其它目录的Rockchip驱动负责。
潜在例外是:
simple-pm-bus为通用OF驱动,但只有节点以simple-pm-bus为最具体compatible时才执行PM和child populate;- MHI PCI generic理论上可驱动插在RK3588 PCIe上的受支持蜂窝模组,但当前Rockchip配置未启用MHI,且是否匹配取决于PCI ID而非RK3588 DTS。
8. 分析原则
阅读本目录应先回答:
- 驱动是否注册真正的
bus_type; - 还是只作为platform容器;
- 是否拥有children的电源/clock;
- children来自DT还是固件/硬件枚举;
- 错误处理是报告、复位还是重建总线;
- 目标平台是否实际启用。