RSB、MOXTET 与 MIPS CDMM 专用总线

RSB、MOXTET 与 MIPS CDMM 专用总线

1. 共性与差异

三者都注册自定义bus_type,但传输和枚举来源完全不同:

Bus 底层 枚举
Sunxi RSB 专用串行控制器 DT child
MOXTET SPI连接的模块链 读取模块拓扑
MIPS CDMM CPU内部memory map 每CPU扫描

它们的client driver不能改注册为platform driver,因为match、modalias和I/O API均属于专用bus。

2. Sunxi RSB初始化

1
2
3
4
5
6
7
8
9
10
sunxi_rsb_init
-> bus_register(sunxi_rsb_bus)
-> platform_driver_register
sunxi_rsb_probe
-> map MMIO/request IRQ
-> clocks/reset
-> controller soft reset/divider
-> runtime PM autosuspend
-> parse DT children
-> sunxi_rsb_device_create

RSB常连接Allwinner PMIC和音频器件。Client通过RSB regmap访问,不直接操作controller寄存器。

3. RSB传输

一次传输由mutex串行:

1
2
3
4
program runtime address/register/data
-> start transfer
-> wait completion
-> IRQ读取status并complete

超时会发ABORT并返回错误;NACK、data error、busy需要区分。Runtime PM负责clock,system sleep执行更完整的hardware exit/init。

Controller设置pm_suspend_ignore_children(true),意味着children不会自动阻止父设备系统挂起,client必须遵守总线suspend约束。

4. MOXTET

MOXTET用于Turris MOX可堆叠模块:

1
2
3
4
5
6
7
moxtet_init
-> bus_register(moxtet)
-> spi_register_driver
moxtet_probe
-> SPI读取模块链
-> 按slot/type创建设备
-> 专用driver匹配

模块顺序决定拓扑。Driver导出device read/write、IRQ/GPIO相关接口。热插并非普通PCI/USB级动态发现,需按硬件支持评估。

moxtet_device的parent是SPI host对应对象,但function driver绑定在moxtet bus。

5. MIPS CDMM

CDMM是MIPS CPU内紧耦合device memory map,设备可能是Fast Debug Channel等。

1
2
3
4
5
subsys_initcall
-> bus_register(mips_cdmm)
-> register CPU hotplug callbacks
-> each CPU scan ACSR/CDMM region
-> register mips_cdmm_device

它是per-CPU总线。CPU online/offline会影响设备可达性,driver不能假设固定boot CPU永久在线。

6. Match与Modalias

  • RSB按sunxi_rsb_device_id/compatible;
  • MOXTET按module type;
  • CDMM按device type/revision。

各自uevent生成专用modalias供模块自动加载。

7. 生命周期

自定义bus退出顺序必须:

  1. 停止controller和新枚举;
  2. unregister所有child;
  3. unregister host driver;
  4. bus_unregister()

若先注销bus type,仍注册的device/driver会留下无效引用。

8. 错误处理

  • RSB事务错误可按单次传输返回errno;
  • MOXTET拓扑读取失败通常使整条模块链不可用;
  • CDMM扫描或CPU offline属于设备生命周期变化。

三者都不适合套用MHI的重型ring recovery,也不能用simple-pm-bus代替。

9. RK3588

RK3588不具备Sunxi RSB、MOXTET模块链或MIPS CDMM,Kconfig和DTS均不匹配。这些实现用于理解Linux自定义bus type,而非RK3588运行路径。

文章互动

阅读 --

留言

0 条留言

正在加载留言…