作为一名嵌入式软件程序猿,很多时候我们都需要知道linux或android等设备的电源使用相关的情况。如是否有充电器连接、是否在充电、是否充满等状态,linux kernel可以通过uevent机制进行上报事件。
源码目录下相关文档:
/include/linux/power_supply.h // 公用的一些数据结构等的定义,包括电源的各项属性、状态及读写这些属性的一些接口函数等以及提供给具体设备模块的注册、注销等的函数接口。
/drivers/power/power_supply_sysfs.c //实现电源uevent的主要文件
/drivers/power/power_supply_core.c //电源模块核心部分,实现了具体设备统一的注册、注销等电源相关的函数接口,通过/include/linux/power_supply.h文件提供对外接口的声明。
/drivers/power/Makefile //查看该文件可知,uevent的实现主要依赖CONFIG_SYSFS和CONFIG_POWER_SUPPLY这两项的配置
/drivers/power/Kconfig //该文件可相关的配置和依赖关系
/drivers/power/power_supply.h // 声明一些power_supply_sysfs.c文件和power_supply_leds.c的对外接口,这些接口在文件/drivers/power/power_supply_core.c中使用。
/drivers/power/power_supply_leds.c //电源LED相关,不分析
在 /drivers/power/目录下还有很多其它的一些具体设备的底层实现,本文不分析。
本文主要分析四个文件:/include/linux/power_supply.h , /drivers/power/power_supply.h , /drivers/power/power_supply_sysfs.c,/drivers/power/power_supply_core.c。
1. /include/linux/power_supply.h 文件
struct power_supply {...}结构体:
该结构体中定义了一些重要的电源相关的操作函数接口,如get_property和set_property函数指针可以分别获取和设置电源相关的一些属性。
enum power_supply_property {...}枚举结构,其定义如下:
enum power_supply_property {
/* Properties of type `int' */
POWER_SUPPLY_PROP_STATUS = 0,
POWER_SUPPLY_PROP_CHARGE_TYPE,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_ONLINE,
POWER_SUPPLY_PROP_AUTHENTIC,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_VOLTAGE_MAX,
POWER_SUPPLY_PROP_VOLTAGE_MIN,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_AVG,
POWER_SUPPLY_PROP_VOLTAGE_OCV,
POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_POWER_AVG,
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
POWER_SUPPLY_PROP_CHARGE_FULL,
POWER_SUPPLY_PROP_CHARGE_EMPTY,
POWER_SUPPLY_PROP_CHARGE_NOW,
POWER_SUPPLY_PROP_CHARGE_AVG,
POWER_SUPPLY_PROP_CHARGE_COUNTER,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX,
POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT,
POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX,
POWER_SUPPLY_PROP_ENERGY_