static void usb_check_for_transfer_events(const usb_device_t* const device) { const uint32_t endptcomplete = usb_get_endpoint_complete(device); if( endptcomplete ) { for( uint_fast8_t i=0; i<6; i++ ) { const uint32_t endptcomplete_out_bit = USB0_ENDPTCOMPLETE_ERCE(1 << i); if( endptcomplete & endptcomplete_out_bit ) { usb_clear_endpoint_complete(endptcomplete_out_bit, device); usb_endpoint_t* const endpoint = usb_endpoint_from_address( usb_endpoint_address(USB_TRANSFER_DIRECTION_OUT, i), device); if( endpoint && endpoint->transfer_complete ) { endpoint->transfer_complete(endpoint); } } const uint32_t endptcomplete_in_bit = USB0_ENDPTCOMPLETE_ETCE(1 << i); if( endptcomplete & endptcomplete_in_bit ) { usb_clear_endpoint_complete(endptcomplete_in_bit, device); usb_endpoint_t* const endpoint = usb_endpoint_from_address( usb_endpoint_address(USB_TRANSFER_DIRECTION_IN, i), device); if( endpoint && endpoint->transfer_complete ) { endpoint->transfer_complete(endpoint); } } } } }
bool usb_endpoint_is_complete( const usb_endpoint_t* const endpoint ) { const uint_fast8_t endpoint_number = usb_endpoint_number(endpoint->address); if( usb_endpoint_is_in(endpoint->address) ) { return USB0_ENDPTCOMPLETE & USB0_ENDPTCOMPLETE_ETCE(1 << endpoint_number); } else { return USB0_ENDPTCOMPLETE & USB0_ENDPTCOMPLETE_ERCE(1 << endpoint_number); } }
static void usb_endpoint_clear_pending_interrupts( const usb_endpoint_t* const endpoint ) { const uint_fast8_t endpoint_number = usb_endpoint_number(endpoint->address); if( usb_endpoint_is_in(endpoint->address) ) { usb_clear_pending_interrupts(USB0_ENDPTCOMPLETE_ETCE(1 << endpoint_number)); } else { usb_clear_pending_interrupts(USB0_ENDPTCOMPLETE_ERCE(1 << endpoint_number)); } }