Linux电源管理

Stella981
• 阅读 693

前言

1.  什么是regulator?

     regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器)。一般电源管理芯片(Power Management IC)中会包含一个甚至多个regulator。

2.  regulator有什么作用?

    通常的作用是给电子设备供电。大多数regulator可以启用(enable)和禁用(disable)其输出,同时也可以控制其输出电压(voltage)和电流(current)。

Linux电源管理

从上图可以看出,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板级的配置。

Linux电源管理

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 */  
};

Linux电源管理

.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结构中。

Linux电源管理

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 */  
};

Linux电源管理

.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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这