对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处。所以,各个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: regulator@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. };

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

  1. linux驱动编写(pwm驱动)【转】

    本文转载自:https://blog.csdn.net/feixiaoxing/article/details/79889240 pwm方波可以用来控制很多的设备,比如它可以被用来控制电机.简单来说, ...

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

    设备电源管理 Copyright (c) 2010 Rafael J. Wysocki<rjw@sisk.pl>, Novell Inc. Copyright (c) 2010 Alan ...

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

    新版linux系统设备架构中关于电源管理方式的变更 based on linux-2.6.32 一.设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct d ...

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

    在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务:(2)调用注册的设备的suspend的回调函数:(3)按照注册顺序休眠核心设备和使CPU进入休眠态.       冻结进程是 ...

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

    1. Based on linux2.6.32,  only for mem(SDR) 2. 有兴趣请先参考阅读: 电源管理方案APM和ACPI比较.doc Linux系统的休眠与唤醒简介.doc 3 ...

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

    Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback   struct dev_pm_ops { ... int (*runtime_su ...

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

    电源管理芯片可以为多设备供电,且这些设备电压电流有所同.为这些设备提供的稳压器代码模型即为regulator. 下面通过下面三个过程分析regulartor供电机制: 1.分析regulator结构体 ...

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

    三.pm_test属性文件读写 int pm_test_level = TEST_NONE; static const char * const  pm_tests[__TEST_AFTER_LAST ...

  9. linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- -.el6.x86_6 ...

随机推荐

  1. JavaScript 对象Array,Map,Set使用

    for(int i = 0 :i < 3 ;i++ ){ //[重点说三遍] 在说明每个对象的用法之前,首先说明 JavaScript 对象的使用一定要注意浏览器的兼容性问题!尤其是IE的版本! ...

  2. nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)

    安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...

  3. Xtreme9.0 - Car Spark 动态规划

    Car Spark 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/car-spark Descr ...

  4. UVALive 6916 Punching Robot dp

    Punching Robot 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid= ...

  5. LPC-Link2 CMSIS-DAP firmware source

    LPC-Link2 CMSIS-DAP firmware source Hi, I'm using the CMSIS-DAP firmware with the LPC-Link2. I'd lik ...

  6. MSDN WinUSB Example

    The WinUSB user-mode library uses device interface classes to communicate with the kernel-mode USB s ...

  7. ubuntu的配置文件

    ubuntu的配置文件 是 ~/.gconf 我是把终端弄挂了, 只能再桌面系统下找到 ~/.gconf 下的相应文件 修改后就恢复到原来状态.

  8. STM32F103 TIM3定时器初始化程序

    //TIM3 分频 #define TIM3_DIV1 (1-1) #define TIM3_DIV18 (18-1) #define TIM3_DIV72 (72-1) //************ ...

  9. 用delphi实现完美屏幕截图

    可以截取layered窗口(包括透明窗口)的代码: procedure CaptureScreen(AFileName: string);const  CAPTUREBLT = $40000000;v ...

  10. iPhone开发中从一个视图跳到另一个视图有三种方法:

    iPhone开发中从一个视图跳到另一个视图有三种方法:   1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...