![]() |
RT-Thread RTOS
An open source embedded real-time operating system
|
Header: **components/drivers/include/drivers/power_supply.h**. Core: **components/drivers/power/supply/supply.c**.
Models batteries, USB ports, mains, etc. as property objects (Linux power_supply–like). Chargers use the same class — Charger (gpio-charger).
Kconfig: **RT_USING_POWER_SUPPLY**, optional **RT_POWER_SUPPLY_DAEMON**.
There is no separate platform bus for power supplies: the platform driver owns **struct rt_platform_device**, and the **rt_power_supply** hangs off **psy->dev = &pdev->parent**.
Bind to DT with **compatible**, then register the supply in **probe**:
Reference: **gpio-charger.c** — **RT_PLATFORM_DRIVER_EXPORT(gpio_charger_driver)**.
| Field | Required |
|---|---|
**psy->dev** | Yes — usually **&pdev->parent** |
**psy->ops** + **properties** + **properties_nr** | Yes, unless **battery_info** is set (static battery descriptor path) |
**psy->type** | Set before register (USB type, battery, mains, …) |
**psy->battery_info** | Alternative to dynamic properties for some battery profiles |
On success:
psy** into global listrt_dm_dev_bind_fwdata(psy->dev, NULL, psy)** when **dev->ofw_node** is setchanged_work** for **rt_power_supply_changed()****rt_power_supply_unregister**: removes from list; fails with **-RT_EBUSY** if **rt_power_supply_get** refcount > 1.
Implement **ops->set_property** for writable limits (e.g. charge current). Only properties listed in **properties[]** are exposed via **rt_power_supply_set_property**.
After hardware state changes (GPIO IRQ, PMIC interrupt):
This queues **power_supply_changed_work**, which:
led_dev** if **RT_USING_LED**rt_power_supply_notifier** callbacksRegister a notifier:
**RT_POWER_SUPPLY_DAEMON**: built-in notifier drives low-battery / PM hints when **RT_USING_PM**.
**get_property** only succeeds if **prop** is in **psy->properties[]** (or **battery_info** path for supported static props).
Common properties: **STATUS**, **CAPACITY**, **ONLINE**, **VOLTAGE_NOW**, **CURRENT_NOW**, **TEMP**, **CONSTANT_CHARGE_CURRENT_MAX**, … — see enum in **power_supply.h**.
**id** is a DT phandle property name on **consumer_dev** (e.g. **power-supply = <&bat>** → **"power-supply"**). Resolves **rt_ofw_data** on the supply’s OFW node after register.
Fuel-gauge driver **probe** registers **rt_power_supply** on node **bat**. Thermal references **&bat** via **rt_power_supply_thermal_register** when **PROP_TEMP** exists.
| Subsystem | Hook |
|---|---|
| LED | Assign **psy->led_dev** before register; **changed** updates indicators |
| Thermal | **power_supply_thermal_register** if **PROP_TEMP** |
| Regulator | Charger **set_property** may adjust rails (see **gpio-charger**) |
| PM | Daemon may request sleep modes on low SOC |
| Issue | Mitigation |
|---|---|
Register before **psy->dev** set | **register** returns **-RT_EINVAL** |
Empty **properties** | Must list every prop **get_property** handles |
Forget **rt_power_supply_changed** | Notifiers/LED/PM stay stale |
**unregister with active get** | **put** all references first |
**get_property from ISR** | Defer to workqueue; gauge I2C may block |
| Stale SOC cache | Re-read hardware in **get_property** |
gpio-charger**components/drivers/power/supply/supply.c