| ======================== |
| Linux power supply class |
| ======================== |
| |
| Synopsis |
| ~~~~~~~~ |
| Power supply class used to represent battery, UPS, AC or DC power supply |
| properties to user-space. |
| |
| It defines core set of attributes, which should be applicable to (almost) |
| every power supply out there. Attributes are available via sysfs and uevent |
| interfaces. |
| |
| Each attribute has well defined meaning, up to unit of measure used. While |
| the attributes provided are believed to be universally applicable to any |
| power supply, specific monitoring hardware may not be able to provide them |
| all, so any of them may be skipped. |
| |
| Power supply class is extensible, and allows to define drivers own attributes. |
| The core attribute set is subject to the standard Linux evolution (i.e. |
| if it will be found that some attribute is applicable to many power supply |
| types or their drivers, it can be added to the core set). |
| |
| It also integrates with LED framework, for the purpose of providing |
| typically expected feedback of battery charging/fully charged status and |
| AC/USB power supply online status. (Note that specific details of the |
| indication (including whether to use it at all) are fully controllable by |
| user and/or specific machine defaults, per design principles of LED |
| framework). |
| |
| |
| Attributes/properties |
| ~~~~~~~~~~~~~~~~~~~~~ |
| Power supply class has predefined set of attributes, this eliminates code |
| duplication across drivers. Power supply class insist on reusing its |
| predefined attributes *and* their units. |
| |
| So, userspace gets predictable set of attributes and their units for any |
| kind of power supply, and can process/present them to a user in consistent |
| manner. Results for different power supplies and machines are also directly |
| comparable. |
| |
| See drivers/power/supply/ds2760_battery.c and drivers/power/supply/pda_power.c |
| for the example how to declare and handle attributes. |
| |
| |
| Units |
| ~~~~~ |
| Quoting include/linux/power_supply.h: |
| |
| All voltages, currents, charges, energies, time and temperatures in µV, |
| µA, µAh, µWh, seconds and tenths of degree Celsius unless otherwise |
| stated. It's driver's job to convert its raw values to units in which |
| this class operates. |
| |
| |
| Attributes/properties detailed |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| +--------------------------------------------------------------------------+ |
| | **Charge/Energy/Capacity - how to not confuse** | |
| +--------------------------------------------------------------------------+ |
| | **Because both "charge" (µAh) and "energy" (µWh) represents "capacity" | |
| | of battery, this class distinguish these terms. Don't mix them!** | |
| | | |
| | - `CHARGE_*` | |
| | attributes represents capacity in µAh only. | |
| | - `ENERGY_*` | |
| | attributes represents capacity in µWh only. | |
| | - `CAPACITY` | |
| | attribute represents capacity in *percents*, from 0 to 100. | |
| +--------------------------------------------------------------------------+ |
| |
| Postfixes: |
| |
| _AVG |
| *hardware* averaged value, use it if your hardware is really able to |
| report averaged values. |
| _NOW |
| momentary/instantaneous values. |
| |
| STATUS |
| this attribute represents operating status (charging, full, |
| discharging (i.e. powering a load), etc.). This corresponds to |
| `BATTERY_STATUS_*` values, as defined in battery.h. |
| |
| CHARGE_TYPE |
| batteries can typically charge at different rates. |
| This defines trickle and fast charges. For batteries that |
| are already charged or discharging, 'n/a' can be displayed (or |
| 'unknown', if the status is not known). |
| |
| AUTHENTIC |
| indicates the power supply (battery or charger) connected |
| to the platform is authentic(1) or non authentic(0). |
| |
| HEALTH |
| represents health of the battery, values corresponds to |
| POWER_SUPPLY_HEALTH_*, defined in battery.h. |
| |
| VOLTAGE_OCV |
| open circuit voltage of the battery. |
| |
| VOLTAGE_MAX_DESIGN, VOLTAGE_MIN_DESIGN |
| design values for maximal and minimal power supply voltages. |
| Maximal/minimal means values of voltages when battery considered |
| "full"/"empty" at normal conditions. Yes, there is no direct relation |
| between voltage and battery capacity, but some dumb |
| batteries use voltage for very approximated calculation of capacity. |
| Battery driver also can use this attribute just to inform userspace |
| about maximal and minimal voltage thresholds of a given battery. |
| |
| VOLTAGE_MAX, VOLTAGE_MIN |
| same as _DESIGN voltage values except that these ones should be used |
| if hardware could only guess (measure and retain) the thresholds of a |
| given power supply. |
| |
| VOLTAGE_BOOT |
| Reports the voltage measured during boot |
| |
| CURRENT_BOOT |
| Reports the current measured during boot |
| |
| CHARGE_FULL_DESIGN, CHARGE_EMPTY_DESIGN |
| design charge values, when battery considered full/empty. |
| |
| ENERGY_FULL_DESIGN, ENERGY_EMPTY_DESIGN |
| same as above but for energy. |
| |
| CHARGE_FULL, CHARGE_EMPTY |
| These attributes means "last remembered value of charge when battery |
| became full/empty". It also could mean "value of charge when battery |
| considered full/empty at given conditions (temperature, age)". |
| I.e. these attributes represents real thresholds, not design values. |
| |
| ENERGY_FULL, ENERGY_EMPTY |
| same as above but for energy. |
| |
| CHARGE_COUNTER |
| the current charge counter (in µAh). This could easily |
| be negative; there is no empty or full value. It is only useful for |
| relative, time-based measurements. |
| |
| PRECHARGE_CURRENT |
| the maximum charge current during precharge phase of charge cycle |
| (typically 20% of battery capacity). |
| |
| CHARGE_TERM_CURRENT |
| Charge termination current. The charge cycle terminates when battery |
| voltage is above recharge threshold, and charge current is below |
| this setting (typically 10% of battery capacity). |
| |
| CONSTANT_CHARGE_CURRENT |
| constant charge current programmed by charger. |
| |
| |
| CONSTANT_CHARGE_CURRENT_MAX |
| maximum charge current supported by the power supply object. |
| |
| CONSTANT_CHARGE_VOLTAGE |
| constant charge voltage programmed by charger. |
| CONSTANT_CHARGE_VOLTAGE_MAX |
| maximum charge voltage supported by the power supply object. |
| |
| INPUT_CURRENT_LIMIT |
| input current limit programmed by charger. Indicates |
| the current drawn from a charging source. |
| INPUT_VOLTAGE_LIMIT |
| input voltage limit programmed by charger. Indicates |
| the voltage limit from a charging source. |
| INPUT_POWER_LIMIT |
| input power limit programmed by charger. Indicates |
| the power limit from a charging source. |
| |
| CHARGE_CONTROL_LIMIT |
| current charge control limit setting |
| CHARGE_CONTROL_LIMIT_MAX |
| maximum charge control limit setting |
| |
| CALIBRATE |
| battery or coulomb counter calibration status |
| |
| CAPACITY |
| capacity in percents. |
| CAPACITY_ALERT_MIN |
| minimum capacity alert value in percents. |
| CAPACITY_ALERT_MAX |
| maximum capacity alert value in percents. |
| CAPACITY_LEVEL |
| capacity level. This corresponds to POWER_SUPPLY_CAPACITY_LEVEL_*. |
| |
| TEMP |
| temperature of the power supply. |
| TEMP_ALERT_MIN |
| minimum battery temperature alert. |
| TEMP_ALERT_MAX |
| maximum battery temperature alert. |
| TEMP_AMBIENT |
| ambient temperature. |
| TEMP_AMBIENT_ALERT_MIN |
| minimum ambient temperature alert. |
| TEMP_AMBIENT_ALERT_MAX |
| maximum ambient temperature alert. |
| TEMP_MIN |
| minimum operatable temperature |
| TEMP_MAX |
| maximum operatable temperature |
| |
| TIME_TO_EMPTY |
| seconds left for battery to be considered empty |
| (i.e. while battery powers a load) |
| TIME_TO_FULL |
| seconds left for battery to be considered full |
| (i.e. while battery is charging) |
| |
| |
| Battery <-> external power supply interaction |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| Often power supplies are acting as supplies and supplicants at the same |
| time. Batteries are good example. So, batteries usually care if they're |
| externally powered or not. |
| |
| For that case, power supply class implements notification mechanism for |
| batteries. |
| |
| External power supply (AC) lists supplicants (batteries) names in |
| "supplied_to" struct member, and each power_supply_changed() call |
| issued by external power supply will notify supplicants via |
| external_power_changed callback. |
| |
| |
| Devicetree battery characteristics |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| Drivers should call power_supply_get_battery_info() to obtain battery |
| characteristics from a devicetree battery node, defined in |
| Documentation/devicetree/bindings/power/supply/battery.txt. This is |
| implemented in drivers/power/supply/bq27xxx_battery.c. |
| |
| Properties in struct power_supply_battery_info and their counterparts in the |
| battery node have names corresponding to elements in enum power_supply_property, |
| for naming consistency between sysfs attributes and battery node properties. |
| |
| |
| QA |
| ~~ |
| |
| Q: |
| Where is POWER_SUPPLY_PROP_XYZ attribute? |
| A: |
| If you cannot find attribute suitable for your driver needs, feel free |
| to add it and send patch along with your driver. |
| |
| The attributes available currently are the ones currently provided by the |
| drivers written. |
| |
| Good candidates to add in future: model/part#, cycle_time, manufacturer, |
| etc. |
| |
| |
| Q: |
| I have some very specific attribute (e.g. battery color), should I add |
| this attribute to standard ones? |
| A: |
| Most likely, no. Such attribute can be placed in the driver itself, if |
| it is useful. Of course, if the attribute in question applicable to |
| large set of batteries, provided by many drivers, and/or comes from |
| some general battery specification/standard, it may be a candidate to |
| be added to the core attribute set. |
| |
| |
| Q: |
| Suppose, my battery monitoring chip/firmware does not provides capacity |
| in percents, but provides charge_{now,full,empty}. Should I calculate |
| percentage capacity manually, inside the driver, and register CAPACITY |
| attribute? The same question about time_to_empty/time_to_full. |
| A: |
| Most likely, no. This class is designed to export properties which are |
| directly measurable by the specific hardware available. |
| |
| Inferring not available properties using some heuristics or mathematical |
| model is not subject of work for a battery driver. Such functionality |
| should be factored out, and in fact, apm_power, the driver to serve |
| legacy APM API on top of power supply class, uses a simple heuristic of |
| approximating remaining battery capacity based on its charge, current, |
| voltage and so on. But full-fledged battery model is likely not subject |
| for kernel at all, as it would require floating point calculation to deal |
| with things like differential equations and Kalman filters. This is |
| better be handled by batteryd/libbattery, yet to be written. |