From 3a89fdee96eadda10a6024bd1162fae696654ae6 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sat, 2 Oct 2021 11:53:20 +0100 Subject: [PATCH] x1000: fix hang that may occur in USB mode Upon getting a USB reset, the USB core will update charging current by calling usb_charging_maxcurrent_change(). On all current X1000 targets this may cause a hang, since changing the charge current involves a blocking I2C transaction. Eg. if the host issues a reset when we're already configured as part of error recovery, the change from 500 mA -> 100 mA will cause a hang. Change-Id: I5b45272c01fa16b179ae3d16bbc50c7fab9a416b --- firmware/export/config/erosqnative.h | 1 + firmware/export/config/fiiom3k.h | 1 + firmware/export/config/shanlingq1.h | 1 + firmware/usbstack/usb_core.c | 6 ++++++ 4 files changed, 9 insertions(+) diff --git a/firmware/export/config/erosqnative.h b/firmware/export/config/erosqnative.h index e0a668d82d..e326f29b98 100644 --- a/firmware/export/config/erosqnative.h +++ b/firmware/export/config/erosqnative.h @@ -114,6 +114,7 @@ #define USB_DEVBSS_ATTR __attribute__((aligned(32))) #define HAVE_USB_POWER #define HAVE_USB_CHARGING_ENABLE +#define HAVE_USB_CHARGING_IN_THREAD #define TARGET_USB_CHARGING_DEFAULT USB_CHARGING_FORCE #define HAVE_BOOTLOADER_USB_MODE #endif diff --git a/firmware/export/config/fiiom3k.h b/firmware/export/config/fiiom3k.h index dc56f0a5cc..5a2fa6c025 100644 --- a/firmware/export/config/fiiom3k.h +++ b/firmware/export/config/fiiom3k.h @@ -114,6 +114,7 @@ #define USB_DEVBSS_ATTR __attribute__((aligned(32))) #define HAVE_USB_POWER #define HAVE_USB_CHARGING_ENABLE +#define HAVE_USB_CHARGING_IN_THREAD #define TARGET_USB_CHARGING_DEFAULT USB_CHARGING_FORCE #define HAVE_BOOTLOADER_USB_MODE #endif diff --git a/firmware/export/config/shanlingq1.h b/firmware/export/config/shanlingq1.h index 88175b9160..1122b7693c 100644 --- a/firmware/export/config/shanlingq1.h +++ b/firmware/export/config/shanlingq1.h @@ -104,6 +104,7 @@ #define USB_DEVBSS_ATTR __attribute__((aligned(32))) #define HAVE_USB_POWER #define HAVE_USB_CHARGING_ENABLE +#define HAVE_USB_CHARGING_IN_THREAD #define HAVE_BOOTLOADER_USB_MODE #endif diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index bf73c58abc..65bf7293c8 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c @@ -928,8 +928,14 @@ void usb_core_bus_reset(void) usb_address = 0; usb_state = DEFAULT; #ifdef HAVE_USB_CHARGING_ENABLE +#ifdef HAVE_USB_CHARGING_IN_THREAD + /* On some targets usb_charging_maxcurrent_change() cannot be called + * from an interrupt handler; get the USB thread to do it instead. */ + usb_charger_update(); +#else usb_charging_maxcurrent_change(usb_charging_maxcurrent()); #endif +#endif } /* called by usb_drv_transfer_completed() */