深度拆解RK806 PMIC电源处理流程:从SPI通信到DVS动态调压

电子说

1.4w人已加入

描述

 

 

在嵌入式设备中,PMIC(电源管理集成电路)是 能源管家”—— 它不仅为 CPU、内存、外设提供稳定电压,还需处理休眠唤醒、异常保护、动态调压等核心逻辑。瑞芯微 RK806 作为一款高集成度 PMIC,支持 10 路 DCDC 稳压器、路 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 设备的devirq

 

 

3.regmap 初始化:通过devm_regmap_init,将 SPI 总线的读写函数(rk806_spi_bus_read/write)封装为 regmap 接口,上层无需关心 SPI 协议细节;

 

 

4.核心初始化入口:调用rk806_device_initcore.c),启动核心配置;

 

 

5.设备树解析rk806_parse_dt读取电压阈值(如low_voltage_threshold)、关机序列(shutdown-sequence)、DVS 控制参数,默认值兜底(如低电压阈值默认 3400mV);

 

 

6.寄存器字段映射:初始化regmap_field,将寄存器某几位映射为独立字段(如BUCK1_EN对应 0x00 寄存器 位),方便单独读写;

 

 

7.芯片信息校验:读取CHIP_NAME_H/LCHIP_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_voltageregulator.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 模式:

 

 

模式 1GPIO 触发 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_SD0x00):直接触发关机;

 

 

VB_LO_ACT_INT0x01):先发送中断通知系统;

 

 

1.强制关机:调用rk806_vb_force_shutdown_init,加载vb-shutdown-sequence,按序列关闭电源;

 

 

2.硬件复位:若电压持续过低,触发DEV_RST0x72 寄存器),硬件复位系统。

 

 

4.3 休眠唤醒与关机流程图

 

稳压器稳压器稳压器

五、RK806 电源处理的核心设计亮点

 

1.分层解耦架构SPI 总线层(屏蔽硬件差异)、核心控制层(统一调度)、子设备层(专注细分功能),便于维护和扩展;

 

 

2.灵活的调压机制:支持线性电压映射、多模式 DVS,适配不同负载场景;

 

 

3.完善的异常保护:低电压(2800-3500mV)、过温(140℃/160℃)双重保护,避免硬件损坏;

 

 

4.便捷的调试接口sysfs 节点支持寄存器读写,无需修改代码即可调试电源参数;

 

 

5.设备树驱动分离:电压阈值、关机序列等参数通过设备树配置,无需重新编译驱动,适配不同硬件。

 

 

总结

 

RK806 的电源处理流程,本质是  regmap 为核心,分层实现通信、控制、调压、保护”—— 从 SPI 通信初始化,到电压调节、休眠唤醒,再到异常关机,每一步都围绕 稳定供电” 和 低功耗” 展开。

 

 

对于工程师而言,理解这一流程不仅能快速定位电源问题(如电压不稳定、DVS 失效),还能根据实际需求定制电源方案(如调整 DVS 阈值、优化关机序列)。后续我们还将拆解 RK806 的中断处理、GPIO 控制细节,敬请关注!

 

 

如果觉得本文有帮助,欢迎点赞、在看,转发给身边的嵌入式同行~


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分