From b12404a986225e6f00d1a6c36880091de206364e Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 00:18:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(svc=5Fpower):=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=86=99=E4=BF=9D=E6=8A=A4(=E5=8D=A1=E6=A0=B9r3proii.upt?= =?UTF-8?q?=E5=AD=98=E5=9C=A8+=E9=9D=9E=E7=A9=BA+=E5=8F=AF=E8=AF=BB+size>0?= =?UTF-8?q?,=20=E5=A4=B1=E8=B4=A5=E4=B8=8D=E5=86=99mtd5/=E4=B8=8D=E9=87=8D?= =?UTF-8?q?=E5=90=AF)=20+=20dac=20status=E8=AF=BB=E6=9D=BF=E8=BD=BDaudio.v?= =?UTF-8?q?olume=E7=9C=9F=E5=AE=9E0-100(=E5=BC=83amixer=20dummy)=20(agent-?= =?UTF-8?q?163)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patch_v2/meow_svc_power/meow_svc_power | Bin 93900 -> 90636 bytes patch_v2/meow_svc_power/meow_svc_power.c | 157 ++++++++++++-------- patch_v2/meow_svc_power/meow_svc_power_host | Bin 73736 -> 73456 bytes 3 files changed, 99 insertions(+), 58 deletions(-) diff --git a/patch_v2/meow_svc_power/meow_svc_power b/patch_v2/meow_svc_power/meow_svc_power index f0cc3901ca48cd497c1fc1d6c5f8515c35ceecbe..bc576abb06f35b2bdcd84f1381307600110ba392 100755 GIT binary patch delta 21254 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 delta 24002 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 AfdBvi diff --git a/patch_v2/meow_svc_power/meow_svc_power.c b/patch_v2/meow_svc_power/meow_svc_power.c index ba362a5..b4f20d8 100644 --- a/patch_v2/meow_svc_power/meow_svc_power.c +++ b/patch_v2/meow_svc_power/meow_svc_power.c @@ -54,16 +54,22 @@ #define BATT_CAP "/sys/class/power_supply/battery/capacity" #define BATT_STATUS "/sys/class/power_supply/battery/status" #define BATT_VOLT "/sys/class/power_supply/battery/voltage_now" -#define DAC_NUMID "amixer -c 0 cget numid=%d 2>/dev/null" +#define UPGRADE_FW "/usr/data/mnt/sd_0/r3proii.upt" /* 卡根升级固件(写 mtd5 前完整性校验) */ + +/* 音量语义(与 launcher MEOW_VOL_DEFAULT/MEOW_VOL_MAX_DEFAULT、SDK MEOW_UI_VOL_* 一致): + * audio.volume 默认 60(写 DAC 映射值 0-100);audio.volume_max 默认 100(软上限 clamp)。 */ +#ifndef MEOW_VOL_DEFAULT +#define MEOW_VOL_DEFAULT 60 +#endif +#ifndef MEOW_VOL_MAX_DEFAULT +#define MEOW_VOL_MAX_DEFAULT 100 +#endif #define LINUX_REBOOT_MAGIC1 0xfee1dead #define LINUX_REBOOT_MAGIC2 672274793 /* 0x28121969 */ #define LINUX_REBOOT_CMD_RESTART 0x01234567 #define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc -#define SV_PIPE_MAX 4096 /* popen_read_tmo 上限 */ -#define SV_TIMEOUT_MS 1500 /* popen 子命令读超时 */ - static const char *g_sock = "/usr/data/meow_power.sock"; /* ---------------- 极简日志(stderr;svcd supervisor 捕获) ---------------- */ @@ -179,39 +185,68 @@ static int settings_set_int(const char *key, int val) return 0; } -/* ---------------- popen 限时读(kill 子进程防挂) ---------------- */ -static char *popen_read_tmo(int tmo_ms, const char *cmd) +/* 读 settings.conf 某 int 键:兼容落盘 "key = value"(带空格/多空格),'=' 切分、key 去首尾空白精确匹配 + * (避免 audio.volume 误配 audio.volume_max)。打开失败/键缺失/解析失败 → def。 + * 与 launcher 读循环、SDK meow_ui_vol.c meow_ui_vol_read 同款解析。 */ +static int settings_get_int_trim(const char *key, int def) { - int p[2]; - if (pipe(p) < 0) return NULL; - pid_t pid = fork(); - if (pid < 0) { close(p[0]); close(p[1]); return NULL; } - if (pid == 0) { - dup2(p[1], 1); - close(p[0]); close(p[1]); - execl("/bin/sh", "sh", "-c", cmd, (char *)0); - _exit(127); + FILE *f = fopen(SETTINGS_FILE, "r"); + if (!f) return def; + size_t kl = strlen(key); + char line[160]; + char *found = NULL; + while (fgets(line, sizeof line, f)) { + char *eq = strchr(line, '='); + if (!eq) continue; /* 非 key=value 行(注释/空行)跳过 */ + char *k = line; + while (*k == ' ' || *k == '\t') k++; /* key 左去空白 */ + long n = (long)(eq - k); + while (n > 0 && (k[n - 1] == ' ' || k[n - 1] == '\t')) n--; /* key 右去空白 */ + if ((size_t)n != kl || strncmp(k, key, kl) != 0) continue; /* key 不精确匹配 */ + found = eq + 1; /* 命中所求键 */ + break; } - close(p[1]); - fcntl(p[0], F_SETFL, fcntl(p[0], F_GETFL, 0) | O_NONBLOCK); - char *buf = malloc(SV_PIPE_MAX); - if (!buf) { close(p[0]); waitpid(pid, NULL, 0); return NULL; } - size_t off = 0; - int remain = tmo_ms; - while (remain > 0 && off < SV_PIPE_MAX - 1) { - struct pollfd pf = { p[0], POLLIN, 0 }; - int r = poll(&pf, 1, remain); - if (r < 0) { if (errno == EINTR) continue; break; } - if (r == 0) break; /* 超时 */ - ssize_t rd = read(p[0], buf + off, SV_PIPE_MAX - 1 - off); - if (rd == 0) break; /* EOF(子进程退出/关写端) */ - if (rd < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) continue; break; } - off += (size_t)rd; + fclose(f); + if (!found) return def; + while (*found == ' ' || *found == '\t') found++; /* value 左去空白;atoi 天然停于非数字 */ + return atoi(found); +} + +/* ---------------- 升级写保护(MeowOS 侧;固件只完整性校验,不签名) ---------------- + * upgrade 信号(CLI 与 IPC POWER_UPGRADE 同路径)触发写 mtd5 前先校验卡根升级固件 + * r3proii.upt(TF 卡挂载点 /usr/data/mnt/sd_0): + * 1. 存在(access F_OK)——无文件不写 mtd5; + * 2. 可读(access R_OK); + * 3. 常规文件 + 非空 + size>0(stat)——防 0 字节/损坏。 + * 校验失败 → 返回非 MEOW_OK + why 提示;调用方绝不写 mtd5、不 reboot。 + * 待补(二期):期望 md5/hash 校验——经 IPC/配置传期望值,或读卡上 MeowOS/config/ 固件 fingerprint; + * 本批只完整性(防"无文件/0 字节/损坏")。**固件不签名**(海贝官方 r3proii.upt 无签名,签名会挡自刷)。 */ +static int upgrade_fw_check(char *why, int cap) +{ + const char *path = UPGRADE_FW; + if (access(path, F_OK) < 0) { + svc_log("upgrade fw missing: %s (%s)", path, strerror(errno)); + snprintf(why, cap, "卡上无升级文件 %s", path); + return MEOW_ERR_NOENT; } - close(p[0]); - waitpid(pid, NULL, 0); - buf[off] = 0; - return buf; + if (access(path, R_OK) < 0) { + svc_log("upgrade fw unreadable: %s (%s)", path, strerror(errno)); + snprintf(why, cap, "升级文件不可读 %s", path); + return MEOW_ERR_IO; + } + struct stat st; + if (stat(path, &st) < 0) { + svc_log("upgrade fw stat fail: %s (%s)", path, strerror(errno)); + snprintf(why, cap, "升级文件状态读取失败 %s", path); + return MEOW_ERR_IO; + } + if (!S_ISREG(st.st_mode) || st.st_size <= 0) { + svc_log("upgrade fw invalid: %s size=%lld", path, (long long)st.st_size); + snprintf(why, cap, "升级文件为空或损坏 %s", path); + return MEOW_ERR_IO; + } + svc_log("upgrade fw ok: %s size=%lld", path, (long long)st.st_size); + return MEOW_OK; } /* 前置声明:CLI 用法串(cli_run 用到)。 */ @@ -349,28 +384,20 @@ static int screen_off(void) /* ---------------- DAC(CS43198) ---------------- */ /* 原机 cs43198 驱动 pwr_gpio=-1:无上电/下电控制点(sysfs/amixer),on/off 不支持。 - * status 仅报 amixer numid=1/2(L/R)当前音量上报值。 */ + * status 报**真实音量**:读板载 /usr/data/meow/settings.conf 的 audio.volume(meow_dac_vol_write + * 写入映射值 0-100),按 audio.volume_max clamp(与 launcher vol_clamp / SDK meow_ui_vol_clamp 同口径)。 + * 原 amixer -c 0 cget numid=1/2 为驱动 dummy 恒 0(不可靠),弃用——不再走 amixer 虚拟上报。 */ static int dac_status(char *out, int cap) { - char l[48] = "?", r[48] = "?"; - char *o1 = popen_read_tmo(SV_TIMEOUT_MS, "PATH=/bin:/sbin:/usr/bin:/usr/sbin amixer -c 0 cget numid=1 2>/dev/null"); - if (o1) { - char *p = strstr(o1, ": values="); - if (p) snprintf(l, sizeof l, "%.40s", p + 9); - free(o1); - } - char *o2 = popen_read_tmo(SV_TIMEOUT_MS, "PATH=/bin:/sbin:/usr/bin:/usr/sbin amixer -c 0 cget numid=2 2>/dev/null"); - if (o2) { - char *p = strstr(o2, ": values="); - if (p) snprintf(r, sizeof r, "%.40s", p + 9); - free(o2); - } - out[0] = 0; - cat_b(out, cap, "dac=cs43198 L="); - cat_b(out, cap, l); - cat_b(out, cap, " R="); - cat_b(out, cap, r); - cat_b(out, cap, " powerctl=unsupported(no_gpio)"); + int vol = settings_get_int_trim("audio.volume", MEOW_VOL_DEFAULT); + int vmax = settings_get_int_trim("audio.volume_max", MEOW_VOL_MAX_DEFAULT); + if (vol < 0) vol = 0; /* 硬下限 0 */ + if (vol > 100) vol = 100; /* 硬上限 100(0-100 口径) */ + if (vmax < 0) vmax = 0; /* 异常上限兜底:不进负值 */ + if (vol > vmax) vol = vmax; /* 尊重 audio.volume_max 软上限 */ + /* 左右同值(单个 DAC 声道容量;L=R=vol%);settings 读不到 → 默认 MEOW_VOL_DEFAULT(60) 即真实默认。 */ + snprintf(out, cap, "dac=cs43198 vol=%d%% L=R", vol); + svc_log("dac status: audio.volume=%d (volume_max=%d)", vol, vmax); return 0; } @@ -405,10 +432,18 @@ static int execute_action(const m_power_action_t *a, m_power_status_t *st) snprintf(st->msg, sizeof st->msg, "reboot accepted (boot=meow)"); return 1; case POWER_UPGRADE: - sync(); - st->code = MEOW_OK; - snprintf(st->msg, sizeof st->msg, "upgrade accepted"); - return 1; + { /* 写 mtd5 前先校验卡上升级固件(升级写保护);校验失败→非 OK、绝不写 mtd5/不 reboot。 */ + char why[64]; + int rc = upgrade_fw_check(why, sizeof why); + if (rc != MEOW_OK) { + st->code = rc; + snprintf(st->msg, sizeof st->msg, "upgrade rejected: %s", why); + return 0; /* 已填 st;调用方直接应答非 OK(不触发 run_system_action) */ + } + sync(); + st->code = MEOW_OK; + snprintf(st->msg, sizeof st->msg, "upgrade accepted"); + return 1; } case POWER_BACK_HIBY: write_boot_default(1); sync(); @@ -659,6 +694,12 @@ static int cli_run(int n, char **v) return 0; } if (!strcmp(cmd, "upgrade")) { + char why[64]; + int rc = upgrade_fw_check(why, sizeof why); + if (rc != MEOW_OK) { + fprintf(stderr, "upgrade aborted: %s (firmware NOT written to mtd5)\n", why); + return 1; + } enter_upgrade(); sys_reboot_do(LINUX_REBOOT_CMD_RESTART); return 0; diff --git a/patch_v2/meow_svc_power/meow_svc_power_host b/patch_v2/meow_svc_power/meow_svc_power_host index 0fa93b9700931a411c4a0b910be22b9021f2a109..9148c36aea11e9f4feb4c8f52be0968850d0664e 100755 GIT binary patch delta 11096 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