有没有 Linux 下充电到指定电量就停止充电的软件?

236 天前
 itakeman

有没有 linux 下充电到指定电量就停止充电的软件?停止充电后,直接用充电器得电,不走电池,这种软件有吗?

2801 次点击
所在节点    Linux
36 条回复
ChaosAttractor
236 天前
这个需要 BIOS 来实现吧,很多机器可以用逆向工程得到的 ACPI CALL 来控制(比如说华硕有 asusd )
如果机器不支持就没戏?
itakeman
236 天前
@ChaosAttractor 我看联想 win 下有这功能,看一下 linux 能不能实现
SHF
236 天前
EmbeddedController 有充电阈值可以设置,可能需要有驱动支持能写入这个值
zhuisui
236 天前
tlp
libook
236 天前
需要硬件支持的,没办法软件实现。
itakeman
236 天前
@libook 联想小新 win 下可以用旧版电源管理可以实现,不知道 linux 可不可以实现
0superx0
236 天前
@zhuisui
4 楼说的对,tlp 完全可以操作配置 TLP
sudo nano /etc/default/tlp
充电参数
START_CHARGE_THRESH_BAT0=20 #低于 20%开始充电
STOP_CHARGE_THRESH_BAT0=80 #高于 80%停止充电

具体你可以按自己要求更改就行
wowpaladin
236 天前
直接用 wsl 不行吗?
itakeman
236 天前
@0superx0 问题是可不可以,到了 80 电量,直接用电源的电,不走电池循环?
itakeman
236 天前
@wowpaladin 用了几年 linux 了,不想用回 win
iOCZS
236 天前
难点是如何断开,获取电量还是容易的
kuanat
236 天前
如果 Windows 有这个功能,大概率可以 Linux 实现。难易程度主要看硬件实现的方式,我简单描述下方法,你可以先尝试一下。



一般来说,电池都会通过 ACPI 提供像电量、充电状态信息等等接口,然后通过 sysfs 抽象供用户空间的应用使用。

所以第一步是看 /sys/class/power_supply 的设备,笔记本上 power_supply 类型一般有电源和电池。

能找到对应的电池的话,可以顺着 /sys/class/power_supply/XXX 链接去找对应的电池设备,看看有没有类似 charge_control_end_threshold 这类名字的抽象,这个名字都是厂家自己定义的,但是看字面意义一般就能猜出来。

如果存在的话,可以直接尝试写入。通常电池还会有另一个属性 status ,取值大概是 full/unknown/charging/discharging/not charging ,这个属性几乎都是一样的。not charging 就代表外接电源通电但电池未充电,可以据此判断充电限制是否生效。

还有一种可能是并没有一个 threshold 之类的属性可供设置,但有个类似 limit/switch 命名的属性,代表是否开启充电。通过写 0/1 来测试是否生效。



上面说的都是比较理想的情况。不太理想的情况是,这个充电控制是 EC 完成的,并没有暴露在 sysfs 里面。

那就需要你去 Windows 里,使用 https://github.com/hirschmann/nbfc 这个项目里的 ec_probe 工具,用来检测 EC 寄存器的变化。通过切换软件的充电控制开关,观察 EC 寄存器的变化,用控制变量的方法最终确定相应的地址,然后尝试改写寄存器的值,判断充电控制是否生效。

如果能找到对应的地址和值,用 ec_probe 的 Linux 版本做相应操作即可。(如果开启 SafeBoot 的话,Linux 会进入 Kernel Lockdown 模式,不允许修改 MSR 的值,这就需要 https://github.com/musikid/acpi_ec 的内核模块来修改)



如果 EC 接口也没用,那大概率这个功能是 WMI 驱动完成的,这就需要把 Windows 版的控制程序拿来逆向,然后改写成 Linux 可用的内核驱动模块。这个方法比较复杂就不多说了,如果真遇到了可以再聊。
itakeman
236 天前
@iOCZS 断开还是容易的,以前就多了一个到达指定电量自动断开智能开关电源的,现在是想怎么实现不走电池循环,就走电源直流电
itakeman
236 天前
@kuanat 好像很复杂
shijingshijing
236 天前
这个是 EC 配合 PMIC 实现的,现在的电子设备不管是笔记本还是手机,都是这样一个模式,EC 做决策判断,PMIC 的数模混合电路来实现开启关闭和冲电放电策略。
shijingshijing
236 天前
联想的 Thinkpad 在 Win 下面通过联想自己的管家软件设置以后,Linux 下面同样有效,因为底层都是把阈值交给 EC 来处理,纯硬件实现,理论上在 UEFI/BIOS 里面也可以直接操作,就看 Vendor 给不给你这个选项。

我的 Thinkpad X1E 在 Ubunutu 一直用的很好,现在稳定充电 94%之后停止充电,笔记本此时由电源适配器直接供电。
NessajCN
236 天前
我先要确认一下,楼主你知道笔记本边充电边用的时候,
只要一插上充电器,电脑就是直接通过电源供电并且电源也同时给电池充电,
而不是电池一边充电一边给笔记本供电的吧?
同时充满电的情况下也一样是电源供电不走电池这一点楼主清楚的吧?

如果楼主确实知道以上情况,那么请问下你需要电池不充满就不充的原因是什么呢?
itakeman
236 天前
@NessajCN 笔记本边充电边用的时候,
只要一插上充电器,电脑就是直接通过电源供电并且电源也同时给电池充电。这个我不清楚,我以为电池一边被充电,一边被放电。

充满电的情况下也一样是电源供电不走电池这一点楼主清楚的吧?这个我清楚,但是据说会加速电池衰退,我是我要限制到 50-60 之间
itakeman
236 天前
@shijingshijing 感谢 我 win 设置一下,linux 下看看
NessajCN
236 天前
@itakeman
「但是据说会加速电池衰退」
假的,电池寿命只和充放电循环次数有关,保持 50-60 并不会比保持满格更保电池

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1036612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX