From e95d6b3932f64d59ce2979743b063fbea779a9b9 Mon Sep 17 00:00:00 2001 From: "Zhang, Zhenjiang" Date: Thu, 25 Jun 2026 10:00:57 +0800 Subject: fix(dwc2_hcd): correct HFIR for Low-Speed devices via internal FS PHY When a Low-Speed device is connected through the internal FS PHY, the effective PHY clock is 6MHz (HCFG_FSLS_PHYCLK_SEL_6MHZ), but phy_clock was incorrectly left at 48. This caused HFIR to be calculated as 47999 (~8ms SOF interval) instead of the correct 5999 (1ms SOF interval), breaking periodic endpoint scheduling. Fixes: LS mouse only receiving first HID report on OTG_HS + FS PHY --- src/portable/synopsys/dwc2/hcd_dwc2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/portable/synopsys/dwc2/hcd_dwc2.c b/src/portable/synopsys/dwc2/hcd_dwc2.c index 84a0c6afd..8265700c0 100644 --- a/src/portable/synopsys/dwc2/hcd_dwc2.c +++ b/src/portable/synopsys/dwc2/hcd_dwc2.c @@ -1427,10 +1427,11 @@ static void port0_enable(dwc2_regs_t* dwc2, tusb_speed_t speed) { uint32_t phy_clock; if (gusbcfg.phy_sel == GUSBCFG_PHYSEL_FULLSPEED) { - phy_clock = 48; // dedicated FS is 48Mhz if (speed == TUSB_SPEED_LOW) { + phy_clock = 6; // LS via FS PHY: effective clock is 6MHz hcfg |= HCFG_FSLS_PHYCLK_SEL_6MHZ; } else { + phy_clock = 48; // dedicated FS is 48Mhz hcfg |= HCFG_FSLS_PHYCLK_SEL_48MHZ; } } else { -- cgit v1.3.1 From 854525d5268669843a9700bee60e5613a5ce945a Mon Sep 17 00:00:00 2001 From: HiFiPhile Date: Thu, 25 Jun 2026 21:46:58 +0200 Subject: hcd/dwc2: update wording on hfir Signed-off-by: HiFiPhile --- src/portable/synopsys/dwc2/hcd_dwc2.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/portable/synopsys/dwc2/hcd_dwc2.c b/src/portable/synopsys/dwc2/hcd_dwc2.c index 8265700c0..a536b1e36 100644 --- a/src/portable/synopsys/dwc2/hcd_dwc2.c +++ b/src/portable/synopsys/dwc2/hcd_dwc2.c @@ -1410,15 +1410,15 @@ static bool handle_sof_irq(uint8_t rhport, bool in_isr) { // Config HCFG FS/LS clock and HFIR for SOF interval according to link speed (value is in PHY clock unit) // Databook Table 2-2: System Clock Speeds -// +-----------+------------------+----------+-----------+-------------------+ -// | PHY | PHY Clock (MHz) | Width | HCFG.Sel | HFIR (clk cycles) | -// +-----------+------------------+----------+-----------+-------------------+ -// | HS UTMI+ | 30 | 16-bit | 30_60 | HS:3749 FS:29999 | -// | HS UTMI+ | 60 | 8-bit | 30_60 | HS:7499 FS:59999 | -// | HS ULPI | 60 | 8-bit | 30_60 | HS:7499 FS:59999 | +// +------------+------------------+----------+-----------+-------------------+ +// | PHY | PHY Clock (MHz) | Width | HCFG.Sel | HFIR (clk cycles) | +// +------------+------------------+----------+-----------+-------------------+ +// | HS UTMI+ | 30 | 16-bit | 30_60 | HS:3749 FS:29999 | +// | HS UTMI+ | 60 | 8-bit | 30_60 | HS:7499 FS:59999 | +// | HS ULPI | 60 | 8-bit | 30_60 | HS:7499 FS:59999 | // | FS (dead.) | 48 | internal | 48 | FS:47999 | -// | LS via FS | 48 (6 effective) | internal | 6 | LS:47999 | -// +-----------+------------------+----------+-----------+-------------------+ +// | LS via FS | 6 | internal | 6 | LS:5999 | +// +------------+------------------+----------+-----------+-------------------+ // HFIR = (interval_us * phy_clock) - 1, where interval is 125us (HS) or 1000us (FS/LS) static void port0_enable(dwc2_regs_t* dwc2, tusb_speed_t speed) { uint32_t hcfg = dwc2->hcfg & ~HCFG_FSLS_PHYCLK_SEL; @@ -1428,10 +1428,10 @@ static void port0_enable(dwc2_regs_t* dwc2, tusb_speed_t speed) { if (gusbcfg.phy_sel == GUSBCFG_PHYSEL_FULLSPEED) { if (speed == TUSB_SPEED_LOW) { - phy_clock = 6; // LS via FS PHY: effective clock is 6MHz + phy_clock = 6; // LS via FS PHY is 6MHz (utmifs_clk48/8) hcfg |= HCFG_FSLS_PHYCLK_SEL_6MHZ; } else { - phy_clock = 48; // dedicated FS is 48Mhz + phy_clock = 48; // FS is 48Mhz (utmifs_clk48) hcfg |= HCFG_FSLS_PHYCLK_SEL_48MHZ; } } else { -- cgit v1.3.1