static bool udd_ctrl_interrupt_error(void) { // Underflow only managed for control endpoint if (udd_is_underflow_event()) { udd_ack_underflow_event(); if (udd_control_in_underflow()) { udd_ctrl_underflow(); } return true; } // Overflow only managed for control endpoint if (udd_is_overflow_event()) { udd_ack_overflow_event(); if (udd_control_out_overflow()) { udd_ctrl_overflow(); } return true; } return false; }
static bool udd_ctrl_interrupt(void) { if (!Is_udd_endpoint_interrupt(0)) return false; // No interrupt events on control endpoint // By default disable overflow and underflow interrupt udd_disable_nak_in_interrupt(0); udd_disable_nak_out_interrupt(0); // Search event on control endpoint if (Is_udd_setup_received(0)) { // SETUP packet received udd_ctrl_setup_received(); return true; } if (Is_udd_in_send(0) && Is_udd_in_send_interrupt_enabled(0)) { // IN packet sent udd_ctrl_in_sent(); return true; } if (Is_udd_out_received(0)) { // OUT packet received udd_ctrl_out_received(); return true; } if (Is_udd_nak_out(0)) { // Overflow on OUT packet udd_ack_nak_out(0); udd_ctrl_overflow(); return true; } if (Is_udd_nak_in(0)) { // Underflow on IN packet udd_ack_nak_in(0); udd_ctrl_underflow(); return true; } return false; }