Files
MeowOS-For-R3P2/patch_v2/sdk/meow_time32.h
T
AskaEth 63b278e13e fix(watchdog+launcher+sdk): M40 电源键 time64 ABI + 锁屏/叠加残留链
- sdk/meow_time32: 抽出可独立链接的 o32 time32 取时/睡眠设施(不依赖 meow_ui.a,
  watchdog 等独立静态组件可直接链;可选 -DMEOW_TIME32_LIBC_OVERRIDES 接管 libc 入口)
- watchdog: now_ms/usleep 改走 time32(修复 held 变天文数字→每次单击都弹菜单);
  阈值读 power.longpress_menu_ms/forceoff_ms(缺省 3000/8000),删除
  PWR_TOGGLE_MS==PWR_MENU_MS;新增 wd_power.h 纯判定 + 宿主行为矩阵测试
- launcher: App 前台电源菜单补齐 §10.5(notif 全抑制 + 帧恢复 + SIGCONT 排空 +
  标记翻回前台);show_power_menu 恢复进入前背景帧(关闭后不再停留菜单画面);
  重绘挪到首轮按键采样之后;activity 标记排空窗 + 会话入口清理 + manual_off 去闩锁
- lock_screen: 电源改按下边沿 + 进场 300ms 才熄屏;电源熄屏退出也恢复底层帧;
  launcher 在 SIGCONT 前写 /tmp/meow_app_repaint,SDK present 消费并 dirty_full
- power_menu: 菜单内强关接 power.forceoff_ms(按 longpress 抵扣),日志不再谎称 8s
- 重编 meow_ui.a 并重链 meow_launcherd/ncm/files/hello/reader(picbrowser 无源码)
- fw_content.conf: 同步 launcherd/watchdog 新 md5;顺带修正 M35 遗留的 nyai 失效钉值

Host: test_wd_fw 66/66、test_overlay_gate 40/40、test_meow_time64/time/repaint PASS。
真机未验证(设备关机);未刷机、未写设备。
2026-11-10 22:51:00 +08:00

79 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* meow_time32.h — mipsel o32 内核 time32 ABI 兜底(**可独立链接**的公共设施)。
*
* 为什么单独成文件(M40):
* zig 0.17 给 32 位 mips 预定义 __ILP32__,打穿 musl 的 time64 回退守卫:调用方按
* 16 字节 time64 结构取数,libc 却只发 time32 系统调用(只写前 8 字节)。结果是
* 「秒在低 32 位、毫秒位恒 0、高 32 位是 nsec」的垃圾时间,任何 now_ms()/超时/退避
* 都会失真。meow_ui_time.c 的修复只对**链接 meow_ui.a** 的进程生效;系统组件
* (watchdog / sysui / svcd / bootmenu / amsd / audiod / netmgrd / crash / svc_perf /
* powermgr / meowpanel)各自独立静态链接,不链 SDK,因此需要一份不依赖 SDK 的实现。
*
* 本 TU 只依赖 libc(stdint/unistd/time/syscall),不引用 meow_ui.a 的任何符号:
* - 纯换算函数(与内核结构宽度解耦,宿主可直接单测);
* - 内核 o32 time32 取时(meow_time32_clock_gettime / meow_time32_monotonic_ms);
* - 亚秒睡眠(meow_time32_sleep_us;usleep 同源受损,见 meow_ui_time.c 注释)。
*
* 用法(系统组件的构建脚本):
* $CC ... meow_watchdog.c ../sdk/meow_time32.c -o meow_watchdog
* 若希望**链接期整体接管 libc 的取时/睡眠入口**(不再逐个改调用点),额外加宏
* -DMEOW_TIME32_LIBC_OVERRIDES
* 该宏只在 mipsel o32 上生效;此时**不要**同时链接 meow_ui.a 里的 meow_ui_time.o
* (两者都会强定义 __clock_gettime 等符号)。
*/
#ifndef MEOW_TIME32_H
#define MEOW_TIME32_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* mipsel o32 内核结构(与 libc 头里的 time_t 宽度无关):
* { int32 tv_sec; int32 tv_nsec; } —— 固定 8 字节。 */
struct meow_time32 {
int32_t tv_sec;
int32_t tv_nsec;
};
struct meow_itimerspec32 {
struct meow_time32 it_interval;
struct meow_time32 it_value;
};
/* 与 libc 结构解耦的 64 位镜像(宿主/交叉两端 time_t 宽度不同,测试不依赖它)。 */
struct meow_time64_spec {
int64_t tv_sec;
int64_t tv_nsec;
};
struct meow_time64_itimerspec {
struct meow_time64_spec it_interval;
struct meow_time64_spec it_value;
};
/* ---- 纯换算(无系统调用;宿主单测直接覆盖)---- */
/* 相对超时(futex / nanosleep 的「等多久」):sec 超出 int32 时饱和
* (正→INT32_MAX、负→INT32_MIN,与 musl CLAMP 一致),nsec 原样。 */
void meow_time32_rel_from_parts(int64_t sec, int64_t nsec, struct meow_time32 *out);
/* 绝对时刻(clock_settime / timerfd):sec 落不进 int32 返回 -1,nsec 原样。 */
int meow_time32_abs_from_parts(int64_t sec, int64_t nsec, struct meow_time32 *out);
/* itimerspec 转换;任一侧越界返回 -1 且 *out 不变。 */
int meow_time32_itimerspec_from_64(const struct meow_time64_itimerspec *in,
struct meow_itimerspec32 *out);
void meow_time64_itimerspec_from_32(const struct meow_itimerspec32 *in,
struct meow_time64_itimerspec *out);
/* 秒/纳秒 → 单调毫秒的唯一换算点。 */
uint64_t meow_time_ms_from_parts(int64_t sec, int64_t nsec);
/* ---- 内核取时 / 睡眠 ---- */
/* 按内核 o32 ABI 取时(clk 用 <time.h> 的 CLOCK_*)。返回 0=成功 / -1=失败(errno)。 */
int meow_time32_clock_gettime(int clk, struct meow_time32 *out);
/* CLOCK_MONOTONIC 毫秒;失败返回 0。 */
uint64_t meow_time32_monotonic_ms(void);
/* 睡眠 usec 微秒(EINTR 自动续睡)。返回 0=正常 / -1=失败(errno)。 */
int meow_time32_sleep_us(unsigned usec);
#ifdef __cplusplus
}
#endif
#endif /* MEOW_TIME32_H */