mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-31 05:52:55 +08:00
Handle xfer events before closing EP
This commit is contained in:
parent
36e69b86bf
commit
ae970ba2e2
@ -247,6 +247,14 @@ static void dcd_rp2040_irq(void)
|
|||||||
uint32_t const status = usb_hw->ints;
|
uint32_t const status = usb_hw->ints;
|
||||||
uint32_t handled = 0;
|
uint32_t handled = 0;
|
||||||
|
|
||||||
|
// xfer events are handled before setup req. So if a transfer completes immediately
|
||||||
|
// before closing the EP, the events will be delivered in same order.
|
||||||
|
if (status & USB_INTS_BUFF_STATUS_BITS)
|
||||||
|
{
|
||||||
|
handled |= USB_INTS_BUFF_STATUS_BITS;
|
||||||
|
hw_handle_buff_status();
|
||||||
|
}
|
||||||
|
|
||||||
if (status & USB_INTS_SETUP_REQ_BITS)
|
if (status & USB_INTS_SETUP_REQ_BITS)
|
||||||
{
|
{
|
||||||
handled |= USB_INTS_SETUP_REQ_BITS;
|
handled |= USB_INTS_SETUP_REQ_BITS;
|
||||||
@ -260,12 +268,6 @@ static void dcd_rp2040_irq(void)
|
|||||||
usb_hw_clear->sie_status = USB_SIE_STATUS_SETUP_REC_BITS;
|
usb_hw_clear->sie_status = USB_SIE_STATUS_SETUP_REC_BITS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status & USB_INTS_BUFF_STATUS_BITS)
|
|
||||||
{
|
|
||||||
handled |= USB_INTS_BUFF_STATUS_BITS;
|
|
||||||
hw_handle_buff_status();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if FORCE_VBUS_DETECT == 0
|
#if FORCE_VBUS_DETECT == 0
|
||||||
// Since we force VBUS detect On, device will always think it is connected and
|
// Since we force VBUS detect On, device will always think it is connected and
|
||||||
// couldn't distinguish between disconnect and suspend
|
// couldn't distinguish between disconnect and suspend
|
||||||
@ -496,9 +498,6 @@ void dcd_edpt_close (uint8_t rhport, uint8_t ep_addr)
|
|||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
|
||||||
pico_trace("dcd_edpt_close %02x\n", ep_addr);
|
pico_trace("dcd_edpt_close %02x\n", ep_addr);
|
||||||
|
|
||||||
// usbd.c says: In progress transfers on this EP may be delivered after this call.
|
|
||||||
// If the endpoint is no longer active when the transfer event is delivered, it will be ignored.
|
|
||||||
hw_endpoint_close(ep_addr);
|
hw_endpoint_close(ep_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,9 +294,7 @@ bool hw_endpoint_xfer_continue(struct hw_endpoint *ep)
|
|||||||
// Part way through a transfer
|
// Part way through a transfer
|
||||||
if (!ep->active)
|
if (!ep->active)
|
||||||
{
|
{
|
||||||
pico_info("Ignore xfer on inactive ep %d %s", tu_edpt_number(ep->ep_addr), ep_dir_string[tu_edpt_dir(ep->ep_addr)]);
|
panic("Can't continue xfer on inactive ep %d %s", tu_edpt_number(ep->ep_addr), ep_dir_string[tu_edpt_dir(ep->ep_addr)]);
|
||||||
_hw_endpoint_lock_update(ep, -1);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update EP struct from hardware state
|
// Update EP struct from hardware state
|
||||||
|
Loading…
x
Reference in New Issue
Block a user