Rockchip Power Management Driver (rockchip-pm)
一个用于 Rockchip SoC 的 Rust 电源管理驱动库,提供基础的电源域控制功能。
特性
- 🔋 基础电源域控制: 支持 RK3588 电源域的开关操作
- 🛡️ 内存安全: 利用 Rust 类型系统确保内存和线程安全
- 📋 无标准库:
#![no_std]设计,适用于嵌入式环境 - 🎯 硬件准确: 直接寄存器访问,无抽象开销
- 🔌 名称查找: 支持通过名称查找电源域
- 📦 驱动框架: 基于 rdif-base 驱动框架
快速开始
use ;
use NonNull;
// 初始化 RK3588 PMU(基础地址通常来自设备树)
let pmu_base = unsafe ;
let mut pm = new;
// 使用 ID 控制电源域
let npu_domain = new; // NPU 主域
pm.power_domain_on?;
// 通过名称查找电源域
if let Some = pm.get_power_dowain_by_name
// 关闭电源域
pm.power_domain_off?;
API 文档
核心结构体
板型支持
电源域类型
错误处理
pub type NpuResult<T> = ;
主要方法
支持的电源域 (RK3588)
计算域
- NPU (ID: 8) - 神经处理单元主域
- NPUTOP (ID: 9) - NPU 顶层域
- NPU1 (ID: 10) - NPU 核心 1
- NPU2 (ID: 11) - NPU 核心 2
图形域
- GPU (ID: 0) - 图形处理单元
- VOP (ID: 26) - 视频输出处理器
- VO0 (ID: 27) - 视频输出 0
- VO1 (ID: 28) - 视频输出 1
视频域
- VCODEC (ID: 4) - 视频编解码器主域
- VENC0 (ID: 5) - 视频编码器 0
- VENC1 (ID: 6) - 视频编码器 1
- RKVDEC0 (ID: 7) - Rockchip 视频解码器 0
- RKVDEC1 (ID: 12) - Rockchip 视频解码器 1
- AV1 (ID: 18) - AV1 解码器
- VDPU (ID: 2) - 视频处理单元
图像域
- VI (ID: 29) - 视频输入
- ISP1 (ID: 30) - 图像信号处理器
- RGA30 (ID: 15) - 光栅图形加速器 30
- RGA31 (ID: 16) - 光栅图形加速器 31
总线域
- PHP (ID: 17) - PHP 控制器
- GMAC (ID: 19) - 千兆以太网 MAC
- PCIE (ID: 20) - PCIe 控制器
- SDIO (ID: 21) - SDIO 控制器
- USB (ID: 22) - USB 控制器
- SDMMC (ID: 23) - SD/MMC 控制器
其他域
- AUDIO (ID: 1) - 音频子系统
- FEC (ID: 24) - 前向纠错编码
- NVM (ID: 25) - 非易失性存储器
- NVM0 (ID: 3) - NVM 域 0
项目结构
rockchip-pm/
├── src/
│ ├── lib.rs # 主 API 和 RockchipPM 结构
│ ├── registers/mod.rs # 寄存器定义和访问抽象
│ └── variants/ # 芯片特定实现
│ ├── mod.rs # PowerDomain 类型和通用结构
│ ├── _macros.rs # 电源域定义宏
│ └── rk3588.rs # RK3588 电源域定义
├── tests/
│ └── test.rs # NPU 电源控制集成测试
├── Cargo.toml # 项目配置和依赖
├── build.rs # 构建脚本
├── rust-toolchain.toml # Rust 工具链配置
└── README.md # 项目文档
构建和测试
环境要求
- Rust 1.75+ (nightly)
- aarch64-unknown-none-softfloat 目标支持
构建步骤
# 添加目标架构支持
# 构建库
# 构建发布版本
# 检查代码
运行测试
项目包含 1 个集成测试,验证 NPU 电源域控制功能:
# 在开发板上运行测试(需要 U-Boot 环境)
测试内容:
- ✅ RK3588 NPU 相关电源域开关
- ✅ 设备树电源域解析
- ✅ 寄存器访问验证
依赖项
核心依赖
- rdif-base (v0.7): 设备驱动框架
- tock-registers (v0.10): 类型安全的寄存器访问和位域操作
- mbarrier (v0.1): 内存屏障原语,用于寄存器访问排序
- dma-api (v0.5): DMA API 支持
- log (v0.4): 日志记录
开发依赖
- bare-test (v0.7): 裸机测试框架
构建依赖
- bare-test-macros (v0.2): 测试宏定义
硬件兼容性
支持的芯片
- RK3588: ✅ 已完整实现
- RK3568: ❌ 未实现(代码中为
unimplemented!()占位符)
开发板
- RK3588 板型:
- Orange Pi 5/5 Plus/5B
- Rock 5A/5B/5C
- NanoPC-T6
- 其他基于 RK3588/RK3588S 的开发板
内存映射要求
使用本库需要确保:
- 正确的 PMU 基础地址:
- RK3588: 通常为
0xfd8d8000(请从设备树验证)
- RK3588: 通常为
- 内存映射权限: PMU 寄存器区域的读写权限
- 时钟配置: 确保 PMU 时钟正确配置
工作原理
电源开启流程
- 写入电源控制寄存器,开启电源域
- 轮询状态寄存器,等待电源域稳定(最多 10000 次循环)
- 验证电源状态是否成功开启
电源关闭流程
- 写入电源控制寄存器,关闭电源域
- 轮询状态寄存器,等待电源域稳定(最多 10000 次循环)
- 验证电源状态是否成功关闭
安全注意事项
⚠️ 重要: 本库直接操作硬件寄存器。使用前请确保:
- 系统 PMU 硬件已正确初始化
- 没有其他驱动同时控制相同电源域
- 在真实硬件上使用前进行充分验证
License
本项目采用 MIT 许可证。
贡献
欢迎贡献!请提交 Issue 和 Pull Request。
开发环境设置
# 克隆项目
# 安装开发工具
# 格式化代码
# 运行代码检查
参考资料
- Linux 内核
drivers/soc/rockchip/pm_domains.c - RK3588 技术参考手册
- Rockchip 电源域设备树绑定文档
注意: 本驱动是底层系统软件。确保硬件寄存器操作符合芯片规格。在生产环境中使用前请进行充分测试。