@@ -110,7 +110,7 @@ static inline void ClearOUT(void)
110110	UEINTX = ~(1 <<RXOUTI);
111111}
112112
113- void  Recv (volatile  u8 * data, u8  count)
113+ static   inline   void  Recv (volatile  u8 * data, u8  count)
114114{
115115	while  (count--)
116116		*data++ = UEDATX;
@@ -253,7 +253,7 @@ u8 USB_SendSpace(u8 ep)
253253	LockEP lock (ep);
254254	if  (!ReadWriteAllowed ())
255255		return  0 ;
256- 	return  64  - FifoByteCount ();
256+ 	return  USB_EP_SIZE  - FifoByteCount ();
257257}
258258
259259// 	Blocking Send of data to an endpoint
@@ -326,6 +326,7 @@ u8 _initEndpoints[] =
326326
327327#define  EP_SINGLE_64  0x32 	//  EP0
328328#define  EP_DOUBLE_64  0x36 	//  Other endpoints
329+ #define  EP_SINGLE_16  0x12 
329330
330331static 
331332void  InitEP (u8  index, u8  type, u8  size)
@@ -344,7 +345,13 @@ void InitEndpoints()
344345		UENUM = i;
345346		UECONX = (1 <<EPEN);
346347		UECFG0X = _initEndpoints[i];
348+ #if  USB_EP_SIZE == 16
349+ 		UECFG1X = EP_SINGLE_16;
350+ #elif  USB_EP_SIZE == 64
347351		UECFG1X = EP_DOUBLE_64;
352+ #else 
353+ #error  Unsupported value for USB_EP_SIZE
354+ #endif 
348355	}
349356	UERST = 0x7E ;	//  And reset them
350357	UERST = 0 ;
@@ -620,13 +627,19 @@ void USB_Flush(u8 ep)
620627
621628static  inline  void  USB_ClockDisable ()
622629{
630+ #if  defined(OTGPADE)
623631	USBCON = (USBCON & ~(1 <<OTGPADE)) | (1 <<FRZCLK); //  freeze clock and disable VBUS Pad
632+ #else  //  u2 Series
633+ 	USBCON = (1  << FRZCLK); //  freeze clock
634+ #endif 
624635	PLLCSR &= ~(1 <<PLLE);  //  stop PLL
625636}
626637
627638static  inline  void  USB_ClockEnable ()
628639{
640+ #if  defined(UHWCON)
629641	UHWCON |= (1 <<UVREGE);			//  power internal reg
642+ #endif 
630643	USBCON = (1 <<USBE) | (1 <<FRZCLK);	//  clock frozen, usb enabled
631644
632645//  ATmega32U4
@@ -639,6 +652,16 @@ static inline void USB_ClockEnable()
639652#error  "Clock rate of F_CPU not supported"
640653#endif 
641654
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+ 
642665//  AT90USB646, AT90USB647, AT90USB1286, AT90USB1287
643666#elif  defined(PLLP2)
644667#if  F_CPU == 16000000UL
@@ -670,10 +693,18 @@ static inline void USB_ClockEnable()
670693	//  strange behaviors when the board is reset using the serial
671694	//  port touch at 1200 bps. This delay fixes this behavior.
672695	delay (1 );
696+ #if  defined(OTGPADE)
673697	USBCON = (USBCON & ~(1 <<FRZCLK)) | (1 <<OTGPADE);	//  start USB clock, enable VBUS Pad
698+ #else 
699+ 	USBCON &= ~(1  << FRZCLK);	//  start USB clock
700+ #endif 
674701
675702#if  defined(RSTCPU)
703+ #if  defined(LSM)
676704	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 
677708#else 
678709	//  AT90USB64x and AT90USB128x don't have RSTCPU
679710	UDCON &= ~((1 <<LSM) | (1 <<RMWKUP) | (1 <<DETACH));	//  enable attach resistor, set full speed mode
0 commit comments