#!/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