From 215020a592a4ee7e51c64a29e7f6cfeaf21a2a3d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 12 Feb 2020 20:56:42 +0000 Subject: [PATCH] legacy: show webusb popup only in bootloader and only if firmware is not installed --- legacy/bootloader/usb.c | 31 +++++++++++++++++++++++-------- legacy/firmware/usb.c | 2 +- legacy/webusb.c | 30 +++++++++++++++++++++--------- legacy/webusb.h | 4 +++- 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/legacy/bootloader/usb.c b/legacy/bootloader/usb.c index 508d54491..9a8d2d251 100644 --- a/legacy/bootloader/usb.c +++ b/legacy/bootloader/usb.c @@ -440,23 +440,38 @@ static void set_config(usbd_device *dev, uint16_t wValue) { static usbd_device *usbd_dev; static uint8_t usbd_control_buffer[256] __attribute__((aligned(2))); -static const struct usb_device_capability_descriptor *capabilities[] = { +static const struct usb_device_capability_descriptor *capabilities_landing[] = { (const struct usb_device_capability_descriptor - *)&webusb_platform_capability_descriptor, + *)&webusb_platform_capability_descriptor_landing, }; -static const struct usb_bos_descriptor bos_descriptor = { +static const struct usb_device_capability_descriptor + *capabilities_no_landing[] = { + (const struct usb_device_capability_descriptor + *)&webusb_platform_capability_descriptor_no_landing, +}; + +static const struct usb_bos_descriptor bos_descriptor_landing = { .bLength = USB_DT_BOS_SIZE, .bDescriptorType = USB_DT_BOS, - .bNumDeviceCaps = sizeof(capabilities) / sizeof(capabilities[0]), - .capabilities = capabilities}; + .bNumDeviceCaps = + sizeof(capabilities_landing) / sizeof(capabilities_landing[0]), + .capabilities = capabilities_landing}; -static void usbInit(void) { +static const struct usb_bos_descriptor bos_descriptor_no_landing = { + .bLength = USB_DT_BOS_SIZE, + .bDescriptorType = USB_DT_BOS, + .bNumDeviceCaps = + sizeof(capabilities_no_landing) / sizeof(capabilities_no_landing[0]), + .capabilities = capabilities_no_landing}; + +static void usbInit(bool firmware_present) { usbd_dev = usbd_init(&otgfs_usb_driver, &dev_descr, &config, usb_strings, sizeof(usb_strings) / sizeof(const char *), usbd_control_buffer, sizeof(usbd_control_buffer)); usbd_register_set_config_callback(usbd_dev, set_config); - usb21_setup(usbd_dev, &bos_descriptor); + usb21_setup(usbd_dev, firmware_present ? &bos_descriptor_no_landing + : &bos_descriptor_landing); webusb_setup(usbd_dev, "trezor.io/start"); winusb_setup(usbd_dev, USB_INTERFACE_INDEX_MAIN); } @@ -491,7 +506,7 @@ static void checkButtons(void) { void usbLoop(void) { bool firmware_present = firmware_present_new(); - usbInit(); + usbInit(firmware_present); for (;;) { usbd_poll(usbd_dev); if (!firmware_present && diff --git a/legacy/firmware/usb.c b/legacy/firmware/usb.c index a2f497a15..4aab3b0af 100644 --- a/legacy/firmware/usb.c +++ b/legacy/firmware/usb.c @@ -373,7 +373,7 @@ static uint8_t usbd_control_buffer[256] __attribute__((aligned(2))); static const struct usb_device_capability_descriptor *capabilities[] = { (const struct usb_device_capability_descriptor - *)&webusb_platform_capability_descriptor, + *)&webusb_platform_capability_descriptor_no_landing, }; static const struct usb_bos_descriptor bos_descriptor = { diff --git a/legacy/webusb.c b/legacy/webusb.c index eda931a78..13c311e20 100644 --- a/legacy/webusb.c +++ b/legacy/webusb.c @@ -23,15 +23,27 @@ #include "util.h" #include "webusb.h" -const struct webusb_platform_descriptor webusb_platform_capability_descriptor = - {.bLength = WEBUSB_PLATFORM_DESCRIPTOR_SIZE, - .bDescriptorType = USB_DT_DEVICE_CAPABILITY, - .bDevCapabilityType = USB_DC_PLATFORM, - .bReserved = 0, - .platformCapabilityUUID = WEBUSB_UUID, - .bcdVersion = 0x0100, - .bVendorCode = WEBUSB_VENDOR_CODE, - .iLandingPage = 1}; +const struct webusb_platform_descriptor + webusb_platform_capability_descriptor_landing = { + .bLength = WEBUSB_PLATFORM_DESCRIPTOR_SIZE, + .bDescriptorType = USB_DT_DEVICE_CAPABILITY, + .bDevCapabilityType = USB_DC_PLATFORM, + .bReserved = 0, + .platformCapabilityUUID = WEBUSB_UUID, + .bcdVersion = 0x0100, + .bVendorCode = WEBUSB_VENDOR_CODE, + .iLandingPage = 1}; + +const struct webusb_platform_descriptor + webusb_platform_capability_descriptor_no_landing = { + .bLength = WEBUSB_PLATFORM_DESCRIPTOR_SIZE, + .bDescriptorType = USB_DT_DEVICE_CAPABILITY, + .bDevCapabilityType = USB_DC_PLATFORM, + .bReserved = 0, + .platformCapabilityUUID = WEBUSB_UUID, + .bcdVersion = 0x0100, + .bVendorCode = WEBUSB_VENDOR_CODE, + .iLandingPage = 0}; static const char* webusb_https_url; diff --git a/legacy/webusb.h b/legacy/webusb.h index 5835e3ca4..d9de1ecd9 100644 --- a/legacy/webusb.h +++ b/legacy/webusb.h @@ -26,7 +26,9 @@ #define WEBUSB_VENDOR_CODE 0x01 extern const struct webusb_platform_descriptor - webusb_platform_capability_descriptor; + webusb_platform_capability_descriptor_landing; +extern const struct webusb_platform_descriptor + webusb_platform_capability_descriptor_no_landing; extern void webusb_setup(usbd_device* usbd_dev, const char* https_url);