详解linux电源管理驱动编写

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

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,那我们可以找一个设备的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文件,继续查看

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";
}; 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解linux 看门狗驱动编写
  • linux nand flash驱动编写
  • 详解linux驱动编写(入门)
  • 详解linux 驱动编写(sd卡驱动)
  • 详解linux dma驱动编写
  • 详解linux lcd驱动编写
  • linux 触摸屏驱动编写
  • 详解linux pwm驱动编写
  • linux 驱动编写之虚拟字符设备的编写实例详解
  • Linux 字符设备驱动框架详细介绍
(0)

相关推荐

  • 详解linux驱动编写(入门)

    在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了.当然,至于驱动下面是怎么实现那就要根据具体情况而定了.比如说,有的驱动是芯片厂商直接写好的,假设芯片厂商提供了对应平台的sdk函数,那么驱动的工作就是对这些sdk函数进行封装就可以了,另外一种就是自己编写具体平台的驱动接口了.比如说,现在你需要编写串口.i2c.i2s.FLASH.网卡.LCD.触摸屏.USB驱动了.这个时候,你手里面除了一堆芯片手册,啥也没

  • 详解linux lcd驱动编写

    有些嵌入式设备是不需要lcd的,比如路由器.但是,还有些设备是需要lcd显示内容的,比如游戏机.测试仪.智能手表等等.所以,今天我们就看看lcd驱动在linux上是怎么进行的. 1.代码目录 drivers/video 2.查看video下的Makefile文件 # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_VGASTATE) += vgastate.o obj-$(CONFIG_HDMI) += hdmi.o obj-$(CONFIG_VT)

  • Linux 字符设备驱动框架详细介绍

    Linux 字符设备驱动框架 字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l /dev的时候,就能看到大量的设备文件,c就是字符设备,b就是块设备,网络设备没有对应的设备文件.编写一个外部模块的字符设备驱动,除了要实现编写一个模块所需要的代码之外,还需要编写作为一个字符设备的代码. 驱动模型 Linux一切皆文件,那么作为一个设备文件,它的操作方

  • linux 驱动编写之虚拟字符设备的编写实例详解

     linux 驱动编写 前言: 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关方面的内容,并且用一个实例来说明在Linux上面设备是如何编写的.虽然我不是专门做linux驱动的,却也经常收到一些朋友们的来信.在信件中,很多做驱动的朋友对自己的工作不是很满意,认为自己的工作就是把代码拷贝来拷贝去,或者说是改来改去,没有什么技术含量.有这种想法的朋友不在少数,我想这主要还是因为他们对自己的工作缺少了解导致.如果有可能,我们可以问问自己这样几个问题: (

  • linux nand flash驱动编写

    很长一段时间,nand flash都是嵌入式的标配产品.nand flash价格便宜,存储量大,适用于很多的场景.现在很普及的ssd,上面的存储模块其实也是由一块一块nand flash构成的.对于linux嵌入式来说,开始uboot的加载是硬件完成的,中期的kernel加载是由uboot中的nand flash驱动完成的,而后期的rootfs加载,这就要靠kernel自己来完成了.当然,这次还是以三星s3c芯片为例进行说明. 1.nand flash驱动在什么地方,可以从drviers/mtd

  • linux 触摸屏驱动编写

    早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多.但是随着触摸屏手机.即智能手机的流行,触摸屏基本成了手机的标配.所以,今天可以看看触摸屏驱动在linux上是如何进行的. 1.驱动目录 drivers/input 2.看看这个目录的Makefile如何设计 obj-$(CONFIG_INPUT) += input-core.o input-core-y := input.o input-compat.o input-mt.o ff-core.o obj-$(CONFIG_INPUT_TOU

  • 详解linux dma驱动编写

    linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率. 1.dma驱动在什么地方 drivers/dma 2.如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support" depends on ARCH_S3C24XX || COMPILE_TEST se

  • 详解linux pwm驱动编写

    pwm方波可以用来控制很多的设备,比如它可以被用来控制电机.简单来说,就是单位时间内的方波越多,那么电机的转速就会越快:反之就越慢.通过这个特性,soc就可以轻松地利用pwm对外设进行自动控制.所以,今天的主题就是pwm驱动. 1.驱动目录 drivers/pwm 2.查看对应目录下的Kconfig config PWM_SAMSUNG tristate "Samsung PWM support" depends on PLAT_SAMSUNG || ARCH_EXYNOS help

  • 详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分 host是我们需要真正关心的代码 3.以s3c为例,观察makefile obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o ...... obj-$(CONFIG_MMC_S3

  • 详解linux 看门狗驱动编写

    看门狗是linux驱动的一个重要环节.某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信设备.但是,任何软件都不可能100%没有bug.如何保证软件在遇到严重bug.死机的时候也能正常运行呢,那么看门狗就是有效的一种方法.看门狗一般要求用户定时喂狗,如果一段时间没有喂狗的话,那么系统就会自动重启.今天,我们就来看看这个看门狗驱动怎么编写? 1.代码目录 drivers/watchdog 2.阅读目录下的Kconfig,可以找一个s3c模块macro config HAVE_S3C2410

随机推荐