From 9b2696b8488dbc39b0fdcdefdfad775913cb6e2d Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Mon, 1 Apr 2013 15:54:44 -0300 Subject: [PATCH] atusb/fw/usb/: enable MCU reset on USB bus reset after config selection This way the host can reset the MCU if it's hung (for example, in the panic loop) and we don't need to unplug-replug. --- atusb/fw/usb/atu2.c | 7 ++++++- atusb/fw/usb/usb.c | 1 + atusb/fw/usb/usb.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/atusb/fw/usb/atu2.c b/atusb/fw/usb/atu2.c index 17868a5..4b2d6b2 100644 --- a/atusb/fw/usb/atu2.c +++ b/atusb/fw/usb/atu2.c @@ -247,6 +247,12 @@ void usb_reset(void) } +void usb_enable_bus_reset(void) +{ + UDCON |= 1 << RSTCPU; /* reset CPU on bus reset */ +} + + void usb_init(void) { USBCON |= 1 << FRZCLK; /* freeze the clock */ @@ -263,7 +269,6 @@ void usb_init(void) UDCON &= ~(1 << DETACH); /* attach the pull-up */ UDIEN = 1 << EORSTE; /* enable device interrupts */ -// UDCON |= 1 << RSTCPU; /* reset CPU on bus reset */ ep_init(); } diff --git a/atusb/fw/usb/usb.c b/atusb/fw/usb/usb.c index 4fde778..54dd2cd 100644 --- a/atusb/fw/usb/usb.c +++ b/atusb/fw/usb/usb.c @@ -118,6 +118,7 @@ bool handle_setup(const struct setup_request *setup) case TO_DEVICE(SET_CONFIGURATION): if (setup->wValue != config_descriptor[5]) return 0; + usb_enable_bus_reset(); break; /* diff --git a/atusb/fw/usb/usb.h b/atusb/fw/usb/usb.h index 90dd423..403d694 100644 --- a/atusb/fw/usb/usb.h +++ b/atusb/fw/usb/usb.h @@ -153,6 +153,7 @@ bool handle_setup(const struct setup_request *setup); void set_addr(uint8_t addr); void usb_ep_change(struct ep_descr *ep); void usb_reset(void); +void usb_enable_bus_reset(void); void usb_init(void); #endif /* !USB_H */