aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Drivers/USB
diff options
context:
space:
mode:
authorBert van Hall <bert.vanhall@avionic-design.de>2014-07-22 10:33:50 +0200
committerBert van Hall <bert.vanhall@avionic-design.de>2014-07-22 10:41:55 +0200
commitc499a0b7550ba26e4b26e11ae13935f094f22ddc (patch)
tree4a8e5ca4fe3a6214981e4beda8617aa0086d369d /LUFA/Drivers/USB
parent526091fba4e1b86d14c8fcff5d32953c15ed0802 (diff)
downloadlufa-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/USB')
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c16
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