diff --git a/core/SConscript.bootloader_emu b/core/SConscript.bootloader_emu index 062c508c6c..d47092c902 100644 --- a/core/SConscript.bootloader_emu +++ b/core/SConscript.bootloader_emu @@ -20,7 +20,7 @@ if not models.has_emulator(TREZOR_MODEL): ) Return() -FEATURES_WANTED = ["input", "rgb_led", "dma2d", "optiga", "powerctl", "display"] +FEATURES_WANTED = ["input", "rgb_led", "dma2d", "optiga", "power_manager", "display"] CCFLAGS_MOD = '' CPPPATH_MOD = [] diff --git a/core/embed/projects/bootloader/main.c b/core/embed/projects/bootloader/main.c index 6bfc57fc45..90752a9971 100644 --- a/core/embed/projects/bootloader/main.c +++ b/core/embed/projects/bootloader/main.c @@ -90,6 +90,56 @@ CONFIDENTIAL volatile secbool dont_optimize_out_true = sectrue; CONFIDENTIAL void (*volatile firmware_jump_fn)(void) = failed_jump_to_firmware; static void drivers_init(secbool *touch_initialized) { +#ifdef USE_BACKUP_RAM + backup_ram_init(); +#endif + +#ifdef USE_BUTTON + button_init(); +#endif + +#ifdef USE_RGB_LED + rgb_led_init(); +#endif + +#ifdef USE_POWER_MANAGER + pm_init(false); + + boot_command_t cmd = bootargs_get_command(); + + bool turn_on = + (cmd == BOOT_COMMAND_INSTALL_UPGRADE || cmd == BOOT_COMMAND_REBOOT || + cmd == BOOT_COMMAND_SHOW_RSOD || cmd == BOOT_COMMAND_STOP_AND_WAIT); + + while (!button_is_down(BTN_POWER) && !turn_on) { + pm_state_t state; + pm_get_state(&state); + + if (state.charging_status == PM_BATTERY_CHARGING) { + // charing screen + rgb_led_set_color(0x0000FF); + } else { + if (!state.usb_connected && !state.wireless_connected) { + // device in just intended to be turned off + pm_hibernate(); + systick_delay_ms(1000); + reboot_to_off(); + } else { + // todo signal full battery if conditions are met + } + } + } + + while (pm_turn_on() != PM_OK) { + rgb_led_set_color(0x400000); + systick_delay_ms(1000); + pm_hibernate(); + systick_delay_ms(1000); + reboot_to_off(); + } + +#endif + random_delays_init(); #ifdef USE_PVD pvd_init(); @@ -127,27 +177,17 @@ static void drivers_init(secbool *touch_initialized) { #ifdef USE_OPTIGA optiga_hal_init(); #endif -#ifdef USE_BACKUP_RAM - backup_ram_init(); -#endif -#ifdef USE_BUTTON - button_init(); -#endif + #ifdef USE_CONSUMPTION_MASK consumption_mask_init(); #endif -#ifdef USE_RGB_LED - rgb_led_init(); -#endif + #ifdef USE_BLE ble_init(); #endif } static void drivers_deinit(void) { -#ifdef USE_BACKUP_RAM - backup_ram_deinit(); -#endif #ifdef FIXED_HW_DEINIT #ifdef USE_BUTTON button_deinit(); @@ -163,6 +203,9 @@ static void drivers_deinit(void) { #ifdef USE_POWER_MANAGER pm_deinit(); #endif +#ifdef USE_BACKUP_RAM + backup_ram_deinit(); +#endif } static secbool check_vendor_header_lock(const vendor_header *const vhdr) { @@ -342,10 +385,6 @@ int bootloader_main(void) { firmware_present_backup = firmware_present; } -#ifdef USE_POWER_MANAGER - pm_init(false); -#endif - #if PRODUCTION && !defined STM32U5 // for STM32U5, this check is moved to boardloader ensure_bootloader_min_version();