1. Regulator驅(qū)動(dòng)是什么?
Regulator是Linux系統(tǒng)中電源管理的基礎(chǔ)設(shè)施之一,用于穩(wěn)壓電源的管理,是各種驅(qū)動(dòng)子系統(tǒng)中設(shè)置 電壓的標(biāo)準(zhǔn)接口。前面介紹的CPUFreq驅(qū)動(dòng)就經(jīng)常使用它來(lái)設(shè)定電壓。分為voltage regulator(電壓調(diào)節(jié)器)和current(電流調(diào)節(jié)器)。一般電源管理芯片(Power Management IC)中會(huì)包含一個(gè)甚至多個(gè)regulator。
而Regulator則可以管理系統(tǒng)中的供電單元,即穩(wěn)壓器(Low Dropout Regulator,LDO,即低壓差線性 穩(wěn)壓器),并提供獲取和設(shè)置這些供電單元電壓的接口。一般在ARM電路板上,各個(gè)穩(wěn)壓器和設(shè)備會(huì)形 成一個(gè)Regulator樹(shù)形結(jié)構(gòu),
Regulator的作用是什么?
通常的作用是給電子設(shè)備供電。大多數(shù)regulator可以啟用(enable)和禁用(disable)其輸出,同時(shí)也可以控制其輸出電壓(voltage)和電流(current)。
從上圖可以看出,input power會(huì)經(jīng)過(guò) regulator 轉(zhuǎn)化為output power,regulator可以做如下的約束:
Voltage control: 限制輸出的電壓
Current limiting: 限制最大輸出電流
Power switch: 可以控制電壓enable/disable
Power Domain
電源域由穩(wěn)壓器、開(kāi)關(guān)或其他電源域的輸出電源提供其輸入電源的電子電路。電源Regulator可能位于一個(gè)或多個(gè)開(kāi)關(guān)后面,例如:
Regulator -+-> Switch-1 -+-> Switch-2 --> [Consumer A] | | | +-> [Consumer B], [Consumer C] | +-> [Consumer D], [Consumer E]
這是一個(gè)穩(wěn)壓器和三個(gè)電源域:
Domain 1: Switch-1, Consumers D & E. Domain 2: Switch-2, Consumers B & C. Domain 3: Consumer A.
Regulator電壓設(shè)計(jì)時(shí)的約束:
穩(wěn)壓器級(jí)別:這由穩(wěn)壓器硬件操作參數(shù)定義,并在穩(wěn)壓器數(shù)據(jù)表中指定,例如:``` 電壓輸出范圍為 800mV -> 3500mV 穩(wěn)壓器電流輸出限制為 20mA @ 5V,但為 10mA @ 10V
功率域級(jí)別:這是由內(nèi)核級(jí)板初始化代碼在軟件中定義的。它用于將功率域限制在特定的功率范圍內(nèi),例如:Domain-2 電壓為 1400mV -> 1600mV
Consumer級(jí)別:這是由Consumer驅(qū)動(dòng)程序動(dòng)態(tài)設(shè)置電壓或電流限制級(jí)別定義的。例如 消費(fèi)類(lèi)背光驅(qū)動(dòng)器要求將電流從 5mA 增加到 10mA,以增加 LCD 亮度。
2. Regulator框架介紹
Linux regulator framework的主要目的:
提供標(biāo)準(zhǔn)的內(nèi)核接口,控制系統(tǒng)的voltage/current regulators,并提供相應(yīng)的開(kāi)關(guān)、大小設(shè)置的機(jī)制。
在系統(tǒng)運(yùn)行的過(guò)程中,根據(jù)具體的需要?jiǎng)討B(tài)改變r(jià)egulators的輸出,從而達(dá)到省電的目的。
在系統(tǒng)中如果配錯(cuò)regulator是比較危險(xiǎn)的,可能會(huì)造成硬件器件的損壞。因此,需要在regulator framework中對(duì)電流或者電壓的大小做限定,并且不能被ragulator的consumer或者provider更改。
2.1 regulator consumer
regulator consumer抽象出regulator設(shè)備(struct regulator),并提供regulator操作相關(guān)的接口。包括:regulator_get/regulator_put/regulator_enable/regulator_disable/ regulator_set_voltage/regulator_get_voltage等。
2.2 regulator core
regulator core負(fù)責(zé)上述regulator driver/consumer/machine邏輯的具體實(shí)現(xiàn),對(duì)底層的硬件進(jìn)行封裝,并提供接口給內(nèi)核中其他的consumer(使用當(dāng)前regulator設(shè)備的驅(qū)動(dòng))提供操作接口,并以sysfs的形式,向用戶空間提供接口。
2.3 regulator driver
regulator driver指的是regulator設(shè)備的驅(qū)動(dòng),主要包含如下結(jié)構(gòu):
1)使用struct regulator_desc,描述regulator的靜態(tài)信息,包括:名字、supply regulator的名字、中斷號(hào)、操作函數(shù)集(struct regulator_ops)、使用regmap時(shí)相應(yīng)的寄存器即bitmap等。
2)使用struct regulator_config,描述regulator的動(dòng)態(tài)信息(所謂的動(dòng)態(tài)信息,體現(xiàn)在struct regulator_config變量都是局部變量,因此不會(huì)永久保存),包括struct regulator_init_data指針、設(shè)備指針、enable gpio等。
3)提供regulator的注冊(cè)接口(regulator_register/devm_regulator_register),該接口接受描述該regulator的兩個(gè)變量的指針:struct regulator_desc和struct regulator_config,并分配一個(gè)新的數(shù)據(jù)結(jié)構(gòu)(struct regulator_dev,從設(shè)備的角度描述regulator),并把靜態(tài)指針(struct regulator_desc)和動(dòng)態(tài)指針(struct regulator_config)提供的信息保存在其中。
4)regulator driver以struct regulator_dev(代表設(shè)備)指針為對(duì)象,對(duì)regulator進(jìn)行后續(xù)的操作。
3. DTS配置文件及初始化
例如:arch/arm/boot/dts/100ask_imx6ull_qemu.dts中
regulators { compatible = "simple-bus"; #address-cells = <1>; #size-cells = <0>; reg_can_3v3: regulator@0 { compatible = "regulator-fixed"; reg = <0>; regulator-name = "can-3v3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; /*gpios = <&gpio_spi 3 GPIO_ACTIVE_LOW>;*/ };
subsys_initcall(regulator_fixed_voltage_init); //系統(tǒng)啟動(dòng)時(shí)候執(zhí)行
--》platform_driver_register(®ulator_fixed_voltage_driver);
static struct platform_driver regulator_fixed_voltage_driver = { .probe = reg_fixed_voltage_probe, .driver = { .name = "reg-fixed-voltage", .of_match_table = of_match_ptr(fixed_of_match), .pm = ®_fixed_voltage_pm_ops, }, };
reg_fixed_voltage_probe --》devm_regulator_register(&pdev->dev, &drvdata->desc, &cfg); --》rdev = regulator_register(regulator_desc, config);
regulator_ops指針ops是對(duì)這個(gè)穩(wěn)壓器硬件操作的封裝,其中包含獲取、設(shè)置電壓等的成員函數(shù)
//穩(wěn)壓器硬件操作的封裝,其中包含獲取、設(shè)置電壓等 struct regulator_ops { /* enumerate supported voltages */ int (*list_voltage) (struct regulator_dev *, unsigned selector); /* get/set regulator voltage */ int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV, unsigned *selector); int (*map_voltage)(struct regulator_dev *, int min_uV, int max_uV); int (*set_voltage_sel) (struct regulator_dev *, unsigned selector); int (*get_voltage) (struct regulator_dev *); int (*get_voltage_sel) (struct regulator_dev *); /* get/set regulator current */ int (*set_current_limit) (struct regulator_dev *, int min_uA, int max_uA); int (*get_current_limit) (struct regulator_dev *); int (*set_input_current_limit) (struct regulator_dev *, int lim_uA); int (*set_over_current_protection) (struct regulator_dev *); int (*set_active_discharge) (struct regulator_dev *, bool enable); /* enable/disable regulator */ int (*enable) (struct regulator_dev *); int (*disable) (struct regulator_dev *); int (*is_enabled) (struct regulator_dev *); /* get/set regulator operating mode (defined in consumer.h) */ int (*set_mode) (struct regulator_dev *, unsigned int mode); unsigned int (*get_mode) (struct regulator_dev *); /* Time taken to enable or set voltage on the regulator */ int (*enable_time) (struct regulator_dev *); int (*set_ramp_delay) (struct regulator_dev *, int ramp_delay); int (*set_voltage_time) (struct regulator_dev *, int old_uV, int new_uV); int (*set_voltage_time_sel) (struct regulator_dev *, unsigned int old_selector, unsigned int new_selector); int (*set_soft_start) (struct regulator_dev *); /* report regulator status ... most other accessors report * control inputs, this reports results of combining inputs * from Linux (and other sources) with the actual load. * returns REGULATOR_STATUS_* or negative errno. */ int (*get_status)(struct regulator_dev *); /* get most efficient regulator operating mode for load */ unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV, int output_uV, int load_uA); /* set the load on the regulator */ int (*set_load)(struct regulator_dev *, int load_uA); /* control and report on bypass mode */ int (*set_bypass)(struct regulator_dev *dev, bool enable); int (*get_bypass)(struct regulator_dev *dev, bool *enable); /* the operations below are for configuration of regulator state when * its parent PMIC enters a global STANDBY/HIBERNATE state */ /* set regulator suspend voltage */ int (*set_suspend_voltage) (struct regulator_dev *, int uV); /* enable/disable regulator in suspend state */ int (*set_suspend_enable) (struct regulator_dev *); int (*set_suspend_disable) (struct regulator_dev *); /* set regulator suspend operating mode (defined in consumer.h) */ int (*set_suspend_mode) (struct regulator_dev *, unsigned int mode); int (*set_pull_down) (struct regulator_dev *); };
4. 運(yùn)行時(shí)調(diào)用
調(diào)壓前要先獲取regulator handle,然后利用regulator_set_voltage進(jìn)行調(diào)壓
5. Consumer API
5.1 Consumer Regulator Access (static & dynamic drivers)
消費(fèi)者驅(qū)動(dòng)程序可以通過(guò)調(diào)用regulator_get訪問(wèn)其供應(yīng)調(diào)節(jié)器:
regulator = regulator_get(dev, "Vcc");
消費(fèi)者傳入其結(jié)構(gòu)設(shè)備指針和電源 ID。然后內(nèi)核通過(guò)查詢特定于機(jī)器的查找表找到正確的調(diào)節(jié)器。如果查找成功,則此調(diào)用將返回一個(gè)指向提供此使用者的結(jié)構(gòu)調(diào)節(jié)器的指針。
要釋放調(diào)節(jié)器,消費(fèi)者驅(qū)動(dòng)程序應(yīng)調(diào)用:
regulator_put(regulator);
消費(fèi)者可以由多個(gè)調(diào)節(jié)器供電,例如 具有模擬和數(shù)字電源的編解碼器消費(fèi)者:
digital = regulator_get(dev, "Vcc"); /* digital core */ analog = regulator_get(dev, "Avdd"); /* analog */
調(diào)節(jié)器訪問(wèn)函數(shù)regulator_get() 和regulator_put() 通常會(huì)分別在您的設(shè)備驅(qū)動(dòng)程序probe() 和remove() 中調(diào)用。
5.2 Regulator Output Enable & Disable (static & dynamic drivers)
消費(fèi)者可以通過(guò)調(diào)用regulator_enable啟用調(diào)節(jié)器:
int regulator_enable(regulator);
在調(diào)用regulator_enabled() 之前,電源可能已經(jīng)啟用。如果消費(fèi)者共享調(diào)節(jié)器或調(diào)節(jié)器先前已由引導(dǎo)加載程序或內(nèi)核板初始化代碼啟用,則可能會(huì)發(fā)生這種情況。消費(fèi)者可以通過(guò)調(diào)用regulator_is_enabled判斷是否啟用了調(diào)節(jié)器:
int regulator_is_enabled(regulator);
當(dāng)調(diào)節(jié)器啟用時(shí),這將返回大于零。消費(fèi)者可以在不再需要時(shí)通過(guò)調(diào)用禁用其供應(yīng):
int regulator_disable(regulator);
如果它與其他消費(fèi)者共享,這可能不會(huì)禁用供應(yīng)。僅當(dāng)啟用的參考計(jì)數(shù)為零時(shí),才會(huì)禁用調(diào)節(jié)器。最后,在緊急情況下可以強(qiáng)制禁用調(diào)節(jié)器:
int regulator_force_disable(regulator);
這將立即強(qiáng)制關(guān)閉穩(wěn)壓器輸出。所有消費(fèi)者都將斷電。
5.3 Regulator Voltage Control & Status (dynamic drivers)
一些消費(fèi)類(lèi)驅(qū)動(dòng)器需要能夠動(dòng)態(tài)改變其電源電壓以匹配系統(tǒng)工作點(diǎn)。例如 CPUfreq 驅(qū)動(dòng)程序可以隨頻率調(diào)整電壓以節(jié)省電量,SD 驅(qū)動(dòng)程序可能需要選擇正確的卡電壓等。
消費(fèi)者可以通過(guò)調(diào)用來(lái)控制他們的電源電壓:
int regulator_set_voltage(regulator, min_uV, max_uV);
其中 min_uV 和 max_uV 是以微伏為單位的最小和最大可接受電壓。這可以在調(diào)節(jié)器啟用或禁用時(shí)調(diào)用。如果在已啟用regulator時(shí)調(diào)用,則電壓會(huì)立即更改,否則電壓配置會(huì)更改,并且在下一次啟用穩(wěn)壓器時(shí)會(huì)物理設(shè)置電壓。調(diào)節(jié)器配置的電壓輸出可以通過(guò)調(diào)用找到:
int regulator_get_voltage(regulator);
無(wú)論調(diào)節(jié)器是啟用還是禁用,get_voltage() 都將返回配置的輸出電壓,并且不應(yīng)用于確定調(diào)節(jié)器輸出狀態(tài)。然而,這可以與 is_enabled() 結(jié)合使用來(lái)確定穩(wěn)壓器物理輸出電壓。
5.4 Regulator Current Limit Control & Status (dynamic drivers)
一些消費(fèi)類(lèi)驅(qū)動(dòng)程序需要能夠動(dòng)態(tài)更改其電源電流限制以匹配系統(tǒng)工作點(diǎn)。例如 LCD 背光驅(qū)動(dòng)程序可以更改電流限制以改變背光亮度,USB 驅(qū)動(dòng)程序可能希望在供電時(shí)將限制設(shè)置為 500mA。消費(fèi)者可以通過(guò)調(diào)用來(lái)控制他們的電源電流限制:
int regulator_set_current_limit(regulator, min_uA, max_uA);
其中 min_uA 和 max_uA 是以微安為單位的最小和最大可接受電流限制。
這可以在調(diào)節(jié)器啟用或禁用時(shí)調(diào)用。如果在已啟用電流限制時(shí)調(diào)用,則電流限制會(huì)立即更改,否則電流限制配置會(huì)更改,并且在下一次啟用調(diào)節(jié)器時(shí)會(huì)設(shè)置電流限制。
通過(guò)調(diào)用可以找到調(diào)節(jié)器電流限制:
int regulator_get_current_limit(regulator);
無(wú)論調(diào)節(jié)器是啟用還是禁用,get_current_limit() 都將返回電流限制,并且不應(yīng)用于確定調(diào)節(jié)器電流負(fù)載。
5.5 Regulator Operating Mode Control & Status (dynamic drivers)
一些消費(fèi)者可以通過(guò)改變其電源調(diào)節(jié)器的工作模式來(lái)進(jìn)一步節(jié)省系統(tǒng)功率,以便在消費(fèi)者工作狀態(tài)發(fā)生變化時(shí)提高效率。例如 消費(fèi)者驅(qū)動(dòng)程序空閑,隨后消耗較少的電流.調(diào)節(jié)器操作模式可以間接或直接改變。
間接操作模式控制 消費(fèi)者驅(qū)動(dòng)程序可以通過(guò)以下調(diào)用請(qǐng)求更改其電源調(diào)節(jié)器操作模式:
int regulator_set_load(struct regulator *regulator, int load_uA);
這將導(dǎo)致core重新計(jì)算調(diào)節(jié)器上的總負(fù)載(基于其所有消費(fèi)者)并更改操作模式(如果必要和允許)以最佳匹配當(dāng)前操作負(fù)載。load_uA 值可以從消費(fèi)者的數(shù)據(jù)表中確定。例如 大多數(shù)數(shù)據(jù)表都有表格顯示在某些情況下消耗的最大電流。大多數(shù)消費(fèi)者將使用間接操作模式控制,因?yàn)樗麄儾涣私庹{(diào)節(jié)器或調(diào)節(jié)器是否與其他消費(fèi)者共享
直接操作模式控制 定制或緊密耦合的驅(qū)動(dòng)器可能希望根據(jù)其工作點(diǎn)直接控制調(diào)節(jié)器的工作模式, 這可以通過(guò)調(diào)用:
int regulator_set_mode(struct regulator *regulator, unsigned int mode); unsigned int regulator_get_mode(struct regulator *regulator); 直接模式將僅由了解有關(guān)調(diào)節(jié)器且不與其他消費(fèi)者共享調(diào)節(jié)器的消費(fèi)者使用
5.6 Regulator Events
監(jiān)管機(jī)構(gòu)可以將外部事件通知消費(fèi)者, 在監(jiān)管機(jī)構(gòu)壓力或故障條件下,消費(fèi)者可能會(huì)收到事件。消費(fèi)者調(diào)用以下接口注冊(cè)感興趣的事件:
int regulator_register_notifier(struct regulator *regulator, struct notifier_block *nb); 消費(fèi)者調(diào)用以下接口反注冊(cè)感興趣的事件:
int regulator_unregister_notifier(struct regulator *regulator, struct notifier_block *nb); 監(jiān)管機(jī)構(gòu)使用內(nèi)核通知程序框架向感興趣的消費(fèi)者發(fā)送事件。
5.7 Regulator Direct Register Access
某些類(lèi)型的電源管理硬件或固件被設(shè)計(jì)為需要對(duì)調(diào)節(jié)器進(jìn)行低級(jí)硬件訪問(wèn),而無(wú)需內(nèi)核參與,此類(lèi)設(shè)備的示例有:
帶有壓控振蕩器和控制邏輯的時(shí)鐘源,可通過(guò) I2C 改變電源電壓,以實(shí)現(xiàn)所需的輸出時(shí)鐘速率 熱管理固件,可發(fā)出任意 I2C 事務(wù)以在過(guò)熱條件下執(zhí)行系統(tǒng)斷電 要設(shè)置這樣的設(shè)備/固件,需要為其配置各種參數(shù),例如調(diào)節(jié)器的 I2C 地址、各種調(diào)節(jié)器寄存器的地址等。監(jiān)管者框架提供了以下查詢這些詳細(xì)信息的幫助程序。
特定于總線的詳細(xì)信息,例如 I2C 地址或傳輸速率,由 regmap 框架處理。要獲取監(jiān)管機(jī)構(gòu)的 regmap(如果支持),請(qǐng)使用:
struct regmap *regulator_get_regmap(struct regulator *regulator); 要獲取穩(wěn)壓器電壓選擇器寄存器的硬件寄存器偏移量和位掩碼,請(qǐng)使用:
int regulator_get_hardware_vsel_register(struct regulator *regulator, unsigned *vsel_reg, unsigned *vsel_mask); 要將調(diào)節(jié)器框架電壓選擇器代碼(由調(diào)節(jié)器列表電壓使用)轉(zhuǎn)換為可直接寫(xiě)入電壓選擇器寄存器的特定于硬件的電壓選擇器,請(qǐng)使用:
int regulator_list_hardware_vsel(struct regulator *regulator, unsigned selector);
6. Driver Interface
驅(qū)動(dòng)程序可以通過(guò)調(diào)用以下接口注冊(cè)Regulator:struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, const struct regulator_config *config); 這會(huì)將regulator的能力和操作注冊(cè)到regulator核心。注銷(xiāo)接口如下:void regulator_unregister(struct regulator_dev *rdev);
調(diào)節(jié)器可以通過(guò)調(diào)用以下方式向消費(fèi)者驅(qū)動(dòng)程序發(fā)送事件(例如過(guò)熱、欠壓等):int regulator_notifier_call_chain(struct regulator_dev *rdev, unsigned long event, void *data)
最后來(lái)個(gè)大圖:
審核編輯:劉清
-
穩(wěn)壓器
+關(guān)注
關(guān)注
24文章
4570瀏覽量
95527 -
電源管理
+關(guān)注
關(guān)注
116文章
6400瀏覽量
145780 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
603瀏覽量
28290 -
輸出電壓
+關(guān)注
關(guān)注
2文章
1463瀏覽量
39024 -
電壓調(diào)節(jié)器
+關(guān)注
關(guān)注
3文章
154瀏覽量
18258
原文標(biāo)題:電源管理入門(mén)-11Regulator驅(qū)動(dòng)
文章出處:【微信號(hào):OS與AUTOSAR研究,微信公眾號(hào):OS與AUTOSAR研究】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
電源管理入門(mén):驅(qū)動(dòng)Runtime PM管理

電源驅(qū)動(dòng)ic的作用是什么 電源IC驅(qū)動(dòng)電路設(shè)計(jì)圖

用STM8-MC_KIT庫(kù)來(lái)控制BLDC電機(jī),如何調(diào)用PI_Regulator()函數(shù)??
學(xué)習(xí)嵌入式小白基于4412修改電源管理芯片8767電壓輸出
迅為4412開(kāi)發(fā)板-驅(qū)動(dòng)-電源管理芯片S5M8767修改輸出例程
如何使用Linux regulator系統(tǒng)通過(guò)一個(gè)GPIO控制外部IC的電源
電源管理芯片的regulator用法有哪些呢
電源管理regulator分成哪幾種?怎樣去使用呢
Protecting Super LDO Regulator
Buck Regulator Generates Ultra

4A switching regulator with ov

高通平臺(tái)電源管理regulator介紹

[Linux 驅(qū)動(dòng)] -- 電源管理芯片之 Regulator 用法 與具體使用實(shí)例
![[Linux <b class='flag-5'>驅(qū)動(dòng)</b>] -- <b class='flag-5'>電源</b><b class='flag-5'>管理</b>芯片之 <b class='flag-5'>Regulator</b> 用法 與具體使用實(shí)例](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
電源管理芯片之 Regulator 用法 與具體使用實(shí)例

評(píng)論