tp_smapi

出自 ArchWiki

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-batAURtpacpi-bat-gitAUR

安装

安装 tp_smapi 软件包以用于 linuxtp_smapi-lts 以用于 linux-lts。对于所有其他内核(例如,linux-zen),请考虑使用 tp_smapi-dkmsAUR

tp_smapi(及其变体)提供以下内核模块

tp_smapi
ThinkPad SMAPI 支持
hdaps
IBM 硬盘驱动器主动保护系统 (HDAPS) 驱动程序
thinkpad_ec
ThinkPad 嵌入式控制器硬件访问(tp_smapihdaps 都依赖于它)

重新启动后,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-batAURtpacpi-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 中相应地编辑开始和结束阈值。

注意: 有关命令列表,请参阅 tpacpi-bat 帮助: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/ 下找到。

参见