diff options
| author | sakumisu <[email protected]> | 2023-12-24 23:37:47 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2023-12-24 23:37:47 +0800 |
| commit | f68a86ea89c6c9bbc3bc662b0f593dd7c850a450 (patch) | |
| tree | 98196016f4128e3e5f76f53cfbe9c1e2a2422267 /port/dwc2 | |
| parent | 8a831cdaa5a547c3e92a73f4b772c32407b21161 (diff) | |
add usbh_deinitialize api
Diffstat (limited to 'port/dwc2')
| -rw-r--r-- | port/dwc2/usb_hc_dwc2.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c index 791a20d2..8fa9ce15 100644 --- a/port/dwc2/usb_hc_dwc2.c +++ b/port/dwc2/usb_hc_dwc2.c @@ -525,6 +525,57 @@ int usb_hc_init(void) return 0; } +int usb_hc_deinit(void) +{ + volatile uint32_t count = 0U; + uint32_t value; + + USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + + dwc2_flush_txfifo(0x10U); + dwc2_flush_rxfifo(); + + /* Flush out any leftover queued requests. */ + for (uint32_t i = 0U; i <= 15U; i++) { + value = USB_OTG_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value &= ~USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USB_OTG_HC(i)->HCCHAR = value; + } + + /* Halt all channels to put them into a known state. */ + for (uint32_t i = 0U; i <= 15U; i++) { + value = USB_OTG_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value |= USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USB_OTG_HC(i)->HCCHAR = value; + + do { + if (++count > 1000U) { + return -USB_ERR_TIMEOUT; + } + } while ((USB_OTG_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + + /* Disable all interrupts. */ + USB_OTG_GLB->GINTMSK = 0U; + + /* Clear any pending Host interrupts */ + USB_OTG_HOST->HAINT = 0xFFFFFFFFU; + USB_OTG_GLB->GINTSTS = 0xFFFFFFFFU; + + dwc2_drivebus(0); + usb_osal_msleep(200); + + for (uint8_t chidx = 0; chidx < CONFIG_USBHOST_PIPE_NUM; chidx++) { + usb_osal_sem_delete(g_dwc2_hcd.chan_pool[chidx].waitsem); + } + + return 0; +} + uint16_t usbh_get_frame_number(void) { return (USB_OTG_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); |
