0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度解析RK806 PMIC驱动:从寄存器到实际应用(实现长按电源键开机)

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-28 10:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

RK806瑞芯微Rockchip)推出的一款高性能电源管理ICPMIC),广泛应用于基于瑞芯微芯片的嵌入式设备中。其Linux驱动基于MFDMulti-Function Device)框架开发,集成了电源键、电压调节、中断处理等核心功能。本文将从驱动架构、核心代码、关键功能到实际扩展,全面解析RK806驱动的实现逻辑。

一、RK806驱动整体架构

RK806驱动采用Linux MFD框架设计,将PMIC的多个功能(如引脚控制、电源键、电压调节器)拆分为独立的子设备,核心特点如下:

基于regmap管理寄存器读写,简化底层硬件操作;

通过reg_field抽象寄存器位段,降低位操作复杂度;

基于中断芯片(regmap_irq_chip)处理各类硬件中断;

支持设备树(DT)配置,实现驱动参数的灵活定制;

提供sysfs调试接口,方便寄存器读写调试。

驱动核心文件为rk806-core.c,整体流程可概括为:寄存器字段定义设备初始化子设备注册中断初始化功能配置

二、核心代码模块解析

1.寄存器字段抽象:reg_field数组

RK806的寄存器操作是驱动的基础,代码中通过rk806_reg_fields数组定义了所有关键寄存器的位段映射,涵盖:

电源使能(BUCK/LDOEN位):如BUCK1_ENNLDO1_EN等;

电压配置(ON/SLP模式电压):如BUCK1_ON_VSELPLDO3_SLP_VSEL等;

中断状态/配置:如INT_POLVB_LO_STS等;

系统配置:如PWRON_ON_TIME(电源键开机延时)、DEV_OFF(设备关机)等。

示例代码(电源使能位段):

[BUCK1_EN] = REG_FIELD(0X00,0,0),  // 0x00寄存器的0位为BUCK1使能[NLDO1_EN] = REG_FIELD(0x03,0,0),  // 0x03寄存器的0位为NLDO1使能[DEV_OFF] = REG_FIELD(0x72,0,0),  // 0x72寄存器的0位为设备关机控制

通过regmap_field_read/write接口,可直接操作这些位段,无需手动计算寄存器偏移和掩码,大幅简化代码。

2. MFD子设备注册

RK806驱动通过mfd_cell数组注册子设备,对应PMIC的不同功能模块:

staticconststructmfd_cell rk806_cells[] = {  { .name ="rk806-pinctrl", },    // 引脚控制子设备  {    .name ="rk805-pwrkey",    // 电源键子设备    .num_resources = ARRAY_SIZE(rk806_pwrkey_resources),    .resources = &rk806_pwrkey_resources[0],  },  { .name ="rk806-regulator", },  // 电压调节器子设备};

子设备通过devm_mfd_add_devices接口注册,由MFD框架管理,实现功能解耦。

3.中断处理机制

RK806的中断包括电源键、低电压(VB_LO)、VDC电压变化等,驱动通过regmap_irq_chip实现中断管理:

1)中断定义

staticconststructregmap_irq rk806_irqs[] = {  REGMAP_IRQ_REG(RK806_IRQ_PWRON_FALL,0, RK806_INT_STS_PWRON_FALL),  REGMAP_IRQ_REG(RK806_IRQ_VB_LO,0, RK806_INT_STS_VB_LO),  REGMAP_IRQ_REG(RK806_IRQ_VDC_RISE,0, RK806_INT_STS_VDC_RISE),};

2)中断初始化

ret = devm_regmap_add_irq_chip(rk806->dev,               rk806->regmap,               rk806->irq,               IRQF_ONESHOT | IRQF_SHARED,               0,               &rk806_irq_chip,               &rk806->irq_data);

3)典型中断处理

以低电压(VB_LO)中断为例,驱动实现了低电压阈值配置和中断注册:

staticintrk806_low_power_irqs(structrk806 *rk806){ // 配置低电压触发方式为中断 rk806_field_write(rk806, VB_LO_ACT, VB_LO_ACT_INT); // 配置低电压阈值(2800~3500mV) rk806_field_write(rk806, VB_LO_SEL, (pdata->low_voltage_threshold -2800) /100); // 注册中断处理函数  ret =devm_request_threaded_irq(rk806->dev, vb_lo_irq,                 NULL, rk806_vb_low_irq,                  IRQF_TRIGGER_HIGH | IRQF_ONESHOT,                 "rk806_vb_low", rk806);}

4.设备初始化流程

rk806_device_init是驱动的核心初始化函数,流程如下:

1.分配寄存器字段映射(devm_regmap_field_alloc);

2.读取芯片ID/版本信息(CHIP_NAME_H/LCHIP_VER);

3.解析设备树参数(rk806_parse_dt):如低电压阈值、关机电压阈值、VDC唤醒使能等;

4.中断初始化(rk806_irq_init):配置中断极性(如INT_POL为低电平有效);

5.注册中断芯片和MFD子设备;

6.引脚控制初始化(rk806_pinctrl_init);

7.低电压/VDC中断初始化(rk806_low_power_irqs/rk806_vdc_irqs_init);

8.创建sysfs调试节点。

5.调试接口:sysfs节点

驱动提供了debugsysfs节点(对应rk806_master_attrs/rk806_slaver_attrs),支持读写寄存器:

写操作:echo w [addr] [value] > debug(写入寄存器);

读操作:echo r [addr] > debug(读取寄存器)。

示例代码(写寄存器逻辑):

case'w':  ret = sscanf(buf,"%c%x%x", &cmd, &input[0], &input[1]);  addr = input[0] &0xff;  data = input[1] &0xff;  regmap_write(rk806->regmap, addr, data);  regmap_read(rk806->regmap, addr, &data);//回读验证  pr_info("new:%x%xn", addr, data); break;

该接口可快速调试寄存器配置,无需修改驱动代码,是开发/调试阶段的重要工具。

三、关键功能扩展:电源键3秒检测逻辑

在嵌入式设备中,常需实现电源键长按3秒开机/短按关机的逻辑,代码中注释的rk806_check_pwrkey_3s函数正是该需求的实现,核心思路:

1.循环检测PWRON_STS(电源键状态),每100ms检测一次,累计3秒;

2.若中途检测到按键松开,触发硬件关机(写入DEV_OFF字段);

3.3秒内按键持续按下,配置开机参数并唤醒系统。

核心代码实现:

staticintrk806_check_pwrkey_3s(structrk806 *rk806){ intcheck_count =0; intmax_check =30;// 30×100ms=3000ms intpwr_on_sts; while(check_count < max_check) {   // 读取电源键状态    pwr_on_sts = rk806_field_read(rk806, PWRON_STS);   if(pwr_on_sts < 0)returnpwr_on_sts;   // 按键松开,触发关机   if(pwr_on_sts ==1) {      dev_info(rk806->dev,"PWRON released, trigger shutdown...n");     returnrk806_field_write(rk806, DEV_OFF,0x01);    }    msleep(100);    check_count++;  } // 3秒长按,触发开机  dev_info(rk806->dev,"PWRON pressed 3s, trigger boot...n");  rk806_field_write(rk806, PWRON_ON_TIME,0x00);// 配置开机延时500ms  pm_wakeup_dev_event(rk806->dev,5000,true);// 唤醒系统 return0;}

该逻辑可直接集成到rk806_device_init中,实现电源键的定制化操作。

四、实际应用与调试技巧

1.设备树配置示例

RK806的参数可通过设备树灵活配置,无需修改驱动代码:

rk806: pmic@0{  compatible ="rockchip,rk806";  low_voltage_threshold = <3000>;//低电压阈值3000mV  shutdown_voltage_threshold = <2700>;//关机电压阈值2700mV  vdc-wakeup-enable;//使能VDC电压变化唤醒  pwron-on-time-500ms;//电源键开机延时500ms};

驱动通过device_property_read_u32解析这些参数,适配不同硬件需求。

wKgZO2l5clKAT3fxAAEgVgkWKA8945.png

2.调试技巧

读取芯片版本:通过CHIP_NAME_H/LCHIP_VER字段,确认芯片型号和版本;

调试寄存器:使用sysfsdebug节点读写寄存器,验证配置是否生效;

中断调试:通过cat /proc/interrupts查看中断触发次数,确认中断是否正常;

电源键状态:读取PWRON_STS字段,确认按键状态是否正确识别。

五、总结

RK806驱动是典型的MFD框架应用,其设计思路对PMIC驱动开发具有重要参考意义:

1.采用regmapreg_field抽象寄存器操作,降低硬件耦合

2.基于MFD框架拆分功能模块,提高代码可维护性;

3.充分利用设备树,实现驱动参数的灵活配置;

4.提供完善的调试接口,降低开发/调试成本。

5.这个逻辑移植到uboot下效果会更好

无论是基础的电压配置、中断处理,还是定制化的电源键逻辑,RK806驱动都提供了清晰的实现思路。掌握该驱动的核心逻辑,可快速适配瑞芯微平台的PMIC定制需求,也为其他品牌PMIC驱动开发提供参考。


审核编辑 黄宇

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

    关注

    31

    文章

    5607

    浏览量

    129784
  • PMIC
    +关注

    关注

    15

    文章

    470

    浏览量

    113008
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开关电源pcb设计实例 分析RK806电源方案的PCB设计

    模块峰值电流表进行知悉,供PCB Layout时评估线宽作用,如下表值得注意的是,不能简单的全部加起来算成SOC的峰值电流,要评估散热方案,根据实际场景的工作平均电流进行,表格参数值仅供参考。 本篇内容以RK806电源方案的PC
    的头像 发表于 08-02 08:41 3409次阅读
    开关<b class='flag-5'>电源</b>pcb设计实例 分析<b class='flag-5'>RK806</b><b class='flag-5'>电源</b>方案的PCB设计

    一文解析Matlab如何实现移位寄存器

    本文主要介绍Matlab如何实现移位寄存器,首先介绍的是移位寄存器的原理及作用,其次介绍了m序列的生成原理及m序列的matlab 仿真实现,最后介绍了Matlab如何
    的头像 发表于 04-26 09:28 1.8w次阅读
    一文<b class='flag-5'>解析</b>Matlab如何<b class='flag-5'>实现</b>移位<b class='flag-5'>寄存器</b>

    浅析寄存器用户态与内核态

    寄存器是CPU内部重要的组成部分,寄存器内部由N个触发组成,每个触发可以保存1位二进制数,所以16位寄存器可以保存16个bit。
    的头像 发表于 01-30 15:28 3545次阅读

    PLCHTTP服务端获取JSON文件,解析数据寄存器

    文件提交给HTTP的服务端; 服务端有返回的JSON,或者GET命令获取到的JSON,网关进行解析后将数据写入PLC寄存器。 本文主要描述通过GET命令获取数据,解析
    发表于 01-24 09:47

    RK3588 EVB开发板原理图讲解【三】

    为高电平期间,RK806 不能被关机。若要实现插适配器开机功能,需要给 VDC 脚做 RC 延时(可根据实际情况插入相应的 RC 延时电路图,便于理解其
    发表于 02-14 16:13

    RK3588 EVB开发板原理图讲解【七】

    流程◦ Power Key 开机流程◦ 关机方式1. RK3588 实际板型开机电路描述2. 长按强制关机和复位的区别探讨
    发表于 02-28 08:51

    RK3128 Android 7.1 进入深度休眠流程分析

    4. 唤醒流程当以下任一事件发生时,系统深度休眠唤醒: 电源按下 RTC闹钟触发 其他预设的唤醒源信号 5. 调试与验证可以通过以下方式验证
    发表于 07-22 10:45

    如何去实现RK809长按PWR重启呢

    如何去实现RK809长按PWR重启呢?如何对其进行测试呢?
    发表于 02-16 07:52

    求助: rk3399 android9如何实现短按电源开机

    rk3399开机一般都是长按电源,现在设计成关机时,按一下电源
    发表于 11-07 17:01

    CSD寄存器解析

    CSD寄存器解析,SD卡寄存器解说,值得学习。
    发表于 01-06 14:25 0次下载

    寄存器与移位寄存器

    寄存器与移位寄存器:介绍寄存器原理和移位寄存器的原理及实现
    发表于 05-20 11:47 0次下载

    RK806电源方案的PCB设计注意事项

    的太远,摆放方向时,尽量优先考虑 RK806的BUCK1、BUCK2、BUCK3、BUCK4这些输出电流比较大的电源RK3588的信号流向是顺畅的。 图1 整体
    的头像 发表于 09-23 07:40 2242次阅读
    <b class='flag-5'>RK806</b><b class='flag-5'>电源</b>方案的PCB设计注意事项

    解决RK806+RK3588休眠异常!硬件特性软件优化的完整方案

    在嵌入式开发中,电源管理的稳定性直接决定了设备的可靠性。近期,RK3588 平台搭配 RK806 电源管理芯片(PMIC)时,出现了二次休眠
    的头像 发表于 02-09 16:46 676次阅读
    解决<b class='flag-5'>RK806+RK</b>3588休眠异常!<b class='flag-5'>从</b>硬件特性<b class='flag-5'>到</b>软件优化的完整方案

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

    在嵌入式设备中,PMIC电源管理集成电路)是 “能源管家”—— 它不仅为 CPU、内存、外设提供稳定电压,还需处理休眠唤醒、异常保护、动态调压等核心逻辑。瑞芯微 RK806 作为一款高集成度
    的头像 发表于 02-05 13:47 578次阅读
    <b class='flag-5'>深度</b>拆解<b class='flag-5'>RK806</b> <b class='flag-5'>PMIC</b><b class='flag-5'>电源</b>处理流程:<b class='flag-5'>从</b>SPI通信到DVS动态调压

    RK806中断处理流程深度解析架构调试实战

    RK806 作为瑞芯微主流 PMIC电源管理芯片),其中断机制是实现电源响应、电压异常保护
    的头像 发表于 02-05 13:46 512次阅读
    <b class='flag-5'>RK806</b>中断处理流程<b class='flag-5'>深度</b><b class='flag-5'>解析</b>:<b class='flag-5'>从</b>架构<b class='flag-5'>到</b>调试实战