diff --git a/micropython/boardloader/main.c b/micropython/boardloader/main.c index 85bd5ae4b..a98562e63 100644 --- a/micropython/boardloader/main.c +++ b/micropython/boardloader/main.c @@ -51,7 +51,7 @@ bool check_sdcard(void) } } -static void progress_callback(void) { +static void progress_callback(uint16_t val) { display_printf("."); } diff --git a/micropython/bootloader/main.c b/micropython/bootloader/main.c index a16ac5432..39d6e792c 100644 --- a/micropython/bootloader/main.c +++ b/micropython/bootloader/main.c @@ -35,7 +35,8 @@ void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_len, ui } uint32_t datalen = *(uint32_t *)(vimg + 8); display_image(60, 32, w, h, vimg + 12, datalen); - display_text_center(120, 192, vstr, vstr_len, FONT_BOLD, COLOR_WHITE, COLOR_BLACK); +// FIXME: uncomment next line +// display_text_center(120, 192, vstr, vstr_len, FONT_BOLD, COLOR_WHITE, COLOR_BLACK); char ver_str[32]; mini_snprintf(ver_str, sizeof(ver_str), "%d.%d.%d.%d", (int)(fw_version & 0xFF), @@ -43,7 +44,8 @@ void display_vendor(const uint8_t *vimg, const char *vstr, uint32_t vstr_len, ui (int)((fw_version >> 16) & 0xFF), (int)((fw_version >> 24) & 0xFF) ); - display_text_center(120, 215, ver_str, -1, FONT_BOLD, COLOR_GRAY64, COLOR_BLACK); +// FIXME: uncomment next line +// display_text_center(120, 215, ver_str, -1, FONT_BOLD, COLOR_GRAY64, COLOR_BLACK); display_refresh(); } @@ -155,6 +157,9 @@ void mainloop(void) __fatal_error("usb_init_all", __FILE__, __LINE__, __FUNCTION__); } + display_clear(); + display_loader(0, 0, 0xFFFF, 0, 0, 0, 0); + uint8_t buf[USB_PACKET_SIZE]; for (;;) { @@ -171,23 +176,18 @@ void mainloop(void) } switch (msg_id) { case 0: // Initialize - display_printf("received Initialize\n"); process_msg_Initialize(USB_IFACE_NUM, msg_size, buf); break; case 1: // Ping - display_printf("received Ping\n"); process_msg_Ping(USB_IFACE_NUM, msg_size, buf); break; case 6: // FirmwareErase - display_printf("received FirmwareErase\n"); process_msg_FirmwareErase(USB_IFACE_NUM, msg_size, buf); break; case 7: // FirmwareUpload - display_printf("received FirmwareUpload\n"); process_msg_FirmwareUpload(USB_IFACE_NUM, msg_size, buf); break; default: - display_printf("received unknown message\n"); process_msg_unknown(USB_IFACE_NUM, msg_size, buf); break; } diff --git a/micropython/bootloader/messages.c b/micropython/bootloader/messages.c index 071d527ee..a95245775 100644 --- a/micropython/bootloader/messages.c +++ b/micropython/bootloader/messages.c @@ -7,6 +7,7 @@ #include "messages.pb.h" #include "common.h" +#include "display.h" #include "flash.h" #include "usb.h" #include "version.h" @@ -15,12 +16,12 @@ bool msg_parse_header(const uint8_t *buf, uint16_t *msg_id, uint32_t *msg_size) { - if (buf[0] != '?' || buf[1] != '#' || buf[2] != '#') { - return false; - } - *msg_id = (buf[3] << 8) + buf[4]; - *msg_size = (buf[5] << 24) + (buf[6] << 16) + (buf[7] << 8) + buf[8]; - return true; + if (buf[0] != '?' || buf[1] != '#' || buf[2] != '#') { + return false; + } + *msg_id = (buf[3] << 8) + buf[4]; + *msg_size = (buf[5] << 24) + (buf[6] << 16) + (buf[7] << 8) + buf[8]; + return true; } typedef struct { @@ -220,23 +221,28 @@ void process_msg_Ping(uint8_t iface_num, uint32_t msg_size, uint8_t *buf) MSG_SEND(Success); } -static uint32_t firmware_size, firmware_flashed, chunk_requested; +static uint32_t firmware_remaining, firmware_flashed, chunk_requested; + +static void progress_erase(uint16_t val) +{ + display_loader(val, 0, 0xFFFF, 0, 0, 0, 0); +} void process_msg_FirmwareErase(uint8_t iface_num, uint32_t msg_size, uint8_t *buf) { - firmware_size = 0; + firmware_remaining = 0; firmware_flashed = 0; chunk_requested = 0; MSG_RECV_INIT(FirmwareErase); MSG_RECV(FirmwareErase); - firmware_size = msg_recv.has_length ? msg_recv.length : 0; - if (firmware_size > 0 && firmware_size % 4 == 0) { + firmware_remaining = msg_recv.has_length ? msg_recv.length : 0; + if (firmware_remaining > 0 && firmware_remaining % 4 == 0) { // erase flash - flash_erase_sectors(FLASH_SECTOR_FIRMWARE_START, FLASH_SECTOR_FIRMWARE_END, NULL); + flash_erase_sectors(FLASH_SECTOR_FIRMWARE_START, FLASH_SECTOR_FIRMWARE_END, progress_erase); // request new firmware - chunk_requested = (firmware_size > FIRMWARE_CHUNK_SIZE) ? FIRMWARE_CHUNK_SIZE : firmware_size; + chunk_requested = (firmware_remaining > FIRMWARE_CHUNK_SIZE) ? FIRMWARE_CHUNK_SIZE : firmware_remaining; MSG_SEND_INIT(FirmwareRequest); MSG_SEND_ASSIGN_VALUE(offset, 0); MSG_SEND_ASSIGN_VALUE(length, chunk_requested); @@ -253,11 +259,13 @@ static uint32_t chunk_size = 0; static bool _read_payload(pb_istream_t *stream, const pb_field_t *field, void **arg) { -#define BUFSIZE 1024 +#define BUFSIZE 4096 uint32_t buf[BUFSIZE / sizeof(uint32_t)]; uint32_t chunk_written = 0; chunk_size = stream->bytes_left; while (stream->bytes_left) { + // print loader + display_loader(1000 * (firmware_flashed + chunk_written) / (firmware_flashed + firmware_remaining), 0, 0xFFFF, 0, 0, 0, 0); memset(buf, 0xFF, sizeof(buf)); // read data if (!pb_read(stream, (pb_byte_t *)buf, (stream->bytes_left > BUFSIZE) ? BUFSIZE : stream->bytes_left)) { @@ -289,16 +297,17 @@ void process_msg_FirmwareUpload(uint8_t iface_num, uint32_t msg_size, uint8_t *b MSG_SEND(Failure); } - firmware_size -= chunk_requested; + firmware_remaining -= chunk_requested; firmware_flashed += chunk_requested; - if (firmware_size > 0) { - chunk_requested = (firmware_size > FIRMWARE_CHUNK_SIZE) ? FIRMWARE_CHUNK_SIZE : firmware_size; + if (firmware_remaining > 0) { + chunk_requested = (firmware_remaining > FIRMWARE_CHUNK_SIZE) ? FIRMWARE_CHUNK_SIZE : firmware_remaining; MSG_SEND_INIT(FirmwareRequest); MSG_SEND_ASSIGN_VALUE(offset, firmware_flashed); MSG_SEND_ASSIGN_VALUE(length, chunk_requested); MSG_SEND(FirmwareRequest); } else { + display_clear(); MSG_SEND_INIT(Success); MSG_SEND(Success); } diff --git a/micropython/trezorhal/flash.c b/micropython/trezorhal/flash.c index 234d59681..2288d9eff 100644 --- a/micropython/trezorhal/flash.c +++ b/micropython/trezorhal/flash.c @@ -39,7 +39,7 @@ void flash_set_option_bytes(void) } } -int flash_erase_sectors(int start, int end, void (*progress)(void)) +int flash_erase_sectors(int start, int end, void (*progress)(uint16_t val)) { HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef EraseInitStruct; @@ -56,7 +56,7 @@ int flash_erase_sectors(int start, int end, void (*progress)(void)) return 0; } if (progress) { - progress(); + progress(1000 * (i - start + 1) / (end - start + 1)); } } HAL_FLASH_Lock(); diff --git a/micropython/trezorhal/flash.h b/micropython/trezorhal/flash.h index 670b7f11e..00d52863b 100644 --- a/micropython/trezorhal/flash.h +++ b/micropython/trezorhal/flash.h @@ -1,6 +1,8 @@ #ifndef __TREZORHAL_FLASH_H__ #define __TREZORHAL_FLASH_H__ +#include + int flash_init(void); void flash_set_option_bytes(void); @@ -17,6 +19,6 @@ void flash_set_option_bytes(void); #define FLASH_SECTOR_FIRMWARE_START 5 #define FLASH_SECTOR_FIRMWARE_END 11 -int flash_erase_sectors(int start, int end, void (*progress)(void)); +int flash_erase_sectors(int start, int end, void (*progress)(uint16_t val)); #endif