diff options
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); |