refactor(core/embed): simplify ensure_compatible_settings

[no changelog]
tychovrahe/coresplit/merged
cepetr 3 months ago
parent 8e43402e58
commit df3c654233

@ -326,7 +326,10 @@ int main(void) {
write_bootloader_min_version(hdr->monotonic);
display_deinit(DISPLAY_RETAIN_CONTENT);
#ifdef ENSURE_COMPATIBLE_SETTINGS
ensure_compatible_settings();
#endif
mpu_config_off();

@ -188,5 +188,3 @@ __attribute__((noreturn)) void jump_to(uint32_t address) {
"STORAGE WAS RETAINED");
}
}
void ensure_compatible_settings(void) {}

@ -15,8 +15,6 @@ void emulator_poll_events(void);
void set_core_clock(int);
void mpu_config_bootloader(void);
void mpu_config_off(void);
void display_set_little_endian(void);
void jump_to(uint32_t address);
void ensure_compatible_settings(void);
void jump_to(void *addr);
#endif

@ -331,7 +331,10 @@ void real_jump_to_firmware(void) {
}
display_deinit(DISPLAY_RETAIN_CONTENT);
#ifdef ENSURE_COMPATIBLE_SETTINGS
ensure_compatible_settings();
#endif
mpu_config_off();
jump_to(IMAGE_CODE_ALIGN(FIRMWARE_START + vhdr.hdrlen + IMAGE_HEADER_SIZE));

@ -58,4 +58,11 @@
#define SD_ENABLE_PORT GPIOC
#define SD_ENABLE_PIN GPIO_PIN_0
// Ensure compatible hardware settings before jumping to
// the different booting stage. This function is used to
// ensure backward compatibility with older versions of
// released bootloaders and firmware.
#define ENSURE_COMPATIBLE_SETTINGS
extern void ensure_compatible_settings(void);
#endif //_TREZOR_T_H

@ -0,0 +1,4 @@
#include "platform.h"
void ensure_compatible_settings(void) { set_core_clock(CLOCK_168_MHZ); }

@ -93,6 +93,12 @@ static inline void display_init(display_content_mode_t mode) {
}
static inline void display_deinit(display_content_mode_t mode) {
#ifdef TREZOR_MODEL_T
if (mode == DISPLAY_RESET_CONTENT) {
display_orientation(0);
}
#endif
display_finish_actions();
}

@ -117,22 +117,6 @@ void collect_hw_entropy(void) {
NULL);
}
// this function resets settings changed in one layer (bootloader/firmware),
// which might be incompatible with the other layers older versions,
// where this setting might be unknown
void ensure_compatible_settings(void) {
#ifdef TREZOR_MODEL_T
#ifdef NEW_RENDERING
display_set_compatible_settings();
#else
display_set_big_endian();
#endif
display_orientation(0);
set_core_clock(CLOCK_168_MHZ);
backlight_pwm_deinit(BACKLIGHT_RETAIN);
#endif
}
void invalidate_firmware(void) {
// erase start of the firmware (metadata) -> invalidate FW
ensure(flash_unlock_write(), NULL);

@ -723,6 +723,7 @@ void display_finish_actions(void) {
#ifndef BOARDLOADER
bg_copy_wait();
#endif
backlight_pwm_deinit(BACKLIGHT_RETAIN);
}
#else
// NOT FRAMEBUFFER
@ -755,6 +756,11 @@ uint16_t display_get_window_offset(void) { return 0; }
void display_shift_window(uint16_t pixels) {}
void display_finish_actions(void) {}
void display_finish_actions(void) {
backlight_pwm_deinit(BACKLIGHT_RETAIN);
#ifdef TREZOR_MODEL_T
display_set_big_endian();
#endif
}
#endif

@ -35,7 +35,6 @@ void set_core_clock(clock_settings_t settings);
void memset_reg(volatile void *start, volatile void *stop, uint32_t val);
void jump_to(uint32_t address);
void jump_to_with_flag(uint32_t address, uint32_t register_flag);
void ensure_compatible_settings(void);
void clear_otg_hs_memory(void);
void drop_privileges(void);

@ -31,8 +31,10 @@ __attribute__((noreturn)) static void _reboot_to_bootloader(
#else
__attribute__((noreturn)) static void _reboot_to_bootloader(
boot_command_t boot_command) {
display_deinit(DISPLAY_RETAIN_CONTENT);
display_deinit(DISPLAY_RESET_CONTENT);
#ifdef ENSURE_COMPATIBLE_SETTINGS
ensure_compatible_settings();
#endif
mpu_config_bootloader();
jump_to_with_flag(IMAGE_CODE_ALIGN(BOOTLOADER_START + IMAGE_HEADER_SIZE),
boot_command);

@ -18,7 +18,6 @@ extern uint32_t systick_val_copy;
// from util.s
extern void shutdown_privileged(void);
extern void ensure_compatible_settings(void);
// Initializes the supervise module
//

@ -72,9 +72,23 @@ void display_init(display_content_mode_t mode) {
void display_deinit(display_content_mode_t mode) {
#ifdef XFRAMEBUFFER
#ifndef BOARDLOADER
// Ensure that the ready frame buffer is transfered to
// the display controller
display_ensure_refreshed();
// Disable periodical interrupt
svc_disableIRQ(DISPLAY_TE_INTERRUPT_NUM);
#endif
#endif
backlight_pwm_deinit(mode == DISPLAY_RESET_CONTENT ? BACKLIGHT_RESET : BACKLIGHT_RETAIN);
#ifdef TREZOR_MODEL_T
// This ensures backward compatibility with legacy bootloader/firmware
// that relies on this hardware settings from the previous boot stage
if (mode == DISPLAY_RESET_CONTENT) {
display_set_orientation(0);
}
display_panel_set_big_endian();
#endif
}
@ -123,5 +137,3 @@ int display_get_orientation(void) {
return drv->orientation_angle;
}
void display_set_compatible_settings(void) { display_panel_set_big_endian(); }

@ -107,8 +107,6 @@ void display_refresh(void) {
// Do nothing as using just a single frame buffer
}
void display_set_compatible_settings() {}
void display_fill(const gfx_bitblt_t *bb) {
display_driver_t *drv = &g_display_driver;

@ -370,8 +370,6 @@ display_fb_info_t display_get_frame_buffer(void) {
void display_refresh(void) { display_sync_with_fb(); }
void display_set_compatible_settings() {}
void display_fill(const gfx_bitblt_t *bb) {
display_driver_t *drv = &g_display_driver;

@ -351,8 +351,6 @@ void display_refresh(void) {
display_sync_with_fb(drv);
}
void display_set_compatible_settings() {}
void display_fill(const gfx_bitblt_t *bb) {
display_driver_t *drv = &g_display_driver;

@ -101,11 +101,6 @@ void collect_hw_entropy(void) {
NULL);
}
// this function resets settings changed in one layer (bootloader/firmware),
// which might be incompatible with the other layers older versions,
// where this setting might be unknown
void ensure_compatible_settings(void) {}
void invalidate_firmware(void) {
// on stm32u5, we need to disable the instruction cache before erasing the
// firmware - otherwise, the write check will fail

@ -34,7 +34,6 @@ typedef enum {
} clock_settings_t;
void set_core_clock(clock_settings_t settings);
void ensure_compatible_settings(void);
void drop_privileges(void);
// the following functions are defined in util.s

@ -76,7 +76,7 @@ void display_pixeldata(pixel_color c) {
c = (c & 0x8410) ? 0xFFFF : 0x0000;
#endif
if (!RENDERER) {
display_init();
display_init_all();
}
if (PIXELWINDOW.pos.x <= PIXELWINDOW.end.x &&
PIXELWINDOW.pos.y <= PIXELWINDOW.end.y) {
@ -97,7 +97,7 @@ void display_reset_state() {}
void display_init_seq(void) {}
void display_deinit(void) {
void display_exit_handler(void) {
SDL_FreeSurface(PREV_SAVED);
SDL_FreeSurface(BUFFER);
if (BACKGROUND != NULL) {
@ -115,12 +115,12 @@ void display_deinit(void) {
SDL_Quit();
}
void display_init(void) {
void display_init_all(void) {
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("%s\n", SDL_GetError());
error_shutdown("SDL_Init error");
}
atexit(display_deinit);
atexit(display_exit_handler);
char *window_title = NULL;
char *window_title_alloc = NULL;
@ -197,7 +197,7 @@ void display_init(void) {
void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
if (!RENDERER) {
display_init();
display_init_all();
}
PIXELWINDOW.start.x = x0;
PIXELWINDOW.start.y = y0;
@ -211,7 +211,7 @@ void display_sync(void) {}
void display_refresh(void) {
if (!RENDERER) {
display_init();
display_init_all();
}
if (BACKGROUND) {
const SDL_Rect r = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
@ -267,7 +267,7 @@ int display_backlight(int val) {
const char *display_save(const char *prefix) {
if (!RENDERER) {
display_init();
display_init_all();
}
static int count;
static char filename[256];

@ -254,7 +254,7 @@ void display_refresh(void) {
display_driver_t *drv = &g_display_driver;
if (!drv->renderer) {
display_init();
return;
}
#ifdef DISPLAY_MONO
@ -287,10 +287,6 @@ void display_refresh(void) {
SDL_RenderPresent(drv->renderer);
}
void display_set_compatible_settings(void) {
// not used
}
#ifndef DISPLAY_MONO
void display_fill(const gfx_bitblt_t *bb) {
@ -365,7 +361,7 @@ const char *display_save(const char *prefix) {
display_driver_t *drv = &g_display_driver;
if (!drv->renderer) {
display_init();
return NULL;
}
#ifdef DISPLAY_MONO

@ -126,11 +126,6 @@ void display_wait_for_sync(void);
// swaps the active (currently displayed) and the inactive frame buffers.
void display_refresh(void);
// Sets display to the mode compatible with the legacy bootloader code.
//
// This is used when switching between the firmware and the bootloader.
void display_set_compatible_settings(void);
// Following functions define display's bitblt interface.
//
// These functions draw directly to to display or to the

@ -40,6 +40,7 @@ def configure(
defines += [f"HW_REVISION={hw_revision}"]
sources += [
"embed/models/T2T1/model_T2T1_layout.c",
"embed/models/T2T1/compat_settings.c",
]
if "new_rendering" in features_wanted:
sources += ["embed/trezorhal/xdisplay_legacy.c"]

Loading…
Cancel
Save