@@ -627,13 +627,19 @@ void USB_Flush(u8 ep)
627
627
628
628
static inline void USB_ClockDisable ()
629
629
{
630
+ #if defined(OTGPADE)
630
631
USBCON = (USBCON & ~(1 <<OTGPADE)) | (1 <<FRZCLK); // freeze clock and disable VBUS Pad
632
+ #else // u2 Series
633
+ USBCON = (1 << FRZCLK); // freeze clock
634
+ #endif
631
635
PLLCSR &= ~(1 <<PLLE); // stop PLL
632
636
}
633
637
634
638
static inline void USB_ClockEnable ()
635
639
{
640
+ #if defined(UHWCON)
636
641
UHWCON |= (1 <<UVREGE); // power internal reg
642
+ #endif
637
643
USBCON = (1 <<USBE) | (1 <<FRZCLK); // clock frozen, usb enabled
638
644
639
645
// ATmega32U4
@@ -646,6 +652,16 @@ static inline void USB_ClockEnable()
646
652
#error "Clock rate of F_CPU not supported"
647
653
#endif
648
654
655
+ #elif defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__)
656
+ // for the u2 Series the datasheet is confusing. On page 40 its called PINDIV and on page 290 its called PLLP0
657
+ #if F_CPU == 16000000UL
658
+ // Need 16 MHz xtal
659
+ PLLCSR |= (1 << PLLP0);
660
+ #elif F_CPU == 8000000UL
661
+ // Need 8 MHz xtal
662
+ PLLCSR &= ~(1 << PLLP0);
663
+ #endif
664
+
649
665
// AT90USB646, AT90USB647, AT90USB1286, AT90USB1287
650
666
#elif defined(PLLP2)
651
667
#if F_CPU == 16000000UL
@@ -677,10 +693,18 @@ static inline void USB_ClockEnable()
677
693
// strange behaviors when the board is reset using the serial
678
694
// port touch at 1200 bps. This delay fixes this behavior.
679
695
delay (1 );
696
+ #if defined(OTGPADE)
680
697
USBCON = (USBCON & ~(1 <<FRZCLK)) | (1 <<OTGPADE); // start USB clock, enable VBUS Pad
698
+ #else
699
+ USBCON &= ~(1 << FRZCLK); // start USB clock
700
+ #endif
681
701
682
702
#if defined(RSTCPU)
703
+ #if defined(LSM)
683
704
UDCON &= ~((1 <<RSTCPU) | (1 <<LSM) | (1 <<RMWKUP) | (1 <<DETACH)); // enable attach resistor, set full speed mode
705
+ #else // u2 Series
706
+ UDCON &= ~((1 << RSTCPU) | (1 << RMWKUP) | (1 << DETACH)); // enable attach resistor, set full speed mode
707
+ #endif
684
708
#else
685
709
// AT90USB64x and AT90USB128x don't have RSTCPU
686
710
UDCON &= ~((1 <<LSM) | (1 <<RMWKUP) | (1 <<DETACH)); // enable attach resistor, set full speed mode
0 commit comments