小米笔记本16Pro(2024版本已验证),ubuntu24.04,电源阈值管理
·
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.mdredmibook-charge-limit.shredmibook-charge-limit.serviceredmibook-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-dkmsdkmslinux-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调用返回的是结构化数据,不是Errorredmibook-charge-limit.service可以成功启动并保持启用
更多推荐


所有评论(0)