-struct ao_usb_setup {
- uint8_t dir_type_recip;
- uint8_t request;
- uint16_t value;
- uint16_t index;
- uint16_t length;
-} __xdata ao_usb_setup;
-
-__xdata uint8_t ao_usb_ep0_state;
-uint8_t * __xdata ao_usb_ep0_in_data;
-__xdata uint8_t ao_usb_ep0_in_len;
-__xdata uint8_t ao_usb_ep0_in_buf[2];
-__xdata uint8_t ao_usb_ep0_out_len;
-__xdata uint8_t *__xdata ao_usb_ep0_out_data;
-__xdata uint8_t ao_usb_configuration;
-
-/* Send an IN data packet */
-static void
-ao_usb_ep0_flush(void)
-{
- __xdata uint8_t this_len;
- __xdata uint8_t cs0;
-
- /* If the IN packet hasn't been picked up, just return */
- UENUM = 0;
- if (!(UEINTX & (1 << TXINI)))
- return;
-
- this_len = ao_usb_ep0_in_len;
- if (this_len > AO_USB_CONTROL_SIZE)
- this_len = AO_USB_CONTROL_SIZE;
-
- ao_usb_ep0_in_len -= this_len;
- while (this_len--)
- UEDATX = *ao_usb_ep0_in_data++;
-
- /* Clear the TXINI bit to send the packet */
- UEINTX &= ~(1 << TXINI);
-}