diff options
author | Keith Packard <keithp@keithp.com> | 2009-04-13 21:51:59 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-04-13 21:51:59 -0700 |
commit | b56a44e48552bc32dbba9ff21770c370219a684a (patch) | |
tree | 00c759a9aea00333525312c76efe6ee9dc172945 /ao_usb.c | |
parent | cdaf3fc5802acf2ddc7972a15649ab0e1b31b873 (diff) |
Fix USB input/output by reloading packet limits.
The USB controller is reset during the connection process, which clears the
packet limits set in the controller at initialization time. Reload those
values when the configuration is set.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao_usb.c')
-rw-r--r-- | ao_usb.c | 33 |
1 files changed, 24 insertions, 9 deletions
@@ -301,6 +301,24 @@ ao_usb_set_address(uint8_t address) } static void +ao_usb_set_configuration(void) +{ + uint8_t size; + + /* Set the IN max packet size, double buffered */ + USBINDEX = AO_USB_IN_EP; + size = AO_USB_IN_SIZE >> 3; + USBMAXI = size; +// USBCSIH |= USBCSIH_IN_DBL_BUF; + + /* Set the OUT max packet size, double buffered */ + USBINDEX = AO_USB_OUT_EP; + size = AO_USB_OUT_SIZE >> 3; + USBMAXO = size; +// USBCSOH = USBCSOH_OUT_DBL_BUF; +} + +static void ao_usb_ep0_setup(void) { /* Pull the setup packet out of the fifo */ @@ -350,6 +368,7 @@ ao_usb_ep0_setup(void) break; case AO_USB_REQ_SET_CONFIGURATION: ao_usb_configuration = ao_usb_setup.value; + ao_usb_set_configuration(); break; } break; @@ -494,6 +513,10 @@ ao_usb_getchar(void) } --ao_usb_out_bytes; c = USBFIFO[AO_USB_OUT_EP << 1]; + if (ao_usb_out_bytes == 0) { + USBINDEX = AO_USB_OUT_EP; + USBCSOL &= ~USBCSOL_OUTPKT_RDY; + } ao_interrupt_enable(); return c; } @@ -504,15 +527,7 @@ ao_usb_init(void) /* Turn on the USB controller */ SLEEP |= SLEEP_USB_EN; - /* Set the IN max packet size, double buffered */ - USBINDEX = AO_USB_IN_EP; - USBMAXI = AO_USB_IN_SIZE >> 3; - USBCSIH |= USBCSIH_IN_DBL_BUF; - - /* Set the OUT max packet size, double buffered */ - USBINDEX = AO_USB_OUT_EP; - USBMAXO = AO_USB_OUT_SIZE >> 3; - USBCSOH = USBCSOH_OUT_DBL_BUF; + ao_usb_set_configuration(); /* IN interrupts on the control an IN endpoints */ USBIIE = (1 << AO_USB_CONTROL_EP) | (1 << AO_USB_IN_EP); |