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 regulator之浅见【转】的更多相关文章

  1. Linux Regulator Framework(2)_regulator driver

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...

  2. Linux regulator framework(1) - 概述【转】

    转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...

  3. Linux电源管理-Linux regulator framework概述

    前言 1.  什么是regulator?      regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...

  4. Linux regulator系统

    1. 概念:Regulator : 电源芯片, 比如电压转换芯片Consumer : 消费者,使用电源的部件, Regulator是给Consumer供电的machine : 单板,上面焊接有Regu ...

  5. 【转】linux设备驱动之MMC SD卡——核心层简单分析

    原文网址:http://blog.chinaunix.net/uid-28685940-id-3889878.html /*************************************** ...

  6. Linux下Power Management开发总结

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...

  7. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  8. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  9. Power Management开发的一般流程

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 开发流程 针对一个PM feature进行开发,设计模型是第一步.模型设计好之后,还要保留参数接口,可以基于这些参数针对特殊个体进行优化. ...

随机推荐

  1. pyEcharts

    例子: from pyecharts import Line line = Line("我的第一个图表", "这里是副标题",width="800px ...

  2. forEach、for、$.each()跳出循环比较

    无论工作上或是学习上,用过的知识点总是容易忘记,于是略作记录,方便你我他. 说起跳出循环,第一时间想起的是 break \ continue,这是经典的for循环. 1.for 循环 先上例子,思考输 ...

  3. Luogu 1979 NOIP 2013 华容道(搜索,最短路径)

    Luogu 1979 NOIP 2013 华容道(搜索,最短路径) Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面 ...

  4. 【洛谷P3792】由乃与大母神原型和偶像崇拜

    题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ...

  5. 斯坦福大学公开课机器学习:梯度下降运算的特征缩放(gradient descent in practice 1:feature scaling)

    以房屋价格为例,假设有两个特征向量:X1:房子大小(1-2000 feets), X2:卧室数量(1-5) 关于这两个特征向量的代价函数如下图所示: 从上图可以看出,代价函数是一个又瘦又高的椭圆形轮廓 ...

  6. 枚举 enum 成员变量初始化

    typedef enum { A1, A2, A3, A4 = , A_END }A; 如果A1赋值为5,则下列依次递增1,即A2等于6,A3等于7: 由于A4赋值为10,所以A_END等于11 如果 ...

  7. GO语言的进阶之路-网络安全之proxy

    GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...

  8. 远程客户端连接MysqL数据库太慢解决方案

    远程客户端连接MysqL数据库太慢解决方案局域网客户端访问mysql 连接慢问题解决. cd /etc/mysql vi my.conf [mysqld] skip-name-resolve 此选项禁 ...

  9. mysql表备份的一种方式

    前提: 最近测试环境shop表经常出现表损坏不能正常查询,通过mysql的修复方法,暂时有效.故做该表的迁移操作. 思路是: 停止数据库的操作 1.备份老表.  2.创建一个结构一样的表. 3.将老表 ...

  10. 添加dubbo.xsd的方法

    整合dubbo-spring的时候,配置文件会报错 因为     阿里关闭在线的域名了.需要本地下载xsd文件  所以,需要下载本地引入. 解决方式: 在dubbo的开源项目上找到xsd文件: htt ...