Debian 13 (Trixie) 在Redmi Book Pro 16 2024上开启智能充电

本教程在ai的帮助下,通过对ec写入特定数值实现智能充电(充电到80%停止充电)

#!/bin/bash

set -e

echo “=== Redmi Book Pro 16 2024 充电阈值修复脚本 ===”

# 1. 安装依赖

sudo apt update

sudo apt install acpi-call-dkms dkms linux-headers-$(uname -r) -y

# 2. 确保模块加载

echo “acpi_call” | sudo tee /etc/modules-load.d/acpi_call.conf

sudo modprobe acpi_call

# 3. 写入脚本

sudo tee /usr/local/bin/redmibook-charge-limit.sh << ‘EOF’

#!/bin/bash

CONFIG_FILE=“/etc/default/redmibook-charge-limit”

THRESHOLD=“${1}”

if [ -z “$THRESHOLD” ]; then

if \[ -f "$CONFIG_FILE" \]; then

    source "$CONFIG_FILE"

    THRESHOLD="${CHARGE_LIMIT}"

fi

fi

acpi_call() {

local command="$1"

local hex_value="$2"

local acpi_string="\\\\\_SB.PC00.WMID.WMAA 0x0 0x1 { 0x00 $command 0x00 0x10 0x02 0x00 $hex_value 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 }"

echo "$acpi_string" | tee /proc/acpi/call

}

case “$THRESHOLD” in

40) limit_hex="0x08" ;;

50) limit_hex="0x07" ;;

60) limit_hex="0x06" ;;

70) limit_hex="0x05" ;;

80) limit_hex="0x01" ;;

disable)

    echo "Disabling charge limit"

    acpi_call "0xfb" "0x00"

    acpi_call "0xfb" "0x00"

    logger "Battery charge limit disabled"

    exit 0

    ;;

\*)

    echo "Invalid threshold: $THRESHOLD. Use 40,50,60,70,80 or disable."

    exit 1

    ;;

esac

echo “Setting ${THRESHOLD}% limit”

acpi_call “0xfb” “$limit_hex”

acpi_call “0xfa” “0x00”

acpi_call “0xfa” “0x00”

logger “Battery charge limit set to ${THRESHOLD}%”

EOF

sudo chmod +x /usr/local/bin/redmibook-charge-limit.sh

# 4. 写入配置(默认80%)

sudo tee /etc/default/redmibook-charge-limit << ‘EOF’

CHARGE_LIMIT=80

EOF

# 5. 写入服务

sudo tee /etc/systemd/system/redmibook-charge-limit.service << ‘EOF’

[Unit]

Description=Redmi Book Pro 16 2024 Battery Charge Limit

After=multi-user.target suspend.target hibernate.target hybrid-sleep.target

[Service]

Type=oneshot

EnvironmentFile=-/etc/default/redmibook-charge-limit

ExecStartPre=/bin/sh -c ‘while [ ! -e /proc/acpi/call ]; do sleep 0.1; done’

ExecStart=/usr/local/bin/redmibook-charge-limit.sh ${CHARGE_LIMIT}

RemainAfterExit=yes

[Install]

WantedBy=multi-user.target suspend.target hibernate.target hybrid-sleep.target

EOF

# 6. 启用服务

sudo systemctl daemon-reload

sudo systemctl enable --now redmibook-charge-limit.service

# 7. 验证

echo “”

echo “=== 验证 ===”

sudo cat /proc/acpi/call

echo “”

sudo systemctl status redmibook-charge-limit.service --no-pager

echo “”

echo “当前电量: $(cat /sys/class/power_supply/BAT0/capacity)%”

echo “当前状态: $(cat /sys/class/power_supply/BAT0/status)”

echo “”

echo “✅ 完成!充电阈值已设置为 80%”

# ============================================

# 内核升级后充电阈值修复(快速版)

# 用途:每次 apt upgrade 升级内核后,acpi_call 模块需要重新编译

# 问题原因:新内核缺少对应版本的头文件,DKMS 无法自动编译模块

# 执行时机:内核升级并重启后,发现充电阈值失效时

# ============================================

#!/bin/bash

set -e

echo “=== 内核升级后充电阈值快速修复 ===”

# 1. 安装新内核头文件(apt upgrade 不会自动安装这个)

echo “[1/4] 安装内核头文件…”

sudo apt install linux-headers-$(uname -r) -y

# 2. 触发 DKMS 重新编译 acpi_call 模块

echo “[2/4] 重新编译 acpi_call 模块…”

sudo dkms autoinstall

# 3. 加载模块

echo “[3/4] 加载 acpi_call 模块…”

sudo modprobe acpi_call

# 4. 重启充电阈值服务

echo “[4/4] 重启充电阈值服务…”

sudo systemctl restart redmibook-charge-limit.service

# 验证

echo “”

echo “=== 验证 ===”

ls -la /proc/acpi/call

sudo systemctl status redmibook-charge-limit.service --no-pager

echo “”

echo “当前电量: $(cat /sys/class/power_supply/BAT0/capacity)%”

echo “当前状态: $(cat /sys/class/power_supply/BAT0/status)”

echo “”

echo “✅ 完成!充电阈值已恢复”

建议把代码放到代码块里,否则是会出问题的。比如,论坛会自动把英文引号转换成弯引号,这样的代码肯定是无法正常运行的:

代码块的使用方法见本文:

话说 /sys/class/power_supply/BAT0 下没有直接暴露充电阈值的接口吗

在我的笔记本上没有,就算在win下也要安装厂家自带的电脑管家才可以调整充电阈值,bios里面和我in系统自带的电源管理都没有相对应的设置

脚本还是要再改一下。虽然您现在用了代码块,但之前没用代码块的时候,代码中的引号已经被论坛不可逆地替换成弯引号了。

所以我不喜欢自动替换功能嘛。我自己管理的论坛把这些全部都关掉了。