diff --git a/components/usb/cherryusb/common/usb_dc.h b/components/usb/cherryusb/common/usb_dc.h index ca45150a..c2d332d1 100644 --- a/components/usb/cherryusb/common/usb_dc.h +++ b/components/usb/cherryusb/common/usb_dc.h @@ -143,6 +143,14 @@ int usbd_ep_start_read(const uint8_t ep, uint8_t *data, uint32_t data_len); /* usb dcd irq callback */ +/** + * @brief Usb resume irq callback. + */ +void usbd_event_resume_handler(void); +/** + * @brief Usb suspend irq callback. + */ +void usbd_event_suspend_handler(void); /** * @brief Usb reset irq callback. */ diff --git a/drivers/lhal/src/bflb_usb_v2.c b/drivers/lhal/src/bflb_usb_v2.c index 7a664758..b7b89f28 100644 --- a/drivers/lhal/src/bflb_usb_v2.c +++ b/drivers/lhal/src/bflb_usb_v2.c @@ -530,6 +530,8 @@ int usb_dc_init(void) /* enable rst/tx0/rx0 irq in source group2 */ regval = 0xffffffff; regval &= ~USB_MUSBRST_INT; + regval &= ~USB_MSUSP_INT; + regval &= ~USB_MRESM_INT; regval &= ~USB_MTX0BYTE_INT; regval &= ~USB_MRX0BYTE_INT; putreg32(regval, BLFB_USB_BASE + USB_DEV_MISG2_OFFSET); @@ -888,6 +890,14 @@ void USBD_IRQHandler(int irq, void *arg) if (dev_intstatus & USB_INT_G2) { subgroup_intstatus = bflb_usb_get_source_group_intstatus(2); + if (subgroup_intstatus & USB_SUSP_INT) { + bflb_usb_source_group_int_clear(2, USB_SUSP_INT); + usbd_event_suspend_handler(); + } + if (subgroup_intstatus & USB_RESM_INT) { + bflb_usb_source_group_int_clear(2, USB_RESM_INT); + usbd_event_resume_handler(); + } if (subgroup_intstatus & USB_TX0BYTE_INT) { for (uint8_t i = 1; i < 5; i++) { if (bflb_usb_get_tx_zlp_intstatus() & (1 << (i - 1))) {