天天看點

linux驅動編寫(電源管理驅動)

對于嵌入式裝置來說,合适的電源管理,不僅可以延長電池的壽命,而且可以省電,延長裝置運作時間,在提高使用者體驗方面有很大的好處。是以,各個soc廠家在這方面花了很多的功夫。下面,我們可以看看linux是如何處理電源管理驅動的。

1、代碼目錄

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,那我們可以找一個裝置的macro看看

config REGULATOR_STM32_VREFBUF

tristate "STMicroelectronics STM32 VREFBUF"

depends on ARCH_STM32 || COMPILE_TEST

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檔案,繼續檢視

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、确認驅動為platform驅動,尋找regulator特有的資料結構

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資料結構,當然也少不了注冊函數

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、進一步确認of_device_id是不是真實存在,可以在arch/arm/boot/dts/stm32h743.dtsi找到對應内容

vrefbuf: regulator@58003C00 {

compatible = "st,stm32-vrefbuf";

reg = <0x58003C00 0x8>;

clocks = <&rcc VREF_CK>;

regulator-min-microvolt = <1500000>;

regulator-max-microvolt = <2500000>;

status = "disabled";

下一篇: LCD驅動

繼續閱讀