在嵌入式设备中,PMIC(电源管理集成电路)是“能源管家”——它不仅为CPU、内存、外设提供稳定电压,还需处理休眠唤醒、异常保护、动态调压等核心逻辑。瑞芯微RK806作为一款高集成度PMIC,支持10路DCDC稳压器、6路PLDO+5路NLDO,广泛应用于工业控制、智能硬件等场景。
本文将从驱动架构出发,逐层拆解RK806的电源处理流程(初始化、电压调节、休眠唤醒、关机保护),结合核心代码与流程图,帮你吃透底层逻辑,为定制电源方案、调试问题提供参考。
一、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)专注细分功能,形成“总线→核心→子设备”的分层架构。
二、第一步:RK806初始化流程(从SPI匹配到电源就绪)
初始化是PMIC工作的基础——从SPI设备被系统识别,到完成寄存器配置、子设备加载,最终进入可工作状态。整个流程可分为SPI通信初始化和核心参数配置两大阶段。
2.1初始化数据流程
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)。
2.2初始化流程图(Mermaid)

三、核心能力:电压调节与DVS动态调压流程
电压调节是PMIC的核心功能——既要为不同外设提供固定电压(如CPU核心1.2V、内存1.8V),也要支持DVS(动态电压调节)(根据负载调整电压,降低功耗)。
3.1常规电压调节流程(固定电压设置)
当应用层需要设置某路稳压器电压(如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,确认电压已更新并打印调试信息。
3.2 DVS动态调压流程(负载自适应)
DVS用于“按需调压”——比如CPU负载低时降为0.9V,负载高时升为1.2V,实现功耗优化。RK806支持GPIO触发和软件触发两种DVS模式:
模式1: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值,完成电压切换。
模式2:软件触发DVS(软件命令控制)
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,加载对应电压值。
3.3电压调节流程图

四、休眠唤醒与关机保护:电源状态管理
RK806需处理设备的“休眠-唤醒”状态切换,以及“低电压/过温”的异常保护,确保系统稳定。
4.1休眠-唤醒流程
休眠流程(系统进入低功耗)
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状态,外设恢复供电。
4.2关机与异常保护流程
RK806支持正常关机和异常关机(低电压/过温),核心是“按序列关闭电源”,避免硬件损坏。
1.正常关机流程
1.关机触发:系统执行shutdown,调用rk806_regulator_shutdown;
2.加载关机序列:调用rk806_shutdown_requence_config,从设备树读取shutdown-sequence(如先关DCDC10,再关DCDC9...);
3.引脚状态切换:pinctrl_select_state切换到power_off状态,触发电源关闭信号;
4.按序列关电:按预设序列关闭所有DCDC/LDO,完成关机。
2.异常保护流程(低电压为例)
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寄存器),硬件复位系统。
4.3休眠唤醒与关机流程图



五、RK806电源处理的核心设计亮点
1.分层解耦架构:SPI总线层(屏蔽硬件差异)、核心控制层(统一调度)、子设备层(专注细分功能),便于维护和扩展;
2.灵活的调压机制:支持线性电压映射、多模式DVS,适配不同负载场景;
3.完善的异常保护:低电压(2800-3500mV)、过温(140℃/160℃)双重保护,避免硬件损坏;
4.便捷的调试接口:sysfs节点支持寄存器读写,无需修改代码即可调试电源参数;
5.设备树驱动分离:电压阈值、关机序列等参数通过设备树配置,无需重新编译驱动,适配不同硬件。
总结
RK806的电源处理流程,本质是“以regmap为核心,分层实现通信、控制、调压、保护”——从SPI通信初始化,到电压调节、休眠唤醒,再到异常关机,每一步都围绕“稳定供电”和“低功耗”展开。
对于工程师而言,理解这一流程不仅能快速定位电源问题(如电压不稳定、DVS失效),还能根据实际需求定制电源方案(如调整DVS阈值、优化关机序列)。后续我们还将拆解RK806的中断处理、GPIO控制细节,敬请关注!
如果觉得本文有帮助,欢迎点赞、在看,转发给身边的嵌入式同行~
-
稳压器
+关注
关注
24文章
4975浏览量
100508 -
内存
+关注
关注
9文章
3238浏览量
76524 -
PMIC
+关注
关注
15文章
495浏览量
113199
发布评论请先 登录
开关电源pcb设计实例 分析RK806电源方案的PCB设计
如何通过动态电压调整(DVS)来实现精密电压调节?
RK3588 EVB开发板原理图讲解【一】
RK3588 EVB开发板原理图讲解【三】
RK3588 EVB开发板原理图讲解【七】
RK3128 Android 7.1 进入深度休眠流程分析
请问WiFi模块通过串口通信到ZigBee模块的程序吗?
一文解析RK3288 PMU配置RK808
求一种RK3588+FPGA高速图像处理通信处理机解决方案
瑞芯微:已有多款搭载RK3588M芯片乘用车面世
解决RK806+RK3588休眠异常!从硬件特性到软件优化的完整方案
深度拆解RK806 PMIC电源处理流程:从SPI通信到DVS动态调压
评论