深度拆解RK806 PMIC电源处理流程:从SPI通信到DVS动态调压 电子说
在嵌入式设备中,PMIC(电源管理集成电路)是 “能源管家”—— 它不仅为 CPU、内存、外设提供稳定电压,还需处理休眠唤醒、异常保护、动态调压等核心逻辑。瑞芯微 RK806 作为一款高集成度 PMIC,支持 10 路 DCDC 稳压器、6 路 PLDO+5 路 NLDO,广泛应用于工业控制、智能硬件等场景。
本文将从驱动架构出发,逐层拆解 RK806 的电源处理流程(初始化、电压调节、休眠唤醒、关机保护),结合核心代码与流程图,帮你吃透底层逻辑,为定制电源方案、调试问题提供参考。
RK806 的 Linux 驱动基于MFD(多功能设备)框架设计,通过 4 个核心文件实现功能解耦,各模块职责清晰:
|
文件名
|
核心功能
|
关键接口 / 作用
|
|
rk806-spi.c
|
SPI 总线通信层
|
实现 regmap 读写接口,对接硬件 SPI
|
|
rk806-core.c
|
核心控制层
|
设备初始化、中断管理、子设备加载
|
|
pinctrl-rk806.c
|
引脚控制层
|
GPIO 管理、引脚复用(DVS/PWRCTRL)
|
|
rk806-regulator.c
|
稳压器驱动层
|
电压调节、DVS 动态调压、异常保护
|
核心设计思路:以regmap为数据交互核心(屏蔽总线差异),core层统一调度,子模块(regulator/pinctrl)专注细分功能,形成 “总线→核心→子设备” 的分层架构。
初始化是 PMIC 工作的基础 —— 从 SPI 设备被系统识别,到完成寄存器配置、子设备加载,最终进入可工作状态。整个流程可分为SPI 通信初始化和核心参数配置两大阶段。
1.SPI 设备匹配:系统枚举 SPI 设备时,通过rk806_of_match(兼容rockchip,rk806)或spi_id_table匹配驱动;
2.SPI 通信层初始化:调用rk806_spi_probe,分配rk806结构体,绑定 SPI 设备的dev、irq;
3.regmap 初始化:通过devm_regmap_init,将 SPI 总线的读写函数(rk806_spi_bus_read/write)封装为 regmap 接口,上层无需关心 SPI 协议细节;
4.核心初始化入口:调用rk806_device_init(core.c),启动核心配置;
5.设备树解析:rk806_parse_dt读取电压阈值(如low_voltage_threshold)、关机序列(shutdown-sequence)、DVS 控制参数,默认值兜底(如低电压阈值默认 3400mV);
6.寄存器字段映射:初始化regmap_field,将寄存器某几位映射为独立字段(如BUCK1_EN对应 0x00 寄存器 0 位),方便单独读写;
7.芯片信息校验:读取CHIP_NAME_H/L、CHIP_VER,打印芯片 ID(如 RK806 的 ID 为 RKxx)和版本,确认硬件匹配;
8.中断系统初始化:添加regmap_irq_chip,管理 16 路中断(如 PWRON 按键、VDC 电压变化、过温),启用唤醒中断(如 VDC 中断);
9.加载 MFD 子设备:通过devm_mfd_add_devices加载 3 个子设备 ——rk806-pinctrl(引脚)、rk805-pwrkey(电源键)、rk806-regulator(稳压器);
10.电源参数配置:rk806_init设置电压保护阈值(如 VB_UV_SEL)、TSD 过温阈值(140℃/160℃)、启用 2MHz 时钟,初始化强制关机序列;
11.调试节点创建:在 sysfs 创建debug节点,支持通过命令读写寄存器(如echo "w 0x00 0x01" > /sys/rk806/debug)。

电压调节是 PMIC 的核心功能 —— 既要为不同外设提供固定电压(如 CPU 核心 1.2V、内存 1.8V),也要支持DVS(动态电压调节)(根据负载调整电压,降低功耗)。
当应用层需要设置某路稳压器电压(如 DCDC_REG1 输出 1.2V)时,流程如下:
1.应用层请求:通过 sysfs 或 regulator API 发起请求(如echo 1200000 > /sys/class/regulator/DCDC_REG1/microvolts);
2.regulator 框架调度:Linux regulator 框架调用rk806_set_voltage(regulator.c);
3.电压→VSEL 映射:调用regulator_map_voltage_linear_range,将目标电压(1200000μV)映射为 VSEL 值 ——
以 DCDC 为例,电压范围分两段:500mV~1500mV(步长 6.25mV)、1500mV~3400mV(步长 25mV),1200mV 对应 VSEL=112((1200-500)/6.25=112);
4.确定目标寄存器:调用rk806_get_write_vsel_register,根据 DVS 模式选择写入寄存器(正常模式写ON_VSEL,休眠模式写SLP_VSEL);
5.写入寄存器:通过regmap_update_bits将 VSEL 值写入目标寄存器(如 DCDC_REG1 对应BUCK1_ON_VSEL=0x1A);
6.同步电压状态:调用rk806_regulator_sync_voltage,确认电压已更新并打印调试信息。
DVS 用于 “按需调压”—— 比如 CPU 负载低时降为 0.9V,负载高时升为 1.2V,实现功耗优化。RK806 支持GPIO 触发和软件触发两种 DVS 模式:
1.DVS 引脚配置:通过设备树配置dvs-pin1_ctrl,将 PWRCTRL1 引脚复用为 DVS 触发引脚;
2.电平变化检测:DVS 引脚电平变化(如从高变低),触发 GPIO 中断;
3.切换 VSEL 寄存器:调用rk806_do_gpio_dvs,读取 GPIO 电平 ——
◦电平 = 0:切换为休眠电压(读SLP_VSEL);
◦电平 = 1:切换为工作电压(读ON_VSEL);
1.更新输出电压:regmap 自动加载对应 VSEL 值,完成电压切换。
1.DVS 模式初始化:通过rk806_dvs_mode_init配置为“start bit 控制” 模式;
2.软件触发:应用层触发 DVS(如 CPU 负载升高),调用rk806_do_soft_dvs;
3.设置 DVS_START 位:向DVS_START1~3寄存器(0x70)写入 1,触发 DVS 切换;
4.切换电压:regmap 根据预设的DVS_CTRL_SEL,加载对应电压值。

RK806 需处理设备的 “休眠 - 唤醒” 状态切换,以及 “低电压 / 过温” 的异常保护,确保系统稳定。
1.休眠触发:系统执行suspend(如echo mem > /sys/power/state);
2.核心中断处理:调用rk806_core_suspend,禁用 RK806 主 IRQ,启用 IRQ 唤醒(如 VDC 中断、PWRON 按键);
3.regulator 休眠配置:调用regulator_suspend,设置休眠电压(写入SLP_VSEL),切换 DVS 控制方式为 “休眠模式”;
4.引脚状态切换:pinctrl_select_state将引脚切换到sleep状态(如禁用非必要外设引脚)。
1.唤醒源触发:唤醒源(如 PWRON 按键、VDC 电压恢复)触发 IRQ;
2.核心中断恢复:调用rk806_core_resume,启用主 IRQ,禁用 IRQ 唤醒;
3.regulator 恢复:调用regulator_resume,恢复工作电压(加载ON_VSEL),重置 DVS 控制为 “正常模式”;
4.引脚恢复:pinctrl_select_state将引脚切换回default状态,外设恢复供电。
RK806 支持正常关机和异常关机(低电压 / 过温),核心是 “按序列关闭电源”,避免硬件损坏。
1.关机触发:系统执行shutdown,调用rk806_regulator_shutdown;
2.加载关机序列:调用rk806_shutdown_requence_config,从设备树读取shutdown-sequence(如先关 DCDC10,再关 DCDC9...);
3.引脚状态切换:pinctrl_select_state切换到power_off状态,触发电源关闭信号;
4.按序列关电:按预设序列关闭所有 DCDC/LDO,完成关机。
1.低电压检测:SYS_STS寄存器(0x5D)的VB_LO_STS位变为 1(检测到输入电压低于阈值);
2.保护策略判断:读取VB_LO_ACT配置(0x5E 寄存器)——
◦VB_LO_ACT_SD(0x00):直接触发关机;
◦VB_LO_ACT_INT(0x01):先发送中断通知系统;
1.强制关机:调用rk806_vb_force_shutdown_init,加载vb-shutdown-sequence,按序列关闭电源;
2.硬件复位:若电压持续过低,触发DEV_RST(0x72 寄存器),硬件复位系统。



1.分层解耦架构:SPI 总线层(屏蔽硬件差异)、核心控制层(统一调度)、子设备层(专注细分功能),便于维护和扩展;
2.灵活的调压机制:支持线性电压映射、多模式 DVS,适配不同负载场景;
3.完善的异常保护:低电压(2800-3500mV)、过温(140℃/160℃)双重保护,避免硬件损坏;
4.便捷的调试接口:sysfs 节点支持寄存器读写,无需修改代码即可调试电源参数;
5.设备树驱动分离:电压阈值、关机序列等参数通过设备树配置,无需重新编译驱动,适配不同硬件。
RK806 的电源处理流程,本质是 “以 regmap 为核心,分层实现通信、控制、调压、保护”—— 从 SPI 通信初始化,到电压调节、休眠唤醒,再到异常关机,每一步都围绕 “稳定供电” 和 “低功耗” 展开。
对于工程师而言,理解这一流程不仅能快速定位电源问题(如电压不稳定、DVS 失效),还能根据实际需求定制电源方案(如调整 DVS 阈值、优化关机序列)。后续我们还将拆解 RK806 的中断处理、GPIO 控制细节,敬请关注!
如果觉得本文有帮助,欢迎点赞、在看,转发给身边的嵌入式同行~
全部0条评论
快来发表一下你的评论吧 !