(1 << EPBK0) | /* Double bank */
(1 << ALLOC)); /* Allocate */
+#if 0
UEIENX = ((1 << TXINE)); /* Enable IN complete interrupt */
+#endif
ao_usb_dump_ep(AO_USB_IN_EP);
if (UEINTX & (1 << RWAL))
break;
+ cli();
/* Wait for an IN buffer to be ready */
for (;;) {
UENUM = AO_USB_IN_EP;
if ((UEINTX & (1 << TXINI)))
break;
+ UEIENX = (1 << TXINE);
ao_sleep(&ao_usb_in_flushed);
}
/* Ack the interrupt */
UEINTX &= ~(1 << TXINI);
+ sei();
}
}
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 */
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;
}
+uint16_t control_count;
+uint16_t in_count;
+uint16_t out_count;
+
/* Endpoint interrupt */
ISR(USB_COM_vect)
{
+ uint8_t old_num = UENUM;
uint8_t i = UEINT;
#ifdef AO_LED_RED
ao_led_toggle(AO_LED_RED);
#endif
UEINT = 0;
- if (i & (1 << 0))
+ if (i & (1 << 0)) {
ao_wakeup(&ao_usb_task);
- if (i & (1 << AO_USB_IN_EP))
+ ++control_count;
+ }
+ if (i & (1 << AO_USB_IN_EP)) {
+ UENUM = AO_USB_IN_EP;
+ UEIENX = 0;
ao_wakeup(&ao_usb_in_flushed);
- if (i & (1 << AO_USB_OUT_EP))
+ in_count++;
+ }
+ if (i & (1 << AO_USB_OUT_EP)) {
+ UENUM = AO_USB_OUT_EP;
+ UEIENX = 0;
ao_wakeup(&ao_stdin_ready);
+ ++out_count;
+ }
+ UENUM = old_num;
}
#if AVR_VCC_5V
}
#endif
+static void
+ao_usb_irq(void)
+{
+ printf ("control: %d out: %d in: %d\n",
+ control_count, out_count, in_count);
+}
+
+__code struct ao_cmds ao_usb_cmds[] = {
+ { ao_usb_irq, "i\0Show USB interrupt counts" },
+ { 0, NULL }
+};
+
void
ao_usb_init(void)
{
debug ("ao_usb_init\n");
ao_add_task(&ao_usb_task, ao_usb_ep0, "usb");
// ao_add_task(&ao_usb_echo_task, ao_usb_echo, "usb echo");
+ ao_cmd_register(&ao_usb_cmds[0]);
ao_add_stdio(ao_usb_pollchar, ao_usb_putchar, ao_usb_flush);
}