summaryrefslogtreecommitdiff
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
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>
-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;
}