Maximize your uConsole's
battery life.
2.5 hours out of the box is unacceptable. Here's every tweak, fix, and optimization the community has found — from quick config changes to deep power management tuning.
Why your uConsole dies in 2.5 hours.
The uConsole ships with two 18650 cells (~5000 mAh total at 3.7V, roughly 18.5 Wh). For a handheld Linux device, that should be reasonable — a Raspberry Pi 4 idles at ~3W. But the uConsole has a screen, WiFi radio, keyboard controller, audio DAC, and a power management IC that wasn't designed for efficiency. The result: the system draws 6-8W under normal use, draining those cells in under 3 hours.
CM4 vs CM5: Why CM5 is worse
Higher base clock. The CM5 (BCM2712) runs at 2.4 GHz vs the CM4's 1.5 GHz. More MHz = more power draw at every voltage-frequency point.
More cores active. The CM5's quad Cortex-A76 cores have higher per-core leakage current than the CM4's A72 cores, even when idle.
GPU subsystem. The VideoCore VII in the CM5 is significantly more powerful (and power-hungry) than the VideoCore VI, even when not actively rendering.
No deep sleep states. The uConsole's power management IC (AXP228) can't put the CM5 into proper low-power states. The firmware doesn't expose PM domain controls that would let the OS park unused cores.
The good news: most of this wasted power comes from software defaults that can be changed. The stock OS ships with the CPU governor set to “ondemand” (which ramps too aggressively), WiFi power save disabled by default on some builds, display brightness at 100%, and no thermal-aware frequency scaling. Fix these, and you can get meaningfully more runtime.
Your uConsole charges at half speed.
Out of the box, the AXP228 PMIC limits charging current to ~500mA — USB 2.0 spec. With two 18650 cells, a full charge takes 5+ hours. You can safely double this.
Increase charging current via config.txt
easyThe uConsole's device tree overlay for the AXP228 defaults to a conservative 500mA charge current. With a quality USB-C power supply (5V/2A or better), you can safely increase this to 1000mA or even 1500mA. This halves your charge time from 5+ hours to ~2.5 hours.
# Edit the boot config $ sudo nano /boot/config.txt # Find or add the dtparam for charging current # Default is usually 500000 (500mA) # Safe maximum for most 18650 cells: 1500000 (1.5A) dtparam=axp228-charge-current=1000000 # For aggressive charging with good cells (Samsung/LG/Sony) # dtparam=axp228-charge-current=1500000 # Reboot to apply $ sudo reboot
- • Use quality 18650 cells rated for 1C+ charge rate (e.g., Samsung 25R, LG HG2, Sony VTC6)
- • Monitor cell temperature during initial charges — cells shouldn't exceed 45°C
- • If using no-name cells, stay at 500mA or 750mA max
- • Your USB-C supply must deliver at least 5V/2A for 1000mA charge current
Why it works: The AXP228 PMIC supports up to 1.8A charging current. The stock limit is a conservative default, not a hardware limitation. With properly rated cells, 1A–1.5A is well within safe charging parameters.
Runtime charging control (no reboot)
moderateIf you want to adjust charging on-the-fly without rebooting, you can write directly to the AXP228 via the sysfs power supply interface. This is temporary and resets on reboot.
# Check current charging status
$ cat /sys/class/power_supply/axp20x-battery/status
Charging
# Read current charge current limit (in µA)
$ cat /sys/class/power_supply/axp20x-battery/current_max
500000
# Set to 1A (1000000 µA) — if supported by your DT overlay
$ echo 1000000 | sudo tee \
/sys/class/power_supply/axp20x-battery/current_max
# Verify it took effect
$ cat /sys/class/power_supply/axp20x-battery/current_nowNote: The exact sysfs path may vary depending on your kernel version and device tree configuration. Some builds expose this under /sys/class/power_supply/battery/ instead.
Squeeze every mAh.
These tweaks target the biggest power consumers on the uConsole: the CPU, WiFi radio, and display. Applied together, they can add 30–60 minutes of runtime depending on your workload.
3a. Switch to the conservative CPU governor
easyThe stock “ondemand” governor ramps CPU frequency to maximum at the slightest load spike, then stays there. The “conservative” governor ramps up gradually and drops quickly — much better for battery life without noticeable performance loss for terminal work, browsing, and SSH.
# Check current governor
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
ondemand
# Set conservative governor (all cores)
$ for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo "conservative" | sudo tee "$cpu"
done
# Tune the conservative governor for better battery
$ echo 80 | sudo tee /sys/devices/system/cpu/cpufreq/conservative/up_threshold
$ echo 20 | sudo tee /sys/devices/system/cpu/cpufreq/conservative/down_threshold
$ echo 5 | sudo tee /sys/devices/system/cpu/cpufreq/conservative/freq_step
# Verify
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
conservative# Install cpufrequtils if not present $ sudo apt install cpufrequtils # Set default governor $ sudo tee /etc/default/cpufrequtils << 'EOF' GOVERNOR="conservative" EOF # Enable the service $ sudo systemctl enable cpufrequtils
Why it works: The ondemand governor can keep the CPU at 1.5 GHz (CM4) or 2.4 GHz (CM5) even when a background process briefly spikes load. The conservative governor stays at the lowest frequency that keeps the system responsive. On the CM4, this means 600 MHz idle vs 1500 MHz — a ~40% power reduction at the CPU alone.
3b. Cap maximum CPU frequency
easyIf you don't need full performance, capping the max frequency prevents the CPU from ever reaching its highest (and most power-hungry) states. For terminal work and light browsing, 1.0 GHz on the CM4 or 1.5 GHz on the CM5 is plenty.
# See available frequencies
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
600000 750000 1000000 1500000
# Cap at 1.0 GHz (CM4) — good balance
$ for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do
echo "1000000" | sudo tee "$cpu"
done
# For CM5, cap at 1.5 GHz
$ for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do
echo "1500000" | sudo tee "$cpu"
done
# Verify
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freqTrade-off: Compiling code or running heavy processes will be noticeably slower. You can easily toggle this off when plugged in and back on when on battery.
3c. Enable WiFi power save mode
easyThis is the inverse of our WiFi fix guide advice. If your WiFi is stable (either with a USB adapter or after software fixes), re-enabling power save lets the radio sleep between beacon intervals. This saves 200–400mW — roughly 15–20 minutes of extra runtime.
# Enable WiFi power save immediately $ sudo iwconfig wlan0 power on # Make it persistent via NetworkManager $ sudo tee /etc/NetworkManager/conf.d/wifi-powersave.conf << 'EOF' [connection] # 1 = disabled, 2 = disabled, 3 = enabled wifi.powersave = 3 EOF # Restart NetworkManager $ sudo systemctl restart NetworkManager # Verify $ iwconfig wlan0 | grep "Power Management" Power Management:on
Caveat: If your WiFi is already unstable (see our WiFi guide), power save will make it worse. Fix WiFi first, then enable this.
3d. Reduce display brightness
easyThe 5-inch display is the single biggest power consumer on the uConsole — it draws ~1.5W at full brightness. At 30% brightness, that drops to ~0.5W. For indoor use, 30-50% is perfectly readable and saves a massive amount of power.
# Check max brightness value $ cat /sys/class/backlight/*/max_brightness 255 # Set to ~30% (77/255) $ echo 77 | sudo tee /sys/class/backlight/*/brightness # Set to ~50% (128/255) $ echo 128 | sudo tee /sys/class/backlight/*/brightness # Create a quick-toggle script $ sudo tee /usr/local/bin/battery-saver << 'SCRIPT' #!/bin/bash case "$1" in on) echo 60 | tee /sys/class/backlight/*/brightness ;; off) echo 200 | tee /sys/class/backlight/*/brightness ;; *) echo "Usage: battery-saver [on|off]" ;; esac SCRIPT $ sudo chmod +x /usr/local/bin/battery-saver
Pro tip: If you use i3wm or sway, bind brightness control to keyboard shortcuts for quick adjustment. The Toolkit comes with this pre-configured on Fn+Up/Down.
3e. Disable Bluetooth and HDMI when unused
easyIf you're not using Bluetooth or external displays, disabling these radios and interfaces saves ~100-200mW. Small savings, but they add up.
# Disable Bluetooth $ sudo rfkill block bluetooth # Or via config.txt for persistent disable $ echo "dtoverlay=disable-bt" | sudo tee -a /boot/config.txt # Disable HDMI output (saves ~25mW on CM4) $ sudo /opt/vc/bin/tvservice -o # CM4 # Or for newer kernels: $ echo 1 | sudo tee /sys/class/drm/card1-HDMI-A-1/enabled 2>/dev/null # Re-enable when needed $ sudo rfkill unblock bluetooth $ sudo /opt/vc/bin/tvservice -p # CM4
Apply all of 3a–3e together. On the CM4, expect 30–60 minutes of extra runtime (total: ~3.5–4 hours). On the CM5, expect 20–40 minutes extra (total: ~2–2.5 hours). Display brightness has the biggest single impact.
The overclock-battery tradeoff.
Overclocking is popular in the uConsole community — especially for retro gaming and compilation. But it comes at a real cost to battery life. Here's the data.
CPU power draw scales roughly with V² × frequency. Overclocking requires raising both voltage and frequency. A 30% frequency increase often means a 50-60% increase in power draw. On the CM5, aggressive overclocking can push total system draw over 15W — draining both cells in under an hour.
If you overclock, combine it with the conservative governor (Section 3a) and a frequency cap (Section 3b). Set the overclock high for peak performance but let the governor keep the clock low most of the time. This gives you burst performance when needed without constant high power draw. The Toolkit includes a power profile switcher that toggles between “performance” and “battery” modes automatically.
You're losing 15% of your battery.
One of the most frustrating issues: the uConsole shuts down with battery still remaining. Here's why, and what you can do about it.
The voltage floor explained
The AXP228 PMIC has a configurable low-voltage shutdown threshold. On the stock uConsole firmware, this is set to 3.18V per cell. The problem: most 18650 cells can safely discharge to 2.8V or even 2.5V. That means the uConsole leaves 10-15% of usable capacity on the table.
4.2V ┤████████████████████████████ 100%
4.0V ┤██████████████████████████ 90%
3.8V ┤████████████████████████ 80%
3.6V ┤██████████████████████ 65%
3.4V ┤████████████████████ 45%
3.2V ┤██████████████████ 30% ← stock shutdown
3.0V ┤████████████████ 18%
2.8V ┤██████████████ 10% ← safe minimum
2.5V ┤████████████ 3% ← absolute minimum
└────────────────────────────────Lower the voltage cutoff
advancedYou can lower the shutdown threshold via the AXP228's device tree overlay or register writes. Dropping from 3.18V to 2.9V recovers approximately 10-15 minutes of runtime.
# Check current battery voltage $ cat /sys/class/power_supply/axp20x-battery/voltage_now # Value in µV — e.g., 3850000 = 3.85V # Adjust shutdown threshold in config.txt $ sudo nano /boot/config.txt # Add or modify (value in mV): dtparam=axp228-shutdown-voltage=2900 # Default is 3180 (3.18V) # Recommended minimum: 2900 (2.9V) # Absolute minimum: 2700 (2.7V) — risk of cell damage $ sudo reboot
Discharging below 2.5V can permanently damage lithium cells. If you lower the threshold, monitor your cells closely. Cheap cells with degraded capacity may report higher voltage than actual — when they sag under load, they can drop below the safe minimum faster than expected. We recommend 2.9V as a safe lower bound for quality cells.
The real fix here would be a firmware update to the AXP228 to better track state-of-charge and implement a graceful warning system. The Toolkit includes a battery warning daemon that alerts you at configurable voltage thresholds (default: 3.3V warning, 3.1V critical) so you can save work before shutdown.
Real-world numbers.
Data collected from the uConsole Discord, Reddit r/ClockworkPi, and our own testing. All tests use stock 18650 cells unless noted. Your results will vary with cell age, capacity, and ambient temperature.
With all software tweaks applied, the CM4 uConsole is a 3.5–5 hour device depending on workload and display brightness. The CM5 is a 2.5–3.5 hour device. Upgrading to high-capacity 18650 cells (Samsung 30Q, 3000 mAh) is the single biggest improvement beyond software — it adds ~20% capacity over stock cells. This isn't a laptop. Plan your workflow around charging breaks or carry a USB-C power bank.
Know your power state.
You can't optimize what you can't measure. The AXP228 PMIC exposes detailed battery telemetry via sysfs. Here are the tools to monitor it.
7a. Read battery data from sysfs
easyThe AXP228 driver exposes voltage, current, temperature, and capacity via the Linux power supply subsystem. You can read these values directly.
# Battery voltage (µV)
$ cat /sys/class/power_supply/axp20x-battery/voltage_now
3856000 # = 3.856V
# Charge/discharge current (µA)
$ cat /sys/class/power_supply/axp20x-battery/current_now
-487000 # negative = discharging, 487mA
# Remaining capacity percentage
$ cat /sys/class/power_supply/axp20x-battery/capacity
67
# Charging status
$ cat /sys/class/power_supply/axp20x-battery/status
Discharging
# Battery temperature (0.1°C units)
$ cat /sys/class/power_supply/axp20x-battery/temp
312 # = 31.2°C
# All-in-one status script
$ for f in /sys/class/power_supply/axp20x-battery/*; do
echo "$(basename $f): $(cat $f 2>/dev/null)"
done7b. Battery monitor for your status bar
moderateA compact script that outputs battery info formatted for i3status, polybar, waybar, or any status bar. Shows voltage, percentage, current draw, and estimated time remaining.
#!/bin/bash
# uConsole Battery Monitor
# Usage: uconsole-battery-monitor.sh
# Outputs: 🔋 67% | 3.85V | -487mA | ~2h 15m
BAT="/sys/class/power_supply/axp20x-battery"
voltage=$(awk '{printf "%.2f", $1/1000000}' "$BAT/voltage_now")
current=$(awk '{printf "%d", $1/1000}' "$BAT/current_now")
capacity=$(cat "$BAT/capacity")
status=$(cat "$BAT/status")
# Estimate time remaining
if [ "$current" -lt 0 ]; then
# Discharging: estimate from current draw
energy_now=$(cat "$BAT/energy_now" 2>/dev/null || echo 0)
if [ "$energy_now" -gt 0 ] && [ "$current" -lt 0 ]; then
hours=$(awk -v e="$energy_now" -v c="$current" \
'BEGIN{t=e/(c*-1); printf "%d", t/1}')
mins=$(awk -v e="$energy_now" -v c="$current" \
'BEGIN{t=e/(c*-1)*60; printf "%d", t%60}')
time_est="~${hours}h ${mins}m"
else
time_est="calc..."
fi
else
time_est="charging"
fi
# Status icon
icon="🔋"
[ "$capacity" -le 20 ] && icon="🪫"
[ "$status" = "Charging" ] && icon="⚡"
echo "$icon $capacity% | ${voltage}V | ${current}mA | $time_est"7c. Measure per-component power draw
advancedTo understand where your power is going, you can use powertop to identify the biggest consumers. This helps you make informed decisions about which tweaks matter most for your workload.
# Install powertop $ sudo apt install powertop # Run interactive analysis (let it collect for 30+ seconds) $ sudo powertop # Auto-tune all power-saving settings # WARNING: may cause instability — test carefully $ sudo powertop --auto-tune # Generate an HTML report $ sudo powertop --html=power-report.html $ xdg-open power-report.html
What to look for: The “Device Stats” tab shows per-device wakeups and power estimates. Focus on anything waking the CPU more than 100 times/second — that's your biggest drain. Common culprits: misbehaving desktop widgets, polling scripts, and audio subsystem timers.
The Pocket Forge Toolkit ships with all of this pre-configured:
Skip all of this.
That was a lot of config files, sysfs paths, and kernel parameters. Every one of those tweaks works — but applying them all manually means an afternoon of terminal work, forum cross-referencing, and hoping you didn't break something.
Every fix. Pre-configured. Flash and go.
Our premium OS image ships with every battery optimization from this guide already applied — plus WiFi fixes, a tuned i3 desktop for the 5" screen, QMK keyboard firmware, and 30+ curated packages. Stop spending afternoons debugging. Start using your uConsole.
Overclocking Guide
Push your CM4/A06 further — with safe profiles that balance power and performance.
Read guide →WiFi Fix Guide
Fix the WiFi signal issues caused by the aluminum shell — driver patches and antenna mods.
Read guide →i3 & Sway Setup
Lightweight tiling WM that uses less power than a full desktop environment.
Read guide →Retro Gaming & Emulation
Set up RetroArch and play NES through PSP on your uConsole.
Read guide →More guides are coming.
We're writing guides on i3 desktop setup, QMK keyboard firmware, overclocking profiles, and more. Join the waitlist to get notified when they drop — plus early access to new tools.
Also check out our WiFi Fix Guide
Your email is stored securely and used only for Pocket Forge updates. Unsubscribe anytime.