一起游 手游攻略 手游评测 深度解析RK806 PMIC驱动:从寄存器到实际应用(实现长按电源键开机)

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

时间: 来源:互联网 浏览:0

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

1. RK806驱动整体架构

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

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

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

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

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

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

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

2.核心代码模块分析

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

RK806的寄存器操作是驱动程序的基础。代码中通过rk806_reg_fields数组定义了所有关键寄存器的位域映射,包括:

•电源使能(BUCK/LDO的EN位):如BUCK1_EN、NLDO1_EN等;

•电压配置(ON/SLP模式电压):如BUCK1_ON_VSEL、PLDO3_SLP_VSEL等;

•中断状态/配置:如INT_POL、VB_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), //BUCK1 的位00x72寄存器用于设备关闭控制。通过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/L、CHIP_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]);地址=输入[0]0xff;数据=输入[1]0xff; regmap_write(rk806-regmap,地址,数据); regmap_read(rk806-regmap, addr, data);//回读验证pr_info('new:%x%xn', addr, data);休息;该接口可以快速调试寄存器配置,无需修改驱动代码。它是开发/调试阶段的重要工具。

3.按键功能扩展:电源键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;//30100ms=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 释放,触发关机.n'); returnrk806_field_write(rk806, DEV_OFF,0x01);睡眠(100);检查计数++; } //长按3秒触发开机dev_info(rk806-dev,'PWRON按下3秒,触发开机.n'); rk806_field_write(rk806, PWRON_ON_TIME,0x00);//配置开机延时500ms pm_wakeup_dev_event(rk806-dev,5000,true);//唤醒系统return0;} 该逻辑可以直接集成到rk806_device_init 中,实现电源按钮的自定义操作。

4.实际应用和调试技巧

1. 设备树配置示例

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

rk806: pmic@0{ 兼容='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.png2。调试技巧

•读取芯片版本:通过CHIP_NAME_H/L和CHIP_VER字段确认芯片型号和版本;

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

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

• 电源按钮状态:读取PWRON_STS字段以确认按钮状态是否被正确识别。

5. 总结

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

1、使用regmap和reg_field抽象寄存器操作,减少硬件耦合;

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

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

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

5、如果将此逻辑移植到uboot中效果会更好。

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

评论编辑黄宇

标题:深度解析RK806 PMIC驱动:从寄存器到实际应用(实现长按电源键开机)
链接:https://yqqlyw.com/news/sypc/72587.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2026-01-28
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2026-01-28
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2026-01-28
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2026-01-28