Linux电源管理-Linux regulator framework概述
前言
问题
Linux Regulator Framework
machine
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使用。
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: 描述该约束的名字。
#define REGULATOR_MODE_NORMAL 0x2 //正常模式,大多数驱动都使用这种模式
#define REGULATOR_MODE_IDLE 0x4 //设备在idle状态,regulator给设备提供服务
#define REGULATOR_MODE_STANDBY 0x8 //设备在standby状态,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。
.apply_uV: 当min_uV=max_uV的时候时使用。
buck3_reg: BUCK3 {regulator-name = "VCC_1.8V";regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-always-on;regulator-boot-on;
};
regulator-name对应struct regulation_constraints中的name
regulator
struct regulator_desc {const char *name;const char *supply_name;const char *of_match;const char *regulators_node;int id;bool continuous_voltage_range;unsigned n_voltages;const struct regulator_ops *ops;int irq;enum regulator_type type;struct module *owner;unsigned int min_uV;unsigned int uV_step;unsigned int linear_min_sel;int fixed_uV;unsigned int ramp_delay;const struct regulator_linear_range *linear_ranges;int n_linear_ranges;const unsigned int *volt_table;unsigned int vsel_reg;unsigned int vsel_mask;unsigned int apply_reg;unsigned int apply_bit;unsigned int enable_reg;unsigned int enable_mask;unsigned int enable_val;unsigned int disable_val;bool enable_is_inverted;unsigned int bypass_reg;unsigned int bypass_mask;unsigned int bypass_val_on;unsigned int bypass_val_off;unsigned int enable_time;unsigned int off_on_delay;
};
.name: 该regulator的名字。
struct regulator_ops {/* enumerate supported voltages */int (*list_voltage) (struct regulator_dev *, unsigned selector);/* get/set regulator voltage */int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV,unsigned *selector);int (*map_voltage)(struct regulator_dev *, int min_uV, int max_uV);int (*set_voltage_sel) (struct regulator_dev *, unsigned selector);int (*get_voltage) (struct regulator_dev *);int (*get_voltage_sel) (struct regulator_dev *);/* get/set regulator current */int (*set_current_limit) (struct regulator_dev *,int min_uA, int max_uA);int (*get_current_limit) (struct regulator_dev *);/* enable/disable regulator */int (*enable) (struct regulator_dev *);int (*disable) (struct regulator_dev *);int (*is_enabled) (struct regulator_dev *);/* get/set regulator operating mode (defined in consumer.h) */int (*set_mode) (struct regulator_dev *, unsigned int mode);unsigned int (*get_mode) (struct regulator_dev *);/* Time taken to enable or set voltage on the regulator */int (*enable_time) (struct regulator_dev *);int (*set_ramp_delay) (struct regulator_dev *, int ramp_delay);int (*set_voltage_time_sel) (struct regulator_dev *,unsigned int old_selector,unsigned int new_selector);/* report regulator status ... most other accessors report* control inputs, this reports results of combining inputs* from Linux (and other sources) with the actual load.* returns REGULATOR_STATUS_* or negative errno.*/int (*get_status)(struct regulator_dev *);/* get most efficient regulator operating mode for load */unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV,int output_uV, int load_uA);/* control and report on bypass mode */int (*set_bypass)(struct regulator_dev *dev, bool enable);int (*get_bypass)(struct regulator_dev *dev, bool *enable);/* the operations below are for configuration of regulator state when* its parent PMIC enters a global STANDBY/HIBERNATE state *//* set regulator suspend voltage */int (*set_suspend_voltage) (struct regulator_dev *, int uV);/* enable/disable regulator in suspend state */int (*set_suspend_enable) (struct regulator_dev *);int (*set_suspend_disable) (struct regulator_dev *);/* set regulator suspend operating mode (defined in consumer.h) */int (*set_suspend_mode) (struct regulator_dev *, unsigned int mode);
};
此结构体的注释写的非常清楚,这里就不做详细的解释。
struct regulator_config {struct device *dev;const struct regulator_init_data *init_data;void *driver_data;struct device_node *of_node;struct regmap *regmap;int ena_gpio;unsigned int ena_gpio_invert:1;unsigned int ena_gpio_flags;
};
.dev: struct device指针。
struct regulator_dev {const struct regulator_desc *desc;int exclusive;u32 use_count;u32 open_count;u32 bypass_count;/* lists we belong to */struct list_head list; /* list of all regulators *//* lists we own */struct list_head consumer_list; /* consumers we supply */struct blocking_notifier_head notifier;struct mutex mutex; /* consumer lock */struct module *owner;struct device dev;struct regulation_constraints *constraints;struct regulator *supply; /* for tree */struct regmap *regmap;struct delayed_work disable_work;int deferred_disables;void *reg_data; /* regulator_dev data */struct dentry *debugfs;struct regulator_enable_gpio *ena_pin;unsigned int ena_gpio_state:1;/* time when this regulator was disabled last time */unsigned long last_off_jiffy;
};
.list: 所有的regulator链表。
consumer
sysfs-class-regulator
常见的API
regulator consumer interface
获取regulator/释放regulator
regulator = regulator_get(dev, "Vcc");
regulator_put(regulator);
Enable and disable
int regulator_enable(regulator);
int regulator_disable(regulator);
int regulator_force_disable(regulator);
设置regulator的电压,获得regulator的电压状态
int regulator_set_voltage(regulator, min_uV, max_uV);
int regulator_get_voltage(regulator);
设置regulator的电流,获得regulator的电流状态
int regulator_set_current_limit(regulator, min_uA, max_uA);
int regulator_get_current_limit(regulator);
regulator的模式设置,间接(通过负载),直接设置
int regulator_set_optimum_mode(struct regulator *regulator, int load_uA);
int regulator_set_mode(struct regulator *regulator, unsigned int mode);
unsigned int regulator_get_mode(struct regulator *regulator);
Regulator Driver interface
注册/反注册一个regulator
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,const struct regulator_config *config);
void regulator_unregister(struct regulator_dev *rdev);
regulator事件通知
int regulator_notifier_call_chain(struct regulator_dev *rdev,unsigned long event, void *data);
本小节就先到这里,下节通过一个实际的例子对regulator再有一个更深的认识。
Linux电源管理-Linux regulator framework概述相关推荐
- linux 电源管理 regulator,Linux内核电源管理综述
资料: http://blog.csdn.net/bingqingsuimeng/article/category/1228414 http://os.chinaunix.net/a2006/0519 ...
- linux 电源管理 Generic PM之Suspend功能
Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...
- Linux电源管理(一)电源管理系统架构
概述 Linux 电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电 ...
- Linux电源管理(1)_整体架构 -- wowo
1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就 ...
- Linux电源管理(6)_Generic PM之Suspend功能【重磅文章】-- wowo
文章目录 1. 前言 2. Suspend功能有关的代码分布 1)PM Core 2)Device PM 3)Platform dependent PM 3. suspend&resume过程 ...
- Linux电源管理_Generic PowerManager 之Suspend功能--(一)
1. 前言 Linux内核提供了三种Suspend: Freeze.Standby和STR(Suspend to RAM),在用户空间向"/sys/power/state"文件分别 ...
- Linux电源管理(10)_autosleep
Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...
- linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构
Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...
- linux系统电源时钟,linux电源管理的一些梳理
由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...
- Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)
1. 前言 这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off).待机(Standby or Hibernate).重启(Reboo ...
最新文章
- cookie JS验证码
- 网卡驱动和队列层中的数据包接收
- 电脑换ip软件_为什么会有企业需要软件换IP?
- javascript写贪吃蛇
- 【Python学习系列二十二】pandas数据筛选和排序
- 【 c#】实现form窗口中,通过按钮实现tabPage的切换
- smem – Linux 内存监视软件
- 文字转wav_这6款超良心语音转文字工具,真让人省心!
- 网络流优化:-1优化与当前弧优化
- 我的机器人现在无处可去。 无家可归。 无服务器。
- 微信小程序 等待几秒、_微信小程序—setTimeout定时器的坑
- 微服务feignclient_搞微服务用阿里开源的 Nacos 真香啊
- 【MyBatis笔记】10-多对一左连接查询分步查询(查询所有订单及订单对应的客户)
- python测试面试题-python接口自动化+测试开发面试题
- CDR9 X4 才是最稳定的经典版本,但是汉字文本对齐方面还是有点欠缺
- 易语言大漠多线程模板日志输出
- 英语12种记忆单词的方法
- 第6回 スライドによるページナビゲーション
- 地理信息系统的元数据、主数据、参考数据之间的区分
- 【Vue3】vue3的keepAlive保存滚动位置