feat: UI strict-error mode - ohMyLogo login intro, typewriter removed, fatal instrumentation

- desktop boot screen: typewriter effect removed, whole screen drawn in one pass
- login: ohMyLogo (DEAICUP lotus, 288px embedded) intro screen before password card
- strict error policy instrumentation (zero degradation): login LOGIN-E01..E05 (integrity/badctx/noconf/nouser/nohash) and desktop DSK-E01 now full-screen fatal with symbol + halt instead of silent skip
- root-cause fixed: missing .build_tmp/mkfat32.ps1 silently left SATA sidecar stale (login.elf 'not found' degradation) - replaced with CODE/linux/make_sata_sidecar.sh (auto adaptive FAT32 rebuild each build)
- recreated lost CODE/login/patch_login_hash.ps1 (.text SHA256 -> .hashseg)
- dev config now full flow: show_logo=1, wizard+login enabled, dev shell off
This commit is contained in:
Linehu
2026-10-02 21:07:05 +08:00
parent 3aa15e7b21
commit c4a5295a81
14 changed files with 520 additions and 61 deletions
+21 -23
View File
@@ -97,7 +97,7 @@ static void boot_screen(void) {
int W = (int)g_fb_w, H = (int)g_fb_h;
/* M2 修复:保留 DSK 已绘制的启动画面(渐变背景 + 居中开机 Logo +
* dcp/xj 角标),打字机叠加在其上下空白区——logo 不跳位、不重复、
* dcp/xj 角标),boot 屏叠加在其上下空白区——logo 不跳位、不重复、
* 不被覆盖。DSK logo 居中 157px:占据 H/2-78 .. H/2+78。 */
{
u64 pitch_u32 = g_fb_pitch / 4;
@@ -112,24 +112,17 @@ static void boot_screen(void) {
int lx = (W - lw) / 2;
int ty = H / 2 - 220;
/* boot-title(logo 上方空白区) */
/* boot-title(logo 上方空白区)——一次性整行绘制(打字机效果已删) */
const char *title = "DESHAB";
int tl = kstrlen(title);
for (int i = 0; i < tl; i++) {
char t[2] = { title[i], 0 };
du_draw_string(&g_fb, t, W / 2 - tl * (int)DU_ASCII_STEP + i * (int)DU_ASCII_STEP * 2,
ty, KS_ACCENT, 0, DU_ASCII_STEP * 2);
flip_buffer();
busy_delay(2000000);
}
du_draw_string(&g_fb, title, W / 2 - tl * (int)DU_ASCII_STEP, ty,
KS_ACCENT, 0, DU_ASCII_STEP * 2);
du_divider_h(&g_fb, W / 2 - 120, ty + 30, 240, KS_ACCENT);
/* boot-subtitle(对应 Kate "由 Deaicup 工作室制作") */
draw_centered("DEAICUP STUDIO", W / 2, ty + 44, KS_ACCENT2, 0);
flip_buffer();
busy_delay(2500000);
/* boot-lines 打字机:logo 下方空白区(H/2+110 起),进度条再下方 */
/* boot-lines(logo 下方空白区,H/2+110 起)——整屏一次绘制 */
int ly = H / 2 + 110;
int bar_y = ly + BOOT_LINE_COUNT * ((int)DU_ASCII_LINE_H + 2) + 12;
int bw = 260;
@@ -137,21 +130,15 @@ static void boot_screen(void) {
const char *s = BOOT_LINES[li];
u32 fg = (li == 1 || li == BOOT_LINE_COUNT - 1) ? KS_TEXT_DIM : KS_ACCENT2;
du_draw_string(&g_fb, ">", lx, ly, KS_ACCENT, 0, DU_ASCII_STEP);
for (int ci = 0; s[ci]; ci++) {
char t[2] = { s[ci], 0 };
du_draw_string(&g_fb, t, lx + (ci + 1) * (int)DU_ASCII_STEP, ly,
fg, 0, DU_ASCII_STEP);
flip_buffer();
busy_delay(125000);
}
du_draw_string(&g_fb, s, lx + (int)DU_ASCII_STEP, ly, fg, 0, DU_ASCII_STEP);
ly += (int)DU_ASCII_LINE_H + 2;
/* boot-bar:渐变填充(accent → accent2) */
/* boot-bar: 渐变填充(accent → accent2) */
int fill = bw * (li + 1) / BOOT_LINE_COUNT;
du_rect_outline(&g_fb, W / 2 - bw / 2, bar_y, bw, 6, KS_BORDER, 1);
if (fill > 2) du_fill_rect_gradient(&g_fb, W / 2 - bw / 2 + 1, bar_y + 1,
fill - 2, 4, KS_ACCENT, KS_ACCENT2);
flip_buffer();
}
flip_buffer();
/* boot-hint + credit(对应 Kate "SYSTEM ONLINE" + "© 2026 Deaicup Studio") */
draw_centered("SYSTEM ONLINE", W / 2, H - 64, KS_ACCENT2, 0);
@@ -160,6 +147,18 @@ static void boot_screen(void) {
busy_delay(10000000);
}
/* ============================================================
* 严格错误策略插桩(D 系列):错误不再降级,整屏 fatal + 错误码。
* 每个插桩点唯一 symbol(DSK-E<nn>)。
* ============================================================ */
static void desktop_fatal(const char *sym) {
/* 严格错误策略:任何错误不再降级,串口留档 + 停机。
* (UI 层 fatal 屏由各 UI 组件就绪后的路径使用;此处不依赖任何子系统) */
slog(sym);
for (;;) __asm__("cli; hlt");
}
/* ============================================================
* 主入口
* ============================================================ */
@@ -170,8 +169,7 @@ void dsk_entry(const dsk_boot_context *ctx) {
slog("boot");
if (!ctx || ctx->magic != 0x44534B31424F4F54ULL) {
slog("bad context");
for (;;) __asm__("hlt");
desktop_fatal("DSK-E01-BADCONTEXT");
}
g_boot_ctx = ctx;