linux驱动编写(电源管理驱动)

对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处。所以,各个soc厂家在这方面花了很多的功夫。下面,我们可以看看linux是如何处理电源管理驱动的。

1、代码目录

drivers/regulator

2、查看目录下的Kconfig文件

  1. menuconfig REGULATOR
  2. bool "Voltage and Current Regulator Support"
  3. help
  4. Generic Voltage and Current Regulator support.
  5.  
  6. This framework is designed to provide a generic interface to voltage
  7. and current regulators within the Linux kernel. It‘s intended to
  8. provide voltage and current control to client or consumer drivers and
  9. also provide status information to user space applications through a
  10. sysfs interface.
  11.  
  12. The intention is to allow systems to dynamically control regulator
  13. output in order to save power and prolong battery life. This applies
  14. to both voltage regulators (where voltage output is controllable) and
  15. current sinks (where current output is controllable).
  16.  
  17. This framework safely compiles out if not selected so that client
  18. drivers can still be used in systems with no software controllable
  19. regulators.
  20.  
  21. If unsure, say no.

3、阅读文件,得知REGULATOR是最核心的模块macro,那我们可以找一个设备的macro看看

  1. config REGULATOR_STM32_VREFBUF
  2. tristate "STMicroelectronics STM32 VREFBUF"
  3. depends on ARCH_STM32 || COMPILE_TEST
  4. help
  5. This driver supports STMicroelectronics STM32 VREFBUF (voltage
  6. reference buffer) which can be used as voltage reference for
  7. internal ADCs, DACs and also for external components through
  8. dedicated Vref+ pin.
  9.  
  10. This driver can also be built as a module. If so, the module
  11. will be called stm32-vrefbuf.

4、没有找到s3c,可以看一下stm32芯片的依赖属性,接着看Makefile

  1. obj-$(CONFIG_REGULATOR) += core.o dummy.o fixed-helper.o helpers.o devres.o
  2. obj-$(CONFIG_OF) += of_regulator.o
  3. obj-$(CONFIG_REGULATOR_FIXED_VOLTAGE) += fixed.o
  4. obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o
  5. obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o
  6.  
  7. obj-$(CONFIG_REGULATOR_STM32_VREFBUF) += stm32-vrefbuf.o

5、看的出来stm32只依赖于stm32-verfbuf.c文件,继续查看

  1. static const struct of_device_id stm32_vrefbuf_of_match[] = {
  2. { .compatible = "st,stm32-vrefbuf", },
  3. {},
  4. };
  5. MODULE_DEVICE_TABLE(of, stm32_vrefbuf_of_match);
  6.  
  7. static struct platform_driver stm32_vrefbuf_driver = {
  8. .probe = stm32_vrefbuf_probe,
  9. .remove = stm32_vrefbuf_remove,
  10. .driver = {
  11. .name = "stm32-vrefbuf",
  12. .of_match_table = of_match_ptr(stm32_vrefbuf_of_match),
  13. },
  14. };
  15. module_platform_driver(stm32_vrefbuf_driver);

6、确认驱动为platform驱动,寻找regulator特有的数据结构

  1. static const struct regulator_ops stm32_vrefbuf_volt_ops = {
  2. .enable = stm32_vrefbuf_enable,
  3. .disable = stm32_vrefbuf_disable,
  4. .is_enabled = stm32_vrefbuf_is_enabled,
  5. .get_voltage_sel = stm32_vrefbuf_get_voltage_sel,
  6. .set_voltage_sel = stm32_vrefbuf_set_voltage_sel,
  7. .list_voltage = regulator_list_voltage_table,
  8. };
  9.  
  10. static const struct regulator_desc stm32_vrefbuf_regu = {
  11. .name = "vref",
  12. .supply_name = "vdda",
  13. .volt_table = stm32_vrefbuf_voltages,
  14. .n_voltages = ARRAY_SIZE(stm32_vrefbuf_voltages),
  15. .ops = &stm32_vrefbuf_volt_ops,
  16. .type = REGULATOR_VOLTAGE,
  17. .owner = THIS_MODULE,
  18. };

7、由代码得知,regulator_ops和regulator_desc才是特有的regulator数据结构,当然也少不了注册函数

  1. rdev = regulator_register(&stm32_vrefbuf_regu, &config);
  2. if (IS_ERR(rdev)) {
  3. ret = PTR_ERR(rdev);
  4. dev_err(&pdev->dev, "register failed with error %d\n", ret);
  5. goto err_clk_dis;
  6. }
  7. platform_set_drvdata(pdev, rdev);

8、进一步确认of_device_id是不是真实存在,可以在arch/arm/boot/dts/stm32h743.dtsi找到对应内容

    1. vrefbuf: [email protected]58003C00 {
    2. compatible = "st,stm32-vrefbuf";
    3. reg = <0x58003C00 0x8>;
    4. clocks = <&rcc VREF_CK>;
    5. regulator-min-microvolt = <1500000>;
    6. regulator-max-microvolt = <2500000>;
    7. status = "disabled";
    8. };

原文地址:https://www.cnblogs.com/wanghuaijun/p/9649102.html

时间: 09-14

linux驱动编写(电源管理驱动)的相关文章

linux驱动程序之电源管理之linux的电源管理架构(3)

设备电源管理 Copyright (c) 2010 Rafael J. Wysocki<[email protected]>, Novell Inc. Copyright (c) 2010 Alan Stern[email protected] ************************************************************* 本文由DroidPhone翻译于2011.8.5 ***************************************

linux驱动程序之电源管理 之linux休眠与唤醒(2)

在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务:(2)调用注册的设备的suspend的回调函数:(3)按照注册顺序休眠核心设备和使CPU进入休眠态.       冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文.当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行.如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠.比如: # echo standby >

linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更

新版linux系统设备架构中关于电源管理方式的变更 based on linux-2.6.32 一.设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct device,struct device_type,struct class, struct device_driver,struct bus_type等. @kernel/include/linux/devices.h中有这几中结构体的定义,这里只列出和PM有关的项,其余查看源码: struct d

linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)

1. Based on linux2.6.32,  only for mem(SDR) 2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3. 本文先研究标准linux的休眠与唤醒,android对这部分的增改在另一篇文章中讨论 4. 基于手上的一个项目来讨论,这里只讨论共性的地方 虽然linux支持三种省电模式:standby.suspend to ram.suspend to disk,但是在使用电池供电的手持设备上,几乎所有的方案

linux驱动程序之电源管理之Run-time PM 详解(4)

Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); ... }; 每个device或者bus都会有2个计数器,一个是device的u

linux驱动程序之电源管理之regulator机制流程 (1)

电源管理芯片可以为多设备供电,且这些设备电压电流有所同.为这些设备提供的稳压器代码模型即为regulator. 下面通过下面三个过程分析regulartor供电机制: 1.分析regulator结构体 2.regulator 注册过程 3.设备使用regulator过程 一.分析regulator结构体 Regulator模块用于控制系统中某些设备的电压/电流供应.在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间.所以,如果系统中某一个模块暂时不需要使用,就可以通过reg

linux驱动程序之电源管理之标准linux休眠和唤醒机制分析(二)

三.pm_test属性文件读写 int pm_test_level = TEST_NONE; static const char * const  pm_tests[__TEST_AFTER_LAST] = { [TEST_NONE] = "none", [TEST_CORE] = "core", [TEST_CPUS] = "processors", [TEST_PLATFORM] = "platform", [TEST_D

Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用. 本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作. 顺便感概一下,虽

AM335x(TQ335x)学习笔记——触摸屏驱动编写

前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱动源码,单纯的配置DTS是无法完成TQ335x的触摸驱动移植工作的,因此,本文参考内核中原有的pixcir_i2c_ts驱动编写TQ335x的触摸屏(TN92)驱动. 在之前移植TQ210时,我已经编写过TQ210的触摸屏驱动,我的TQ335x还是使用的TQ210的屏,因此,难度不是很大.这里需要说

Linux电源管理系统架构和驱动(1)-Linux电源管理全局架构

1.   Linux电源管理全局架构 Linux电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电子产品来说,电源管理相当重要.因此,这部分工作往往在开发周期中占据相当大的比重,图1呈现了Linux内核电源管理的整体架构.大体可以归纳为如下几类: 1.      CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq 2.      CPU在系统空闲时根据