linux regulator之浅见

转载 2013年12月02日 21:53:42
1: 校准器的基本概念
所谓校准器实际是在软件控制下把输入的电源调节精心输出。

Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过regulator关闭其电源供应;或者降低提供给该模块的电压、电流大小。

Regulator的文档在KERNEL/Documentation/Power/Regulator中。

2、几个重要结构:

regulator_dev

regulator_dev代表一个regulator设备。

struct regulator_dev {

           struct regulator_desc *desc;         // 描述符,包括regulator的名称、ID、regulator_ops等

           int use_count;                                        // 使用计数

           /* lists we belong to */

           struct list_head list;                     // regulator通过此结构挂到regulator_list链表中

           struct list_head slist;                   // 如果有父regulator,通过此域挂到父regulator的链表

           /* lists we own */

           struct list_head consumer_list;     // 此regulator负责供电的设备列表

           struct list_head supply_list;                      //此regulator负责供电的子regulator

           struct blocking_notifier_head notifier;      // notifier,具体的值在consumer.h中,比如REGULATOR_EVENT_FAIL

           struct mutex mutex;

           struct module *owner;

           struct device dev;                                              // device结构,属于class regulator_class

           struct regulation_constraints *constraints; // 限制,比如最大电压/电流、最小电压/电流

           struct regulator_dev *supply;                  // 父regulator的指针

           void *reg_data;              /* regulator_dev data */

};

regulator_init_data

regulator_init_data在初始化时使用,用来建立父子regulator、受电模块之间的树状结构,以及一些regulator的基本参数。

struct regulator_init_data {

           struct device *supply_regulator_dev;                    // 父regulator的指针

           struct regulation_constraints constraints;

           int num_consumer_supplies;

           struct regulator_consumer_supply *consumer_supplies;      // 负责供电的设备数组

           /* optional regulator machine specific init */

           int (*regulator_init)(void *driver_data);               // 初始化函数

           void *driver_data;          /* core does not touch this */

};

其它结构体自己可以看看~如

struct regulator               -------> 设备驱动直接操作的结构体

struct regulation_constraints       ----->regulator限制范围,其它信息,在于

                       struct regulator_init_data,用于初始化

struct regulator_consumer_supply   ----->consumer信息

struct regulator_desc                           ----->这个多关注些,内有正真操作设备函数结构体~

struct regulator_map                           ----->这个为consumers与regulator对应表

通常情况下,我们要在板级文件中fill一些结构,如struct regulator_init_data,这个在regulator初始化时必调用的;还有一般情况下电源管理PMU都是I2C设备,所以struct regulator_init_data经常作为I2C的私有数据来传递;另外由于一个PMU模块控制不只一个模块的电压,通常都是多个,所以需要多个struct regulator_init_data结构,并且通常定义成struct regulator_init_data xxxx[]数组结构,并调用platform_device_add()来注册设备(struct regulator_init_data结构作为struct platform_device中的struct devices中的platformdata)。

regulator_desc

struct regulator_described{

const char* name;

int id;

unsigned n_voltages;

struct regulator_ops *ops;

int irq;

enum regulator_type type;

struct module *owner;

}


3、注册regulator

板级信息和regulator_desc准备好之后就要注册了。

通过regulator_register函数登记生成一个regulator_dev。

struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, struct device *dev, struct regulator_init_data *init_data,void *driver_data)

{

struct regulator_dev *rdev;

....

//fill struct regulator_dev结构;

           device_register(&rdev->dev);                  // 注册设备

           // 设置constraints,其中可能会包括供电状态的初始化(设置初始电压,enable/disable等等)

           set_machine_constraints(rdev, &init_data->constraints);

           add_regulator_attributes (rdev);

           // 设置此regulator与其负责供电的设备之间的联系

for (i = 0; i < init_data->num_consumer_supplies; i++)

                       ret = set_consumer_device_supply(rdev, init_data->consumer_supplies[i].dev,

                                   init_data->consumer_supplies[i].supply);

           // 将regulator加入一个链表,该链表包含所有regulator

list_add(&rdev->list, &regulator_list);

.......

}

set_consumer_device_supply函数用于登记regulator_dev与comsumer_dev(regulator负责供电的设备)之间的对应关系。对于每一个regulator_dev—comsumer_dev的配对,都会有一个regulator_map结构,这些结构会被加入到全局链表regulator_map_list中。


4、regulator应用

在设备驱动使用regulator对其驱动的设备供电时,需要首先保证设备与对应regulator之间的匹配关系已经被登记到regulator框架中。

设备驱动通过regulator_get函数得到regulator结构,此函数通过前文所述regulator_map_list找到对应regulator_dev,再生成regulator结构给用户使用。

通过regulator_enable / regulator_disable打开、关闭regulator,这两个函数最终都是调用struct regulator_ops里的对应成员。

除此之外,还有regualtor_set_voltage / regulator_get_voltage等等。

具体代码查看:/kernel/driver/regulator/core.c

Linux电源管理-Linux Regulator Framework代码分析

示例分析 在内核kernel/drivers/regulator/dummy.c文件中构造了一个虚拟的regulator,参考此文件编写一个虚拟的regulator driver。 #include ...
  • longwang155069
  • longwang155069
  • 2016年11月15日 14:44
  • 1086

Linux下regulator驱动程序分析

// /*regulator 是驱动中电源管理的基础设施。要先注册到内核中,然后使用这些电压输出的模块get其regulator,在驱动中的init里,在适当时间中进行电压电流的设置. 与 gpi...
  • allen6268198
  • allen6268198
  • 2012年03月15日 15:21
  • 11162

linux regulator之浅见

1: 校准器的基本概念 所谓校准器实际是在软件控制下把输入的电源调节精心输出。 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影...
  • batoom
  • batoom
  • 2013年12月02日 21:53
  • 7164

regulator_get 调用过程

Touch panel DTS 分析(MSM8994平台,Atmel 芯片) 标签: linux内核parseDTS 2014-10-28 11:29 1986人阅读 评论(0) 收藏 举...
  • u012719256
  • u012719256
  • 2016年08月01日 11:06
  • 2284

关于linux regulator dirver(1) fixed regulator:

http://blog.chinaunix.net/uid-20514606-id-3045107.html 关于fixed regulator 的使用:    1. 提供一组,消耗和供电...
  • landishu
  • landishu
  • 2012年10月18日 14:50
  • 415

Linux驱动regulator

Regulator驱动         regulator是Linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电压的标准接口。regulator可以管理系统中的供电单元...
  • liaokesen168
  • liaokesen168
  • 2017年02月27日 11:39
  • 207

Regulator framework

Regulator framework 1 General description Voltage Regulator & current regulator 电压调节器和电流调节器 在Linux中...
  • u013709322
  • u013709322
  • 2016年11月05日 15:37
  • 140

linux regulator之浅见

1: 校准器的基本概念 所谓校准器实际是在软件控制下把输入的电源调节精心输出。 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响...
  • u010447426
  • u010447426
  • 2013年08月21日 18:04
  • 382

Linux Regulator Framework(1)_概述

1. 前言 Regulator,中文名翻译为“稳定器”,在电子工程中,是voltage regulator(稳压器)或者current regulator(稳流器)的简称,指可以自动维持恒定电压...
  • jacobywu
  • jacobywu
  • 2017年12月16日 09:48
  • 89

Linux下regulator的基础知识

1: 校准器的基本概念 所谓校准器实际是在软件控制下把输入的电源调节精心输出。 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直...
  • stephen0102
  • stephen0102
  • 2014年10月29日 21:28
  • 402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux regulator之浅见
举报原因:
原因补充:

(最多只允许输入30个字)