X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_usb.c;h=dd0471d182d3adac0784b42616f053a232bc5320;hp=d8f099c0b6aef985884879210fa656b66293d695;hb=ac99982b10fd5772218660137ee21db9b90cd885;hpb=cdaf3fc5802acf2ddc7972a15649ab0e1b31b873 diff --git a/ao_usb.c b/ao_usb.c index d8f099c0..dd0471d1 100644 --- a/ao_usb.c +++ b/ao_usb.c @@ -32,8 +32,8 @@ struct ao_task __xdata ao_usb_task; #define AO_USB_IN_SIZE 256 #define AO_USB_OUT_SIZE 128 -static uint16_t ao_usb_in_bytes; -static uint16_t ao_usb_out_bytes; +static __xdata uint16_t ao_usb_in_bytes; +static __xdata uint16_t ao_usb_out_bytes; static __data uint8_t ao_usb_iif; static __data uint8_t ao_usb_oif; @@ -65,7 +65,7 @@ struct ao_usb_setup { uint16_t value; uint16_t index; uint16_t length; -} ao_usb_setup; +} __xdata ao_usb_setup; __data uint8_t ao_usb_ep0_state; uint8_t * __data ao_usb_ep0_in_data; @@ -300,6 +300,20 @@ ao_usb_set_address(uint8_t address) ; } +static void +ao_usb_set_configuration(void) +{ + /* 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; +} + static void ao_usb_ep0_setup(void) { @@ -350,6 +364,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; @@ -406,15 +421,13 @@ ao_usb_ep0(void) ao_usb_ep0_state = AO_USB_EP0_IDLE; for (;;) { - ao_interrupt_disable(); - for (;;) { + __critical for (;;) { if (ao_usb_iif & 1) { ao_usb_iif &= ~1; break; } ao_sleep(&ao_usb_task); } - ao_interrupt_enable(); USBINDEX = 0; cs0 = USBCS0; if (cs0 & USBCS0_SETUP_END) { @@ -451,21 +464,18 @@ ao_usb_ep0(void) } void -ao_usb_flush(void) +ao_usb_flush(void) __critical { - ao_interrupt_disable(); if (ao_usb_in_bytes) { USBINDEX = AO_USB_IN_EP; USBCSIL |= USBCSIL_INPKT_RDY; ao_usb_in_bytes = 0; } - ao_interrupt_enable(); } void -ao_usb_putchar(uint8_t c) +ao_usb_putchar(uint8_t c) __critical { - ao_interrupt_disable(); for (;;) { USBINDEX = AO_USB_IN_EP; if ((USBCSIL & USBCSIL_INPKT_RDY) == 0) @@ -473,16 +483,17 @@ ao_usb_putchar(uint8_t c) ao_sleep(&ao_usb_in_bytes); } USBFIFO[AO_USB_IN_EP << 1] = c; - if (++ao_usb_in_bytes == AO_USB_IN_SIZE) - ao_usb_flush(); - ao_interrupt_enable(); + if (++ao_usb_in_bytes == AO_USB_IN_SIZE) { + USBINDEX = AO_USB_IN_EP; + USBCSIL |= USBCSIL_INPKT_RDY; + ao_usb_in_bytes = 0; + } } uint8_t -ao_usb_getchar(void) +ao_usb_getchar(void) __critical { uint8_t c; - ao_interrupt_disable(); while (ao_usb_out_bytes == 0) { for (;;) { USBINDEX = AO_USB_OUT_EP; @@ -494,7 +505,10 @@ ao_usb_getchar(void) } --ao_usb_out_bytes; c = USBFIFO[AO_USB_OUT_EP << 1]; - ao_interrupt_enable(); + if (ao_usb_out_bytes == 0) { + USBINDEX = AO_USB_OUT_EP; + USBCSOL &= ~USBCSOL_OUTPKT_RDY; + } return c; } @@ -504,15 +518,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);