summaryrefslogtreecommitdiff
path: root/src-avr/ao_usb_avr.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-05-20 02:36:59 -0700
committerKeith Packard <keithp@keithp.com>2011-05-20 02:36:59 -0700
commit99801601966bfb5b09c94faee6cf5d232168700e (patch)
treef0e61709b9b01f4f0bd2042586bb09601abbf764 /src-avr/ao_usb_avr.c
parentfa1eb3afabda9bdf8a0aefa5cdedd382f8da0426 (diff)
src-avr: Disable USB interrupts while we're not interested
We leave USB data lying around until called for, which results in constant badgering if interrupts are enabled. Disable them until there isn't any data left. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src-avr/ao_usb_avr.c')
-rw-r--r--src-avr/ao_usb_avr.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src-avr/ao_usb_avr.c b/src-avr/ao_usb_avr.c
index e8639217..69a2dfa4 100644
--- a/src-avr/ao_usb_avr.c
+++ b/src-avr/ao_usb_avr.c
@@ -500,15 +500,18 @@ _ao_usb_pollchar(void)
if (intx & (1 << FIFOCON)) {
/* Ack the last packet */
- UEINTX &= ~(1 << FIFOCON);
+ UEINTX = (uint8_t) ~(1 << FIFOCON);
}
/* Check to see if a packet has arrived */
- if ((intx & (1 << RXOUTI)) == 0)
+ if ((intx & (1 << RXOUTI)) == 0) {
+ UENUM = AO_USB_OUT_EP;
+ UEIENX = (1 << RXOUTE);
return AO_READ_AGAIN;
+ }
/* Ack the interrupt */
- UEINTX &= ~(1 << RXOUTI);
+ UEINTX = ~(1 << RXOUTI);
}
/* Pull a character out of the fifo */
@@ -532,7 +535,7 @@ ao_usb_getchar(void) __critical
char c;
cli();
- while ((c = ao_usb_pollchar()) == AO_READ_AGAIN)
+ while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
ao_sleep(&ao_stdin_ready);
sei();
return c;
@@ -563,6 +566,8 @@ ISR(USB_COM_vect)
in_count++;
}
if (i & (1 << AO_USB_OUT_EP)) {
+ UENUM = AO_USB_OUT_EP;
+ UEIENX = 0;
ao_wakeup(&ao_stdin_ready);
++out_count;
}