核心提供給電池驅動的接口就是結構體power_supply。
Battery驅動程式需要通過sys檔案系統向使用者空間提供接口,sys檔案系統的路徑是由上層的程式指定的。
Linux标準的Power Supply驅動程式所使用的檔案系統路徑問/sys/class/power_supply,其中的每個子目錄表示一種能源供應裝置的名稱。
Power Supply驅動程式的頭檔案在include/linux/power_supply.h中定義,注冊和登出驅動程式的函數如下所示:
struct power_supply *power_supply_register(struct device *parent,
const struct power_supply_desc *desc,
const struct power_supply_config *cfg)
void power_supply_unregister(struct power_supply *psy)
其中
power_supply
結構體為驅動程式需要實作的部分:
struct power_supply {
const struct power_supply_desc *desc;
char **supplied_to;
size_t num_supplicants;
char **supplied_from;
size_t num_supplies;
struct device_node *of_node;
/* Driver private data */
void *drv_data;
/* private */
struct device dev;
struct work_struct changed_work;
struct delayed_work deferred_register_work;
spinlock_t changed_lock;
bool changed;
atomic_t use_cnt;
#ifdef CONFIG_THERMAL
struct thermal_zone_device *tzd;
struct thermal_cooling_device *tcd;
#endif
#ifdef CONFIG_LEDS_TRIGGERS
struct led_trigger *charging_full_trig;
char *charging_full_trig_name;
struct led_trigger *charging_trig;
char *charging_trig_name;
struct led_trigger *full_trig;
char *full_trig_name;
struct led_trigger *online_trig;
char *online_trig_name;
struct led_trigger *charging_blink_full_solid_trig;
char *charging_blink_full_solid_trig_name;
#endif
};
其中
power_supply_desc
為裝置供電的描述結構體:
/* Description of power supply */
struct power_supply_desc {
const char *name; /*供電裝置名*/
enum power_supply_type type;/*裝置類型*/
enum power_supply_property *properties;/*裝置屬性*/
size_t num_properties;
/*
* Functions for drivers implementing power supply class.
* These shouldn't be called directly by other drivers for accessing
* this power supply. Instead use power_supply_*() functions (for
* example power_supply_get_property()).
*/
int (*get_property)(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val);
int (*set_property)(struct power_supply *psy,
enum power_supply_property psp,
const union power_supply_propval *val);
/*
* property_is_writeable() will be called during registration
* of power supply. If this happens during device probe then it must
* not access internal data of device (because probe did not end).
*/
int (*property_is_writeable)(struct power_supply *psy,
enum power_supply_property psp);
void (*external_power_changed)(struct power_supply *psy);
void (*set_charged)(struct power_supply *psy);
/*
* Set if thermal zone should not be created for this power supply.
* For example for virtual supplies forwarding calls to actual
* sensors or other supplies.
*/
bool no_thermal;
/* For APM emulation, think legacy userspace. */
int use_for_apm;
};
其中核心主要通過
get_property
這個函數指針來獲得驅動中的有關電池的資訊。
核心中提供給使用者接口,通過
power_supply_register
函數在
/sys/class/power_supply
下分别注冊ac、usb、 battery,注冊完成可發現在裝置目錄/sys/class/power_supply下分别出現ac、 usb、 battery三個檔案夾,通過讀取這些檔案的内容,就可以得到電源的資訊。
核心主要通過兩個檔案
power_supply_class.c
和
power_supply_core.c
,調用其中的函數就可以把電源(電池,USB或AC)的資訊展現給使用者!
power supply例子:
http://blog.csdn.net/sgmenghuo/article/details/44061715