static bool udd_ctrl_interrupt(void) { if (!Is_udd_endpoint_interrupt(0)) return false; // No interrupt events on control endpoint // Search event on control endpoint if (Is_udd_setup_received(0)) { // SETUP packet received udd_ctrl_setup_received(); return true; } if (Is_udd_in_sent(0)) { // IN packet sent udd_ctrl_in_sent(); return true; } if (Is_udd_bank0_received(0)) { // OUT packet received udd_ctrl_out_received(); return true; } if (Is_udd_stall(0)) { // STALLed udd_ack_stall(0); return true; } return false; }
bool udd_ep_clear_halt(udd_ep_id_t ep) { udd_ep_job_t *ptr_job; ep &= USB_EP_ADDR_MASK; if (USB_DEVICE_MAX_EP < ep) { return false; } ptr_job = &udd_ep_job[ep - 1]; if (Is_udd_endpoint_stall_requested(ep)) { // Remove stall request udd_disable_stall_handshake(ep); if (Is_udd_stall(ep)) { udd_ack_stall(ep); // A packet has been stalled, then reset data toggle udd_reset_data_toggle(ep); } // If a job is register on clear halt action // then execute callback if (ptr_job->busy == true) { ptr_job->busy = false; ptr_job->call_nohalt(); } } return true; }
bool udd_ep_clear_halt(udd_ep_id_t ep) { bool b_stall_cleared = false; udd_ep_job_t *ptr_job; ep &= USB_EP_ADDR_MASK; if (USB_DEVICE_MAX_EP < ep) return false; ptr_job = &udd_ep_job[ep - 1]; if (ptr_job->stall_requested) { // Endpoint stall has been requested but not done // Remove stall request ptr_job->stall_requested = false; udd_disable_bank_interrupt(ep); udd_disable_endpoint_interrupt(ep); b_stall_cleared = true; } if (Is_udd_endpoint_stall_requested(ep)) { if (Is_udd_stall(ep)) { udd_ack_stall(ep); // A packet has been stalled // then reset datatoggle udd_reset_data_toggle(ep); } // Disable stall udd_disable_stall_handshake(ep); udd_enable_endpoint_bank_autoswitch(ep); b_stall_cleared = true; } if (b_stall_cleared) { // If a job is register on clear halt action // then execute callback if (ptr_job->busy == true) { ptr_job->busy = false; ptr_job->call_nohalt(); } } return true; }
static bool udd_ep_interrupt(void) { udd_ep_id_t ep; udd_ep_job_t *ptr_job; // For each endpoint different of control endpoint (0) for (ep = 1; ep <= USB_DEVICE_MAX_EP; ep++) { // Check RXRDY and TXEMPTY event for none DMA endpoints if (!Is_udd_endpoint_interrupt_enabled(ep)) { continue; } // Get job corresponding at endpoint ptr_job = &udd_ep_job[ep - 1]; // RXOUT: Full packet received if (Is_udd_any_bank_received(ep)) { udd_ep_out_received(ep); return true; } // TXIN: packet sent if (Is_udd_in_sent(ep)) { ptr_job->bank--; // Stall when all banks free if (ptr_job->b_stall_requested) { if (ptr_job->bank) { // Send remaining udd_set_transmit_ready(ep); udd_ack_in_sent(ep); } else { // Ack last packet udd_ack_in_sent(ep); // Enable stall udd_enable_stall_handshake(ep); // Halt executed ptr_job->b_stall_requested = false; } return true; } // Finish Job when buffer end if (ptr_job->b_buf_end) { ptr_job->b_buf_end = false; ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count udd_ep_finish_job(ptr_job, UDD_EP_TRANSFER_OK, ep); } if (ptr_job->buf_cnt >= ptr_job->buf_size && !ptr_job->b_shortpacket && ptr_job->bank == 0) { // All transfer done, including ZLP irqflags_t flags = cpu_irq_save(); udd_disable_endpoint_interrupt(ep); cpu_irq_restore(flags); // Ack last packet udd_ack_in_sent(ep); return true; } else if (udd_get_endpoint_bank_max_nbr(ep) > 1 && ptr_job->bank > 0) { // Already banks buffered, transmit while loading udd_set_transmit_ready(ep); udd_ack_in_sent(ep); udd_ep_in_sent(ep, false); } else if (udd_get_endpoint_bank_max_nbr(ep) > 1) { // Still bank free, load and transmit if (!udd_ep_in_sent(ep, true)) { ptr_job->b_buf_end = false; ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count udd_ep_finish_job(ptr_job, UDD_EP_TRANSFER_OK, ep); } udd_ack_in_sent(ep); udd_ep_in_sent(ep, false); } else { // Single bank transfer, ack when ready udd_ep_in_sent(ep, true); udd_ack_in_sent(ep); } return true; } // Stall sent/CRC error if (Is_udd_stall(ep)) { udd_ack_stall(ep); if (udd_get_endpoint_type(ep) == UDP_CSR_EPTYPE_ISO_OUT || udd_get_endpoint_type(ep) == UDP_CSR_EPTYPE_ISO_IN) { } return true; } } return false; }