充电态权威源 mp2731-charger/status(修 battery/status 撒谎恒 Discharging)

真机实测:设备充电中但 battery/status 恒 Discharging;权威源为
mp2731-charger/status(Charging/Full),回退链 fusb302-typec-source/online==1
→ 旧逻辑 battery/status==Charging || ac/online==1。电量仍读 battery/capacity。

- meow_svc_power: battery/status 命令充电判定走权威链(MEOW_PS_DIR 可重定向供宿主自测);
  svc_power_authtest 补 6 用例(mp2731 Charging/Full/Discharging + 两级回退)全 PASS
- SDK meow_ui_sys: 状态栏充电态同权威链
- launcher util.c: 抽 batt_is_charging() 公共判定;meow_sys_light 1s 轻刷补充电态(插拔实时)
- bootmenu 无充电判定(仅读 capacity)/MeowPanel 透传 power 服务:均无需改
- 真机验证(充电窗口):新二进制 battery=88%(Charging),对照固件内旧版 88%(Discharging)
- hello/files/ncm 随 meow_ui.a(af6703f2) 重链已热更到卡(.new+mv,md5 对核一致)

md5: meow_svc_power 39ae3aa2 / meow_launcherd 2aa61780 / hello 2444c151 /
files 691db88b / ncm 89da63ed(仅重链,源码未动)
This commit is contained in:
MeowOS committed 2026-09-01 03:25:01 +08:00
1 parent 793a807ce3
commit f149e24f28
13 files changed
+114 -12

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
+20 -3
View File
@@ -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;
Binary file not shown.
+27 -4
View File
@@ -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];
Binary file not shown.
Binary file not shown.
@@ -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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
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;
Binary file not shown.
+17 -2
View File
@@ -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);
+2 -1
View File
@@ -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 同文件;
+2 -2
View File
@@ -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 解析失败)