diff options
author | Keith Packard <keithp@keithp.com> | 2013-12-18 23:27:34 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-12-18 23:27:34 -0800 |
commit | 1ab12861c3e70d7c22b27d988546a925616a0adc (patch) | |
tree | ac92a4158bad80738b7e356c4f2c0c1c63e50b50 /src/lpc | |
parent | 3b13cc2ca035b13582cd2e59ba7286f872f43c6e (diff) |
altos/lpc: Reset less of the device on USB reset.
This leaves most of the device configured across USB reset, which
appears to help when sending a IN reply to the first SETUP packet;
without this change, the IN reply would always get a length of 0,
which is fine for SET_ADDRESS, but not for GET_DESCRIPTOR_DEVICE,
which OS X appears to send before setting the address (go figure).
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lpc')
-rw-r--r-- | src/lpc/ao_usb_lpc.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/lpc/ao_usb_lpc.c b/src/lpc/ao_usb_lpc.c index 108822ce..713fbc53 100644 --- a/src/lpc/ao_usb_lpc.c +++ b/src/lpc/ao_usb_lpc.c @@ -317,6 +317,13 @@ ao_usb_disable_epn(uint8_t n) } static void +ao_usb_reset(void) +{ + ao_usb_set_address(0); + ao_usb_configuration = 0; +} + +static void ao_usb_set_ep0(void) { int e; @@ -326,11 +333,8 @@ ao_usb_set_ep0(void) lpc_usb.epinuse = 0; lpc_usb.epskip = 0xffffffff; - ao_usb_set_address(0); lpc_usb.intstat = 0xc00003ff; - ao_usb_configuration = 0; - ao_usb_sram = lpc_usb_sram; lpc_usb.epliststart = (uint32_t) (intptr_t) &lpc_usb_endpoint; @@ -346,7 +350,7 @@ ao_usb_set_ep0(void) /* Clear all of the other endpoints */ for (e = 1; e <= 4; e++) ao_usb_disable_epn(e); - + ao_usb_reset(); } static void @@ -590,7 +594,7 @@ ao_usb_ep0_handle(uint8_t receive) if (receive & AO_USB_EP0_GOT_RESET) { debug ("\treset\n"); - ao_usb_set_ep0(); + ao_usb_reset(); return; } if (receive & AO_USB_EP0_GOT_SETUP) { @@ -936,11 +940,11 @@ ao_usb_enable(void) for (t = 0; t < 1000; t++) ao_arch_nop(); + ao_usb_set_ep0(); + #if HAS_USB_PULLUP ao_gpio_set(AO_USB_PULLUP_PORT, AO_USB_PULLUP_PIN, AO_USB_PULLUP, 1); #endif - - ao_usb_set_ep0(); } #if USB_ECHO |