天天看點

linux power_supply

核心提供給電池驅動的接口就是結構體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

繼續閱讀