Files
MeowOS-For-R3P2/devdocs/plan/POWER_HW_FACTS.md
T
MeowOS 250c9ae8b1 feat(powermgr): meow_powermgr 期0调研+期1骨架——功耗管理专项服务(POWER_MANAGER_DESIGN)
期0: POWER_HW_FACTS.md 真机只读取证——battery/无current_now(实时功率=derived+estimated
双轨)、无cpufreq(省电档无降频点)、背光量程0-101(非255)、rfkill可用、axp_battery为
幻影设备、无thermal zones、audiod STATE字段完备。

期1: patch_v2/meow_powermgr/ 单二进制双形态(meow_powermgr守护+meow_power CLI):
- svcd托管 trigger=boot/restart=on-fail;HibyOS只读降级(/tmp/meow_boot_mode!=meow
  只采样电池,不碰wlan0/bt/声卡,热切换)
- 权威充电链0-diff照抄svc_power(mp2731→fusb302→battery兜底)
- 电池深加工 state/cap/mV/health/续航估算(容量差分速率环 30s×240)
- 经验功耗模型(/usr/data/meow/power_model.conf 可调,内置默认全部标注待标定)
- IPC /usr/data/meow_pm.sock MSG_PM_QUERY(0x00D0)→MSG_PM_RESULT(0x00D1) JSON,
  subset位;meow_ipc.h 0x00D0-0x00D7 号段回填
- CLI status/estimate/model 落地(IPC优先+直读降级),history/top/events/policy 期2/3桩
- 宿主桩测试36+1例全过(MEOW_PS_DIR等假节点)+qemu-mipsel全过+真机对照svc_power
  battery口径一致(93%/4270mV);mipsel静态117KB(<200KB);-Wall -Wextra 0 warning
2026-09-01 16:21:12 +08:00

7.8 KiB
Raw Blame History

POWER_HW_FACTS — meow_powermgr 期 0 真机只读调研结论

调研时间:2026-09-01 15:43(设备 10.78.193.50,uptime 1:48,/tmp/meow_boot_mode=meow,固件 0.7.89+)。 方式:全部只读(ls/cat/sysfs 读),未写任何节点、未碰进程、未重启。 对照基准:meow_svc_power battery = battery=94%(Discharging) 4275mV。

0. 两个决定形态的关键结论(必读)

问题 结论 影响
battery/current_now 存在吗? 不存在。battery/ 全集无 current_now/charge_now/charge_full/charge_full_design/cycle_count/temp 实时功率不可能 measured;走「容量差分 derived」+「经验模型 estimated」双轨(设计 §3.3 第三档)。健康度(charge_full/design)不可算,只能透传 health 字符串
cpufreq 存在吗? 不存在(/sys/devices/system/cpu/cpu0/cpufreq/ No such file;单核 cpu0) 省电档无降频控制点;CPU 功耗项只能按 util×满载系数估算,无可控项(设计 §5.1 CPU 行降级为「仅观测」)

1. §7 清单逐项结论

项 1:battery/ 全集

capacity=94  health=Good  present=1  status=Discharging(会撒谎,勿用)
technology=Li-ion  voltage_now=4275000(µV)  time_to_empty_now=8191
  • time_to_empty_now=8191(=0x1FFF)为恒定哨兵值,不随负载变化 → 不可用,勿报。
  • 无 temp 节点 → 电池温度报 null(充电器温度见项 2 可替代参考)。

项 2:mp2731-charger/(权威充电态 + 充电功率可算)

status=Discharging(权威源,设计 §3.1 已实测)  online=0  temp=300(=30.0°C)
current_now=0(µA,放电时恒 0;充电时=充电电流)  constant_charge_current=0/_max=4520000
constant_charge_voltage=4200000/_max=4670000  charge_term_current=120000
input_current_now=100000  input_current_limited=2000000  input_suspend=0
input_voltage_settled=2280000  charge_control_limit=3000000  charge_full=0(无效)
real_type=USB  typec_power_role=sink  step_charging_enabled=1
  • 充电功率可估:constant_charge_voltage × current_now / 1e6(充电中 current_now 非 0,待插电实测确认非 0 时刻的值域)。
  • charge_type 节点不存在(清单原问的 charge_type 无)。

项 3:fusb302 / ac / usb / axp_battery

  • fusb302-typec-source/:online✓(插线检测兜底)、voltage_now、current_max(PD 档位相关,本次=0)。
  • ac/:online=0;voltage_now=4600/current_now=1200 为静态默认值(online=0 时不变),仅 online 位可用。
  • usb/:online=0;current_now=780 静态默认。仅 online/present 位可用。
  • axp_battery/:幻影设备(不可用)——capacity=0、voltage_now=0、current_now=200000 三次采样(间隔 5s)恒定不变 → 非实时电量计,是 AXP 遗留驱动的死数据。唯一有用信息:energy_full_design=1600 + voltage_max_design=4350000/min=3400000——可作标称容量参考(1600mAh 级,与 R3 Pro II 官方 1600mAh 电池吻合;诚实标注:单位/口径未经证实,仅作续航估算的默认标称容量,可经 power_model.conf nominal_mah 覆盖)。

项 4:cpufreq —— 不存在(见 §0)

项 5:rfkill —— 存在且可用

rfkill0: type=bluetooth state=1 soft=0 hard=0
rfkill1: type=wlan      state=1 soft=0 hard=0
rfkill2: type=wlan      state=1 soft=0 hard=0
rfkill3: type=bluetooth state=1 soft=0 hard=0
  • 4 个 rfkill(2×wlan + 2×bluetooth,两个同类型并存——WiFi/BT combo 芯片双接口特征)。
  • 软关断控制点存在(写 soft=1,本次未写只读 state)→ 期 3 策略层可用「rfkill soft block」替代 ip link down/hciconfig down(更省电)。红线不变:策略层不直接 poke sysfs,需经 svc_power 类动作通道或新增授权写点,期 3 定案。

项 6:背光节点全集

max_brightness=101  brightness=0  actual_brightness=0  bl_power=0  type=raw
  • ⚠️ 量程是 0-101,不是设计 §3.2 假定的 0-255 → 功耗表背光分档按 0-101 归一(亮度%=brightness/101×100 再分档)。POWER_MANAGER_DESIGN §3.2 表「0-255」需修正为「0-101(R3 Pro II 实测)」。
  • 调查时刻 brightness=0(设备息屏中)→ 息屏态可用 actual_brightness==0 判定(fb0/blank 读取为空串——驱动未实现 read,不可用)。

项 7/8:CPU 满载/背光/WiFi 标定实验

  • 本期 0 未执行:容量差分法需分钟级窗口 + 逐项对照(亮屏定档/stress 满载/WiFi 传输),且设备无 current_now 真值可借 → 留待用户在场配合的标定窗口(每次实验 ≥10min)。
  • 方法已备:capacity 差分(94%→x%)÷ Δt × nominal_mah × 平均电压 = 平均功率;基线=息屏 WiFi 关联空闲。
  • 在标定完成前,一切 mW 数字均为占位经验值(设计 §10 诚实标注不变)。

项 9:WiFi 状态/计数器

  • wpa_cli status ✓:wpa_state=COMPLETED、bssid/freq/ssid/ip_address 全有(关联态可判)。
  • /proc/net/dev wlan0 收发计数器 ✓(bytes/packets 递增)→ 传输态由增量判,可行。
  • wpa_cli 无直接 scan 计数;扫网风暴可用 wpa_cli scan_results 时间戳或 wpa 日志——期 2 再定,标记待验。

项 10:蓝牙

  • hciconfig hci0 ✓(Type: Primary Bus: UART,当前 DOWN,RX/TX 计数器有)。
  • /sys/class/bluetooth/hci0/ ✓ → up/down + 连接数可判(连接数走 hciconfig -a 或 /sys 下 device 枚举,期 2 细化)。

项 11:audiod MSG_AUDIO_STATE

  • meow_audio status 实测:active=0 app=- sid=0 rate=44100 ch=2 fmt=- written=... played=... underrun=1 dropped=0 stall=0 txdrop=0 paused=0 route_mode=auto port=4 vol=44。
  • 字段完备:active(流活跃)/route/port/vol 全有 → 音频链功耗项输入够用(无流≈静态 / 播放≈DAC+FPGA 档)。

项 12:thermal zones —— 不存在

  • /sys/class/thermal/ 目录本身不存在;/sys/class/hwmon/ 也不存在。
  • 唯一温度源:mp2731-charger/temp=300(30.0°C,充电器芯片温度,非电池/SoC)。
  • → 「异常发热」辅助信号无热源可用,期 2 异常检测规则不含温度维度(或仅用充电器温度粗参考)。

2. 对设计文档的回填修正

  1. §3.2 背光量程 0-255 → 0-101(max_brightness 实测)。
  2. §3.3 实时功率:current_now 路径(measured)整层不可达——v1 只有 derived(容量差分)+ estimated(经验模型)。UI 必须带 confidence 标注(设计已要求,此处确认强制执行)。
  3. §3.1 健康度:charge_full/design 不存在 → health 输出透传 health 字符串(Good),不输出百分比。
  4. §3.1 续航估算:以容量差分平均速率(%/min)为准;nominal_mah 默认 1600(axp energy_full_design 旁证,待标定)。
  5. §5.1 CPU 行:无 cpufreq → 「降频」行为项删除,CPU 仅观测。
  6. §5.1 WiFi/BT 行:rfkill soft block 可用作控制点候选(期 3 定案,v1 不动)。
  7. 息屏判定:fb0/blank 不可读 → 用 backlight_pwm0/actual_brightness==0 代理(期 1 采纳)。
  8. 充电功率:mp2731 current_now(µA) + constant_charge_voltage(µV) 可估充电功率(插电态待实测值域)。

3. 遗留 / 待验

  • 插电态复测 mp2731 current_now/constant_charge_current 非零值域(充电功率估算校准)。
  • 标定实验(项 7/8):需用户在场,≥10min/项 × 约 5 项。
  • axp energy_full_design=1600 的单位口径(mAh? mWh?)——与官方 1600mAh 规格吻合但未经驱动源码证实。
  • wpa 扫网频率计数法(期 2)。
  • 时间校准对照:无 current_now,derived 功率的时间分辨率受 capacity 1% 粒度限制(1600mAh×1%=16mAh,~5-15min 才跳 1%)→ 续航估算 v1 精度受限,UI 需标注。