前言

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:1; /* regulator never off when system is on */

unsigned boot_on:1; /* bootloader/firmware enabled regulator */

unsigned apply_uV:1; /* apply uV constraint if min == max */

unsigned ramp_disable:1; /* 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

来源:https://www.cnblogs.com/debruyne/p/9139386.html

linux 电源管理 regulator,Linux电源管理-Linux regulator framework概述相关推荐

  1. linux如deepin manjaro对笔记本电脑电池的伤害解决方案:TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

    TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具 笔记本电池是针对 Windows 操作系统进行了高度优化的,当我在笔记本电脑中使用 Windows 操作系统时,我已经意识到这一点, ...

  2. TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

    笔记本电池是针对 Windows 操作系统进行了高度优化的,当我在笔记本电脑中使用 Windows 操作系统时,我已经意识到这一点,但对于 Linux 来说却不一样. 多年来,Linux 在电池优化方 ...

  3. linux常用指令介绍_软件包管理_VIM编辑器的使用_用户和组账户管理_文件权限管理

    1.1. 文件目录操作命令 ls 显示文件和目录列表 -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 删除?rmdir  非空 -p 父目录不存在情况下先生成 ...

  4. linux 组群设置组群密码,Linux 组群账户管理

    一.Linux组群账户配置文件 1./etc/group文件 /etc/group文件是用户组群的配置文件,内容包括用户和用户组群,并且能显示出用户是归属哪个用户组群或哪几个用户组群.一个用户可以归属 ...

  5. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  6. linux 下mysql的管理,Linux下 MySQL安装和基本管理

    •安装linux一些必须的包: 1.yum install gcc gcc-c++ gcc-g77 autoconf automake zlib* fiex* libxml* ncurses-deve ...

  7. Linux 操作系统原理 — 内存 — 页式管理、段式管理与段页式管理

    目录 文章目录 目录 前文列表 页式管理 快表 多级页表 基于页表的虚实地址转换原理 应用 TLB 快表提升虚实地址转换速度 页式虚拟存储器工作的全过程 缺页中断 为什么 Linux 默认页大小是 4 ...

  8. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  9. 【转】Linux 前后台作业切换及脱机管理

    原帖:http://blog.csdn.net/robinson_0612/article/details/8889014 Linux bash shell单一终端界面下,我们经常需要管理或同时完成多 ...

  10. linux设置用户密码、查看linux用户信息、root用户管理普通用户(passwd命令使用)

    1 切换root用户和给root用户设置密码 1.1 切换到root用户 1.使用su 命令 或 su root命令切换到root用户的时候报错:su: Authentication failure ...

最新文章

  1. C#中访问私有成员技巧
  2. HDU - 5878 A - I Count Two Three H 技巧枚举
  3. 卡巴斯基公布7月中国地区20大恶意软件排行
  4. HTML5使用Div标签来实现表格
  5. ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)
  6. usermod 添加用户多个附属组
  7. redhat下载镜像官方地址
  8. 同一计算机打印机无法连接,共享打印机无法连接怎么办 共享打印机无法连接解决方法【图文教程】...
  9. 【萧蕊冰】ui设计和交互设计的区别是什么?
  10. 【presto】presto 查询hive分桶表问题
  11. php文件夹压缩视频教程,高清视频压缩教程 如何将高清视频压缩文件大小
  12. 关于ttyS与ttySAC
  13. 基于JAVA的KTV点歌系统,管理系统。
  14. 一、剪辑行业概述与剪辑工具介绍
  15. (2017中国数字化贡献人物专访)相宜本草:数字化生态转型实现IT部门角色跃迁...
  16. 芯片架构RISC-V、X86、ARM三足鼎立
  17. asp毕业设计——基于asp+access的档案管理系统设计与实现(毕业论文+程序源码)——档案管理系统
  18. webpack entry入口
  19. 参加计算机社团的英语作文,参加社团的英语作文短文欣赏
  20. AI4DB:openGauss人工智能参数调优之X-Tuner

热门文章

  1. layer进度条ajax,layui动态进度条详细。
  2. linux上删除rime方案_超强的输入法:rime的配置(linux)
  3. api文档 luci_Luci介绍
  4. 【图像】焦距与景深的关系
  5. 小青龙的Java面试笔记
  6. 拼多多分享好友砍价Java实现_拼多多砍价怎么发到qq?怎么帮好友砍价?
  7. 红色警戒2rules.ini数值修改
  8. 80核处理器_【装机帮扶站】第690期:12核amp;16核怪兽CPU配置推荐
  9. 阿里cdn请求原理以及缓存机制
  10. 职场学习、员工管理-怎样做企业最受欢迎的员工