static __xdata uint8_t ao_usb_in_flushed;
static __xdata uint8_t ao_usb_running;
static __xdata uint8_t ao_usb_configuration;
+static __xdata uint8_t ueienx_0;
void
ao_usb_set_address(uint8_t address)
(0 << EPBK0) | /* Single bank */
(1 << ALLOC));
- UEIENX = ((1 << RXSTPE) | /* Enable SETUP interrupt */
- (1 << RXOUTE)); /* Enable OUT interrupt */
+ ueienx_0 = ((1 << RXSTPE) | /* Enable SETUP interrupt */
+ (1 << RXOUTE)); /* Enable OUT interrupt */
// ao_usb_dump_ep(0);
ao_usb_addr_pending = 0;
{
ao_usb_ep0_in_pending = in_pending;
- if (in_pending) {
- UENUM = 0;
- UEIENX = ((1 << RXSTPE) | (1 << RXOUTE) | (1 << TXINE)); /* Enable IN interrupt */
- }
+ if (in_pending)
+ ueienx_0 = ((1 << RXSTPE) | (1 << RXOUTE) | (1 << TXINE)); /* Enable IN interrupt */
}
/* Send an IN data packet */
UDADDR |= (1 << ADDEN);
ao_usb_addr_pending = 0;
}
- UEIENX = ((1 << RXSTPE) | (1 << RXOUTE)); /* Disable IN interrupt */
+ ueienx_0 = ((1 << RXSTPE) | (1 << RXOUTE)); /* Disable IN interrupt */
}
}
// debug ("usb task sleeping...\n");
+ UENUM = 0;
+ UEIENX = ueienx_0;
ao_sleep(&ao_usb_task);
}
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;
#endif
UEINT = 0;
if (i & (1 << 0)) {
+ UENUM = 0;
+ UEIENX = 0;
ao_wakeup(&ao_usb_task);
++control_count;
}
in_count++;
}
if (i & (1 << AO_USB_OUT_EP)) {
+ UENUM = AO_USB_OUT_EP;
+ UEIENX = 0;
ao_wakeup(&ao_stdin_ready);
++out_count;
}
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");
+#if USB_DEBUG
+ ao_add_task(&ao_usb_echo_task, ao_usb_echo, "usb echo");
+#endif
ao_cmd_register(&ao_usb_cmds[0]);
ao_add_stdio(ao_usb_pollchar, ao_usb_putchar, ao_usb_flush);
}