bootloader: rework onboarding

pull/25/head
Pavol Rusnak 6 years ago
parent 2e00c090b6
commit 5538614a79
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D

@ -15,6 +15,10 @@
#include "icon_install.h"
#include "icon_wipe.h"
#include "icon_logo.h"
#include "icon_safeplace.h"
#include "icon_welcome.h"
#define BACKLIGHT_NORMAL 150
#define COLOR_BL_FAIL RGB16(0xFF, 0x00, 0x00) // red
@ -50,7 +54,6 @@ void ui_screen_boot(const vendor_header *vhdr, const image_header *hdr)
(int)((fw_version >> 24) & 0xFF)
);
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 25, ver_str, -1, FONT_NORMAL, COLOR_BL_GRAY, background, 0);
ui_fadein();
}
void ui_screen_boot_wait(int delay)
@ -68,9 +71,26 @@ void ui_screen_boot_click(void) {
// info UI
void ui_screen_first(void)
{
display_icon(0, 0, 240, 240, toi_icon_logo + 12, sizeof(toi_icon_logo) - 12, COLOR_BLACK, COLOR_WHITE);
}
void ui_screen_second(void)
{
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
display_icon((DISPLAY_RESX - 200) / 2, (DISPLAY_RESY - 60) / 2, 200, 60, toi_icon_safeplace + 12, sizeof(toi_icon_safeplace) - 12, COLOR_BLACK, COLOR_WHITE);
}
void ui_screen_third(void)
{
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
display_icon((DISPLAY_RESX - 180) / 2, (DISPLAY_RESY - 30) / 2, 180, 30, toi_icon_welcome + 12, sizeof(toi_icon_welcome) - 12, COLOR_BLACK, COLOR_WHITE);
display_text_center(120, 213, "Open trezor.io/start", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
}
void ui_screen_info(secbool buttons, const vendor_header * const vhdr, const image_header * const hdr)
{
display_backlight(0);
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WHITE);
display_text(16, 32, "Bootloader mode", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
display_bar(16, 44, DISPLAY_RESX - 14 * 2, 1, COLOR_BLACK);
@ -103,9 +123,8 @@ void ui_screen_info(secbool buttons, const vendor_header * const vhdr, const ima
display_bar_radius(123, 184, 108, 50, COLOR_BL_DONE, COLOR_WHITE, 4);
display_icon(123 + (108 - 19) / 2, 184 + (50 - 16) / 2, 20, 16, toi_icon_confirm + 12, sizeof(toi_icon_confirm) - 12, COLOR_WHITE, COLOR_BL_DONE);
} else {
display_text_center(120, 213, "Go to trezor.io/start", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
display_text_center(120, 213, "Open trezor.io/start", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
}
ui_fadein();
}
// install UI
@ -117,7 +136,7 @@ void ui_screen_install_confirm(void)
display_bar(16, 44, DISPLAY_RESX - 14 * 2, 1, COLOR_BLACK);
display_icon(16, 54, 32, 32, toi_icon_info + 12, sizeof(toi_icon_info) - 12, COLOR_BLACK, COLOR_WHITE);
display_text(55, 70, "Do you want to", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
display_text(55, 95, "update the firmware?", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
display_text(55, 95, "update firmware?", -1, FONT_NORMAL, COLOR_BLACK, COLOR_WHITE, 0);
display_bar_radius(9, 184, 108, 50, COLOR_BL_FAIL, COLOR_WHITE, 4);
display_icon(9 + (108 - 16) / 2, 184 + (50 - 16) / 2, 16, 16, toi_icon_cancel + 12, sizeof(toi_icon_cancel) - 12, COLOR_WHITE, COLOR_BL_FAIL);

@ -8,6 +8,9 @@ void ui_screen_boot(const vendor_header * const vhdr, const image_header * const
void ui_screen_boot_wait(int delay);
void ui_screen_boot_click(void);
void ui_screen_first(void);
void ui_screen_second(void);
void ui_screen_third(void);
void ui_screen_info(secbool buttons, const vendor_header * const vhdr, const image_header * const hdr);
void ui_screen_install_confirm(void);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,10 @@
static const uint8_t toi_icon_welcome[] = {
// magic
'T', 'O', 'I', 'g',
// width (16-bit), height (16-bit)
0xb4, 0x00, 0x1e, 0x00,
// compressed data length (32-bit)
0x31, 0x03, 0x00, 0x00,
// compressed data
0xc5, 0x52, 0x3d, 0x53, 0x13, 0x51, 0x14, 0xbd, 0x01, 0x24, 0x42, 0x20, 0xa1, 0x56, 0x07, 0xe8, 0x9c, 0xf1, 0x63, 0x42, 0xa9, 0x33, 0xce, 0x40, 0x8b, 0x85, 0xf0, 0x0f, 0x42, 0x45, 0x9b, 0xd8, 0x21, 0xe3, 0x0c, 0x58, 0x51, 0x39, 0xa1, 0xb3, 0x33, 0xf9, 0x07, 0xf1, 0x17, 0x88, 0x76, 0xb1, 0x11, 0x28, 0x2c, 0x6c, 0x08, 0xd2, 0xa1, 0x33, 0x2e, 0x10, 0x3e, 0x43, 0xd8, 0xe3, 0xb9, 0xf7, 0x6d, 0x36, 0x9b, 0x05, 0x66, 0x1c, 0xc9, 0x8c, 0xb7, 0xd8, 0xbd, 0xef, 0xbd, 0x7b, 0xce, 0xbb, 0xef, 0xdc, 0x23, 0xf2, 0x9f, 0x02, 0x38, 0xba, 0x09, 0x7c, 0x12, 0x98, 0xe2, 0x6f, 0x1d, 0x07, 0xfc, 0x66, 0x80, 0xe5, 0x9b, 0x31, 0x47, 0x30, 0x24, 0x2b, 0x84, 0x3b, 0x59, 0x60, 0xb6, 0x6b, 0xcc, 0x43, 0x40, 0x59, 0xa4, 0x0f, 0x38, 0xe3, 0x22, 0x07, 0x8c, 0x74, 0x8d, 0x79, 0x00, 0xd8, 0x10, 0x49, 0x02, 0x4d, 0x2e, 0x8a, 0xf0, 0xa5, 0x6b, 0xcc, 0xfd, 0xc0, 0x9e, 0x48, 0x0a, 0x00, 0x17, 0x6b, 0x68, 0x74, 0x8f, 0xb9, 0x07, 0xa8, 0x8b, 0xa4, 0xc9, 0x3c, 0x21, 0xe2, 0xe1, 0xa4, 0x7b, 0xcc, 0xcc, 0x8f, 0x6d, 0x74, 0x1c, 0x64, 0xc2, 0x6e, 0xe9, 0x1a, 0xf3, 0x9a, 0xce, 0x8e, 0xa3, 0xc3, 0x07, 0x9d, 0x23, 0x95, 0x91, 0x27, 0x5f, 0xfd, 0xea, 0x44, 0xbb, 0x6a, 0x7a, 0xcb, 0xff, 0x32, 0x61, 0xa5, 0x3c, 0xb0, 0x8c, 0x7e, 0x1a, 0x79, 0x5e, 0xbb, 0x78, 0x23, 0x89, 0xd7, 0xde, 0xcf, 0xf0, 0x28, 0x8a, 0xb1, 0x28, 0xea, 0xec, 0x4a, 0x64, 0xde, 0xd6, 0x39, 0x72, 0x9a, 0x77, 0x98, 0x9b, 0xde, 0xae, 0xea, 0x91, 0x2d, 0xd5, 0x32, 0x77, 0x35, 0x3b, 0x1f, 0x31, 0xe6, 0x07, 0x4c, 0xfd, 0x09, 0x6d, 0xe8, 0x54, 0x49, 0x62, 0x18, 0x17, 0x33, 0x3a, 0xbb, 0x1a, 0x6a, 0x38, 0x90, 0x41, 0x60, 0x55, 0x12, 0x35, 0xad, 0xc2, 0xe7, 0xa0, 0xaa, 0xd7, 0xb3, 0xe5, 0x26, 0x27, 0xe2, 0xb2, 0x1d, 0x63, 0xb6, 0xfc, 0x9b, 0x6d, 0xcc, 0x49, 0x1c, 0x13, 0xc4, 0x18, 0x30, 0xce, 0x8d, 0x3c, 0xb7, 0x86, 0xb5, 0x6c, 0xd8, 0x8a, 0xb4, 0x01, 0xab, 0x1a, 0x75, 0xcb, 0x73, 0x69, 0x1d, 0x5c, 0x18, 0x73, 0x24, 0xb6, 0x25, 0x8e, 0x09, 0x82, 0xb6, 0x98, 0xa5, 0xc0, 0x8f, 0x29, 0x77, 0x46, 0x2f, 0x29, 0x02, 0xbb, 0x0b, 0x9e, 0x5a, 0xc5, 0xaa, 0xa8, 0x53, 0x75, 0x91, 0xa8, 0x29, 0xcd, 0x76, 0x5f, 0x79, 0xfa, 0x2c, 0x65, 0x7e, 0xf7, 0x5e, 0xf5, 0x58, 0xa9, 0x00, 0x87, 0x12, 0xc7, 0x04, 0x41, 0x09, 0x96, 0x93, 0xf0, 0x07, 0xd8, 0x4c, 0x56, 0x85, 0xb1, 0xfe, 0x86, 0x80, 0xb2, 0x55, 0xd1, 0x2e, 0x67, 0xa6, 0x58, 0x99, 0x19, 0x07, 0x72, 0x0f, 0xd8, 0x57, 0xe6, 0x1d, 0x55, 0x10, 0x9f, 0xa4, 0x17, 0x6a, 0xd4, 0x4e, 0x4c, 0x2b, 0x38, 0xb6, 0x72, 0x0a, 0x8d, 0x5b, 0x64, 0xcd, 0x11, 0xdb, 0xaf, 0x50, 0x05, 0xec, 0x59, 0x55, 0xd2, 0xec, 0xc2, 0xdb, 0x37, 0x78, 0x70, 0x60, 0x07, 0xc7, 0xca, 0x4c, 0x71, 0x97, 0xf4, 0x85, 0xe4, 0x3f, 0x8d, 0x63, 0x5a, 0xc1, 0x8d, 0x8d, 0x34, 0x8e, 0xd9, 0xd2, 0x54, 0x91, 0x55, 0x83, 0x7a, 0xb3, 0x76, 0x71, 0x60, 0x55, 0x29, 0x75, 0xa3, 0x42, 0xb7, 0x07, 0xb5, 0x45, 0x65, 0x6a, 0x28, 0xf3, 0xac, 0x48, 0x5e, 0x5f, 0x68, 0xa6, 0x8d, 0x61, 0x22, 0xe6, 0xde, 0xcb, 0xa2, 0x2e, 0x1e, 0x0a, 0x6b, 0x6e, 0x8a, 0x2e, 0x0e, 0xad, 0x8a, 0x53, 0x58, 0x76, 0x65, 0xc3, 0x2e, 0x2b, 0x52, 0x35, 0xc7, 0x9c, 0x0b, 0x98, 0x1b, 0x71, 0x4c, 0x18, 0xeb, 0xa8, 0xe7, 0xf9, 0x8e, 0x0a, 0x3e, 0x78, 0x7c, 0x54, 0xba, 0x55, 0x75, 0x64, 0x55, 0xee, 0xe1, 0x1a, 0xcc, 0x0a, 0x62, 0x1a, 0x5c, 0x62, 0x8e, 0x61, 0xc2, 0x28, 0xe1, 0xb8, 0xc4, 0x27, 0xe7, 0xf1, 0x43, 0x1d, 0x94, 0xb9, 0xc4, 0x3c, 0x1b, 0x32, 0x6b, 0x96, 0xbb, 0x82, 0x39, 0x73, 0x0d, 0x73, 0x1e, 0x67, 0x35, 0xb6, 0x93, 0xc5, 0x89, 0xca, 0x95, 0xf9, 0x87, 0x9e, 0xaf, 0x63, 0xce, 0xe2, 0x42, 0xed, 0x9a, 0xd6, 0x5f, 0x41, 0x5f, 0xb6, 0x1a, 0x0e, 0xe0, 0x2f, 0x75, 0x8e, 0x60, 0x3a, 0xc2, 0x6e, 0x14, 0x75, 0x81, 0x5e, 0x90, 0x52, 0x49, 0xda, 0xcc, 0xce, 0x1b, 0x3d, 0xf3, 0xf3, 0x73, 0x29, 0xe7, 0x8d, 0xf5, 0xd0, 0x1b, 0x6d, 0xe6, 0x08, 0xa6, 0x23, 0x94, 0xb2, 0x69, 0xbe, 0xd6, 0xd2, 0xa4, 0x1a, 0x96, 0x5c, 0x73, 0x12, 0xf1, 0xf3, 0x6d, 0x42, 0x93, 0xe6, 0xe7, 0x1e, 0xe0, 0xe4, 0x12, 0x73, 0x04, 0xd3, 0x11, 0x84, 0xd1, 0xc7, 0xea, 0x6b, 0x3e, 0x54, 0x12, 0xd6, 0xb9, 0xbc, 0x38, 0x72, 0xcc, 0x09, 0x3b, 0x9b, 0x64, 0xe7, 0x09, 0xbb, 0x7f, 0x08, 0xf4, 0x4f, 0x9c, 0x39, 0x82, 0x19, 0xf8, 0x1d, 0xd1, 0xa5, 0x0f, 0x4e, 0x76, 0xfe, 0xce, 0x4c, 0x48, 0x34, 0x57, 0xde, 0x6a, 0xa9, 0x6d, 0x57, 0x80, 0xea, 0x22, 0x94, 0xaa, 0x04, 0xec, 0x2e, 0x78, 0x2a, 0x69, 0x9c, 0x39, 0x82, 0x29, 0x19, 0x47, 0x10, 0x7a, 0xe3, 0xbe, 0x29, 0x68, 0x6f, 0x6a, 0xd9, 0xbe, 0xec, 0x98, 0x47, 0xdd, 0xaa, 0x19, 0x1e, 0xf8, 0x72, 0x99, 0xb9, 0x8d, 0xf1, 0xf4, 0x3c, 0x0c, 0xf6, 0xb1, 0xe1, 0x9a, 0xad, 0xeb, 0x45, 0x35, 0x2b, 0x3a, 0x77, 0x6a, 0x98, 0x48, 0x8c, 0x4d, 0xca, 0xe8, 0x59, 0xb6, 0x73, 0x05, 0x73, 0x1b, 0xd3, 0xc9, 0x5c, 0x71, 0xa6, 0x99, 0xb1, 0x61, 0x51, 0x2a, 0xab, 0x2a, 0x04, 0xcc, 0xf2, 0x4c, 0x57, 0x0d, 0x3d, 0x78, 0x68, 0xe8, 0xf1, 0x2b, 0x98, 0xdb, 0x98, 0x0e, 0x35, 0x64, 0x09, 0xd0, 0xa9, 0x8e, 0x39, 0x5b, 0x89, 0xdc, 0xff, 0x88, 0x5f, 0x2f, 0xa5, 0xc5, 0x2c, 0xd3, 0x5b, 0x7e, 0x75, 0xdc, 0x0e, 0x9e, 0x6e, 0xf9, 0xdf, 0xa7, 0xe4, 0x2a, 0xe6, 0x10, 0x13, 0x4c, 0xf0, 0x0f,
};

@ -150,12 +150,15 @@ static secbool bootloader_usb_loop(const vendor_header * const vhdr, const image
}
break;
case 6: // FirmwareErase
ui_screen_install_confirm();
response = ui_button_response();
if (sectrue != response) {
ui_screen_info(secfalse, vhdr, hdr);
send_user_abort(USB_IFACE_NUM, "Firmware install cancelled");
break;
// skip confirmation when no firmware is present
if (vhdr && hdr) {
ui_screen_install_confirm();
response = ui_button_response();
if (sectrue != response) {
ui_screen_info(secfalse, vhdr, hdr);
send_user_abort(USB_IFACE_NUM, "Firmware install cancelled");
break;
}
}
ui_screen_install();
process_msg_FirmwareErase(USB_IFACE_NUM, msg_size, buf);
@ -258,18 +261,35 @@ main_start:
firmware_present = load_image_header((const uint8_t *)(FIRMWARE_START + vhdr.hdrlen), FIRMWARE_IMAGE_MAGIC, FIRMWARE_IMAGE_MAXSIZE, vhdr.vsig_m, vhdr.vsig_n, vhdr.vpub, &hdr);
}
const vendor_header * const pvhdr = (sectrue == firmware_present) ? &vhdr : NULL;
const image_header * const phdr = (sectrue == firmware_present) ? &hdr : NULL;
if (firmware_present != sectrue) {
ui_screen_first();
ui_fadein();
hal_delay(1000);
ui_fadeout();
ui_screen_second();
ui_fadein();
hal_delay(1000);
ui_fadeout();
ui_screen_third();
ui_fadein();
if (touched || firmware_present != sectrue) {
ui_screen_info(sectrue, pvhdr, phdr);
if (bootloader_usb_loop(NULL, NULL) != sectrue) {
return 1;
}
} else
if (touched) {
ui_screen_info(sectrue, &vhdr, &hdr);
ui_fadein();
secbool response = ui_button_response();
ui_fadeout();
if (sectrue != response) {
goto main_start;
}
ui_screen_info(secfalse, pvhdr, phdr);
if (bootloader_usb_loop(pvhdr, phdr) != sectrue) {
ui_screen_info(secfalse, &vhdr, &hdr);
ui_fadein();
if (bootloader_usb_loop(&vhdr, &hdr) != sectrue) {
return 1;
}
}
@ -295,6 +315,7 @@ main_start:
if ((vhdr.vtrust & VTRUST_ALL) != VTRUST_ALL) {
ui_screen_boot(&vhdr, &hdr);
ui_fadein();
int delay = (vhdr.vtrust & VTRUST_WAIT) ^ VTRUST_WAIT;
while (delay > 0) {

@ -21,7 +21,7 @@ async def display_homescreen():
from apps.common import storage
if not storage.is_initialized():
label = 'Go to trezor.io/start'
label = 'Open trezor.io/start'
image = None
else:
label = storage.get_label() or 'My TREZOR'

Loading…
Cancel
Save