Battery Flipping Between Charging and Discharging
Summary
When connected to AC power with a battery charge limit set, Framework laptops rapidly oscillate between "charging" and "discharging" states — sometimes flipping every 1–2 seconds. This causes the battery to supplement power during brief CPU turbo bursts and then immediately recharge, creating microcyles that may accelerate battery wear12. The issue is visible as flickering charging LEDs, constant udev events, GNOME battery icon changes, and in severe cases USB-C dock disconnections13.
A related but distinct issue is the battery charge limit being ignored (battery charges to 100% despite a lower limit being set), caused by bugs in BIOS 3.07–3.08 that have been fixed in BIOS 3.09+456.
Symptoms
- Battery status rapidly alternates between "Charging" and "Discharging" while on AC power, sometimes every 1–2 seconds1
- Charging LED flickers between white (charging) and amber (discharging)1
- Battery supplements power during CPU turbo bursts even with the official 65W charger connected, discharging at 5–10W under heavy load17
- Constant stream of udev events from the power supply subsystem, causing excessive logging1
- GNOME/KDE battery icon changes rapidly between charging/discharging states1
- USB-C/Thunderbolt dock disconnections when the charge state abruptly switches38
- upower notification spam (chime sounds repeatedly) — especially pronounced with upower 1.90.89
- Battery charge limit ignored — battery charges to 100% despite a limit (e.g., 80%) being set in BIOS45
Affected Models
- Framework Laptop 13 (11th Gen Intel)101112
- Framework Laptop 13 (12th Gen Intel)1131415
- Framework Laptop 13 (13th Gen Intel)161718
- Framework Laptop 13 (AMD Ryzen 7040)19202122
- Framework Laptop 13 (AMD Ryzen AI 300)2324
- Framework Laptop 16 (AMD Ryzen 7040)252627
The issue has also been reported on Windows1112, though it is more visible on Linux due to udev/upower behavior.
Root Cause
Multiple contributing factors cause this behavior:
1. No bypass mode enabled on FW13 firmware. Unlike traditional laptops with a barrel jack delivering fixed voltage, USB-C laptops use a buck-boost DC-DC converter between the input and the system power rail. The FW13 hardware supports bypass mode (disconnecting the battery from the power path), but Framework has never enabled it in firmware. Framework engineer Kieran_Levin confirmed: "Bypass mode is present in the current 13in mainboards... But we never enabled the switching in firmware. It is somewhat complex to implement."28 Without bypass, the battery always participates in the power path and acts as a buffer during transient load spikes.
2. EC runs conflicting charging algorithms. Community member James3 (jcdutton) analyzed the EC source code and found that the EC firmware runs three different battery management algorithms simultaneously, each overwriting the previous one's result. The algorithms "argue" with each other — one says charge, another says discharge — causing rapid state flipping2930.
3. Broken charge state machine logic. The sustain_switch_mode() function in the EC firmware uses exact equality (==) comparisons for charge levels instead of range checks (>=/<=). BMS recalibration can shift the reported state of charge slightly, randomly pushing values across the threshold and triggering state changes29.
4. USB-PD power budget limitation. Community member Charlie_6 measured actual usable power from USB-C adapters and found significant overhead — a 65W adapter delivers only ~37W usable due to USB-PD negotiation and buck-boost converter losses. When CPU turbo draws more than the usable budget, the battery supplements the difference, causing a discharge event followed by an immediate recharge2122.
5. upower 1.90.8 regression (Linux-specific). upower 1.90.8 changed how it detects AC status, treating brief battery discharge states as "AC unplugged." This caused constant notification chimes and power profile switching, making the existing EC behavior much more visible. Fixed in upower 1.90.9931.
Diagnosis
-
Watch battery status in real time:
watch -n 1 cat /sys/class/power_supply/BAT1/status -
Monitor for rapid state changes:
udevadm monitor -s power_supply -
Check for microcycling under load:
upower -i /org/freedesktop/UPower/devices/battery_BAT1 -
Verify BIOS version — BIOS 3.07 and 3.08 have known charge limit bugs:
sudo dmidecode -s bios-version -
Check upower version (Linux):
upower --versionVersion 1.90.8 has the notification spam regression; update to 1.90.9+9.
Workarounds & Fixes
| Solution | Effectiveness | Notes |
|---|---|---|
| Update to BIOS 3.09 or later4532 | Fixes charge limit bugs | Fixes the charge-limit-ignored bug (3.07/3.08). Does not fully eliminate microcycling on FW13. Required for all FW13 AMD 7040 and 13th Gen Intel users |
| Use 100W+ USB-C charger722 | Reduces microcycling | Higher wattage provides more headroom for CPU turbo bursts. Does not eliminate the issue entirely |
| Disable CPU/GPU boost via TLP17 | Eliminates most flipping | Set CPU_BOOST_ON_AC=0 in TLP. Sacrifices peak performance but significantly reduces power draw spikes |
| Update upower to 1.90.9+931 | Fixes notification spam | Fixes the upower 1.90.8 regression that caused constant AC-unplugged notifications. Does not fix the underlying EC behavior |
| Set charge limit to 100%1 | Reduces microcycling | Without a charge limit, the battery stays fully charged and flips less often. Not recommended for battery health if the laptop is always plugged in |
ectool chargecurrentlimit daemon33 | Prevents dock disconnects | Community member real_or_random created a daemon that limits charge current, reducing the severity of charge state transitions. Requires DHowett's ectool |
| Disable Battery Life Extender in BIOS34 | Prevents charge limit override | On BIOS 3.07–3.08, the Battery Extender feature can override the manual charge limit. Disable it and set the limit manually. Fixed in 3.09 |
| James3's custom EC firmware2930 | Fixes microcycling | Community-built EC firmware that fixes the conflicting algorithms and broken state machine. Available for FW16 and FW13 AMD 7040 only. Requires flashing custom firmware — use at your own risk |
Resolution
Charge limit bugs (BIOS 3.07–3.08): Fully resolved in BIOS 3.09 for FW13 AMD Ryzen 7040 and FW13 13th Gen Intel4532. The fix ensures the charge limit is enforced correctly whether Battery Life Extender is enabled or disabled. Framework engineer Quin_Chou confirmed: "BIOS 3.09 beta... resolves a bug affecting the battery charge limit, ensuring it works correctly whether a battery extender is enabled or disabled."5
BIOS 3.07 also introduced a 5% float range — if the charge limit is set to 80%, the battery floats between 75–80% rather than being held at exactly 80%. This reduces (but does not eliminate) microcycling by adding hysteresis635.
Microcycling on FW13: Not fully resolved. The fundamental cause — battery always in the power path without bypass mode — has not been addressed in firmware. Framework engineer Kieran_Levin stated there are no plans to enable bypass mode on FW1328. The 5% float range in BIOS 3.07+ mitigates the symptom.
FW16 battery drain under GPU load: Fixed in BIOS 4.03 (December 2025)36.
upower notification spam: Fixed in upower 1.90.9931.
Related
- [TRACKING] Battery flipping between charging and discharging — Framework Community (main tracking thread, 600+ replies, Sep 2022–present)
- Battery charge limit occasionally ignored — Framework Community (FW16)
- New firmware 3.07 not abiding charge limit — Framework Community
- Framework Laptop 13 Ryzen 7040 BIOS 3.09 Release — Framework Community
- Framework Laptop 16 Ryzen 7040 BIOS 4.03 Release — Framework Community
- Battery Charge Limit unreliable — Issue #52 — GitHub
- Unsupported userspace charge control — Issue #70 — GitHub
- FW16 BIOS 3.05 battery drain — Issue #33 — GitHub
- Framework EmbeddedController source — GitHub
- charge-limiter daemon by real_or_random — GitHub Gist
- James3's fixed EC firmware (jcdutton/EmbeddedController) — GitHub
- upower charge notification cycle issue — GitLab