X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_usb.c;h=3e9bb5b39c4ddb153a4fdc29e77646475b304333;hp=d8f099c0b6aef985884879210fa656b66293d695;hb=b56a44e48552bc32dbba9ff21770c370219a684a;hpb=cdaf3fc5802acf2ddc7972a15649ab0e1b31b873 diff --git a/ao_usb.c b/ao_usb.c index d8f099c0..3e9bb5b3 100644 --- a/ao_usb.c +++ b/ao_usb.c @@ -300,6 +300,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) { @@ -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);