summaryrefslogtreecommitdiff
path: root/src/lpc
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-12-18 23:27:34 -0800
committerKeith Packard <keithp@keithp.com>2013-12-18 23:27:34 -0800
commit1ab12861c3e70d7c22b27d988546a925616a0adc (patch)
treeac92a4158bad80738b7e356c4f2c0c1c63e50b50 /src/lpc
parent3b13cc2ca035b13582cd2e59ba7286f872f43c6e (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.c18
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