在嵌入式設(shè)備中,PMIC(電源管理集成電路)是“能源管家”——它不僅為CPU、內(nèi)存、外設(shè)提供穩(wěn)定電壓,還需處理休眠喚醒、異常保護(hù)、動(dòng)態(tài)調(diào)壓等核心邏輯。瑞芯微RK806作為一款高集成度PMIC,支持10路DCDC穩(wěn)壓器、6路PLDO+5路NLDO,廣泛應(yīng)用于工業(yè)控制、智能硬件等場(chǎng)景。
本文將從驅(qū)動(dòng)架構(gòu)出發(fā),逐層拆解RK806的電源處理流程(初始化、電壓調(diào)節(jié)、休眠喚醒、關(guān)機(jī)保護(hù)),結(jié)合核心代碼與流程圖,幫你吃透底層邏輯,為定制電源方案、調(diào)試問(wèn)題提供參考。
一、RK806驅(qū)動(dòng)架構(gòu):四大核心模塊分工
RK806的Linux驅(qū)動(dòng)基于MFD(多功能設(shè)備)框架設(shè)計(jì),通過(guò)4個(gè)核心文件實(shí)現(xiàn)功能解耦,各模塊職責(zé)清晰:
|
文件名
|
核心功能
|
關(guān)鍵接口/作用
|
|
rk806-spi.c
|
SPI總線通信層
|
實(shí)現(xiàn)regmap讀寫(xiě)接口,對(duì)接硬件SPI
|
|
rk806-core.c
|
核心控制層
|
設(shè)備初始化、中斷管理、子設(shè)備加載
|
|
pinctrl-rk806.c
|
引腳控制層
|
GPIO管理、引腳復(fù)用(DVS/PWRCTRL)
|
|
rk806-regulator.c
|
穩(wěn)壓器驅(qū)動(dòng)層
|
電壓調(diào)節(jié)、DVS動(dòng)態(tài)調(diào)壓、異常保護(hù)
|
核心設(shè)計(jì)思路:以regmap為數(shù)據(jù)交互核心(屏蔽總線差異),core層統(tǒng)一調(diào)度,子模塊(regulator/pinctrl)專(zhuān)注細(xì)分功能,形成“總線→核心→子設(shè)備”的分層架構(gòu)。
二、第一步:RK806初始化流程(從SPI匹配到電源就緒)
初始化是PMIC工作的基礎(chǔ)——從SPI設(shè)備被系統(tǒng)識(shí)別,到完成寄存器配置、子設(shè)備加載,最終進(jìn)入可工作狀態(tài)。整個(gè)流程可分為SPI通信初始化和核心參數(shù)配置兩大階段。
2.1初始化數(shù)據(jù)流程
1.SPI設(shè)備匹配:系統(tǒng)枚舉SPI設(shè)備時(shí),通過(guò)rk806_of_match(兼容rockchip,rk806)或spi_id_table匹配驅(qū)動(dòng);
2.SPI通信層初始化:調(diào)用rk806_spi_probe,分配rk806結(jié)構(gòu)體,綁定SPI設(shè)備的dev、irq;
3.regmap初始化:通過(guò)devm_regmap_init,將SPI總線的讀寫(xiě)函數(shù)(rk806_spi_bus_read/write)封裝為regmap接口,上層無(wú)需關(guān)心SPI協(xié)議細(xì)節(jié);
4.核心初始化入口:調(diào)用rk806_device_init(core.c),啟動(dòng)核心配置;
5.設(shè)備樹(shù)解析:rk806_parse_dt讀取電壓閾值(如low_voltage_threshold)、關(guān)機(jī)序列(shutdown-sequence)、DVS控制參數(shù),默認(rèn)值兜底(如低電壓閾值默認(rèn)3400mV);
6.寄存器字段映射:初始化regmap_field,將寄存器某幾位映射為獨(dú)立字段(如BUCK1_EN對(duì)應(yīng)0x00寄存器0位),方便單獨(dú)讀寫(xiě);
7.芯片信息校驗(yàn):讀取CHIP_NAME_H/L、CHIP_VER,打印芯片ID(如RK806的ID為RKxx)和版本,確認(rèn)硬件匹配;
8.中斷系統(tǒng)初始化:添加regmap_irq_chip,管理16路中斷(如PWRON按鍵、VDC電壓變化、過(guò)溫),啟用喚醒中斷(如VDC中斷);
9.加載MFD子設(shè)備:通過(guò)devm_mfd_add_devices加載3個(gè)子設(shè)備——rk806-pinctrl(引腳)、rk805-pwrkey(電源鍵)、rk806-regulator(穩(wěn)壓器);
10.電源參數(shù)配置:rk806_init設(shè)置電壓保護(hù)閾值(如VB_UV_SEL)、TSD過(guò)溫閾值(140℃/160℃)、啟用2MHz時(shí)鐘,初始化強(qiáng)制關(guān)機(jī)序列;
11.調(diào)試節(jié)點(diǎn)創(chuàng)建:在sysfs創(chuàng)建debug節(jié)點(diǎn),支持通過(guò)命令讀寫(xiě)寄存器(如echo "w 0x00 0x01" > /sys/rk806/debug)。
2.2初始化流程圖(Mermaid)

三、核心能力:電壓調(diào)節(jié)與DVS動(dòng)態(tài)調(diào)壓流程
電壓調(diào)節(jié)是PMIC的核心功能——既要為不同外設(shè)提供固定電壓(如CPU核心1.2V、內(nèi)存1.8V),也要支持DVS(動(dòng)態(tài)電壓調(diào)節(jié))(根據(jù)負(fù)載調(diào)整電壓,降低功耗)。
3.1常規(guī)電壓調(diào)節(jié)流程(固定電壓設(shè)置)
當(dāng)應(yīng)用層需要設(shè)置某路穩(wěn)壓器電壓(如DCDC_REG1輸出1.2V)時(shí),流程如下:
1.應(yīng)用層請(qǐng)求:通過(guò)sysfs或regulator API發(fā)起請(qǐng)求(如echo 1200000 > /sys/class/regulator/DCDC_REG1/microvolts);
2.regulator框架調(diào)度:Linux regulator框架調(diào)用rk806_set_voltage(regulator.c);
3.電壓→VSEL映射:調(diào)用regulator_map_voltage_linear_range,將目標(biāo)電壓(1200000μV)映射為VSEL值——
以DCDC為例,電壓范圍分兩段:500mV~1500mV(步長(zhǎng)6.25mV)、1500mV~3400mV(步長(zhǎng)25mV),1200mV對(duì)應(yīng)VSEL=112((1200-500)/6.25=112);
4.確定目標(biāo)寄存器:調(diào)用rk806_get_write_vsel_register,根據(jù)DVS模式選擇寫(xiě)入寄存器(正常模式寫(xiě)ON_VSEL,休眠模式寫(xiě)SLP_VSEL);
5.寫(xiě)入寄存器:通過(guò)regmap_update_bits將VSEL值寫(xiě)入目標(biāo)寄存器(如DCDC_REG1對(duì)應(yīng)BUCK1_ON_VSEL=0x1A);
6.同步電壓狀態(tài):調(diào)用rk806_regulator_sync_voltage,確認(rèn)電壓已更新并打印調(diào)試信息。
3.2 DVS動(dòng)態(tài)調(diào)壓流程(負(fù)載自適應(yīng))
DVS用于“按需調(diào)壓”——比如CPU負(fù)載低時(shí)降為0.9V,負(fù)載高時(shí)升為1.2V,實(shí)現(xiàn)功耗優(yōu)化。RK806支持GPIO觸發(fā)和軟件觸發(fā)兩種DVS模式:
模式1:GPIO觸發(fā)DVS(硬件信號(hào)控制)
1.DVS引腳配置:通過(guò)設(shè)備樹(shù)配置dvs-pin1_ctrl,將PWRCTRL1引腳復(fù)用為DVS觸發(fā)引腳;
2.電平變化檢測(cè):DVS引腳電平變化(如從高變低),觸發(fā)GPIO中斷;
3.切換VSEL寄存器:調(diào)用rk806_do_gpio_dvs,讀取GPIO電平——
?電平= 0:切換為休眠電壓(讀SLP_VSEL);
?電平= 1:切換為工作電壓(讀ON_VSEL);
1.更新輸出電壓:regmap自動(dòng)加載對(duì)應(yīng)VSEL值,完成電壓切換。
模式2:軟件觸發(fā)DVS(軟件命令控制)
1.DVS模式初始化:通過(guò)rk806_dvs_mode_init配置為“start bit控制”模式;
2.軟件觸發(fā):應(yīng)用層觸發(fā)DVS(如CPU負(fù)載升高),調(diào)用rk806_do_soft_dvs;
3.設(shè)置DVS_START位:向DVS_START1~3寄存器(0x70)寫(xiě)入1,觸發(fā)DVS切換;
4.切換電壓:regmap根據(jù)預(yù)設(shè)的DVS_CTRL_SEL,加載對(duì)應(yīng)電壓值。
3.3電壓調(diào)節(jié)流程圖

四、休眠喚醒與關(guān)機(jī)保護(hù):電源狀態(tài)管理
RK806需處理設(shè)備的“休眠-喚醒”狀態(tài)切換,以及“低電壓/過(guò)溫”的異常保護(hù),確保系統(tǒng)穩(wěn)定。
4.1休眠-喚醒流程
休眠流程(系統(tǒng)進(jìn)入低功耗)
1.休眠觸發(fā):系統(tǒng)執(zhí)行suspend(如echo mem > /sys/power/state);
2.核心中斷處理:調(diào)用rk806_core_suspend,禁用RK806主IRQ,啟用IRQ喚醒(如VDC中斷、PWRON按鍵);
3.regulator休眠配置:調(diào)用regulator_suspend,設(shè)置休眠電壓(寫(xiě)入SLP_VSEL),切換DVS控制方式為“休眠模式”;
4.引腳狀態(tài)切換:pinctrl_select_state將引腳切換到sleep狀態(tài)(如禁用非必要外設(shè)引腳)。
喚醒流程(系統(tǒng)恢復(fù)工作)
1.喚醒源觸發(fā):?jiǎn)拘言矗ㄈ?/span>PWRON按鍵、VDC電壓恢復(fù))觸發(fā)IRQ;
2.核心中斷恢復(fù):調(diào)用rk806_core_resume,啟用主IRQ,禁用IRQ喚醒;
3.regulator恢復(fù):調(diào)用regulator_resume,恢復(fù)工作電壓(加載ON_VSEL),重置DVS控制為“正常模式”;
4.引腳恢復(fù):pinctrl_select_state將引腳切換回default狀態(tài),外設(shè)恢復(fù)供電。
4.2關(guān)機(jī)與異常保護(hù)流程
RK806支持正常關(guān)機(jī)和異常關(guān)機(jī)(低電壓/過(guò)溫),核心是“按序列關(guān)閉電源”,避免硬件損壞。
1.正常關(guān)機(jī)流程
1.關(guān)機(jī)觸發(fā):系統(tǒng)執(zhí)行shutdown,調(diào)用rk806_regulator_shutdown;
2.加載關(guān)機(jī)序列:調(diào)用rk806_shutdown_requence_config,從設(shè)備樹(shù)讀取shutdown-sequence(如先關(guān)DCDC10,再關(guān)DCDC9...);
3.引腳狀態(tài)切換:pinctrl_select_state切換到power_off狀態(tài),觸發(fā)電源關(guān)閉信號(hào);
4.按序列關(guān)電:按預(yù)設(shè)序列關(guān)閉所有DCDC/LDO,完成關(guān)機(jī)。
2.異常保護(hù)流程(低電壓為例)
1.低電壓檢測(cè):SYS_STS寄存器(0x5D)的VB_LO_STS位變?yōu)?/span>1(檢測(cè)到輸入電壓低于閾值);
2.保護(hù)策略判斷:讀取VB_LO_ACT配置(0x5E寄存器)——
?VB_LO_ACT_SD(0x00):直接觸發(fā)關(guān)機(jī);
?VB_LO_ACT_INT(0x01):先發(fā)送中斷通知系統(tǒng);
1.強(qiáng)制關(guān)機(jī):調(diào)用rk806_vb_force_shutdown_init,加載vb-shutdown-sequence,按序列關(guān)閉電源;
2.硬件復(fù)位:若電壓持續(xù)過(guò)低,觸發(fā)DEV_RST(0x72寄存器),硬件復(fù)位系統(tǒng)。
4.3休眠喚醒與關(guān)機(jī)流程圖



五、RK806電源處理的核心設(shè)計(jì)亮點(diǎn)
1.分層解耦架構(gòu):SPI總線層(屏蔽硬件差異)、核心控制層(統(tǒng)一調(diào)度)、子設(shè)備層(專(zhuān)注細(xì)分功能),便于維護(hù)和擴(kuò)展;
2.靈活的調(diào)壓機(jī)制:支持線性電壓映射、多模式DVS,適配不同負(fù)載場(chǎng)景;
3.完善的異常保護(hù):低電壓(2800-3500mV)、過(guò)溫(140℃/160℃)雙重保護(hù),避免硬件損壞;
4.便捷的調(diào)試接口:sysfs節(jié)點(diǎn)支持寄存器讀寫(xiě),無(wú)需修改代碼即可調(diào)試電源參數(shù);
5.設(shè)備樹(shù)驅(qū)動(dòng)分離:電壓閾值、關(guān)機(jī)序列等參數(shù)通過(guò)設(shè)備樹(shù)配置,無(wú)需重新編譯驅(qū)動(dòng),適配不同硬件。
總結(jié)
RK806的電源處理流程,本質(zhì)是“以regmap為核心,分層實(shí)現(xiàn)通信、控制、調(diào)壓、保護(hù)”——從SPI通信初始化,到電壓調(diào)節(jié)、休眠喚醒,再到異常關(guān)機(jī),每一步都圍繞“穩(wěn)定供電”和“低功耗”展開(kāi)。
對(duì)于工程師而言,理解這一流程不僅能快速定位電源問(wèn)題(如電壓不穩(wěn)定、DVS失效),還能根據(jù)實(shí)際需求定制電源方案(如調(diào)整DVS閾值、優(yōu)化關(guān)機(jī)序列)。后續(xù)我們還將拆解RK806的中斷處理、GPIO控制細(xì)節(jié),敬請(qǐng)關(guān)注!
如果覺(jué)得本文有幫助,歡迎點(diǎn)贊、在看,轉(zhuǎn)發(fā)給身邊的嵌入式同行~
-
穩(wěn)壓器
+關(guān)注
關(guān)注
24文章
4950瀏覽量
100142 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3218瀏覽量
76417 -
PMIC
+關(guān)注
關(guān)注
15文章
488瀏覽量
113132
發(fā)布評(píng)論請(qǐng)先 登錄
開(kāi)關(guān)電源pcb設(shè)計(jì)實(shí)例 分析RK806電源方案的PCB設(shè)計(jì)
如何通過(guò)動(dòng)態(tài)電壓調(diào)整(DVS)來(lái)實(shí)現(xiàn)精密電壓調(diào)節(jié)?
RK3588 EVB開(kāi)發(fā)板原理圖講解【一】
RK3588 EVB開(kāi)發(fā)板原理圖講解【三】
RK3588 EVB開(kāi)發(fā)板原理圖講解【七】
RK3128 Android 7.1 進(jìn)入深度休眠流程分析
請(qǐng)問(wèn)WiFi模塊通過(guò)串口通信到ZigBee模塊的程序嗎?
一文解析RK3288 PMU配置RK808
求一種RK3588+FPGA高速圖像處理通信處理機(jī)解決方案
瑞芯微:已有多款搭載RK3588M芯片乘用車(chē)面世
RK806電源方案的PCB設(shè)計(jì)注意事項(xiàng)
解決RK806+RK3588休眠異常!從硬件特性到軟件優(yōu)化的完整方案
RK806中斷處理流程深度解析:從架構(gòu)到調(diào)試實(shí)戰(zhàn)
RK?平臺(tái)?SPI?開(kāi)發(fā)完全指南(驅(qū)動(dòng)?+?配置?+?測(cè)試?+?優(yōu)化)
深度拆解RK806 PMIC電源處理流程:從SPI通信到DVS動(dòng)態(tài)調(diào)壓
評(píng)論