summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2020-07-01 18:44:52 +0700
committerhathach <[email protected]>2020-07-01 18:44:52 +0700
commite3974d6869fb091609ccffc342031dc779a37f7e (patch)
treee673568b13f12b3b6b1038606ec43ffcd970ef6f /src
parent77315ba7ce65291b7f77b6258c4546c7dfde0246 (diff)
correctly set turn around according to cpu clock
help to run with low speed mcu
Diffstat (limited to 'src')
-rw-r--r--src/portable/st/synopsys/dcd_synopsys.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/portable/st/synopsys/dcd_synopsys.c b/src/portable/st/synopsys/dcd_synopsys.c
index 7ba6b2378..ee8cab5c4 100644
--- a/src/portable/st/synopsys/dcd_synopsys.c
+++ b/src/portable/st/synopsys/dcd_synopsys.c
@@ -255,8 +255,33 @@ static void set_turnaround(USB_OTG_GlobalTypeDef * usb_otg, tusb_speed_t speed)
}
else
{
+ // Turnaround timeout depends on the MCU clock
+ extern uint32_t SystemCoreClock;
+ uint32_t turnaround;
+
+ if ( SystemCoreClock >= 32000000U )
+ turnaround = 0x6U;
+ else if ( SystemCoreClock >= 27500000U )
+ turnaround = 0x7U;
+ else if ( SystemCoreClock >= 24000000U )
+ turnaround = 0x8U;
+ else if ( SystemCoreClock >= 21800000U )
+ turnaround = 0x9U;
+ else if ( SystemCoreClock >= 20000000U )
+ turnaround = 0xAU;
+ else if ( SystemCoreClock >= 18500000U )
+ turnaround = 0xBU;
+ else if ( SystemCoreClock >= 17200000U )
+ turnaround = 0xCU;
+ else if ( SystemCoreClock >= 16000000U )
+ turnaround = 0xDU;
+ else if ( SystemCoreClock >= 15000000U )
+ turnaround = 0xEU;
+ else
+ turnaround = 0xFU;
+
// Fullspeed depends on MCU clocks, but we will use 0x06 for 32+ Mhz
- usb_otg->GUSBCFG |= (0x06 << USB_OTG_GUSBCFG_TRDT_Pos);
+ usb_otg->GUSBCFG |= (turnaround << USB_OTG_GUSBCFG_TRDT_Pos);
}
}