今晚很郁闷了,郁闷之余,戴上耳麦放大音乐,就敲打了以下文字,解郁闷~明天又是不错的开始~~
现在android/linux为模块设备供电有两种,一种GPIO供电,另一个就是电源管理芯片。
电源管理芯片可以为多设备供电,且这些设备电压电流有所同。为这些设备提供的稳压器代码模型即为regulator。
下面通过下面三个过程分析regulartor供电机制:
1.分析regulator结构体
2.regulator 注册过程
3.设备使用regulator过程
一.分析regulator结构体
Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统(尤其是手机)中,控制耗电量很重要,直接影响到电池的续航时间。所以,如果系统中某一个模块暂时不需要使用,就可以通过regulator关闭其电源供应;或者降低提供给该模块的电压、电流大小。
Regulator的文档在KERNEL/Documentation/Power/Regulator中。
Regulator与模块之间是树状关系。父regulator可以给设备供电,也可以给子regulator供电:
父Regulator
--> 子Regulator --> [supply]
--> 设备[Consumer]
具体细节可参考内核文档machine.txt。
regulator_dev
regulator_dev代表一个regulator设备。
struct regulator_dev {
struct regulator_desc *desc; // 描述符,包括regulator的名称、ID、regulator_ops等
int use_count; // 使用计数
struct list_head list; // regulator通过此结构挂到regulator_list链表中
struct list_head slist; // 如果有父regulator,通过此域挂到父regulator的链表
struct list_head consumer_list; // 此regulator负责供电的设备列表
struct list_head supply_list; //此regulator负责供电的子regulator
struct blocking_notifier_head notifier; // notifier,具体的值在consumer.h中,比如REGULATOR_EVENT_FAIL
struct mutex mutex;
struct module *owner;
struct device dev; // device结构,属于class regulator_class
struct regulation_constraints *constraints; // 限制,比如最大电压/电流、最小电压/电流
struct regulator_dev *supply; // 父regulator的指针,即由此regulator 供电
void *reg_data;
};
regulator_init_data
regulator_init_data在初始化时使用,用来建立父子regulator、受电模块之间的树状结构,以及一些regulator的基本参数。
struct regulator_init_data {
struct device *supply_regulator_dev; // 父regulator的指针
struct regulation_constraints constraints;
int num_consumer_supplies;
struct regulator_consumer_supply *consumer_supplies; // 负责供电的设备数组
int (*regulator_init)(void *driver_data); // 初始化函数,在regulator_register被调用
void *driver_data;
};