chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析RK806 PMIC驅(qū)動(dòng):從寄存器到實(shí)際應(yīng)用(實(shí)現(xiàn)長按電源鍵開機(jī))

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-01-28 10:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

RK806瑞芯微Rockchip)推出的一款高性能電源管理ICPMIC),廣泛應(yīng)用于基于瑞芯微芯片的嵌入式設(shè)備中。其Linux驅(qū)動(dòng)基于MFDMulti-Function Device)框架開發(fā),集成了電源鍵、電壓調(diào)節(jié)、中斷處理等核心功能。本文將從驅(qū)動(dòng)架構(gòu)、核心代碼、關(guān)鍵功能到實(shí)際擴(kuò)展,全面解析RK806驅(qū)動(dòng)的實(shí)現(xiàn)邏輯。

一、RK806驅(qū)動(dòng)整體架構(gòu)

RK806驅(qū)動(dòng)采用Linux MFD框架設(shè)計(jì),將PMIC的多個(gè)功能(如引腳控制、電源鍵、電壓調(diào)節(jié)器)拆分為獨(dú)立的子設(shè)備,核心特點(diǎn)如下:

?基于regmap管理寄存器讀寫,簡化底層硬件操作;

?通過reg_field抽象寄存器位段,降低位操作復(fù)雜度;

?基于中斷芯片(regmap_irq_chip)處理各類硬件中斷;

?支持設(shè)備樹(DT)配置,實(shí)現(xiàn)驅(qū)動(dòng)參數(shù)的靈活定制;

?提供sysfs調(diào)試接口,方便寄存器讀寫調(diào)試。

驅(qū)動(dòng)核心文件為rk806-core.c,整體流程可概括為:寄存器字段定義設(shè)備初始化子設(shè)備注冊中斷初始化功能配置。

二、核心代碼模塊解析

1.寄存器字段抽象:reg_field數(shù)組

RK806的寄存器操作是驅(qū)動(dòng)的基礎(chǔ),代碼中通過rk806_reg_fields數(shù)組定義了所有關(guān)鍵寄存器的位段映射,涵蓋:

?電源使能(BUCK/LDOEN位):如BUCK1_EN、NLDO1_EN等;

?電壓配置(ON/SLP模式電壓):如BUCK1_ON_VSELPLDO3_SLP_VSEL等;

?中斷狀態(tài)/配置:如INT_POL、VB_LO_STS等;

?系統(tǒng)配置:如PWRON_ON_TIME(電源鍵開機(jī)延時(shí))、DEV_OFF(設(shè)備關(guān)機(jī))等。

示例代碼(電源使能位段):

[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位為設(shè)備關(guān)機(jī)控制

通過regmap_field_read/write接口,可直接操作這些位段,無需手動(dòng)計(jì)算寄存器偏移和掩碼,大幅簡化代碼。

2. MFD子設(shè)備注冊

RK806驅(qū)動(dòng)通過mfd_cell數(shù)組注冊子設(shè)備,對應(yīng)PMIC的不同功能模塊:

staticconststructmfd_cell rk806_cells[] = {  { .name ="rk806-pinctrl", },    // 引腳控制子設(shè)備  {    .name ="rk805-pwrkey",    // 電源鍵子設(shè)備    .num_resources = ARRAY_SIZE(rk806_pwrkey_resources),    .resources = &rk806_pwrkey_resources[0],  },  { .name ="rk806-regulator", },  // 電壓調(diào)節(jié)器子設(shè)備};

子設(shè)備通過devm_mfd_add_devices接口注冊,由MFD框架管理,實(shí)現(xiàn)功能解耦。

3.中斷處理機(jī)制

RK806的中斷包括電源鍵、低電壓(VB_LO)、VDC電壓變化等,驅(qū)動(dòng)通過regmap_irq_chip實(shí)現(xiàn)中斷管理:

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)中斷為例,驅(qū)動(dòng)實(shí)現(xiàn)了低電壓閾值配置和中斷注冊:

staticintrk806_low_power_irqs(structrk806 *rk806){ // 配置低電壓觸發(fā)方式為中斷 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); // 注冊中斷處理函數(shù)  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.設(shè)備初始化流程

rk806_device_init是驅(qū)動(dòng)的核心初始化函數(shù),流程如下:

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

2.讀取芯片ID/版本信息(CHIP_NAME_H/L、CHIP_VER);

3.解析設(shè)備樹參數(shù)(rk806_parse_dt):如低電壓閾值、關(guān)機(jī)電壓閾值、VDC喚醒使能等;

4.中斷初始化(rk806_irq_init):配置中斷極性(如INT_POL為低電平有效);

5.注冊中斷芯片和MFD子設(shè)備;

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

7.低電壓/VDC中斷初始化(rk806_low_power_irqs/rk806_vdc_irqs_init);

8.創(chuàng)建sysfs調(diào)試節(jié)點(diǎn)。

5.調(diào)試接口:sysfs節(jié)點(diǎn)

驅(qū)動(dòng)提供了debugsysfs節(jié)點(diǎn)(對應(yīng)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);//回讀驗(yàn)證  pr_info("new:%x%xn", addr, data); break;

該接口可快速調(diào)試寄存器配置,無需修改驅(qū)動(dòng)代碼,是開發(fā)/調(diào)試階段的重要工具。

三、關(guān)鍵功能擴(kuò)展:電源鍵3秒檢測邏輯

在嵌入式設(shè)備中,常需實(shí)現(xiàn)電源鍵長按3秒開機(jī)/短按關(guān)機(jī)的邏輯,代碼中注釋的rk806_check_pwrkey_3s函數(shù)正是該需求的實(shí)現(xiàn),核心思路:

1.循環(huán)檢測PWRON_STS(電源鍵狀態(tài)),每100ms檢測一次,累計(jì)3秒;

2.若中途檢測到按鍵松開,觸發(fā)硬件關(guān)機(jī)(寫入DEV_OFF字段);

3.3秒內(nèi)按鍵持續(xù)按下,配置開機(jī)參數(shù)并喚醒系統(tǒng)。

核心代碼實(shí)現(xiàn):

staticintrk806_check_pwrkey_3s(structrk806 *rk806){ intcheck_count =0; intmax_check =30;// 30×100ms=3000ms intpwr_on_sts; while(check_count < max_check) {   // 讀取電源鍵狀態(tài)    pwr_on_sts = rk806_field_read(rk806, PWRON_STS);   if(pwr_on_sts 0)returnpwr_on_sts;   // 按鍵松開,觸發(fā)關(guān)機(jī)   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秒長按,觸發(fā)開機(jī)  dev_info(rk806->dev,"PWRON pressed 3s, trigger boot...n");  rk806_field_write(rk806, PWRON_ON_TIME,0x00);// 配置開機(jī)延時(shí)500ms  pm_wakeup_dev_event(rk806->dev,5000,true);// 喚醒系統(tǒng) return0;}

該邏輯可直接集成到rk806_device_init中,實(shí)現(xiàn)電源鍵的定制化操作。

四、實(shí)際應(yīng)用與調(diào)試技巧

1.設(shè)備樹配置示例

RK806的參數(shù)可通過設(shè)備樹靈活配置,無需修改驅(qū)動(dòng)代碼:

rk806: pmic@0{  compatible ="rockchip,rk806";  low_voltage_threshold = <3000>;//低電壓閾值3000mV  shutdown_voltage_threshold = <2700>;//關(guān)機(jī)電壓閾值2700mV  vdc-wakeup-enable;//使能VDC電壓變化喚醒  pwron-on-time-500ms;//電源鍵開機(jī)延時(shí)500ms};

驅(qū)動(dòng)通過device_property_read_u32解析這些參數(shù),適配不同硬件需求。

wKgZO2l5clKAT3fxAAEgVgkWKA8945.png

2.調(diào)試技巧

?讀取芯片版本:通過CHIP_NAME_H/LCHIP_VER字段,確認(rèn)芯片型號和版本;

?調(diào)試寄存器:使用sysfsdebug節(jié)點(diǎn)讀寫寄存器,驗(yàn)證配置是否生效;

?中斷調(diào)試:通過cat /proc/interrupts查看中斷觸發(fā)次數(shù),確認(rèn)中斷是否正常;

?電源鍵狀態(tài):讀取PWRON_STS字段,確認(rèn)按鍵狀態(tài)是否正確識別。

五、總結(jié)

RK806驅(qū)動(dòng)是典型的MFD框架應(yīng)用,其設(shè)計(jì)思路對PMIC驅(qū)動(dòng)開發(fā)具有重要參考意義:

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

2.基于MFD框架拆分功能模塊,提高代碼可維護(hù)性;

3.充分利用設(shè)備樹,實(shí)現(xiàn)驅(qū)動(dòng)參數(shù)的靈活配置;

4.提供完善的調(diào)試接口,降低開發(fā)/調(diào)試成本。

5.這個(gè)邏輯移植到uboot下效果會(huì)更好

無論是基礎(chǔ)的電壓配置、中斷處理,還是定制化的電源鍵邏輯,RK806驅(qū)動(dòng)都提供了清晰的實(shí)現(xiàn)思路。掌握該驅(qū)動(dòng)的核心邏輯,可快速適配瑞芯微平臺的PMIC定制需求,也為其他品牌PMIC驅(qū)動(dòng)開發(fā)提供參考。


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5611

    瀏覽量

    130145
  • PMIC
    +關(guān)注

    關(guān)注

    15

    文章

    485

    瀏覽量

    113120
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    開關(guān)電源pcb設(shè)計(jì)實(shí)例 分析RK806電源方案的PCB設(shè)計(jì)

    模塊峰值電流表進(jìn)行知悉,供PCB Layout時(shí)評估線寬作用,如下表值得注意的是,不能簡單的全部加起來算成SOC的峰值電流,要評估散熱方案,根據(jù)實(shí)際場景的工作平均電流進(jìn)行,表格參數(shù)值僅供參考。 本篇內(nèi)容以RK806電源方案的PC
    的頭像 發(fā)表于 08-02 08:41 ?3478次閱讀
    開關(guān)<b class='flag-5'>電源</b>pcb設(shè)計(jì)實(shí)例 分析<b class='flag-5'>RK806</b><b class='flag-5'>電源</b>方案的PCB設(shè)計(jì)

    一文解析Matlab如何實(shí)現(xiàn)移位寄存器

    本文主要介紹Matlab如何實(shí)現(xiàn)移位寄存器,首先介紹的是移位寄存器的原理及作用,其次介紹了m序列的生成原理及m序列的matlab 仿真實(shí)現(xiàn),最后介紹了Matlab如何
    的頭像 發(fā)表于 04-26 09:28 ?1.8w次閱讀
    一文<b class='flag-5'>解析</b>Matlab如何<b class='flag-5'>實(shí)現(xiàn)</b>移位<b class='flag-5'>寄存器</b>

    淺析寄存器用戶態(tài)與內(nèi)核態(tài)

    寄存器是CPU內(nèi)部重要的組成部分,寄存器內(nèi)部由N個(gè)觸發(fā)組成,每個(gè)觸發(fā)可以保存1位二進(jìn)制數(shù),所以16位寄存器可以保存16個(gè)bit。
    的頭像 發(fā)表于 01-30 15:28 ?3600次閱讀

    ?PLCHTTP服務(wù)端獲取JSON文件,解析數(shù)據(jù)寄存器

    文件提交給HTTP的服務(wù)端; 服務(wù)端有返回的JSON,或者GET命令獲取到的JSON,網(wǎng)關(guān)進(jìn)行解析后將數(shù)據(jù)寫入PLC寄存器。 本文主要描述通過GET命令獲取數(shù)據(jù),解析
    發(fā)表于 01-24 09:47

    RK3588 EVB開發(fā)板原理圖講解【三】

    為高電平期間,RK806 不能被關(guān)機(jī)。若要實(shí)現(xiàn)插適配器開機(jī)功能,需要給 VDC 腳做 RC 延時(shí)(可根據(jù)實(shí)際情況插入相應(yīng)的 RC 延時(shí)電路圖,便于理解其
    發(fā)表于 02-14 16:13

    RK3588 EVB開發(fā)板原理圖講解【七】

    流程? Power Key 開機(jī)流程? 關(guān)機(jī)方式1. RK3588 實(shí)際板型開機(jī)電路描述2. 長按強(qiáng)制關(guān)機(jī)和復(fù)位的區(qū)別探討
    發(fā)表于 02-28 08:51

    RK3128 Android 7.1 進(jìn)入深度休眠流程分析

    4. 喚醒流程當(dāng)以下任一事件發(fā)生時(shí),系統(tǒng)深度休眠喚醒: 電源按下 RTC鬧鐘觸發(fā) 其他預(yù)設(shè)的喚醒源信號 5. 調(diào)試與驗(yàn)證可以通過以下方式驗(yàn)證
    發(fā)表于 07-22 10:45

    如何去實(shí)現(xiàn)RK809長按PWR重啟呢

    如何去實(shí)現(xiàn)RK809長按PWR重啟呢?如何對其進(jìn)行測試呢?
    發(fā)表于 02-16 07:52

    求助: rk3399 android9如何實(shí)現(xiàn)短按電源開機(jī)?

    rk3399開機(jī)一般都是長按電源,現(xiàn)在設(shè)計(jì)成關(guān)機(jī)時(shí),按一下電源
    發(fā)表于 11-07 17:01

    CSD寄存器解析

    CSD寄存器解析,SD卡寄存器解說,值得學(xué)習(xí)。
    發(fā)表于 01-06 14:25 ?0次下載

    寄存器與移位寄存器

    寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實(shí)現(xiàn)
    發(fā)表于 05-20 11:47 ?0次下載

    RK806電源方案的PCB設(shè)計(jì)注意事項(xiàng)

    的太遠(yuǎn),擺放方向時(shí),盡量優(yōu)先考慮 RK806的BUCK1、BUCK2、BUCK3、BUCK4這些輸出電流比較大的電源RK3588的信號流向是順暢的。 圖1 整體
    的頭像 發(fā)表于 09-23 07:40 ?2395次閱讀
    <b class='flag-5'>RK806</b><b class='flag-5'>電源</b>方案的PCB設(shè)計(jì)注意事項(xiàng)

    解決RK806+RK3588休眠異常!硬件特性軟件優(yōu)化的完整方案

    在嵌入式開發(fā)中,電源管理的穩(wěn)定性直接決定了設(shè)備的可靠性。近期,RK3588 平臺搭配 RK806 電源管理芯片(PMIC)時(shí),出現(xiàn)了二次休眠
    的頭像 發(fā)表于 02-09 16:46 ?808次閱讀
    解決<b class='flag-5'>RK806+RK</b>3588休眠異常!<b class='flag-5'>從</b>硬件特性<b class='flag-5'>到</b>軟件優(yōu)化的完整方案

    深度拆解RK806 PMIC電源處理流程:SPI通信到DVS動(dòng)態(tài)調(diào)壓

    在嵌入式設(shè)備中,PMIC電源管理集成電路)是 “能源管家”—— 它不僅為 CPU、內(nèi)存、外設(shè)提供穩(wěn)定電壓,還需處理休眠喚醒、異常保護(hù)、動(dòng)態(tài)調(diào)壓等核心邏輯。瑞芯微 RK806 作為一款高集成度
    的頭像 發(fā)表于 02-05 13:47 ?1561次閱讀
    <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動(dòng)態(tài)調(diào)壓

    RK806中斷處理流程深度解析架構(gòu)調(diào)試實(shí)戰(zhàn)

    RK806 作為瑞芯微主流 PMIC電源管理芯片),其中斷機(jī)制是實(shí)現(xiàn)電源響應(yīng)、電壓異常保護(hù)
    的頭像 發(fā)表于 02-05 13:46 ?1410次閱讀
    <b class='flag-5'>RK806</b>中斷處理流程<b class='flag-5'>深度</b><b class='flag-5'>解析</b>:<b class='flag-5'>從</b>架構(gòu)<b class='flag-5'>到</b>調(diào)試實(shí)戰(zhàn)