Files
MeowOS-For-R3P2/patch_v2/bootmenu/S22brightness
T
AskaEth f9c2ea42a4 fix(boot): M21 r1 评审 P1 — bl_cap 把 cur=0 当「无有效值」照写 20(+P2 两处)
P1 根因(评审给的真机驱动证据链,已按其最小修法改):
  /module_driver/pwm_backlight.sh 是 `insmod pwm_backlight.ko ... default_brightness=0
  max_brightness=101`,模块 init 把 props.brightness 置 0 再 update_status(PWM 0 分支)→ 上电即灭屏;
  该模块由 S11module_driver_default 加载,rcS 自然序排在 S11jpeg_display_shell 之后。于是:
    - 函数入口那次 bl_cap:背光节点还不存在,写必然失败(no-op);
    - fb0 出现后画图前那次 bl_cap:读到 cur=0,旧条件 `cur <= cap` 命中「只降不升」跳过分支,
      20 从未写入 → 画图时刻亮度 0。
  物理后果两头都是缺陷:面板仍亮则 logo 依旧亮(原问题没修);面板灭则 S11~S21 无可见 logo,
  settings.conf 缺失时直到 launcherd 才亮屏(相对 stock「0.1s 后写 60」是回归)。

修改:
  - bl_cap 判定改为「仅 1 <= cur <= cap 才视为已有有效值跳过;0 / 空 / 非数字一律照写」。
    S22 抢写 1 的竞态保护不变(1 落在 1..20 → 仍跳过,不会被顶回 20)。
  - 删掉函数入口那次 bl_cap(节点未建,必然 no-op,且是重定向报错的来源);只保留 fb0 就绪后、
    画 logo 前那一次 —— 同一驱动脚本里 pwm_backlight.ko 先于 soc_fb.ko 加载,fb0 出现即节点就绪。
  - 写入成功时打一行 `backlight: -> 20 (was N)` 便于刷机后复核;`2>/dev/null` 移到 `>` 之前,
    节点未就绪时连重定向报错一起吞掉(P2-1)。
  - S22:失败路径日志由「保持 S11 低亮度」改为「不改背光(当前 brightness=N)」(P2-2);写入失败
    日志同样附当前读数;写入处的 2>/dev/null 次序一并改正。
  - 头部注释按时序真相重写(驱动默认 0 = 灭屏,不是「上电很亮」)。

实测(沙箱重写 sysfs 路径 + stub cmd_jpeg_display/nanddump/sleep,dash 与 busybox 各一遍):
  cur=0 → 画图时刻 20、结束 20(修复前 0/0);cur=1 → 1/1;cur=60、cur=101 → 20/20;
  竞态(fb0 就绪前外部写 1)→ 画图时刻 1、结束 1(未被顶回);节点不可写时 stderr 0 行、仍画图、rc=0。
  S22 19 用例全 rc=0(仅 usage rc=1,rcS 不可达)、sleep 调用 0、行为与改文案前一致。

S11 与 S22 内容均变 → fw_content.conf 两条 md5 同步更新为
  3ad33301fb9f0884102a47e17a1985ed / 1a0aa33d6f806f3f1648168cc1d8b953
(未改动 meow_watchdog 那条:main tip dfde95b 仍是 553840cd,与本单无关,已在报告中提示。)
2026-11-05 22:04:16 +08:00

125 lines
4.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
#
# S22brightness — 开机按用户设置恢复背光(MeowOS M21)
#
# 位置/顺序(/etc/init.d 按文件名自然序执行,见 /etc/init.d/rcS):
# S11jpeg_display_shell 画开机 logo,画前把背光写成 20(驱动默认 0 = 灭屏 → logo 暗而可见)
# → S21mount_ubifs 挂载 /usr/data
# → S22brightness 本脚本:此时才读得到 /usr/data/meow/settings.conf
# → S30dbus … → S70meow_sysui / S90meow_bootmenu launcher/watchdog 接管后继续维持用户亮度
#
# 为什么不能只改 S11:S11 早于 S21,/usr/data 未挂载 → settings.conf 不存在,只能写死一个安全低值
# (且真机 S11 跑在背光模块加载之前,写入时机受 fb0 约束)。
#
# 行为:
# - 读 display.brightness,以 display.brightness_min(下限,缺省 1)和
# /sys/class/backlight/backlight_pwm0/max_brightness(上限,本机实测 101)clamp 后写入。
# - 单位是 0..max_brightness 的**绝对档位**,不是百分比;display.brightness_min 同单位。
# - 读不到文件 / 解析不出 display.brightness / max_brightness 读不到 → **不改背光**
# (S11 未必写过值,真机驱动默认 0 = 灭屏,所以这里只报当前读数、不做假设),
# 打一行日志后 exit 0。
# - 幂等(当前值已是目标值则不写)、无 sleep / 无重试,任何运行期失败都 exit 0(不阻断 init 链)。
BL_BRIGHTNESS="/sys/class/backlight/backlight_pwm0/brightness"
BL_MAX="/sys/class/backlight/backlight_pwm0/max_brightness"
MEOW_SETTINGS="/usr/data/meow/settings.conf"
log()
{
echo "S22brightness: $*"
}
# 当前背光读数(仅用于日志;读不到返回 unreadable)。
cur_bl()
{
v=$(cat "$BL_BRIGHTNESS" 2>/dev/null)
case "$v" in
''|*[!0-9]*) printf 'unreadable' ;;
*) printf '%s' "$v" ;;
esac
}
start()
{
# /usr/data 刚挂载时 settings.conf 可能尚不存在(新机/首次启动)或被正在写:
# 只读一次,读不到就不改背光,不 sleep 重试(不阻塞 init 链)。
if [ ! -r "$MEOW_SETTINGS" ]; then
log "settings.conf 不可读($MEOW_SETTINGS),不改背光(当前 brightness=$(cur_bl))"
return 0
fi
max=$(cat "$BL_MAX" 2>/dev/null)
case "$max" in
''|*[!0-9]*)
log "max_brightness 读不到,不改背光(当前 brightness=$(cur_bl))"
return 0
;;
esac
if [ "$max" -le 0 ]; then
log "max_brightness=$max 非法,不改背光(当前 brightness=$(cur_bl))"
return 0
fi
# 解析 settings.conf:<key> = <value>,容忍两侧空白/CR,忽略注释与非数字值。
b=""
mn=""
while IFS='=' read -r k v; do
k=$(printf '%s' "$k" | tr -d '[:space:]')
v=$(printf '%s' "$v" | tr -d '[:space:]')
case "$k" in
display.brightness)
case "$v" in
''|*[!0-9]*) ;;
*) b="$v" ;;
esac
;;
display.brightness_min)
case "$v" in
''|*[!0-9]*) ;;
*) mn="$v" ;;
esac
;;
esac
done < "$MEOW_SETTINGS"
if [ -z "$b" ]; then
log "settings.conf 无有效 display.brightness,不改背光(当前 brightness=$(cur_bl))"
return 0
fi
[ -n "$mn" ] || mn=1
[ "$mn" -lt 1 ] && mn=1
[ "$mn" -gt "$max" ] && mn="$max"
[ "$b" -lt "$mn" ] && b="$mn"
[ "$b" -gt "$max" ] && b="$max"
cur=$(cat "$BL_BRIGHTNESS" 2>/dev/null)
if [ "$cur" = "$b" ]; then
log "背光已是 $b,跳过写入"
return 0
fi
# 2>/dev/null 放在 > 之前,避免节点不可写时重定向报错漏到控制台。
if echo "$b" 2>/dev/null > "$BL_BRIGHTNESS"; then
log "开机背光 -> $b(min=$mn max=$max)"
else
log "写背光 $b 失败,保持当前值(brightness=$(cur_bl))"
fi
return 0
}
case "$1" in
start)
start
;;
stop|restart|reload)
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0