mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-01 04:12:37 +00:00
fix(core): fix flashing usb disconnected error
[no changelog]
This commit is contained in:
parent
a4d0ec3926
commit
b9647d1296
@ -32,7 +32,7 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
|
||||||
// Whether USB data pins were connected on last check (USB configured)
|
// Whether USB data pins were connected on last check (USB configured)
|
||||||
__attribute__((unused)) static bool usb_connected_previously = false;
|
bool usb_connected_previously = true;
|
||||||
|
|
||||||
#define CHECK_PARAM_RANGE(value, minimum, maximum) \
|
#define CHECK_PARAM_RANGE(value, minimum, maximum) \
|
||||||
if (value < minimum || value > maximum) { \
|
if (value < minimum || value > maximum) { \
|
||||||
|
@ -153,8 +153,12 @@ void usb_start(void) { USBD_Start(&usb_dev_handle); }
|
|||||||
void usb_stop(void) { USBD_Stop(&usb_dev_handle); }
|
void usb_stop(void) { USBD_Stop(&usb_dev_handle); }
|
||||||
|
|
||||||
secbool usb_configured(void) {
|
secbool usb_configured(void) {
|
||||||
|
static uint32_t usb_configured_last_ok = 0;
|
||||||
|
uint32_t ticks = hal_ticks_ms();
|
||||||
|
|
||||||
const USBD_HandleTypeDef *pdev = &usb_dev_handle;
|
const USBD_HandleTypeDef *pdev = &usb_dev_handle;
|
||||||
if (pdev->dev_state == USBD_STATE_CONFIGURED) {
|
if (pdev->dev_state == USBD_STATE_CONFIGURED) {
|
||||||
|
usb_configured_last_ok = hal_ticks_ms();
|
||||||
return sectrue;
|
return sectrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,6 +167,20 @@ secbool usb_configured(void) {
|
|||||||
// configured.
|
// configured.
|
||||||
if (pdev->dev_state == USBD_STATE_SUSPENDED &&
|
if (pdev->dev_state == USBD_STATE_SUSPENDED &&
|
||||||
pdev->dev_old_state == USBD_STATE_CONFIGURED) {
|
pdev->dev_old_state == USBD_STATE_CONFIGURED) {
|
||||||
|
usb_configured_last_ok = hal_ticks_ms();
|
||||||
|
return sectrue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usb_configured_last_ok == 0) {
|
||||||
|
usb_configured_last_ok = ticks;
|
||||||
|
return sectrue;
|
||||||
|
}
|
||||||
|
if (usb_configured_last_ok > ticks) {
|
||||||
|
// probably overflow of 32bit ms counter, ignore as its just once in a long
|
||||||
|
// time
|
||||||
|
return sectrue;
|
||||||
|
}
|
||||||
|
if ((hal_ticks_ms() - usb_configured_last_ok) < 2000) {
|
||||||
return sectrue;
|
return sectrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ class Homescreen(HomescreenBase):
|
|||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.is_connected = False
|
|
||||||
if not storage.device.is_initialized():
|
if not storage.device.is_initialized():
|
||||||
self.label = "Go to trezor.io/start"
|
self.label = "Go to trezor.io/start"
|
||||||
|
|
||||||
@ -44,9 +43,7 @@ class Homescreen(HomescreenBase):
|
|||||||
async def usb_checker_task(self) -> None:
|
async def usb_checker_task(self) -> None:
|
||||||
usbcheck = loop.wait(io.USB_CHECK)
|
usbcheck = loop.wait(io.USB_CHECK)
|
||||||
while True:
|
while True:
|
||||||
is_connected = await usbcheck
|
await usbcheck
|
||||||
if is_connected != self.is_connected:
|
|
||||||
self.is_connected = is_connected
|
|
||||||
self.set_repaint(True)
|
self.set_repaint(True)
|
||||||
|
|
||||||
def do_render(self) -> None:
|
def do_render(self) -> None:
|
||||||
@ -62,7 +59,7 @@ class Homescreen(HomescreenBase):
|
|||||||
elif storage.device.get_experimental_features():
|
elif storage.device.get_experimental_features():
|
||||||
ui.header_warning("EXPERIMENTAL MODE!")
|
ui.header_warning("EXPERIMENTAL MODE!")
|
||||||
else:
|
else:
|
||||||
ui.display.bar(0, 0, ui.WIDTH, ui.HEIGHT, ui.BG)
|
ui.display.bar(0, 0, ui.WIDTH, ui.get_header_height(), ui.BG)
|
||||||
|
|
||||||
# homescreen with shifted avatar and text on bottom
|
# homescreen with shifted avatar and text on bottom
|
||||||
# Differs for each model
|
# Differs for each model
|
||||||
@ -95,6 +92,7 @@ class Homescreen(HomescreenBase):
|
|||||||
|
|
||||||
def on_touch_end(self, _x: int, _y: int) -> None:
|
def on_touch_end(self, _x: int, _y: int) -> None:
|
||||||
if self.loader.start_ms is not None:
|
if self.loader.start_ms is not None:
|
||||||
|
ui.display.clear()
|
||||||
self.set_repaint(True)
|
self.set_repaint(True)
|
||||||
self.loader.stop()
|
self.loader.stop()
|
||||||
self.touch_ms = None
|
self.touch_ms = None
|
||||||
|
@ -148,7 +148,7 @@ MODEL_HEADER_HEIGHTS = {"1": 12, "R": 15, "T": 30}
|
|||||||
MODEL_Y_BASELINES = {"1": 10, "R": 11, "T": 22}
|
MODEL_Y_BASELINES = {"1": 10, "R": 11, "T": 22}
|
||||||
|
|
||||||
|
|
||||||
def header_warning(message: str, clear: bool = True) -> None:
|
def header_warning(message: str) -> None:
|
||||||
height = MODEL_HEADER_HEIGHTS[utils.MODEL]
|
height = MODEL_HEADER_HEIGHTS[utils.MODEL]
|
||||||
y_baseline = MODEL_Y_BASELINES[utils.MODEL]
|
y_baseline = MODEL_Y_BASELINES[utils.MODEL]
|
||||||
|
|
||||||
@ -156,18 +156,18 @@ def header_warning(message: str, clear: bool = True) -> None:
|
|||||||
display.text_center(
|
display.text_center(
|
||||||
WIDTH // 2, y_baseline, message, BOLD, style.BLACK, style.YELLOW
|
WIDTH // 2, y_baseline, message, BOLD, style.BLACK, style.YELLOW
|
||||||
)
|
)
|
||||||
if clear:
|
|
||||||
display.bar(0, height, WIDTH, HEIGHT - height, style.BG)
|
|
||||||
|
|
||||||
|
|
||||||
def header_error(message: str, clear: bool = True) -> None:
|
def header_error(message: str) -> None:
|
||||||
height = MODEL_HEADER_HEIGHTS[utils.MODEL]
|
height = MODEL_HEADER_HEIGHTS[utils.MODEL]
|
||||||
y_baseline = MODEL_Y_BASELINES[utils.MODEL]
|
y_baseline = MODEL_Y_BASELINES[utils.MODEL]
|
||||||
|
|
||||||
display.bar(0, 0, WIDTH, height, style.RED)
|
display.bar(0, 0, WIDTH, height, style.RED)
|
||||||
display.text_center(WIDTH // 2, y_baseline, message, BOLD, style.WHITE, style.RED)
|
display.text_center(WIDTH // 2, y_baseline, message, BOLD, style.WHITE, style.RED)
|
||||||
if clear:
|
|
||||||
display.bar(0, height, WIDTH, HEIGHT - height, style.BG)
|
|
||||||
|
def get_header_height() -> int:
|
||||||
|
return MODEL_HEADER_HEIGHTS[utils.MODEL]
|
||||||
|
|
||||||
|
|
||||||
def draw_simple(t: "Component") -> None:
|
def draw_simple(t: "Component") -> None:
|
||||||
|
@ -16,7 +16,7 @@ class RecoveryHomescreen(ui.Component):
|
|||||||
heading = "SEED CHECK"
|
heading = "SEED CHECK"
|
||||||
else:
|
else:
|
||||||
heading = "RECOVERY MODE"
|
heading = "RECOVERY MODE"
|
||||||
ui.header_warning(heading, clear=False)
|
ui.header_warning(heading)
|
||||||
|
|
||||||
if not self.subtext:
|
if not self.subtext:
|
||||||
ui.display.text_center(ui.WIDTH // 2, 80, self.text, ui.BOLD, ui.FG, ui.BG)
|
ui.display.text_center(ui.WIDTH // 2, 80, self.text, ui.BOLD, ui.FG, ui.BG)
|
||||||
|
Loading…
Reference in New Issue
Block a user