linux regulator之浅见【转】
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, ®ulator_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之浅见【转】的更多相关文章
- Linux Regulator Framework(2)_regulator driver
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...
- Linux regulator framework(1) - 概述【转】
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...
- Linux电源管理-Linux regulator framework概述
前言 1. 什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...
- Linux regulator系统
1. 概念:Regulator : 电源芯片, 比如电压转换芯片Consumer : 消费者,使用电源的部件, Regulator是给Consumer供电的machine : 单板,上面焊接有Regu ...
- 【转】linux设备驱动之MMC SD卡——核心层简单分析
原文网址:http://blog.chinaunix.net/uid-28685940-id-3889878.html /*************************************** ...
- Linux下Power Management开发总结
本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...
- 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Power Management开发的一般流程
本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 开发流程 针对一个PM feature进行开发,设计模型是第一步.模型设计好之后,还要保留参数接口,可以基于这些参数针对特殊个体进行优化. ...
随机推荐
- eclipse中用maven创建web项目
上一节中完成了本地的maven环境搭建,在eclipse中怎么创建一个maven项目呢 一.eclipse中配置maven环境 eclipse版本4.3 1.打开菜单Help->Eclipse ...
- BZOJ 4032: [HEOI2015]最短不公共子串
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 446 Solved: 224[Submit][Sta ...
- 【BZOJ2299】[HAOI2011]向量(数论)
[BZOJ2299][HAOI2011]向量(数论) 题面 BZOJ 洛谷 题解 首先如果我们的向量的系数假装可以是负数,那么不难发现真正有用的向量只有\(4\)个,我们把它列出来.\((a,b)(a ...
- A1008. Elevator
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
- A1090. Highest Price in Supply Chain
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- mysql数据库user表host字段的%问题
搜索: mysql数据库user表host字段的%问题 连接:http://blog.csdn.net/xiaomengh/article/details/48706149 在mysql数据库中,使用 ...
- eclipse复制工作空间配置
eclipse复制工作空间配置 eclipse复制工作空间配置 总结一下,复制工作空间配置步骤如下: 1 使用eclipse新建workspace. 2 将新建的workspace下的.metad ...
- django基础之数据库操作
Django 自称是“最适合开发有限期的完美WEB框架”.本文参考<Django web开发指南>,快速搭建一个blog 出来,在中间涉及诸多知识点,这里不会详细说明,如果你是第一次接触D ...
- 部署python django程序
在一台新的服务器上x需要先安装python3 ,git , 等 安装python3 安装python3 之前博客写过 创建虚拟环境,我用的是venv https://docs.python.org/ ...
- javascript 小清新颜色翻页效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...