\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
\r
static void _poweroff(void)\r
{\r
+ PRINT("【开机流程】执行关机流程:清中断、配置低功耗寄存器"NEWLINE);\r
/* clr ulp int and event */\r
writel(0x5702C1E4, 0x3F);\r
writel(0x5702C1EC, 0x3F);\r
\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
\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
}\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