前言

1.  什么是regulator?
     regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器)。一般电源管理芯片(Power Management IC)中会包含一个甚至多个regulator。
 
2.  regulator有什么作用?
    通常的作用是给电子设备供电。大多数regulator可以启用(enable)和禁用(disable)其输出,同时也可以控制其输出电压(voltage)和电流(current)。
从上图可以看出,input power会经过 regulator 转化为output power,regulator会做如下的约束:
-  Voltage control:  输入5V输出1.8V
-  Current limiting:  电流的输出最大为20MA
-  Power switch:  可以控制电压enable/disable

问题

1.   如果一个系统只有一个regulator,而且只对一个设备控制的话,完全没必要使用linux regulator framework机制。但是如果一个系统几个甚至十几个regulator,每个regulator之间还存在级连关系,这时候就需要Linux regulator framework。
2.  如果一个regulator控制多个设备,而每个设备的电压或电流需求方式不同,linux  regulator framework会怎么管理这些设备?
3.  有些设备只需要enable/disable电源即可,而有些设备在运行的过程中需要动态的改变voltage或者current,Linux regulator Framework会如何处理这些问题?
4.  regulator的错误配置可能也会对硬件有非常严重的后果,所以需要小心设计regulaor,同时也要规范的使用regulator。

Linux Regulator Framework

1.  Linux Regulator Framework设计出主要是提供一个标准的内核接口来控制电压和电流调节器。目的是允许系统动态控制regulator power输出以节省能源延长电池寿命。这适用于voltage regulator和current regulator(其中电压和电流都是可控的)。
2.  Linux Regulator Framework分为四个部分,分别是machine,regulator,consumer,sys-class-regulator。

machine

machine可以理解为regulator在板级的硬件配置,使用regulator_init_data结构体代表regulator板级的配置。
struct regulator_init_data {
const char *supply_regulator; /* or NULL for system supply */ 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 */
};
.supply_regulator:   regulator的parent。用于级联regulator使用。
.constraints:            此regulator的约束,比如输出电压范围,输出电流范围等。
.num_consumer_supplies:  此regulator提供的consumer的个数,也就是控制外设的个数。
.consumer_supplies:   使用此结构确定regulator和consumer之间的联系。
.regulator_init:  regulator注册时候的回调函数。
.driver_data:  regulator_init回调函数的参数。
 
而regulator板级的配置,也可以称为约束,定义在regulation_constraints结构中。
struct regulation_constraints {  

    const char *name;  

    /* voltage output range (inclusive) - for voltage control */
int min_uV;
int max_uV; int uV_offset; /* current output range (inclusive) - for current control */
int min_uA;
int max_uA; /* valid regulator operating modes for this machine */
unsigned int valid_modes_mask; /* valid operations for regulator on this machine */
unsigned int valid_ops_mask; /* regulator input voltage - only if supply is another regulator */
int input_uV; /* regulator suspend states for global PMIC STANDBY/HIBERNATE */
struct regulator_state state_disk;
struct regulator_state state_mem;
struct regulator_state state_standby;
suspend_state_t initial_state; /* suspend state to set at init */ /* mode to set on startup */
unsigned int initial_mode; unsigned int ramp_delay;
unsigned int enable_time; /* constraint flags */
unsigned always_on:; /* regulator never off when system is on */
unsigned boot_on:; /* bootloader/firmware enabled regulator */
unsigned apply_uV:; /* apply uV constraint if min == max */
unsigned ramp_disable:; /* disable ramp delay */
};
.name:   描述该约束的名字。
.min_uV/max_uV:  最小/最大的输出电压。
.uV_offset:  consumer看到的电源和实际电源之间的偏移值,用于电源补偿。
.min_uA/max_uA:  最小/最大的输出电流。
.valid_modes_mask:  该regulator支持的操作模式。
     #define REGULATOR_MODE_FAST 0x1         //快速改变模式
     #define REGULATOR_MODE_NORMAL        0x2         //正常模式,大多数驱动都使用这种模式
     #define REGULATOR_MODE_IDLE         0x4         //设备在idle状态,regulator给设备提供服务
     #define REGULATOR_MODE_STANDBY 0x8         //设备在standby状态,regulator给设备提供服务
.valid_ops_mask: 该regulator支持的操作。
    #define REGULATOR_CHANGE_VOLTAGE 0x1         //该regulator可以改变电压
    #define REGULATOR_CHANGE_CURRENT 0x2         //该regulator可以改变电流
    #define REGULATOR_CHANGE_MODE 0x4         //该regulator可以改变mode
    #define REGULATOR_CHANGE_STATUS 0x8         //该regulator可以改变状态,也就是enable/disable power
    #define REGULATOR_CHANGE_DRMS 0x10       //该regulator可以动态该变mode
    #define REGULATOR_CHANGE_BYPASS 0x20       //该regulator支持bypass mode
.input_uV:  表示该regulator的input是另一个regulator。
.state_disk/state_mem/state_standby:  代表该regulator的各种suspend状态。
.always_on:  是否在系统启动后一直使能。
.boot_on:  是否在boot阶段使能。
.apply_uV: 当min_uV=max_uV的时候时使用。
.ramp_delay: 改变电压到电源稳定后时间。因为硬件原因,改变电源后不能立刻就成功,其中需要有一定的延迟。
.enable_time:  regulator的使能时间。
 
....未完
 
参考地址:https://blog.csdn.net/longwang155069/article/details/53129378

Linux电源管理-Linux regulator framework概述的更多相关文章

  1. Linux电源管理(7)_Wakeup events framework【转】

    转自:http://www.wowotech.net/pm_subsystem/wakeup_events_framework.html 1.  前言 本文继续“Linux电源管理(6)_Generi ...

  2. Linux电源管理(7)_Wakeup events framework

    1. 前言 本文继续"Linux电源管理(6)_Generic PM之Suspend功能"中有关suspend同步以及PM wakeup的话题.这个话题,是近几年Linux ker ...

  3. Linux电源管理(1)-整体架构【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/pm_architecture.html 1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长, ...

  4. Linux电源管理(9)_wakelocks【转】

    1. 前言 wakelocks是一个有故事的功能. wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为"wakelocks&quo ...

  5. Linux电源管理_autosleep--(五)【转】

    本文转载自:https://blog.csdn.net/wlsfling/article/details/46005409 1. 前言 Autosleep也是从Android wakelocks补丁集 ...

  6. Linux电源管理(2)-Generic PM基本概念和软件架构【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/generic_pm_architecture.html 1. 前言 这里的Generic PM,是蜗蜗自己起的名 ...

  7. linux电源管理系列(一)

    本系列将逐步介绍linux电源管理相关的知识,涉及到常见电源管理机制.linux电源管理机制.linux驱动中有关电源管理的相关接口.内核文档中关于Linux电源管理架构文档的分析.以下将以此来介绍相 ...

  8. ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

    ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...

  9. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...

随机推荐

  1. VC_窗口exe_printf信息

    1. #include <io.h> #include <fcntl.h> #include <stdio.h> 2. void InitConsoleWindow ...

  2. SpringBoot获取全局配置文件的属性以及@ConfigurationProperties实现类型安全的配置

    在SpringBoot,可以定义一个全局配置文件,全局配置文件有两种形式: 1). application.properties 2).application.yml 二者的后缀名不同,编辑的格式也不 ...

  3. arcgis10.3 python2.7 开发环境配置

    如题: 首先安装arcgis desktop 和 自带的python版本,本楼的是2.7.8,安装地址在E:\PYTHON2.7,安装完成后即可开始安装pythonwin2.7,下载地址为:http: ...

  4. 力扣(LeetCode)728. 自除数

    自除数 是指可以被它包含的每一位数除尽的数. 例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0. 还有,自除数不允许包含 0 . 给定上边 ...

  5. python 自动化测试Jenkins 持续集成

    一直在做 python 自动化测试,但是脚本的执行之前是运维来维护的,通过 saltstack, 自己并未做过多的研究,后续可以研究一下 saltstack. 今天先研究一下使用 github 管理项 ...

  6. 有关C#中List排序的总结

    这里有一篇文章作者总结的就比较详细: https://blog.csdn.net/jimo_lonely/article/details/51711821 在这里只记录一点: 对list或者数组中的数 ...

  7. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  8. Getting started with Processing 第九章总结

    函数 函数的力量在于模块化. 范例 掷骰子 rollDice()函数 rollDice(int numSides){int d = 1+int(random(numSides));println(&q ...

  9. 最简单的TTcpServer与TTcpClient通信实例-Delphi

    unit TcpSCDemo;//最简单的TTcpServer与TTcpClient通信实例-Delphi //Borland推出TTcpServer与TTcpClient作为主要的网络通信控件,意味 ...

  10. 荧光激活细胞分选( FACS)

    全称:fluorescence-activated cell sorting 参考: 利用荧光激活细胞分选技术获取荧光蛋白标记肾小球足细胞 荧光激活细胞分离技术在角膜缘干细胞研究中的应用 [求助]急! ...