Skip to content

Protezione Batteria Lenovo 13 G2 su MX Linux 25 (Debian 13)

Obiettivo

Configurare la protezione della batteria su un ThinkPad 13 2nd Gen con MX Linux 25.1 (Debian 13), limitando la carica massima all'80% per ridurre l'usura su uso prevalentemente AC.


Hardware e Software

  • Notebook: Lenovo ThinkPad 13 2nd Gen (20J2S1DN00)
  • OS: MX Linux 25.1
  • Kernel: 6.12.74+deb13+1-amd64
  • TLP: 1.8.0
  • Driver batteria: thinkpad_acpi v0.26 (natacpi)
  • Batteria: BAT1 (LGC LNV-01AV435, 42 Wh design, 22.9 Wh reale — 54.6% capacità residua)

Identificazione della batteria

tlp-stat -b

Sul ThinkPad 13 2nd Gen la batteria principale è BAT1 (non BAT0). Il driver attivo è natacpi (thinkpad_acpi).


Il problema: TLP non riesce a impostare le soglie

Su questo notebook il driver thinkpad_acpi v0.26 su kernel 6.12 ha un comportamento anomalo: qualsiasi scrittura su charge_control_end_threshold o charge_control_start_threshold sincronizza automaticamente entrambi i valori all'ultimo scritto.

Esempio del problema:

echo 80 > /sys/class/power_supply/BAT1/charge_control_end_threshold
echo 40 > /sys/class/power_supply/BAT1/charge_control_start_threshold
cat /sys/class/power_supply/BAT1/charge_control_start_threshold  # -> 40
cat /sys/class/power_supply/BAT1/charge_control_end_threshold    # -> 40  (sincronizzato!)

Di conseguenza TLP non riesce ad applicare configurazioni come 40/80 o 75/80. Ogni tentativo produce 80/80 oppure 40/40.

Non è un bug di TLP ma un comportamento del firmware EC di Lenovo su questo notebook, non risolvibile tramite aggiornamento firmware (verificato con fwupdmgr, tutto gia' aggiornato).

Cosa non funziona

  • Modificare tlp.conf con START_CHARGE_THRESH_BAT1 e STOP_CHARGE_THRESH_BAT1
  • tlp start / tlp setcharge
  • Udev rule con ACTION=="add"
  • Scrittura manuale diretta su sysfs con start diverso da stop

La soluzione: servizio systemd con solo stop threshold

Il test ha dimostrato che scrivere solo charge_control_end_threshold=80 funziona: il driver sincronizza automaticamente anche start a 80, e la carica si ferma correttamente.

/sys/class/power_supply/BAT1/status                         = Not charging
/sys/class/power_supply/BAT1/charge_control_start_threshold =     80 [%]
/sys/class/power_supply/BAT1/charge_control_end_threshold   =     80 [%]
Charge                                                      =   87.3 [%]

Creazione del servizio

cat > /etc/systemd/system/battery-threshold.service << 'EOF'
[Unit]
Description=Set battery charge stop threshold to 80%
After=multi-user.target
StartLimitBurst=0

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'echo 80 > /sys/class/power_supply/BAT1/charge_control_end_threshold'

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now battery-threshold.service

Verifica

systemctl status battery-threshold.service
cat /sys/class/power_supply/BAT1/charge_control_end_threshold   # -> 80
cat /sys/class/power_supply/BAT1/charge_control_start_threshold # -> 80

La configurazione è persistente al riavvio.


Comportamento risultante

Con questa configurazione su uso AC fisso la batteria non supera mai l'80% e non cicla mai (non scende sotto 80% restando in AC). La protezione è applicata a livello EC: rimane attiva anche con laptop spento.

La configurazione risultante è 80/80: start e stop allo stesso valore. Su uso AC fisso questo è ottimale: la soglia di start è irrilevante perché la batteria non scendera' mai abbastanza da innescarla.


Attenzione: reset EC

Durante i test è stato possibile mettere l'EC in uno stato bloccato (batteria non caricava nonostante AC collegata) a causa di scritture ripetute e disordinate sulle soglie. Il reset si esegue tramite il foro di emergenza sul fondo del notebook (graffetta raddrizzata, notebook spento e scollegato dall'AC).

Non modificare le soglie manualmente via sysfs senza un piano preciso. Usare esclusivamente il servizio systemd descritto sopra.


Comandi utili

# Stato completo batteria
tlp-stat -b

# Stato del servizio
systemctl status battery-threshold.service

# Carica temporanea al 100% (es. prima di un viaggio)
systemctl stop battery-threshold.service
echo 100 > /sys/class/power_supply/BAT1/charge_control_end_threshold
# Per ripristinare la soglia:
systemctl start battery-threshold.service

Note importanti

  • Configurazione permanente: rimane attiva dopo ogni riavvio
  • Hardware-specific: questo workaround è specifico per ThinkPad 13 2nd Gen con kernel 6.12 e driver thinkpad_acpi v0.26
  • TLP rimane installato e attivo per la gestione del risparmio energetico generale (CPU, disco, WiFi, ecc.): solo la gestione delle soglie batteria è delegata al servizio systemd
  • tlp-stat -b mostrera' valori che sembrano incoerenti: usare upower -i $(upower -e | grep BAT) per una lettura alternativa