优化开机限制
authorcaisking <caiyqm@qq.com>
Thu, 23 Apr 2026 07:50:15 +0000 (15:50 +0800)
committercaisking <caiyqm@qq.com>
Thu, 23 Apr 2026 07:50:15 +0000 (15:50 +0800)
code/sdk/application/brandy/brandy_standard/board_init.c

index ad961ef..adb55a9 100644 (file)
@@ -118,7 +118,20 @@ static void gpio_func_init(void)
 \r
 static button_press_state_t g_pwrkey_press_state = RELEASED;\r
 static startup_reason_t startup_reason = STARTUP_OTHER;\r
-#define  PRESS_COUNT_LIMIT 5\r
+#define PWRKEY_CHECK_INTERVAL_MS 200\r
+#define PWRKEY_HOLD_TIME_MS      2000\r
+#define PRESS_COUNT_LIMIT        (PWRKEY_HOLD_TIME_MS / PWRKEY_CHECK_INTERVAL_MS)\r
+static uint64_t g_boot_stage_last_ms = 0;\r
+\r
+static void boot_log_stage(const char *stage_name)\r
+{\r
+    uint64_t now_ms = uapi_ulp_systick_get_ms();\r
+    uint64_t delta_ms = now_ms - g_boot_stage_last_ms;\r
+    PRINT("【开机流程】%s,当前时间=%llu ms,阶段耗时=%llu ms"NEWLINE,\r
+        stage_name, (unsigned long long)now_ms, (unsigned long long)delta_ms);\r
+    g_boot_stage_last_ms = now_ms;\r
+}\r
+\r
 static button_press_state_t porting_button_get_state(void)\r
 {\r
     if ((readl(ANA_STS) & 0x3) == 0) \r
@@ -141,6 +154,7 @@ static button_press_state_t porting_function_button_get_state(void)
 \r
 static void _poweroff(void)\r
 {\r
+    PRINT("【开机流程】执行关机流程:清中断、配置低功耗寄存器"NEWLINE);\r
     /* clr ulp int and event */\r
     writel(0x5702C1E4, 0x3F);\r
     writel(0x5702C1EC, 0x3F);\r
@@ -176,39 +190,55 @@ static void _poweroff(void)
 \r
 void check_pwrkey_3s(void)\r
 {\r
-   //3�밴������\r
-    bool button_pressed = false;\r
+    // 开机按键长按校验\r
+    button_press_state_t button_pressed = RELEASED;\r
     int pressed_count = 0;\r
     uapi_ulp_wkup_type_record();\r
     startup_reason = uapi_get_startup_reason();\r
+    button_pressed = porting_button_get_state();\r
     int cpu_reset_case = get_cpu_utils_reset_cause();\r
-    PRINT("bootup reasion %d (0-systick 1-pwrkey 2-vbus 3-other) cpu_resetcase 0x%04X"NEWLINE,startup_reason,cpu_reset_case);\r
+    PRINT("【开机按键】开始校验:目标长按=%d ms,采样间隔=%d ms,采样次数=%d"NEWLINE,\r
+        PWRKEY_HOLD_TIME_MS, PWRKEY_CHECK_INTERVAL_MS, PRESS_COUNT_LIMIT);\r
+    PRINT("bootup reasion %d (0-systick 1-pwrkey 2-vbus 3-other) cpu_resetcase 0x%04X realtime_pwrkey=%d hold_ms=%d limit=%d"NEWLINE,\r
+        startup_reason, cpu_reset_case, button_pressed, PWRKEY_HOLD_TIME_MS, PRESS_COUNT_LIMIT);\r
     if (cpu_reset_case == REBOOT_CAUSE_APPLICATION_SYSRESETREQ ) \r
     {\r
+        PRINT("【开机按键】检测到软件复位,不执行长按校验,直接继续启动"NEWLINE);\r
         PRINT("CPU reset Case is REBOOT , no need check PowerKey"NEWLINE);\r
         return ;\r
     }\r
-    if(startup_reason == 1) g_pwrkey_press_state = PRESSED;\r
-    else g_pwrkey_press_state = RELEASED;\r
-    if (g_pwrkey_press_state == PRESSED)\r
+    if (startup_reason == STARTUP_VBUS_EN)\r
     {\r
-        while(g_pwrkey_press_state == PRESSED){//���������ż��3��\r
-            g_pwrkey_press_state =  porting_button_get_state();\r
-            PRINT("bootup timeout %d g_pwrkey_press_state %d"NEWLINE,pressed_count,g_pwrkey_press_state);\r
-            pressed_count ++ ;\r
-            if (pressed_count>=PRESS_COUNT_LIMIT)\r
-            {\r
-                break;\r
-            }\r
-            uapi_tcxo_delay_ms(200);\r
+        PRINT("【开机按键】检测到充电/VBUS启动,跳过长按校验,直接继续启动"NEWLINE);\r
+        return;\r
+    }\r
+\r
+    g_pwrkey_press_state = button_pressed;\r
+    PRINT("bootup startup gated pwrkey_state=%d"NEWLINE, g_pwrkey_press_state);\r
+\r
+    while (pressed_count < PRESS_COUNT_LIMIT)\r
+    {\r
+        g_pwrkey_press_state = porting_button_get_state();\r
+        PRINT("bootup hold check %d/%d g_pwrkey_press_state %d"NEWLINE,\r
+            pressed_count + 1, PRESS_COUNT_LIMIT, g_pwrkey_press_state);\r
+        if (g_pwrkey_press_state != PRESSED)\r
+        {\r
+            PRINT("【开机按键】长按不足,触发关机。已连续按住=%d ms"NEWLINE,\r
+                pressed_count * PWRKEY_CHECK_INTERVAL_MS);\r
+            PRINT("not pressed %d ms continuously, poweroff!"NEWLINE,\r
+                pressed_count * PWRKEY_CHECK_INTERVAL_MS);\r
+            _poweroff(); \r
+            return;\r
         }\r
-        if(pressed_count < PRESS_COUNT_LIMIT )\r
+        pressed_count++;\r
+        if (pressed_count < PRESS_COUNT_LIMIT)\r
         {\r
-            PRINT("not pressed 3 seconds , poweroff!"NEWLINE);\r
-            _poweroff();\r
+            uapi_tcxo_delay_ms(PWRKEY_CHECK_INTERVAL_MS);\r
         }\r
-        PRINT("bootup continue pressed %d pressed count %d"NEWLINE,g_pwrkey_press_state==PRESSED?1:0,pressed_count);\r
     }\r
+\r
+    PRINT("【开机按键】长按校验通过,允许继续启动"NEWLINE);\r
+    PRINT("bootup continue after hold check pressed_count %d"NEWLINE, pressed_count);\r
 }\r
 \r
 // static void check_power_on_voltage(void)\r
@@ -275,7 +305,11 @@ void check_pwrkey_3s(void)
 \r
 bool need_enter_safemode(void)\r
 {\r
-    if (PRESSED ==  porting_button_get_state() && PRESSED ==  porting_function_button_get_state())\r
+    button_press_state_t pwrkey_state = porting_button_get_state();\r
+    button_press_state_t function_key_state = porting_function_button_get_state();\r
+    PRINT("【开机流程】安全模式检测:电源键=%d 功能键=%d (0=按下 1=松开)"NEWLINE,\r
+        pwrkey_state, function_key_state);\r
+    if (PRESSED == pwrkey_state && PRESSED == function_key_state)\r
     {\r
         return true;\r
     }else{\r
@@ -284,41 +318,64 @@ bool need_enter_safemode(void)
 }\r
 void board_init(uint32_t flash_id, uint32_t flash_unique_id)\r
 {\r
+    g_boot_stage_last_ms = uapi_ulp_systick_get_ms();\r
+    PRINT("【开机流程】board_init开始,flash_id=0x%x, flash_uid=0x%x, t0=%llu ms"NEWLINE,\r
+        flash_id, flash_unique_id, (unsigned long long)g_boot_stage_last_ms);\r
+\r
     /* flash init */\r
+    PRINT("【开机流程】开始初始化Flash"NEWLINE);\r
     flash_funcreg_adapt(0);\r
     flash_save_manufacturer(0, flash_id);\r
     uapi_flash_init(0);\r
     uapi_flash_config_cmd_at_xip_mode(0, (uint8_t)flash_unique_id);\r
     uapi_flash_switch_to_cache_mode(0);\r
     PRINT("Flash id is %x, init success"NEWLINE, flash_id);\r
+    boot_log_stage("Flash初始化完成");\r
 \r
+    PRINT("【开机流程】开始初始化PIO配置"NEWLINE);\r
     pio_func_init();\r
+    boot_log_stage("PIO初始化完成");\r
+\r
+    PRINT("【开机流程】开始初始化GPIO配置"NEWLINE);\r
     gpio_func_init();\r
+    boot_log_stage("GPIO初始化完成");\r
+\r
+    PRINT("【开机流程】开始执行电源键长按开机校验"NEWLINE);\r
     check_pwrkey_3s();\r
+    boot_log_stage("电源键长按校验完成");\r
 \r
     // check_power_on_voltage();\r
     \r
-    if (need_enter_safemode() == true)\r
-    {\r
-        PRINT("entering SafeMode\r\n");\r
-        // #ifdef CUSTOM_UTILS\r
-        // uapi_dev_runtime_set_safemode_flag(1);\r
-        // #endif\r
-    }else{\r
-        PRINT("entering NormalMode\r\n");\r
-    }\r
+    // if (need_enter_safemode() == true)\r
+    // {\r
+    //     PRINT("【开机流程】判定结果:进入安全模式"NEWLINE);\r
+    //     PRINT("entering SafeMode\r\n");\r
+    //     // #ifdef CUSTOM_UTILS\r
+    //     // uapi_dev_runtime_set_safemode_flag(1);\r
+    //     // #endif\r
+    // }else{\r
+    //     PRINT("【开机流程】判定结果:进入正常模式"NEWLINE);\r
+    //     PRINT("entering NormalMode\r\n");\r
+    // }\r
+    // boot_log_stage("模式判定完成");\r
 \r
 #ifdef QSPI_DISPLAY\r
     lcd_bus_register_api(&g_display_api_qspi, BUS_DISPLAY_QSPI);\r
     g_display_init_select = DISPLAY_CLASS_QSPI;\r
+    PRINT("【开机流程】显示总线选择:QSPI"NEWLINE);\r
 #else\r
     lcd_bus_register_api(&g_display_api_mipi, BUS_DISPLAY_MIPI);\r
     g_display_init_select = DISPLAY_CLASS_MIPI;\r
+    PRINT("【开机流程】显示总线选择:MIPI"NEWLINE);\r
 #endif\r
+    boot_log_stage("显示总线注册完成");\r
 \r
 #ifdef BRANDY_PRODUCT_EVB\r
     g_board_init_select = BOARD_CLASS_E0B2;\r
+    PRINT("【开机流程】板级型号选择:BOARD_CLASS_E0B2"NEWLINE);\r
 #else\r
     g_board_init_select = BOARD_CLASS_E0B4;\r
+    PRINT("【开机流程】板级型号选择:BOARD_CLASS_E0B4"NEWLINE);\r
 #endif\r
+    boot_log_stage("board_init结束");\r
 }
\ No newline at end of file