1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-24 15:38:22 +00:00

feat(core/bootloader): add power management to bootloader

[no changelog]
This commit is contained in:
tychovrahe 2025-05-07 13:00:13 +02:00 committed by kopecdav
parent c63ff3bf44
commit 26dc39b941
2 changed files with 56 additions and 17 deletions

View File

@ -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 = []

View File

@ -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();