Linux & Donanım

Bir dizüstü pilini düzgün park etmek

Dizüstüm sürekli prizde duruyor. Şarj eşikleri yetmedi, bu yüzden çoğu aracın görmezden geldiği bir kernel özelliğini kullanan küçük bir daemon yazdım.

Ramazan Yavuz
Ramazan Yavuz ·

Dizüstüm on günden dokuzunda masaüstü yerine geçiyor. Bütün gün bir standın üzerinde fişe takılı duruyor, ve sadece seyahatte veya yer değiştirdiğimde yanıma alıyorum. Çoğu modern cihaz gibi, BIOS'unda şarj eşik kontrolü var – benim "80'de durdur, 75'te tekrar başlat" şeklinde ayarlı. Bu varsayılana göre bir iyileşme, ama tam olarak istediğim şey değil.

Ne istiyorum: pilin bir hedef voltajda oturup hiç döngüye girmemesi. 75–80 eşiği, sistem hafif akım çekerken hala saatte birkaç yüzde puan mikro-döngüsüdür. Aylar boyunca yüzlerce gereksiz mini-döngü ediyor. İhtiyacım olan, charger'a "prizi görmezden gel, pili rahat bırak" diyebilen bir mekanizmaydı.


Linux power-supply alt sistemi bir süredir tam bu mekanizmaya sahip: charge_behaviour, inhibit-charge değeri ile. Pil sürücünüz attribute'u export ediyorsa (ve birçok ThinkPad, Framework ve Dell Latitude'da export eder), tam göründüğü gibidir. Charger orada, priz takılı, sistem duvar gücünden çalışıyor, ve pil tamamen görmezden geliniyor. İçeri akım yok, dışarı akım yok, mikro-döngü yok.

BIOS'ta ve user space'te eşik kontrolü her yerde. Attribute olarak inhibit-charge öyle değil, ve onu açığa çıkaran GUI aracı bulamadım. Bu yüzden istediğim şeyi yazdım: attribute'u basit bir politikaya göre değiştiren bir daemon.


Daemon küçüktür. İki set noktası bilir: bir hedef şarj seviyesi ve bir histerez alt sınırı. Varsayılanlar hedef için 60 ve alt sınır için 54, ama yapılandırılabilirler. AC'deyken pil seviyesini sorar. Hedefin üzerindeyse, inhibit-charge yazar: prizi görmezden gel. Alt sınır ile hedef arasındaysa, yine inhibit-charge: şarjı tut. Alt sınırın altındaysa, auto'ya alır, hedefe geri yükler ve sonra tekrar inhibit-charge'a geçer.

Pildeyken daemon hiçbir şey yapmaz. Pil normal şekilde boşalır, kernel kendi işini yapar, kimse karışmaz. Tekrar takıldığında mantık yeniden devreye girer.

54 ile 60 arasındaki histerez bandı, charger'ın açılıp kapanmasını önlemek için. Histerez olmadan daemon, seviye hedefte takılır kalmaz "şarj ediyor" ve "şarj etmiyor" arasında sürekli geçiş yapardı – ki tam da kaçınmaya çalıştığım davranış. Altı yüzde puanlık band, bir oturumun eylem olmadan geçmesi için yeterlidir.


İki mod var ve bu kasıtlıydı. park az önce anlattığım: histerez ile hedef seviyede oturmak, döngü olmadan. off hiçbir şey yapmamak, kernel'in kendi işini halletmesi. "Yolculuk için tam doldur"a yönelik üçüncü bir mod kasıtlı olarak eklemedim, çünkü her zaman ad hoc gerekir ve doğrudan CLI çağrısıyla daha iyi yapılır (inhibit-charge full sonraki saat için bir kez modu değiştirir) kalıcı yapılandırma olarak değil. Üç mod yapılandırmayı yanlış ayarlamanın üç yolu olurdu. İki yeterlidir.


charge_behaviour attribute'u evrensel değil. Charger çipi veya ACPI tabloları bu mekanizmayı açığa çıkarmayan makinelerde, dosya basitçe yoktur, ya da inhibit-charge ile yazma EOPNOTSUPP ile reddedilir. Daemon bunu başlangıçta tespit eder ve sessizce başarısız olmak yerine net bir mesajla çıkar. Test ettiğim Lenovo, Framework ve Dell donanımlarında çalışır. Bazı ASUS ve HP makinelerde çalışmaz, ve o durumda BIOS şarj eşikleri elinizdeki en iyisidir.

Eğer charge_behaviour kullanılabilir durumdaysa, bu temiz şeydir. Bir kernel arabirimidir, bir user-space hack'i değil, dışarıdan yamalı bir ACPI yöntemi değil, EC firmware'inde sıkıştırılmış bir geçici çözüm değil.


Pil artık sıcak değil. Haftalarca %60 civarında oturuyor. Bir toplantı için fişten çıkardığımda normal şekilde boşalıyor. Tekrar taktığımda, daemon mevcut seviyeye göre ne yapacağına karar veriyor: %60 üzerindeyse prizi görmezden gelir ve pili boşta bırakır; %54 ile %60 arasında ise yine hiçbir şey yapmaz, şarjı olduğu gibi tutar; sadece seviye %54'ün altına düştüyse %60'a kısa bir top-up'a izin verir ve sonra tekrar durur. Histerez bandı, charger'ın hedef etrafında açılıp kapanmasını önler. Sonuç, gözlemlediğim en sıkıcı pil davranışı – ki bu tam olarak bir pilden istediğim şey.

Uzun vadeli etkiyi birkaç yıl sonra bileceğim. Park edilmiş bir şarj durumunda calendar aging literatürde iyi belgelenmiş, ama sıfır değil. Dürüst soru, park etmenin sıkı bir döngü bandından daha iyi olup olmadığıdır, ve bu pil kimyasına, ortam sıcaklığına ve gerçekten ne sıklıkla fişten çıkardığınıza bağlıdır. Nadiren fişten çıkarılan masa-bağlı bir dizüstü için park doğru stratejidir. Her gün fişten çıkaran biri için matematik tersine gidebilir.