tp_smapi
tp_smapi 是一组内核模块,用于在 Ivy Bridge 处理器之前的许多 ThinkPad 笔记本电脑上检索硬件信息和传递命令。
此信息通过 /sys/devices/platform/smapi
文件系统呈现。与 /proc
文件系统非常相似,您可以读取和写入这些文件以获取有关硬件的信息并向硬件发送命令。如果您正在使用受支持的 ThinkPad 笔记本电脑,强烈建议使用 tp_smapi。
支持的笔记本电脑
首先检查您的笔记本电脑是否受支持。Thinkwiki 有一个全面的 所有受支持的 ThinkPad 列表。 如果您的 TP 不支持 stop_threshold 而仅支持 start_threshold,请转到此处 #部分支持笔记本电脑的变通方法 以获得不错的变通方法。
如果您安装在具有 Ivy Bridge 处理器或更高版本(任何 *30
、*40
或 *50
型号)的较新 ThinkPad 上,则 tp_smapi 将无法工作。请使用 tpacpi-batAUR 或 tpacpi-bat-gitAUR。
安装
安装 tp_smapi 软件包,适用于 linux 或 tp_smapi-lts 软件包,适用于 linux-lts。对于所有其他内核(例如,linux-zen),请考虑使用 tp_smapi-dkmsAUR。
tp_smapi(及其变体)提供以下 内核模块
- tp_smapi
- ThinkPad SMAPI 支持
- hdaps
- IBM 硬盘主动保护系统 (HDAPS) 驱动程序
- thinkpad_ec
- ThinkPad 嵌入式控制器硬件访问(
tp_smapi
和hdaps
都依赖于它)
重启后,tp_smapi
及其依赖项将自动加载,并且 /sys/devices/platform/smapi/
下的 sysfs 接口应完全正常工作。
功能特性
以下是您可以使用 tp_smapi 执行的一些有用的操作。
控制电池充电
对于大多数笔记本电脑电池来说,长时间保持完全充电状态是不利的。 [1] 您应该尽量将电池电量保持在 40-80% 的充电范围内,除非您需要长时间的电池续航时间。
通用方法
tp_smapi 允许您控制开始和停止充电阈值以实现此目的。运行以下命令将这些值设置为良好值
# echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh # echo 80 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
这将使电池在电量低于 40% 时开始充电,并在电量超过 80% 时停止充电。这将延长电池的寿命。
请注意,当您移除并重新插入电池时,这些阈值可能会重置为其默认值。为了解决这个问题,创建一个脚本来设置这些值,并使该脚本在启动时和插入电池时都运行。更具体的说明如下。
创建脚本
/usr/sbin/set_battery_thresholds
#!/bin/sh # set the battery charging thresholds to extend battery lifespan echo ${2:-40} > /sys/devices/platform/smapi/BAT${1:-0}/start_charge_thresh echo ${3:-80} > /sys/devices/platform/smapi/BAT${1:-0}/stop_charge_thresh
使其成为 可执行文件。使用此脚本设置电池阈值非常简单,只需键入(如果 set_battery_thresholds 是脚本的名称)
set_battery_thresholds 0 96 100
或者不带任何参数运行它,以默认使用 BAT0 和 40% 和 80% 的阈值。
让 systemd 在启动时执行该脚本。因此,创建 tp_smapi_set_battery_thresholds.service
单元,然后 启用/启动 它
/etc/systemd/system/tp_smapi_set_battery_thresholds.service
[Unit] Description=Set Battery Charge Thresholds by tp_smapi [Service] Type=oneshot ExecStart=/usr/sbin/set_battery_thresholds RemainAfterExit=yes [Install] WantedBy=multi-user.target
您还可以使其在插入电池时运行。这需要安装并运行 acpid。编辑 /etc/acpi/handler.sh
#... other ACPI stuff battery) case "$2" in BAT0) case "$4" in 00000000) ;; 00000001) /usr/sbin/set_battery_thresholds ;; #... more ACPI stuff
检查设置是否生效
要检查您的设置是否已被接受,请检查以下输出
$ cat /sys/devices/platform/smapi/BAT0/start_charge_thresh $ cat /sys/devices/platform/smapi/BAT0/stop_charge_thresh
保护硬盘免受跌落损坏
tp_smapi 包含一个驱动程序,用于读取笔记本电脑中的加速度计,以检测可能对硬盘驱动器造成损坏的跌落和其他事件。有关此有用功能的更多信息,请参阅 HDAPS 页面。
部分支持笔记本电脑的变通方法
对于部分支持的笔记本电脑,您仍然可以控制电池。首先检查实际支持的内容
$ cat /sys/devices/platform/smapi/BAT0/start_charge_thresh $ cat /sys/devices/platform/smapi/BAT0/stop_charge_thresh
如果支持 start_charge_thresh 但不支持 stop_charge_thresh,但您仍然希望计算机停止为电池充电,则您可能有其他选择。
注意:前两个选项在 T42p 上均不起作用。第三个选项在 E540 上有效。
第一种方案,自定义脚本
- 如上所述创建脚本
/usr/sbin/set_battery_thresholds
- 将原始
/etc/acpi/handler.sh
复制到/etc/acpi/handler.sh.start
- 如上所述编辑
/etc/acpi/handler.sh
,并将其复制到/etc/acpi/handler.sh.stop
现在复制以下脚本,使其可执行,根据您的喜好调整值,并每隔几分钟以 root cron 身份运行它。
#!/bin/bash CURRENTCHARGE=$(acpitool -b | cut -d, -f2 | cut -d. -f1 | cut -b2-) if [ $CURRENTCHARGE -gt 80 ]; then cp /etc/acpi/handler.sh.stop /etc/acpi/handler.sh echo 99 > /sys/devices/platform/smapi/BAT0/start_charge_thresh exit 0 fi if [ $CURRENTCHARGE -lt 60 ]; then cp /etc/acpi/handler.sh.start /etc/acpi/handler.sh echo 0 > /sys/devices/platform/smapi/BAT0/start_charge_thresh exit 0 fi exit 0
第二种方案,tpacpi-bat
要控制电池充电阈值,请安装 Perl 脚本 tpacpi-batAUR 或 tpacpi-bat-gitAUR。
通过调用手动设置阈值
# tpacpi-bat -v -s startThreshold 0 40 # tpacpi-bat -v -s stopThreshold 0 80
此处给出的示例值 40 和 80 是电池满容量的百分比。根据您自己的需要调整它们。您可能还希望将这些行添加到 systemd tmpfile 中,以便在启动时设置它们。
通过命令 tpacpi-bat
手动设置阈值不是永久性的。要永久设置阈值,请在 /etc/conf.d/tpacpi
中相应地编辑开始和结束阈值。
perl /usr/lib/perl5/vendor_perl/tpacpi-bat -h
。第三种方案,内核内置
内核 4.17 添加了直接调整 ThinkPad 电池充电阈值的选项。
# echo 60 > /sys/class/power_supply/BAT0/charge_stop_threshold # echo 40 > /sys/class/power_supply/BAT0/charge_start_threshold
请注意,如果您尝试显示这些值,您将只会获得最后设置的值(示例中的 start),并在其上添加 128。这是一个已知问题,但实际值确实已设置,您可以从电池行为中看到。其他有趣的参数可以在 /sys/class/power_supply/BAT0/
下找到。