diff options
| author | sakumisu <[email protected]> | 2026-05-21 21:29:04 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2026-05-22 10:33:35 +0800 |
| commit | 43f2140806b01a728b8239a9f245e6f010e84367 (patch) | |
| tree | 07e56624698c4f4795ea272c54e34b7543d08236 | |
| parent | 36145cc47a670e53ea28b421051bd7ea2638d07c (diff) | |
fix(port/musb/usb_glue_sifli): fix phy and reset config
Signed-off-by: sakumisu <[email protected]>
| -rw-r--r-- | port/musb/usb_glue_sifli.c | 34 | ||||
| -rw-r--r-- | port/musb/usb_hc_musb.c | 13 |
2 files changed, 34 insertions, 13 deletions
diff --git a/port/musb/usb_glue_sifli.c b/port/musb/usb_glue_sifli.c index 00194820..ec10d6ba 100644 --- a/port/musb/usb_glue_sifli.c +++ b/port/musb/usb_glue_sifli.c @@ -51,6 +51,7 @@ void usb_dc_low_level_init(uint8_t busid) #ifdef SOC_SF32LB58X //hwp_usbc->utmicfg12 = hwp_usbc->utmicfg12 | 0x3; //set xo_clk_sel + hwp_usbc->utmicfg23 = 0xd8; hwp_usbc->ldo25 = hwp_usbc->ldo25 | 0xa; //set psw_en and ldo25_en HAL_Delay(1); hwp_usbc->swcntl3 = 0x1; //set utmi_en for USB2.0 @@ -96,10 +97,14 @@ void usb_hc_low_level_init(struct usbh_bus *bus) #ifdef SOC_SF32LB58X //hwp_usbc->utmicfg12 = hwp_usbc->utmicfg12 | 0x3; //set xo_clk_sel + hwp_usbc->utmicfg23 = 0xd8; hwp_usbc->ldo25 = hwp_usbc->ldo25 | 0xa; //set psw_en and ldo25_en HAL_Delay(1); hwp_usbc->swcntl3 = 0x1; //set utmi_en for USB2.0 hwp_usbc->usbcfg = hwp_usbc->usbcfg | 0x40; //enable usb PLL. + hwp_usbc->dpbrxdisl = 0xff; + hwp_usbc->dpbtxdisl = 0xff; + hwp_usbc->utmicfg25 = hwp_usbc->utmicfg25 | 0xc0; #elif defined(SOC_SF32LB56X) || defined(SOC_SF32LB52X) hwp_hpsys_cfg->USBCR |= HPSYS_CFG_USBCR_DM_PD | HPSYS_CFG_USBCR_DP_EN | HPSYS_CFG_USBCR_USB_EN; #elif defined(SOC_SF32LB55X) @@ -136,27 +141,46 @@ void usb_hc_low_level_deinit(struct usbh_bus *bus) HAL_RCC_DisableModule(RCC_MOD_USBC); } -void musb_reset_prev(void) +void musb_sifli_reset_port(struct usbh_bus *bus) { +#define HWREGB(x) \ + (*((volatile uint8_t *)(x))) + +#define USB_BASE (bus->hcd.reg_base) +#define MUSB_POWER_OFFSET 0x01 + +#if defined(SF32LB58X) + hwp_usbc->utmicfg25 |= 0xc0; + hwp_usbc->utmicfg21 = 0x23; + hwp_usbc->swcntl2 = 0x7c; + hwp_usbc->utmicfg0 = 0x30; +#endif + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESET; #if defined(SF32LB58X) hwp_usbc->rsvd0 = 0xc; //58 #endif -} - -void musb_reset_post(void) -{ + usb_osal_msleep(500); + HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~(USB_POWER_RESET); + usb_osal_msleep(5); #if defined(SF32LB58X) hwp_usbc->rsvd0 = 0x0; //58 + hwp_usbc->utmicfg25 &= ~0xc0; + hwp_usbc->utmicfg21 = 0x2f; + hwp_usbc->swcntl2 = 0x40; + hwp_usbc->utmicfg0 = 0x00; #endif } + #endif void USBC_IRQHandler(void) { + rt_interrupt_enter(); #ifdef PKG_CHERRYUSB_DEVICE USBD_IRQHandler(0); #endif #ifdef PKG_CHERRYUSB_HOST USBH_IRQHandler(0); #endif + rt_interrupt_leave(); }
\ No newline at end of file diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c index b0c75009..daa0f056 100644 --- a/port/musb/usb_hc_musb.c +++ b/port/musb/usb_hc_musb.c @@ -493,18 +493,15 @@ int musb_intr_urb_init(struct usbh_bus *bus, uint8_t chidx, struct usbh_urb *urb static int usbh_reset_port(struct usbh_bus *bus, const uint8_t port) { g_musb_hcd[bus->hcd.hcd_id].port_pe = 0; - HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESET; #ifdef CONFIG_USB_MUSB_SIFLI - extern void musb_reset_prev(void); - musb_reset_prev(); -#endif - usb_osal_msleep(20); + extern void musb_sifli_reset_port(struct usbh_bus *bus); + musb_sifli_reset_port(bus); +#else + HWREGB(USB_BASE + MUSB_POWER_OFFSET) |= USB_POWER_RESET; + usb_osal_msleep(200); HWREGB(USB_BASE + MUSB_POWER_OFFSET) &= ~(USB_POWER_RESET); usb_osal_msleep(20); -#ifdef CONFIG_USB_MUSB_SIFLI - extern void musb_reset_post(void); - musb_reset_post(); #endif g_musb_hcd[bus->hcd.hcd_id].port_pe = 1; return 0; |
