diff --git a/patch_v2/files_app/files b/patch_v2/files_app/files index 04e5b47..45a0dda 100755 Binary files a/patch_v2/files_app/files and b/patch_v2/files_app/files differ diff --git a/patch_v2/hello_app/hello b/patch_v2/hello_app/hello index e3f8ca4..e1d3f97 100755 Binary files a/patch_v2/hello_app/hello and b/patch_v2/hello_app/hello differ diff --git a/patch_v2/meow_launcherd/meow_launcherd b/patch_v2/meow_launcherd/meow_launcherd index 5c742a1..1121cec 100755 Binary files a/patch_v2/meow_launcherd/meow_launcherd and b/patch_v2/meow_launcherd/meow_launcherd differ diff --git a/patch_v2/meow_launcherd/util.c b/patch_v2/meow_launcherd/util.c index 2356ea9..792c78f 100644 --- a/patch_v2/meow_launcherd/util.c +++ b/patch_v2/meow_launcherd/util.c @@ -747,15 +747,31 @@ static int wifi_signal_level(void) } +/* 充电态权威判定(真机实测 2026-09-01:battery/status 恒 Discharging 撒谎): + * 1) mp2731-charger/status(Charging/Full=充电中)为权威; + * 2) 不可读回退 fusb302-typec-source/online==1(USB-C PD 控制器插线检测); + * 3) 再回退旧逻辑 battery/status==Charging || ac/online==1。 + * 返回 1=充电 0=未充电。 */ +static int batt_is_charging(void) +{ + char st[16]; + read_sys_str("/sys/class/power_supply/mp2731-charger/status", st, sizeof st); + if (st[0]) return (strstr(st, "Charg") || strstr(st, "Full")) ? 1 : 0; + int onl = read_file_int("/sys/class/power_supply/fusb302-typec-source/online"); + if (onl >= 0) return (onl == 1) ? 1 : 0; + read_sys_str("/sys/class/power_supply/battery/status", st, sizeof st); + if (strstr(st, "Charg") || strstr(st, "Full")) return 1; + return read_file_int("/sys/class/power_supply/ac/online") == 1 ? 1 : 0; +} + + /* 全量重抓(进 MeowOS 时调用一次;阻塞可接受)。绝不放进 10ms 主循环。 */ void meow_sys_refresh(void) { load_meowos_version(); /* M2.47:读 /etc/meowos_version(单一数据源,每次刷新对齐) */ int b = read_file_int("/sys/class/power_supply/battery/capacity"); g_sys.batt = (b >= 0 && b <= 100) ? b : -1; - char st[16]; - read_sys_str("/sys/class/power_supply/battery/status", st, sizeof st); - g_sys.charging = (strstr(st, "Charg") || strstr(st, "Full")) ? 1 : 0; + g_sys.charging = batt_is_charging(); g_sys.batt_mv = read_file_int("/sys/class/power_supply/battery/voltage_now") / 1000; /* WiFi:wifi_on=网卡管理态 up(射频开);wifi_connected=operstate up(已关联 AP)。 @@ -820,6 +836,7 @@ void meow_sys_light(void) { int b = read_file_int("/sys/class/power_supply/battery/capacity"); if (b >= 0 && b <= 100) g_sys.batt = b; + g_sys.charging = batt_is_charging(); /* 插拔实时跟踪(两个小 sysfs 节点,开销可忽略) */ char op[16]; read_sys_str("/sys/class/net/wlan0/operstate", op, sizeof op); g_sys.wifi_connected = !strcmp(op, "up") ? 1 : 0; diff --git a/patch_v2/meow_svc_power/meow_svc_power b/patch_v2/meow_svc_power/meow_svc_power index 502f955..33fd4fd 100755 Binary files a/patch_v2/meow_svc_power/meow_svc_power and b/patch_v2/meow_svc_power/meow_svc_power differ diff --git a/patch_v2/meow_svc_power/meow_svc_power.c b/patch_v2/meow_svc_power/meow_svc_power.c index c8b19ed..657d874 100644 --- a/patch_v2/meow_svc_power/meow_svc_power.c +++ b/patch_v2/meow_svc_power/meow_svc_power.c @@ -57,9 +57,19 @@ #define SETTINGS_FILE "/usr/data/meow/settings.conf" #define SETTINGS_HDR "# meow-settings 1" #define VERSION_FILE "/etc/meowos_version" -#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" +/* sysfs 根可经 MEOW_PS_DIR 覆盖(宿主自测用;生产恒 /sys/class/power_supply) */ +#ifndef MEOW_PS_DIR +#define MEOW_PS_DIR "/sys/class/power_supply" +#endif +#define BATT_CAP MEOW_PS_DIR "/battery/capacity" +#define BATT_STATUS MEOW_PS_DIR "/battery/status" +#define BATT_VOLT MEOW_PS_DIR "/battery/voltage_now" +/* 充电态权威源(真机实测 2026-09-01:battery/status 恒 Discharging 撒谎): + * mp2731-charger/status(Charging/Full=充电中)为权威;不可读回退 fusb302-typec-source/online==1 + * (USB-C PD 控制器插线检测);再回退旧逻辑 battery/status==Charging || ac/online==1。 */ +#define CHG_MP2731_STATUS MEOW_PS_DIR "/mp2731-charger/status" +#define CHG_FUSB302_ONLINE MEOW_PS_DIR "/fusb302-typec-source/online" +#define CHG_AC_ONLINE MEOW_PS_DIR "/ac/online" #define UPGRADE_FW "/usr/data/mnt/sd_0/r3proii.upt" /* 卡根升级固件(写 mtd5 前完整性校验) */ /* 音量语义(与 launcher MEOW_VOL_DEFAULT/MEOW_VOL_MAX_DEFAULT、SDK MEOW_UI_VOL_* 一致): @@ -319,11 +329,24 @@ static void cat_b(char *dst, size_t cap, const char *src) } /* ---------------- 电池/状态读组(同 util.c/about.c/bootmenu 数据源) ---------------- */ +/* 充电态权威判定(见上方 CHG_* 注释):返回写入 st 的状态串(空=无法判定)。 */ +static void charging_status_str(char *st, int cap) +{ + st[0] = 0; + if (read_file_txt(CHG_MP2731_STATUS, st, cap) > 0 && st[0]) return; /* 权威源直用 */ + int on = read_file_int_def(CHG_FUSB302_ONLINE, -1); + if (on >= 0) { snprintf(st, cap, "%s", on == 1 ? "Charging" : "Discharging"); return; } + read_file_txt(BATT_STATUS, st, cap); + if (!strstr(st, "Charging") && !strstr(st, "Full") && + read_file_int_def(CHG_AC_ONLINE, 0) == 1) + snprintf(st, cap, "Charging"); +} + static void battery_fill(char *out, int cap) { int pct = read_file_int_def(BATT_CAP, -1); char st[32] = ""; - read_file_txt(BATT_STATUS, st, sizeof st); + charging_status_str(st, sizeof st); /* 权威充电态(battery/status 会撒谎) */ int mv = read_file_int_def(BATT_VOLT, -1) / 1000; /* µV → mV */ if (pct < 0) { snprintf(out, cap, "battery=unknown"); return; } char one[64]; diff --git a/patch_v2/meow_svc_power/meow_svc_power_host b/patch_v2/meow_svc_power/meow_svc_power_host index ad82218..bd3af36 100755 Binary files a/patch_v2/meow_svc_power/meow_svc_power_host and b/patch_v2/meow_svc_power/meow_svc_power_host differ diff --git a/patch_v2/meow_svc_power/svc_power_authtest b/patch_v2/meow_svc_power/svc_power_authtest index ec0dcbb..29c0dd2 100755 Binary files a/patch_v2/meow_svc_power/svc_power_authtest and b/patch_v2/meow_svc_power/svc_power_authtest differ diff --git a/patch_v2/meow_svc_power/svc_power_authtest.c b/patch_v2/meow_svc_power/svc_power_authtest.c index 738b7a8..c117710 100644 --- a/patch_v2/meow_svc_power/svc_power_authtest.c +++ b/patch_v2/meow_svc_power/svc_power_authtest.c @@ -9,12 +9,15 @@ * cc -Wall -Wextra -I../meow_launcherd svc_power_authtest.c -o svc_power_authtest && ./svc_power_authtest */ #define main meow_svc_power_prod_main_unused +#define MEOW_PS_DIR "/tmp/meow_ps_authtest" /* 充电态判定宿主自测:重定向 sysfs 根 */ #include "meow_svc_power.c" #undef main +#undef MEOW_PS_DIR #include #include #include +#include static int g_fail = 0; #define CHECK(cond) do { if (!(cond)) { printf(" FAIL: %s (line %d)\n", #cond, __LINE__); g_fail++; } \ @@ -126,6 +129,49 @@ int main(void) a.cmd = POWER_SET_DEFAULT_MEOW; CHECK(is_read_level(&a) == 0); a.cmd = POWER_SET_DEFAULT_HIBY; CHECK(is_read_level(&a) == 0); + /* == 充电态权威源(真机实测 2026-09-01:battery/status 恒 Discharging 撒谎)== + * 在 /tmp 造 power_supply 假节点(MEOW_PS_DIR 已重定向),覆盖判定优先级: + * mp2731-charger/status(权威)→ fusb302-typec-source/online → battery/status|ac/online。 */ + printf("== charging_status_str (authoritative mp2731) ==\n"); + mkdir("/tmp/meow_ps_authtest", 0755); + mkdir("/tmp/meow_ps_authtest/battery", 0755); + mkdir("/tmp/meow_ps_authtest/mp2731-charger", 0755); + mkdir("/tmp/meow_ps_authtest/fusb302-typec-source", 0755); + mkdir("/tmp/meow_ps_authtest/ac", 0755); + write_file_str("/tmp/meow_ps_authtest/battery/capacity", "72", 0644); + write_file_str("/tmp/meow_ps_authtest/battery/voltage_now", "4150000", 0644); + write_file_str("/tmp/meow_ps_authtest/battery/status", "Discharging", 0644); /* 撒谎节点 */ + write_file_str("/tmp/meow_ps_authtest/ac/online", "0", 0644); + + char out[64]; + /* T1: mp2731=Charging(battery 撒谎 Discharging)→ 充电中 */ + write_file_str("/tmp/meow_ps_authtest/mp2731-charger/status", "Charging", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Charging)") != NULL); + /* T2: mp2731=Full → 满电 */ + write_file_str("/tmp/meow_ps_authtest/mp2731-charger/status", "Full", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Full)") != NULL); + /* T3: mp2731=Discharging 且拔线 → 非充电(权威源的放电可信) */ + write_file_str("/tmp/meow_ps_authtest/mp2731-charger/status", "Discharging", 0644); + write_file_str("/tmp/meow_ps_authtest/fusb302-typec-source/online", "0", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Discharging)") != NULL); + /* T4: mp2731 节点不可读 → 回退 fusb302 online==1 → 充电 */ + unlink("/tmp/meow_ps_authtest/mp2731-charger/status"); + write_file_str("/tmp/meow_ps_authtest/fusb302-typec-source/online", "1", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Charging)") != NULL); + /* T5: 全不可读 → 回退旧逻辑 ac/online==1 → Charging */ + unlink("/tmp/meow_ps_authtest/fusb302-typec-source/online"); + write_file_str("/tmp/meow_ps_authtest/ac/online", "1", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Charging)") != NULL); + /* T6: 全不可读且 ac/online=0、battery=Discharging → Discharging */ + write_file_str("/tmp/meow_ps_authtest/ac/online", "0", 0644); + battery_fill(out, sizeof out); + CHECK(strstr(out, "(Discharging)") != NULL); + if (g_fail) { printf("\nAUTH TEST: %d FAIL\n", g_fail); return 1; } printf("\nAUTH TEST: ALL PASS\n"); return 0; diff --git a/patch_v2/ncm_app/ncm b/patch_v2/ncm_app/ncm index 146ac54..25591d7 100755 Binary files a/patch_v2/ncm_app/ncm and b/patch_v2/ncm_app/ncm differ diff --git a/patch_v2/sdk/meow_ui_sys.c b/patch_v2/sdk/meow_ui_sys.c index b5fade9..3df3327 100644 --- a/patch_v2/sdk/meow_ui_sys.c +++ b/patch_v2/sdk/meow_ui_sys.c @@ -134,8 +134,23 @@ void meow_ui_sys_refresh(void) g_sys.batt = read_int("/sys/class/power_supply/battery/capacity"); if (g_sys.batt < 0 || g_sys.batt > 100) g_sys.batt = -1; char st[16]; - read_str("/sys/class/power_supply/battery/status", st, sizeof st); - g_sys.charging = (strstr(st, "Charg") || strstr(st, "Full")) ? 1 : 0; + /* 充电态权威源(真机实测 2026-09-01:battery/status 恒 Discharging 撒谎): + * 1) mp2731-charger/status(Charging/Full=充电中);2) 回退 fusb302-typec-source/online==1 + * (USB-C PD 插线);3) 再回退旧逻辑 battery/status==Charging || ac/online==1。 */ + read_str("/sys/class/power_supply/mp2731-charger/status", st, sizeof st); + if (st[0]) { + g_sys.charging = (strstr(st, "Charg") || strstr(st, "Full")) ? 1 : 0; + } else { + int onl = read_int("/sys/class/power_supply/fusb302-typec-source/online"); + if (onl >= 0) { + g_sys.charging = (onl == 1) ? 1 : 0; + } else { + read_str("/sys/class/power_supply/battery/status", st, sizeof st); + g_sys.charging = (strstr(st, "Charg") || strstr(st, "Full")) ? 1 : 0; + if (!g_sys.charging && read_int("/sys/class/power_supply/ac/online") == 1) + g_sys.charging = 1; + } + } char op[16]; read_str("/sys/class/net/wlan0/operstate", op, sizeof op); diff --git a/patch_v2/sdk/meow_ui_sys.h b/patch_v2/sdk/meow_ui_sys.h index 2a67ef9..d8c0866 100644 --- a/patch_v2/sdk/meow_ui_sys.h +++ b/patch_v2/sdk/meow_ui_sys.h @@ -7,7 +7,8 @@ * meow_ui_set_fullscreen() / meow_ui_statusbar_height()。 * * 数据源与 launcher 的 meow_sys 同源单点一致: - * - 电量 /sys/class/power_supply/battery/{capacity,status} + * - 电量 /sys/class/power_supply/battery/capacity(充电态权威源=mp2731-charger/status, + * 回退 fusb302-typec-source/online → battery/status|ac/online;battery/status 会撒谎) * - WiFi /sys/class/net/wlan0/operstate * - 蓝牙 实际 powered(hciconfig -a hci0 的 UP;spawn 贵 → 缓存 30s 刷一次) * - 音量 /usr/data/meow/settings.conf 的 audio.volume(launcher 同文件; diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 30389cd..4906723 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -28,13 +28,13 @@ # ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)---- patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|4441822d87e76bfce2ce584604ac3830|引导选单 M2.85(sysui让位 agent-216) -patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|a2f932a1534ac2bb035d39a4d1bcca46|主屏 launcher(+拉起 audiod:MeowOS 模式确认后 meow_svcd start audiod agent-244) +patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|2aa6178090837793957b815ff2f108ba|主屏 launcher(+充电态权威源 mp2731-charger/status,修 battery/status 撒谎恒 Discharging) patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|6373d8e5cac62a34ee468a344b267761|应用看门狗 M2.89(SIGUSR1 仅裸沉浸 App,框架 App 不误杀 agent-236) patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|605646c4cc93f2baf29071ea6bc870ea|服务管理器 M2.77(+崩溃上报 meow_crash agent-187) mips-repo/bins/meow_mdns/bin/meow_mdns|/usr/bin/meow_mdns|d6b0151bda26768f19952dae1342610d|mDNS 应答器 M2.78(启动竞态+换IP重检 agent-194) patch_v2/meow_sysui/meow_sysui|/usr/bin/meow_sysui|173013cc8f0899b3001d0b894ac0d9e6|系统 UI(sysui) patch_v2/meowpkg/nyai|/usr/bin/nyai|2858c3bd8f57fb723df82cb97b488f31|nyai M2.89(导出 exec 绝对路径相对化修复 agent-240) -patch_v2/meow_svc_power/meow_svc_power|/usr/bin/meow_svc_power|306df962d319f16169b14fb808c6a738|电源专项服务 2B(面板精确绑定) +patch_v2/meow_svc_power/meow_svc_power|/usr/bin/meow_svc_power|39ae3aa255695a97f4281124c0621b52|电源专项服务(充电态权威源 mp2731-charger/status,修 battery/status 撒谎恒 Discharging) patch_v2/meow_verify/meow_verify|/usr/bin/meow_verify|6c2e8ed24aebe5caf41e7aed391312d5|II期验签 2B(多公钥+v2签名块 agent-221) patch_v2/meow_crash/meow_crash|/usr/bin/meow_crash|62781084445e82351bcadbdadbe4c7fc|系统级崩溃捕获 (agent-187) patch_v2/meow_svc_perf/meow_svc_perf|/usr/bin/meow_svc_perf|7ea196de9d59ab8cbd1e26edb7762772|性能专项服务 M2.75(net_json 补 network 闭合括号,修 /api/system JSON 解析失败)