詳解linux電源管理驅(qū)動(dòng)編寫
對(duì)于嵌入式設(shè)備來說,合適的電源管理,不僅可以延長(zhǎng)電池的壽命,而且可以省電,延長(zhǎng)設(shè)備運(yùn)行時(shí)間,在提高用戶體驗(yàn)方面有很大的好處。所以,各個(gè)soc廠家在這方面花了很多的功夫。下面,我們可以看看linux是如何處理電源管理驅(qū)動(dòng)的。
1、代碼目錄
drivers/regulator
2、查看目錄下的Kconfig文件
menuconfig REGULATOR bool "Voltage and Current Regulator Support" help Generic Voltage and Current Regulator support. This framework is designed to provide a generic interface to voltage and current regulators within the Linux kernel. It's intended to provide voltage and current control to client or consumer drivers and also provide status information to user space applications through a sysfs interface. The intention is to allow systems to dynamically control regulator output in order to save power and prolong battery life. This applies to both voltage regulators (where voltage output is controllable) and current sinks (where current output is controllable). This framework safely compiles out if not selected so that client drivers can still be used in systems with no software controllable regulators. If unsure, say no.
3、閱讀文件,得知REGULATOR是最核心的模塊macro,那我們可以找一個(gè)設(shè)備的macro看看
config REGULATOR_STM32_VREFBUF tristate "STMicroelectronics STM32 VREFBUF" depends on ARCH_STM32 || COMPILE_TEST help This driver supports STMicroelectronics STM32 VREFBUF (voltage reference buffer) which can be used as voltage reference for internal ADCs, DACs and also for external components through dedicated Vref+ pin. This driver can also be built as a module. If so, the module will be called stm32-vrefbuf.
4、沒有找到s3c,可以看一下stm32芯片的依賴屬性,接著看Makefile
obj-$(CONFIG_REGULATOR) += core.o dummy.o fixed-helper.o helpers.o devres.o obj-$(CONFIG_OF) += of_regulator.o obj-$(CONFIG_REGULATOR_FIXED_VOLTAGE) += fixed.o obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o obj-$(CONFIG_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o
5、看的出來stm32只依賴于stm32-verfbuf.c文件,繼續(xù)查看
static const struct of_device_id stm32_vrefbuf_of_match[] = {
{ .compatible = "st,stm32-vrefbuf", },
{},
};
MODULE_DEVICE_TABLE(of, stm32_vrefbuf_of_match);
static struct platform_driver stm32_vrefbuf_driver = {
.probe = stm32_vrefbuf_probe,
.remove = stm32_vrefbuf_remove,
.driver = {
.name = "stm32-vrefbuf",
.of_match_table = of_match_ptr(stm32_vrefbuf_of_match),
},
};
module_platform_driver(stm32_vrefbuf_driver);
6、確認(rèn)驅(qū)動(dòng)為platform驅(qū)動(dòng),尋找regulator特有的數(shù)據(jù)結(jié)構(gòu)
static const struct regulator_ops stm32_vrefbuf_volt_ops = {
.enable = stm32_vrefbuf_enable,
.disable = stm32_vrefbuf_disable,
.is_enabled = stm32_vrefbuf_is_enabled,
.get_voltage_sel = stm32_vrefbuf_get_voltage_sel,
.set_voltage_sel = stm32_vrefbuf_set_voltage_sel,
.list_voltage = regulator_list_voltage_table,
};
static const struct regulator_desc stm32_vrefbuf_regu = {
.name = "vref",
.supply_name = "vdda",
.volt_table = stm32_vrefbuf_voltages,
.n_voltages = ARRAY_SIZE(stm32_vrefbuf_voltages),
.ops = &stm32_vrefbuf_volt_ops,
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
};
7、由代碼得知,regulator_ops和regulator_desc才是特有的regulator數(shù)據(jù)結(jié)構(gòu),當(dāng)然也少不了注冊(cè)函數(shù)
rdev = regulator_register(&stm32_vrefbuf_regu, &config);
if (IS_ERR(rdev)) {
ret = PTR_ERR(rdev);
dev_err(&pdev->dev, "register failed with error %d\n", ret);
goto err_clk_dis;
}
platform_set_drvdata(pdev, rdev);
8、進(jìn)一步確認(rèn)of_device_id是不是真實(shí)存在,可以在arch/arm/boot/dts/stm32h743.dtsi找到對(duì)應(yīng)內(nèi)容
vrefbuf: regulator@58003C00 {
compatible = "st,stm32-vrefbuf";
reg = <0x58003C00 0x8>;
clocks = <&rcc VREF_CK>;
regulator-min-microvolt = <1500000>;
regulator-max-microvolt = <2500000>;
status = "disabled";
};
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
centos6.5 lamp 環(huán)境(使用yum安裝方法)
這篇文章主要介紹了centos6.5下安裝lamp環(huán)境 使用yum安裝方法,需要的朋友可以參考下2016-10-10
Linux如何使用HTTP進(jìn)行遠(yuǎn)程系統(tǒng)監(jiān)控
這篇文章主要介紹了Linux如何使用HTTP進(jìn)行遠(yuǎn)程系統(tǒng)監(jiān)控問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-11-11
Linux學(xué)習(xí)教程之redis哨兵集群詳解
這篇文章主要給大家介紹了關(guān)于Linux學(xué)習(xí)教程之Redis哨兵集群的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Linux如何用grep高效搜索二進(jìn)制日志并統(tǒng)計(jì)匹配結(jié)果
在日常開發(fā)和運(yùn)維工作中,日志分析是排查問題的重要手段,本文將詳細(xì)介紹?grep?處理二進(jìn)制日志的技巧,并給出完整的解決方案,需要的小伙伴可以參考一下2025-04-04
2018即將推出的Apache Spark 2.4都有哪些新功能
即將發(fā)布的 Apache Spark 2.4 版本是 2.x 系列的第五個(gè)版本。 本文對(duì)Apache Spark 2.4 的主要功能和增強(qiáng)功能進(jìn)行了概述,需要的朋友可以參考下2018-09-09
如何確保Apache?Flink流處理的數(shù)據(jù)一致性和可靠性
Apache?Flink通過其先進(jìn)的狀態(tài)管理、檢查點(diǎn)機(jī)制、時(shí)間語(yǔ)義和容錯(cuò)策略,確保了在流處理中的高數(shù)據(jù)一致性和可靠性,本文詳細(xì)介紹了Flink中保證數(shù)據(jù)一致性和可靠性的機(jī)制,感興趣的朋友一起看看吧2024-08-08
CentOS7.4下MySQL5.7.28二進(jìn)制方式安裝的方法步驟
這篇文章主要介紹了CentOS7.4下MySQL5.7.28二進(jìn)制方式安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

