diff options
author | Bert van Hall <bert.vanhall@avionic-design.de> | 2014-07-22 10:33:50 +0200 |
---|---|---|
committer | Bert van Hall <bert.vanhall@avionic-design.de> | 2014-07-22 10:41:55 +0200 |
commit | c499a0b7550ba26e4b26e11ae13935f094f22ddc (patch) | |
tree | 4a8e5ca4fe3a6214981e4beda8617aa0086d369d /LUFA/Drivers | |
parent | 526091fba4e1b86d14c8fcff5d32953c15ed0802 (diff) | |
download | lufa-c499a0b7550ba26e4b26e11ae13935f094f22ddc.tar.gz lufa-c499a0b7550ba26e4b26e11ae13935f094f22ddc.tar.bz2 lufa-c499a0b7550ba26e4b26e11ae13935f094f22ddc.zip |
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>
Diffstat (limited to 'LUFA/Drivers')
-rw-r--r-- | LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c index f8b0fc6af..b5de862f1 100644 --- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c +++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c @@ -109,15 +109,25 @@ void USB_Disable(void) void USB_ResetInterface(void) { + uint8_t PrescalerNeeded; + uint8_t nbit = 0; + #if defined(USB_DEVICE_OPT_FULLSPEED) if (USB_Options & USB_DEVICE_OPT_LOWSPEED) - CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); + PrescalerNeeded = F_USB / 6000000; else - CLK.USBCTRL = (((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp); + PrescalerNeeded = F_USB / 48000000; #else - CLK.USBCTRL = (((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp); + PrescalerNeeded = F_USB / 6000000; #endif + while (PrescalerNeeded && nbit < 7) { + PrescalerNeeded >>= 1; + nbit++; + } + + CLK.USBCTRL = (nbit - 1) << CLK_USBPSDIV_gp; + if (USB_Options & USB_OPT_PLLCLKSRC) CLK.USBCTRL |= (CLK_USBSRC_PLL_gc | CLK_USBSEN_bm); else |