Linux电源管理-Linux regulator framework概述

前言

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/rayhe/p/9139386.html

时间: 2024-07-31 11:08:18

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

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

转自:http://www.wowotech.net/pm_subsystem/wakeup_events_framework.html 1.  前言 本文继续“Linux电源管理(6)_Generic PM之Suspend功能”中有关suspend同步以及PM wakeup的话题.这个话题,是近几年Linux kernel最具争议的话题之一,在国外Linux开发论坛,经常可以看到围绕该话题的辩论.辩论的时间跨度和空间跨度可以持续很长,且无法达成一致. wakeup events framewo

Linux电源管理(1)_整体架构(转自蜗窝科技,www.wowotech.net)

Linux电源管理(1)_整体架构(转自蜗窝科技,www.wowotech.net) 1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而 能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力.这方面,大自然已经做的很好了,如植 物的落叶,如动物的冬眠,等等.而在计算机的世界里(这里以运行Linux OS的嵌入式系统为例),称作电源管理(Power Management).

Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)

1. 前言 这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off).待机(Standby or Hibernate).重启(Reboot)等.这些手段是在嵌入式Linux普及之前的PC或者服务器时代使用的.在那个计算机科学的蛮荒时代,人类在 摩尔定律的刺激下,孜孜追求的是计算机的计算能力.处理性能,因此并不特别关心Power消耗. 在这种背景下发展出来的Linux电源管理机制,都是粗放的.静态的.被动的,具体请参考下面的介绍. 2

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

1. 前言 wakelocks是一个有故事的功能. wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为"wakelocks"的系统调用,该系统调用允许调用者阻止系统进入低功耗模式(如idle.suspend等).同时,该补丁集更改了Linux kernel原生的电源管理执行过程(kernel/power/main.c中的state_show和state_store),转而执行自定义的state_show.state_store

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

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

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

本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电········>恢复系统——>恢复上下文——>继续使用. 本文以内核向用户空间提供的接口为突破口,从整体上对这两个功能进行介绍,并会在后续的文章中,分析它们的实现逻辑和执行动作. 顺便感概一下,虽

Linux电源管理系统架构和驱动(1)-Linux电源管理全局架构

1.   Linux电源管理全局架构 Linux电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电子产品来说,电源管理相当重要.因此,这部分工作往往在开发周期中占据相当大的比重,图1呈现了Linux内核电源管理的整体架构.大体可以归纳为如下几类: 1.      CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq 2.      CPU在系统空闲时根据

Linux操作系统的管理(虚拟机的概述)三

在我们了解linux操作系统之前我们首先要先知道虚拟机的运行架构,我们在初学linux的时候,如果在我们的真实PC上做操作你就会发现,你很多时候都是在重装系统的状态下,当然你也可以在linux操作系统上去装一个KVM虚拟机,不过你确定你要放弃windows操作系统吗?  所以为了让我们做实验的时候能够方便了解我们就把我们的linux操作系统乖乖的装在虚拟机上吧. 在使用虚拟机之前我们得先知道虚拟机是个什么工具,首先在我们当前这些X86平台上每个平台上只能运行一个,现在的服务器也是这种架构的多,在

Linux电源管理(3)_Generic PM之Reboot过程(转自蜗窝科技,www.wowotech.net)

Linux电源管理(3)_Generic PM之Reboot过程 1. 前言 在使用计算机的过程中,关机和重启是最先学会的两个操作.同样,这两个操作在Linux中也存在,称作shutdown和restart.这就是本文要描述的对象. 在Linux Kernel中,主流的shutdown和restart都是通过“reboot”系统调用(具体可参考kernel/sys.c)来实现的,这也是本文 使用“Generic PM之Reboot过程”作为标题的原因.另外,除了我们常用的shutdown和res