RedmiBook Pro 16 2024 充电上限方案

适用范围

本文档适用于以下环境:

  • 机型:Redmi Book Pro 16 2024
  • 系统:Ubuntu 24.04
  • 已验证内核:6.17.0-22-generic
  • 已验证 BIOS:RMAMT6B0P0B0B

本方案通过 acpi_call 调用小米机器暴露的 ACPI 方法 \_SB.PC00.WMID.WMAA,在 Linux 下设置电池最大充电阈值。

目录内容

压缩文件包含以下文件:

  • README.md
  • redmibook-charge-limit.sh
  • redmibook-charge-limit.service
  • redmibook-charge-limit.default

方案能力

  • 支持充电上限:40、50、60、70、80
  • 支持 disable,用于关闭充电限制
  • 开机自动生效,由 systemd 服务负责下发
  • 支持自定义配置,阈值写在 redmibook-charge-limit.default

约束说明

  • 本文档不直接写任何绝对路径
  • 安装目标路径通过 systemd 和服务文件内容动态推导
  • 目录中的 service 文件本身仍然包含系统运行所需的标准路径,这是 systemd 的要求,不属于文档展示内容

环境要求

硬件与固件要求

  • 固件必须暴露 ACPI 方法:\_SB.PC00.WMID.WMAA
  • 手工写入 procfs 下的 acpi_call 节点后,返回值不能是 Error
  • 当前已验证 BIOS 版本:RMAMT6B0P0B0B
  • 如果以后升级 BIOS,需要重新手工验证 ACPI 调用是否仍然可用

系统与软件包要求

Ubuntu 24.04 需要安装:

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

当前机器上已验证安装的关键包:

  • acpi-call-dkms
  • dkms
  • linux-headers-6.17.0-22-generic

Secure Boot 要求

  • 建议关闭 Secure Boot
  • 如果不关闭,则需要为 acpi_call 模块签名并通过 MOK 导入
  • 当前机器是在 Secure Boot 已关闭的条件下验证成功

安装方法

先进入当前解压后的目录,然后计算安装目标:

SCRIPT_FILE="$(sed -n 's/^ExecStart=\\([^ ]*\\).*/\\1/p' ./redmibook-charge-limit.service)"
UNIT_DIR="$(pkg-config systemd --variable=systemdsystemunitdir systemd)"
UNIT_FILE="${UNIT_DIR%/}/redmibook-charge-limit.service"
CONFIG_FILE="$(sed -n 's/^EnvironmentFile=-//p' ./redmibook-charge-limit.service)"

再安装脚本、服务和默认配置:

sudo install -Dm755 ./redmibook-charge-limit.sh "$SCRIPT_FILE"
sudo install -Dm644 ./redmibook-charge-limit.service "$UNIT_FILE"
sudo install -Dm644 ./redmibook-charge-limit.default "$CONFIG_FILE"
sudo systemctl daemon-reload
sudo systemctl enable --now redmibook-charge-limit.service

自定义配置

编辑默认配置文件:

CONFIG_FILE="$(sed -n 's/^EnvironmentFile=-//p' ./redmibook-charge-limit.service)"
sudo editor "$CONFIG_FILE"

支持的配置值:

CHARGE_LIMIT=80
CHARGE_LIMIT=70
CHARGE_LIMIT=disable

修改配置后重新加载:

sudo systemctl restart redmibook-charge-limit.service

手动使用

按配置文件中的值执行:

SCRIPT_FILE="$(sed -n 's/^ExecStart=\\([^ ]*\\).*/\\1/p' ./redmibook-charge-limit.service)"
sudo "$SCRIPT_FILE"

单次覆盖配置值:

SCRIPT_FILE="$(sed -n 's/^ExecStart=\\([^ ]*\\).*/\\1/p' ./redmibook-charge-limit.service)"
sudo "$SCRIPT_FILE" 80
sudo "$SCRIPT_FILE" 70
sudo "$SCRIPT_FILE" disable

验证方法

检查模块和接口:

lsmod | grep acpi_call
PROC_ROOT="$(findmnt -no TARGET proc)"
test -e "${PROC_ROOT%/}/acpi/call" && echo acpi_call node exists

检查服务状态:

sudo systemctl status redmibook-charge-limit.service --no-pager
sudo journalctl -u redmibook-charge-limit.service -b --no-pager

如果手工 ACPI 调用返回的不是 Error,说明当前固件接口可用。

故障排查

modprobe acpi_call 失败

  • 重新安装 acpi-call-dkms
  • 确认当前运行内核对应的 linux-headers-$(uname -r) 已安装
  • 如果刚升级过内核,先重启到新内核后再测试

开机服务失败

  • 执行 sudo systemctl status redmibook-charge-limit.service
  • 执行 sudo journalctl -u redmibook-charge-limit.service -b
  • 手工执行脚本并传入 80

ACPI 返回 Error

  • 当前 BIOS 可能没有暴露相同的 ACPI 方法
  • 固件更新后可能改变了接口行为
  • 在重新启用自动服务前,先重新做手工 ACPI 验证

当前机器验证结果

当前机器已确认:

  • modprobe acpi_call 成功
  • procfs 下的 acpi_call 节点存在
  • 0xfb 和 0xfa 调用返回的是结构化数据,不是 Error
  • redmibook-charge-limit.service 可以成功启动并保持启用

更多推荐