本教程在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 “✅ 完成!充电阈值已恢复”