mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-20 08:02:04 +00:00
Fix XMEGA USB prescaler calculation
The USB prescaler calculation for the CLK.USBCTRL register is changed to give valid results and set the prescaler correctly. Signed-off-by: Bert van Hall <bert.vanhall@avionic-design.de>
This commit is contained in:
parent
526091fba4
commit
c499a0b755
@ -109,15 +109,25 @@ void USB_Disable(void)
|
|||||||
|
|
||||||
void USB_ResetInterface(void)
|
void USB_ResetInterface(void)
|
||||||
{
|
{
|
||||||
|
uint8_t PrescalerNeeded;
|
||||||
|
uint8_t nbit = 0;
|
||||||
|
|
||||||
#if defined(USB_DEVICE_OPT_FULLSPEED)
|
#if defined(USB_DEVICE_OPT_FULLSPEED)
|
||||||
if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
|
if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
|
||||||
CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp);
|
PrescalerNeeded = F_USB / 6000000;
|
||||||
else
|
else
|
||||||
CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp);
|
PrescalerNeeded = F_USB / 48000000;
|
||||||
#else
|
#else
|
||||||
CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp);
|
PrescalerNeeded = F_USB / 6000000;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
while (PrescalerNeeded && nbit < 7) {
|
||||||
|
PrescalerNeeded >>= 1;
|
||||||
|
nbit++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CLK.USBCTRL = (nbit - 1) << CLK_USBPSDIV_gp;
|
||||||
|
|
||||||
if (USB_Options & USB_OPT_PLLCLKSRC)
|
if (USB_Options & USB_OPT_PLLCLKSRC)
|
||||||
CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
|
CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user