firmware: Implement USB enabled/disable control via I2C

This commit is contained in:
Ondrej Jirman 2021-08-02 10:05:43 +02:00
parent 134b4b6a8b
commit 176a2da7e2
1 changed files with 21 additions and 9 deletions

View File

@ -1811,10 +1811,19 @@ void main(void)
#endif
}
// get current system config
uint8_t cfg = REG_SYS(CONFIG);
__bit usb_enabled = !!(cfg & REG_SYS_CONFIG_USB_DEBUG_EN);
// if we were asked to jump to USB IAP, do it
if (jump_to_usb_bootloader)
__asm__ ("ljmp _usb_bootloader_jump");
if (usb_initialized && !usb_enabled) {
usb_initialized = 0;
ticks = 0;
usb_disable();
}
// if the 20ms timer did not expire yet, check if we can
// powerdown, otherwise busyloop
if (!run_timed_tasks) {
@ -1830,7 +1839,7 @@ void main(void)
if (i2c_idle && !scan_active
&& !p6_changed
#if CONFIG_USB_STACK
&& usb_initialized && usb_suspended
&& (usb_initialized || !usb_enabled) && usb_suspended
#endif
#if CONFIG_STOCK_FW
&& user_app_checked
@ -1888,7 +1897,7 @@ void main(void)
#if CONFIG_USB_STACK
// after 500ms, init usb
if (!usb_initialized && ticks > 500 / 20) {
if (!usb_initialized && usb_enabled && ticks > 500 / 20) {
usb_init();
usb_initialized = 1;
}
@ -1918,14 +1927,17 @@ void main(void)
ext_int_assert();
delay_us(100);
ext_int_deassert();
#if CONFIG_USB_STACK
usb_key_change = 1;
// USB wakeup
PAGESW = 1;
if (P1_UDCCTRL & BIT(2)) {
P1_UDCCTRL |= BIT(5);
P1_UDCCTRL &= ~BIT(5);
#if CONFIG_USB_STACK
if (usb_enabled) {
usb_key_change = 1;
// USB wakeup
PAGESW = 1;
if (P1_UDCCTRL & BIT(2)) {
P1_UDCCTRL |= BIT(5);
P1_UDCCTRL &= ~BIT(5);
}
}
#endif