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 | sunxi_rsb_init |
RSB常连接Allwinner PMIC和音频器件。Client通过RSB regmap访问,不直接操作controller寄存器。
3. RSB传输
一次传输由mutex串行:
1 | program runtime address/register/data |
超时会发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 | moxtet_init |
模块顺序决定拓扑。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 | subsys_initcall |
它是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退出顺序必须:
- 停止controller和新枚举;
- unregister所有child;
- unregister host driver;
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运行路径。
正在加载留言…