X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_usb.c;h=dd0471d182d3adac0784b42616f053a232bc5320;hp=20a853a45e43d167d10545e88b79ab6ab286dec1;hb=fbd8f4aff5058f4d371596b04715b7cb6d38e729;hpb=fb63262699d3a6fbf347d24efda8b01f75b7d0d3 diff --git a/ao_usb.c b/ao_usb.c index 20a853a4..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; @@ -421,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) { @@ -466,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) @@ -488,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; @@ -513,7 +509,6 @@ ao_usb_getchar(void) USBINDEX = AO_USB_OUT_EP; USBCSOL &= ~USBCSOL_OUTPKT_RDY; } - ao_interrupt_enable(); return c; }