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,与本单无关,已在报告中提示。)
125 lines
4.1 KiB
Bash
Executable File
125 lines
4.1 KiB
Bash
Executable File
#!/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
|