From 0ab23161b66dd63ac54c712452c28e7e94a7a4dd Mon Sep 17 00:00:00 2001 From: AskaEth Date: Thu, 5 Nov 2026 21:32:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(boot):=20M21=20=E5=BC=80=E6=9C=BA=20log?= =?UTF-8?q?o=20=E4=BA=AE=E5=BA=A6=20=E2=80=94=20S11=20=E7=94=BB=E5=89=8D?= =?UTF-8?q?=E5=8E=8B=E5=88=B0=20<=3D20=20+=20=E6=96=B0=E5=A2=9E=20S22brigh?= =?UTF-8?q?tness=20=E6=8C=89=E7=94=A8=E6=88=B7=E8=AE=BE=E7=BD=AE=E6=81=A2?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 冷启动 logo 很亮:stock S11 是画完 logo 之后才写死 60,画图那一刻用的是面板上电默认高亮; 而 S11 早于 S21mount_ubifs,那时 /usr/data 未挂载、读不到 settings.conf,只能写死一个值。 - S11jpeg_display_shell:以基线(249220f2)为底,把背光压制挪到画 logo 之前(jpeg_display 函数体内、先于 cmd_jpeg_display),值 20(只降不升:S22 已写更暗则不覆盖);删除画完后 写死 60 的那行;/dev/fb0 等待、mtd5 主题判定、后台 jpeg_display & 语义不变; 主题判定 `==` 改 `=`(POSIX test,语义不变,便于宿主验证)。 - S22brightness(新):S21mount_ubifs 之后运行,读 /usr/data/meow/settings.conf 的 display.brightness,按 display.brightness_min 与 sysfs max_brightness clamp 后写入; 读不到/解析失败不改背光(保持 S11 低值)、无 sleep/重试、任何运行期失败 exit 0;幂等。 - scripts/build/fw_content.conf:登记两条(S11 覆盖基线同名文件、S22 新增),md5 实算, 说明列写清 S11 < S21mount_ubifs < S22 的顺序依赖。 - scripts/build/README.md:补「覆盖基线已有文件」语义(无条件 cp -f,不校验基线 md5、 也不跳过已存在文件;唯一基线校验仍是 hiby_player)。 固件需整包刷机才生效,未刷机、未写设备。 --- patch_v2/bootmenu/S11jpeg_display_shell | 89 +++++++++++++++++++ patch_v2/bootmenu/S22brightness | 111 ++++++++++++++++++++++++ scripts/build/README.md | 14 +++ scripts/build/fw_content.conf | 7 ++ 4 files changed, 221 insertions(+) create mode 100755 patch_v2/bootmenu/S11jpeg_display_shell create mode 100755 patch_v2/bootmenu/S22brightness diff --git a/patch_v2/bootmenu/S11jpeg_display_shell b/patch_v2/bootmenu/S11jpeg_display_shell new file mode 100755 index 0000000..a41b913 --- /dev/null +++ b/patch_v2/bootmenu/S11jpeg_display_shell @@ -0,0 +1,89 @@ +#!/bin/sh +# +# S11jpeg_display_shell — 开机 logo 显示(stock 基线 + MeowOS M21 改动) +# +# stock 基线(md5 249220f2489f63a4c946c55d8d981ca9)的问题: +# 背光是 `cmd_jpeg_display` **画完 logo 之后**才写死的 60。也就是说画图那一刻用的是 +# **面板上电默认值**(很亮 —— 用户报「冷启动开机 logo 挺亮」),60 只是画完后的补救。 +# 本脚本又跑在 S21mount_ubifs 之前:那时 /usr/data 还没挂载,读不到 +# /usr/data/meow/settings.conf,所以这里**只能**写一个和用户设置无关的安全低值。 +# +# M21 改动: +# 1) 背光压制挪到画 logo **之前**,值 BOOT_BL_MAX=20(≈max_brightness 101 的 1/5); +# 2) 删除画完后写死 60 的那行 —— 用户亮度改由 S22brightness(/usr/data 挂载后)就位; +# 3) 压制动作「只降不升」:当前值已 ≤20(例如 S22 已按用户设置写成 1)则不再抬高, +# 避免本脚本的 20 反过来把用户更暗的设置顶回去; +# 4) /dev/fb0 等待、mtd5 主题判定、后台 `jpeg_display &` 语义与 stock 一致。 +# +# 时序(三层写入者): +# 面板上电默认(亮)→ S11 压到 ≤20(画 logo 前)→ S21mount_ubifs → S22brightness(用户值) +# → S90/S70 拉起 launcher/watchdog 后按 display.brightness 继续维持。 +# +# 注:rcS 用 `$i start` fork 执行本脚本,`jpeg_display &` 后父进程立即返回。所以压制写入必须 +# 在 jpeg_display() **函数体内**(子进程自己的时序),不能挪到 case 分支顶层 —— 那是父进程, +# 会和子进程抢时序。 + +BL_BRIGHTNESS="/sys/class/backlight/backlight_pwm0/brightness" +# 上电默认很亮的压制上限(绝对档位 0..max_brightness,不是百分比)。 +# 这是「安全低值」,不是用户值;用户值(display.brightness,可能更暗如 1)由 S22brightness 写入。 +BOOT_BL_MAX=20 + +# 只降不升地把背光压到 <= $1:读不到当前值就照写;当前已更低则不动。 +bl_cap() +{ + cap="$1" + cur=$(cat "$BL_BRIGHTNESS" 2>/dev/null) + case "$cur" in + ''|*[!0-9]*) ;; # 读不到 / 非数字 → 照写压制值 + *) [ "$cur" -le "$cap" ] && return 0 ;; # 已经更暗(如 S22 已写用户值)→ 不动 + esac + echo "$cap" > "$BL_BRIGHTNESS" 2>/dev/null + return 0 +} + +jpeg_display() +{ + echo "Starting display... " + + # M21:尽早压制面板上电默认的高亮(仍在函数体内、早于画图) + bl_cap "$BOOT_BL_MAX" + + while true + do + if [ -e "/dev/fb0" ]; then + break + fi + sleep 0.02 + done + + echo "Wait display... " + + # M21:画 logo 前再压一次(只降不升)。若等待 fb0 期间有别的写入把亮度抬高, + # logo 仍以低亮度出现;反之若 S22brightness 已写了更暗的用户值,这里不会覆盖它。 + bl_cap "$BOOT_BL_MAX" + + theme=$(nanddump -q -s 0x20000 -l 7 /dev/mtd5 -a) + # stock 写的是 `==`(BusyBox test 接受,dash/POSIX test 不接受);语义不变,改为 `=` 以便移植与宿主验证。 + if [ "$theme" = "theme:1" ]; then + cmd_jpeg_display /etc/logo1.jpeg + elif [ "$theme" = "theme:2" ]; then + cmd_jpeg_display /etc/logo2.jpeg + else + cmd_jpeg_display /etc/logo.jpeg + fi + # stock: "R1 lg 35583 need 100ms delay" —— 原先是给「画完后写 60」留的面板 settle 时间。 + # 亮度写入已移到画图之前,但该硬件 settle 保留(在后台子进程里,不阻塞 init 链)。 + sleep 0.1 + echo "Finish display... " +} + +case "$1" in + start) + jpeg_display & + + ;; + *) + exit 1 +esac + +exit 0 diff --git a/patch_v2/bootmenu/S22brightness b/patch_v2/bootmenu/S22brightness new file mode 100755 index 0000000..b3b4847 --- /dev/null +++ b/patch_v2/bootmenu/S22brightness @@ -0,0 +1,111 @@ +#!/bin/sh +# +# S22brightness — 开机按用户设置恢复背光(MeowOS M21) +# +# 位置/顺序(/etc/init.d 按文件名自然序执行,见 /etc/init.d/rcS): +# S11jpeg_display_shell 画开机 logo,画前把背光压到 <=20(防「面板上电默认很亮」) +# → S21mount_ubifs 挂载 /usr/data +# → S22brightness 本脚本:此时才读得到 /usr/data/meow/settings.conf +# → S30dbus … → S70meow_sysui / S90meow_bootmenu launcher/watchdog 接管后继续维持用户亮度 +# +# 为什么不能只改 S11:S11 早于 S21,/usr/data 未挂载 → settings.conf 不存在,只能写死一个安全低值。 +# +# 行为: +# - 读 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 设的低值),打一行日志后 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: $*" +} + +start() +{ + # /usr/data 刚挂载时 settings.conf 可能尚不存在(新机/首次启动)或被正在写: + # 只读一次,读不到就保持 S11 的低亮度,不 sleep 重试(不阻塞 init 链)。 + if [ ! -r "$MEOW_SETTINGS" ]; then + log "settings.conf 不可读($MEOW_SETTINGS),保持 S11 低亮度" + return 0 + fi + + max=$(cat "$BL_MAX" 2>/dev/null) + case "$max" in + ''|*[!0-9]*) + log "max_brightness 读不到,不改背光(保持 S11 低亮度)" + return 0 + ;; + esac + if [ "$max" -le 0 ]; then + log "max_brightness=$max 非法,不改背光" + return 0 + fi + + # 解析 settings.conf: = ,容忍两侧空白/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,保持 S11 低亮度" + 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 + + if echo "$b" > "$BL_BRIGHTNESS" 2>/dev/null; then + log "开机背光 -> $b(min=$mn max=$max)" + else + log "写背光 $b 失败,保持原值" + fi + return 0 +} + +case "$1" in + start) + start + ;; + stop|restart|reload) + ;; + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/scripts/build/README.md b/scripts/build/README.md index 4d43551..abeae2f 100644 --- a/scripts/build/README.md +++ b/scripts/build/README.md @@ -69,6 +69,20 @@ bash scripts/build/build_fw_apps.sh -v 0.7.68 -o r3proii_m2_73.upt -b fw_ssh/squ - 目标目录自动创建;`usr/bin` / `etc/init.d` / `etc/profile.d` 一律 `chmod 755`。 - 多重配置并存:复制 `fw_content.conf` 改名,用 `-c` 指定,互不干扰。 +### 覆盖基线已有文件(清单 `` 与基线同名) + +清单条目对目标目录是**无条件 `cp -f` 覆盖**:不校验基线原文件的 md5、也不跳过「已存在」的文件,只要 +`` 命中就行。脚本里唯一的基线校验是第 2 步的 `usr/bin/hiby_player`(stock a73f2c49…),与清单条目无关。 + +因此覆盖类条目要自己在 `` 里写清「覆盖基线 xxx(基线 md5 …)」,便于复盘对照基线。例(M21 开机亮度链): + +``` +patch_v2/bootmenu/S11jpeg_display_shell|/etc/init.d/S11jpeg_display_shell||覆盖基线 S11(基线 md5 249220f2…)… +patch_v2/bootmenu/S22brightness|/etc/init.d/S22brightness||新增:…(S21mount_ubifs 之后按用户设置恢复背光) +``` + +> 覆盖基线 init 脚本时,顺序仍由**文件名**决定(`rcS` 按 `/etc/init.d/S??*` 自然序执行),不能靠清单顺序。 + ### 常见:更新某个二进制后改 md5 ```bash diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 30b038d..a83c49a 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -46,6 +46,13 @@ patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_netmgrd|20243ea1a800b29badefebb patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_net|20243ea1a800b29badefebb395603aaf|meow_netmgrd 的 CLI 形态(同二进制双形态,argv[0]=meow_net 即 CLI:status/iface/wifi/bt/rfkill/apps/conns/top/dns/policy/help;M6.28 蓝牙P1 BT_CTL收口) # ---- 开机 init 脚本(etc/init.d,数字决定启动顺序,按文件名自然序)---- +# M21 开机亮度链(顺序依赖:S11 < S21mount_ubifs < S22): +# S11jpeg_display_shell 画 logo 前把背光压到 <=20(面板上电默认很亮;此时 /usr/data 未挂载, +# 读不到 settings.conf,只能写安全低值)→ S21mount_ubifs 挂 /usr/data → S22brightness 按 +# display.brightness(clamp [brightness_min, max_brightness])写入用户值。 +# S11 是**覆盖基线同名文件**(基线已有,md5 249220f2…);S22 是**新增**文件。 +patch_v2/bootmenu/S11jpeg_display_shell|/etc/init.d/S11jpeg_display_shell|711664ad3a13557c0c1e018303637ab8|覆盖基线 S11(基线 md5 249220f2…):背光压制从「画完 logo 后写 60」改为「画 logo 前压到 <=20(只降不升)」,删掉写死 60;用户亮度交给 S22 +patch_v2/bootmenu/S22brightness|/etc/init.d/S22brightness|3ce7c3c24edd43ef56c3e084b94d0cf5|新增:S21mount_ubifs 之后按 /usr/data/meow/settings.conf 的 display.brightness 恢复背光(clamp [brightness_min, max_brightness];读不到不改、失败不阻断 init) patch_v2/meow_sysui/S70meow_sysui|/etc/init.d/S70meow_sysui|e435affcb56499e5229728c6ae2524b9|sysui 自启 M2.85(launcher.conf enabled=1+迁移) patch_v2/meow_svcd/S89meow_svcd|/etc/init.d/S89meow_svcd|a1ef9d658d37bb7ed012cc9326840ac4|svcd 自启 M6.2(+amsd.conf 热更 exec→/usr/bin 迁移) patch_v2/meow_amsd/meow_amsd|/usr/bin/meow_amsd|b698f176210b07f760f874ea2bb10a14|活动管理器 M6.46 编入 M7 杀后台修复(am kill 与后台页按钮同通道:MSG_AMS_KILL 先打后台保活表走 meow_bg_terminate,无前台会话也能杀;cmd_kill/cmd_start 失败原因细分 connect failed/timeout,no reply;响应串保留 launcher offline 供 MeowPanel 503 映射);继承 M6.35(注册表自愈+busy 识别+显示名 UTF-8 整序列 name[49];批① FG/BG 收编:handle_bg/handle_fg+AMS_FG/BG 状态供批③后台管理页) From f9c2ea42a4f51578b6e2f03cb60b20578ae240ad Mon Sep 17 00:00:00 2001 From: AskaEth Date: Thu, 5 Nov 2026 21:51:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(boot):=20M21=20r1=20=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=20P1=20=E2=80=94=20bl=5Fcap=20=E6=8A=8A=20cur=3D0=20=E5=BD=93?= =?UTF-8?q?=E3=80=8C=E6=97=A0=E6=9C=89=E6=95=88=E5=80=BC=E3=80=8D=E7=85=A7?= =?UTF-8?q?=E5=86=99=2020=EF=BC=88+P2=20=E4=B8=A4=E5=A4=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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,与本单无关,已在报告中提示。) --- patch_v2/bootmenu/S11jpeg_display_shell | 55 +++++++++++++++---------- patch_v2/bootmenu/S22brightness | 33 ++++++++++----- scripts/build/fw_content.conf | 11 ++--- 3 files changed, 63 insertions(+), 36 deletions(-) diff --git a/patch_v2/bootmenu/S11jpeg_display_shell b/patch_v2/bootmenu/S11jpeg_display_shell index a41b913..da6651e 100755 --- a/patch_v2/bootmenu/S11jpeg_display_shell +++ b/patch_v2/bootmenu/S11jpeg_display_shell @@ -3,41 +3,55 @@ # S11jpeg_display_shell — 开机 logo 显示(stock 基线 + MeowOS M21 改动) # # stock 基线(md5 249220f2489f63a4c946c55d8d981ca9)的问题: -# 背光是 `cmd_jpeg_display` **画完 logo 之后**才写死的 60。也就是说画图那一刻用的是 -# **面板上电默认值**(很亮 —— 用户报「冷启动开机 logo 挺亮」),60 只是画完后的补救。 +# `cmd_jpeg_display` 画完 logo **之后**才写死 60。画图那一刻用的是驱动默认亮度,而真机 +# /module_driver/pwm_backlight.sh 是 `insmod pwm_backlight.ko ... default_brightness=0 +# max_brightness=101`,pwm_backlight.ko 的 init 会把 props.brightness 置 0 再 update_status +# (走 PWM 0 分支)—— 即上电是**全黑**:logo 先画在灭屏上,0.1s 后才被写死的 60 照亮, +# 一出现就是 60(≈60% 亮度,用户报「冷启动开机 logo 挺亮」)。 # 本脚本又跑在 S21mount_ubifs 之前:那时 /usr/data 还没挂载,读不到 # /usr/data/meow/settings.conf,所以这里**只能**写一个和用户设置无关的安全低值。 # # M21 改动: -# 1) 背光压制挪到画 logo **之前**,值 BOOT_BL_MAX=20(≈max_brightness 101 的 1/5); +# 1) 在画 logo **之前**写 BOOT_BL_MAX=20(≈max_brightness 101 的 1/5):logo 以「暗但可见」出现; # 2) 删除画完后写死 60 的那行 —— 用户亮度改由 S22brightness(/usr/data 挂载后)就位; -# 3) 压制动作「只降不升」:当前值已 ≤20(例如 S22 已按用户设置写成 1)则不再抬高, -# 避免本脚本的 20 反过来把用户更暗的设置顶回去; +# 3) 写入「只降不升」:当前值落在 **1..20**(有效且已更暗,例如 S22 已按用户设置写成 1)才不动; +# **0 / 空 / 非数字一律照写 20** —— 驱动默认就是 0(等于灭屏),把 0 当「已有值」跳过会让本 +# 脚本一个值都写不进去(评审 P1:画图时刻亮度 0,且删掉 60 后整段 init 没有可见 logo)。 # 4) /dev/fb0 等待、mtd5 主题判定、后台 `jpeg_display &` 语义与 stock 一致。 # -# 时序(三层写入者): -# 面板上电默认(亮)→ S11 压到 ≤20(画 logo 前)→ S21mount_ubifs → S22brightness(用户值) -# → S90/S70 拉起 launcher/watchdog 后按 display.brightness 继续维持。 +# 时序(三层写入者 + 运行期): +# 驱动默认 0(灭)→ S11 写 20(画 logo 前,logo 暗而可见)→ S21mount_ubifs +# → S22brightness(用户值,如 1)→ S70/S90 launcher/watchdog 继续按 display.brightness 维持。 # -# 注:rcS 用 `$i start` fork 执行本脚本,`jpeg_display &` 后父进程立即返回。所以压制写入必须 -# 在 jpeg_display() **函数体内**(子进程自己的时序),不能挪到 case 分支顶层 —— 那是父进程, +# 注:rcS 用 `$i start` fork 执行本脚本,`jpeg_display &` 后父进程立即返回。所以写入必须在 +# jpeg_display() **函数体内**(子进程自己的时序),不能挪到 case 分支顶层 —— 那是父进程, # 会和子进程抢时序。 +# ⚠️ 也不能放在函数入口:背光模块由排在后面的 S11module_driver_default(rcS 自然序 +# S11jpeg_display_shell < S11module_driver_default)才 insmod,入口那一刻 +# /sys/class/backlight/backlight_pwm0/ 还不存在,写入必然 no-op(重定向失败还会漏一行错)。 +# 能写的时机是 /dev/fb0 出现之后 —— 同一份驱动脚本里 pwm_backlight.ko 先于 soc_fb.ko 加载, +# fb0 一出现背光节点必定已就绪。 BL_BRIGHTNESS="/sys/class/backlight/backlight_pwm0/brightness" -# 上电默认很亮的压制上限(绝对档位 0..max_brightness,不是百分比)。 -# 这是「安全低值」,不是用户值;用户值(display.brightness,可能更暗如 1)由 S22brightness 写入。 +# 画 logo 前的亮度上限(绝对档位 0..max_brightness,不是百分比)。 +# 这是「暗但可见」的安全低值,不是用户值;用户值(display.brightness,可能更暗如 1)由 S22brightness 写入。 BOOT_BL_MAX=20 -# 只降不升地把背光压到 <= $1:读不到当前值就照写;当前已更低则不动。 +# 只降不升地把背光压到 <= $1: +# 当前读数在 1..$1 = 已有有效且更暗的值(如 S22 已写用户值 1)→ 不动; +# 0 / 空 / 非数字(驱动默认 0 = 灭屏、节点未就绪)→ 视为「没有有效值」,照写。 bl_cap() { cap="$1" cur=$(cat "$BL_BRIGHTNESS" 2>/dev/null) case "$cur" in - ''|*[!0-9]*) ;; # 读不到 / 非数字 → 照写压制值 - *) [ "$cur" -le "$cap" ] && return 0 ;; # 已经更暗(如 S22 已写用户值)→ 不动 + ''|*[!0-9]*) ;; # 读不到 / 非数字 → 照写 + *) [ "$cur" -ge 1 ] && [ "$cur" -le "$cap" ] && return 0 ;; # 已有 1..cap 的有效值 → 不动 esac - echo "$cap" > "$BL_BRIGHTNESS" 2>/dev/null + # 2>/dev/null 放在 > 之前:节点尚未就绪时连「重定向失败」的报错一起吞掉(否则每个冷启动漏一行)。 + if echo "$cap" 2>/dev/null > "$BL_BRIGHTNESS"; then + echo "backlight: -> $cap (was ${cur:-unreadable})" + fi return 0 } @@ -45,9 +59,6 @@ jpeg_display() { echo "Starting display... " - # M21:尽早压制面板上电默认的高亮(仍在函数体内、早于画图) - bl_cap "$BOOT_BL_MAX" - while true do if [ -e "/dev/fb0" ]; then @@ -58,8 +69,10 @@ jpeg_display() echo "Wait display... " - # M21:画 logo 前再压一次(只降不升)。若等待 fb0 期间有别的写入把亮度抬高, - # logo 仍以低亮度出现;反之若 S22brightness 已写了更暗的用户值,这里不会覆盖它。 + # M21:画 logo 前写一次安全低亮度。此时背光节点必定已就绪(同一驱动脚本里 + # pwm_backlight.ko 先于 soc_fb.ko 加载,fb0 出现即背光已注册)。只降不升: + # cur 落在 1..20 的有效值就不动;cur=0(驱动默认 = 灭屏)照写 20; + # S22brightness 若已写更暗的用户值也不会被顶回 20。 bl_cap "$BOOT_BL_MAX" theme=$(nanddump -q -s 0x20000 -l 7 /dev/mtd5 -a) diff --git a/patch_v2/bootmenu/S22brightness b/patch_v2/bootmenu/S22brightness index b3b4847..9ddd4cb 100755 --- a/patch_v2/bootmenu/S22brightness +++ b/patch_v2/bootmenu/S22brightness @@ -3,19 +3,21 @@ # S22brightness — 开机按用户设置恢复背光(MeowOS M21) # # 位置/顺序(/etc/init.d 按文件名自然序执行,见 /etc/init.d/rcS): -# S11jpeg_display_shell 画开机 logo,画前把背光压到 <=20(防「面板上电默认很亮」) +# 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: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 设的低值),打一行日志后 exit 0。 +# (S11 未必写过值,真机驱动默认 0 = 灭屏,所以这里只报当前读数、不做假设), +# 打一行日志后 exit 0。 # - 幂等(当前值已是目标值则不写)、无 sleep / 无重试,任何运行期失败都 exit 0(不阻断 init 链)。 BL_BRIGHTNESS="/sys/class/backlight/backlight_pwm0/brightness" @@ -27,24 +29,34 @@ 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 可能尚不存在(新机/首次启动)或被正在写: - # 只读一次,读不到就保持 S11 的低亮度,不 sleep 重试(不阻塞 init 链)。 + # 只读一次,读不到就不改背光,不 sleep 重试(不阻塞 init 链)。 if [ ! -r "$MEOW_SETTINGS" ]; then - log "settings.conf 不可读($MEOW_SETTINGS),保持 S11 低亮度" + 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 读不到,不改背光(保持 S11 低亮度)" + log "max_brightness 读不到,不改背光(当前 brightness=$(cur_bl))" return 0 ;; esac if [ "$max" -le 0 ]; then - log "max_brightness=$max 非法,不改背光" + log "max_brightness=$max 非法,不改背光(当前 brightness=$(cur_bl))" return 0 fi @@ -71,7 +83,7 @@ start() done < "$MEOW_SETTINGS" if [ -z "$b" ]; then - log "settings.conf 无有效 display.brightness,保持 S11 低亮度" + log "settings.conf 无有效 display.brightness,不改背光(当前 brightness=$(cur_bl))" return 0 fi @@ -88,10 +100,11 @@ start() return 0 fi - if echo "$b" > "$BL_BRIGHTNESS" 2>/dev/null; then + # 2>/dev/null 放在 > 之前,避免节点不可写时重定向报错漏到控制台。 + if echo "$b" 2>/dev/null > "$BL_BRIGHTNESS"; then log "开机背光 -> $b(min=$mn max=$max)" else - log "写背光 $b 失败,保持原值" + log "写背光 $b 失败,保持当前值(brightness=$(cur_bl))" fi return 0 } diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index a83c49a..3c66acc 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -47,12 +47,13 @@ patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_net|20243ea1a800b29badefebb3956 # ---- 开机 init 脚本(etc/init.d,数字决定启动顺序,按文件名自然序)---- # M21 开机亮度链(顺序依赖:S11 < S21mount_ubifs < S22): -# S11jpeg_display_shell 画 logo 前把背光压到 <=20(面板上电默认很亮;此时 /usr/data 未挂载, -# 读不到 settings.conf,只能写安全低值)→ S21mount_ubifs 挂 /usr/data → S22brightness 按 -# display.brightness(clamp [brightness_min, max_brightness])写入用户值。 +# 驱动默认 0(pwm_backlight.ko insmod default_brightness=0 = 灭屏;模块由 S11module_driver_default +# 加载,排在 S11jpeg_display_shell 之后)→ S11jpeg_display_shell 画 logo 前写 20(暗而可见; +# 此时 /usr/data 未挂载,读不到 settings.conf,只能写安全低值)→ S21mount_ubifs 挂 /usr/data +# → S22brightness 按 display.brightness(clamp [brightness_min, max_brightness])写入用户值。 # S11 是**覆盖基线同名文件**(基线已有,md5 249220f2…);S22 是**新增**文件。 -patch_v2/bootmenu/S11jpeg_display_shell|/etc/init.d/S11jpeg_display_shell|711664ad3a13557c0c1e018303637ab8|覆盖基线 S11(基线 md5 249220f2…):背光压制从「画完 logo 后写 60」改为「画 logo 前压到 <=20(只降不升)」,删掉写死 60;用户亮度交给 S22 -patch_v2/bootmenu/S22brightness|/etc/init.d/S22brightness|3ce7c3c24edd43ef56c3e084b94d0cf5|新增:S21mount_ubifs 之后按 /usr/data/meow/settings.conf 的 display.brightness 恢复背光(clamp [brightness_min, max_brightness];读不到不改、失败不阻断 init) +patch_v2/bootmenu/S11jpeg_display_shell|/etc/init.d/S11jpeg_display_shell|3ad33301fb9f0884102a47e17a1985ed|覆盖基线 S11(基线 md5 249220f2…):背光写入从「画完 logo 后写 60」改为「画 logo 前写 20(只降不升;cur=0/空 照写,仅 1..20 的有效值跳过)」,删掉写死 60;用户亮度交给 S22 +patch_v2/bootmenu/S22brightness|/etc/init.d/S22brightness|1a0aa33d6f806f3f1648168cc1d8b953|新增:S21mount_ubifs 之后按 /usr/data/meow/settings.conf 的 display.brightness 恢复背光(clamp [brightness_min, max_brightness];读不到不改、失败不阻断 init) patch_v2/meow_sysui/S70meow_sysui|/etc/init.d/S70meow_sysui|e435affcb56499e5229728c6ae2524b9|sysui 自启 M2.85(launcher.conf enabled=1+迁移) patch_v2/meow_svcd/S89meow_svcd|/etc/init.d/S89meow_svcd|a1ef9d658d37bb7ed012cc9326840ac4|svcd 自启 M6.2(+amsd.conf 热更 exec→/usr/bin 迁移) patch_v2/meow_amsd/meow_amsd|/usr/bin/meow_amsd|b698f176210b07f760f874ea2bb10a14|活动管理器 M6.46 编入 M7 杀后台修复(am kill 与后台页按钮同通道:MSG_AMS_KILL 先打后台保活表走 meow_bg_terminate,无前台会话也能杀;cmd_kill/cmd_start 失败原因细分 connect failed/timeout,no reply;响应串保留 launcher offline 供 MeowPanel 503 映射);继承 M6.35(注册表自愈+busy 识别+显示名 UTF-8 整序列 name[49];批① FG/BG 收编:handle_bg/handle_fg+AMS_FG/BG 状态供批③后台管理页)