initialize _usbSuspendState in USBDevice_::attach

pull/18/head
Michael Dreher 12 years ago committed by Jesse Vincent
parent ce9cfedc1f
commit ff1bb4e379

@ -640,6 +640,7 @@ static inline void USB_ClockEnable()
// port touch at 1200 bps. This delay fixes this behaviour. // port touch at 1200 bps. This delay fixes this behaviour.
delay(1); delay(1);
USBCON = (USBCON & ~(1<<FRZCLK)) | (1<<OTGPADE); // start USB clock, enable VBUS Pad USBCON = (USBCON & ~(1<<FRZCLK)) | (1<<OTGPADE); // start USB clock, enable VBUS Pad
UDCON &= ~((1<<RSTCPU) | (1<<LSM) | (1<<RMWKUP) | (1<<DETACH)); // enable attach resistor, set full speed mode
} }
@ -684,19 +685,17 @@ ISR(USB_GEN_vect)
// WAKEUPI shall be cleared by software (USB clock inputs must be enabled before). // WAKEUPI shall be cleared by software (USB clock inputs must be enabled before).
//USB_ClockEnable(); //USB_ClockEnable();
UDINT &= ~(1<<WAKEUPI); UDINT &= ~(1<<WAKEUPI);
_usbSuspendState = (1<<WAKEUPI); _usbSuspendState = (_usbSuspendState & ~(1<<SUSPI)) | (1<<WAKEUPI);
} }
else if (udint & (1<<SUSPI)) // only one of the WAKEUPI / SUSPI bits can be active at time else if (udint & (1<<SUSPI)) // only one of the WAKEUPI / SUSPI bits can be active at time
{ {
// disable SUSPEND interrupts, because the SUSPI IRQ flag is not cleared and would trigger end endless IRQ loop
// the SUSPI flag is needed to detect the current suspend state in wakeupHost
UDIEN = (UDIEN & ~(1<<SUSPE)) | (1<<WAKEUPE); // Disable interrupts for SUSPEND and enable interrupts for WAKEUP UDIEN = (UDIEN & ~(1<<SUSPE)) | (1<<WAKEUPE); // Disable interrupts for SUSPEND and enable interrupts for WAKEUP
//TODO //TODO
//USB_ClockDisable(); //USB_ClockDisable();
UDINT &= ~((1<<WAKEUPI) | (1<<SUSPI)); // clear any already pending WAKEUP IRQs and the SUSPI request UDINT &= ~((1<<WAKEUPI) | (1<<SUSPI)); // clear any already pending WAKEUP IRQs and the SUSPI request
_usbSuspendState = (1<<SUSPI); _usbSuspendState = (_usbSuspendState & ~(1<<WAKEUPI)) | (1<<SUSPI);
} }
} }
@ -722,10 +721,11 @@ void USBDevice_::attach()
{ {
_usbConfiguration = 0; _usbConfiguration = 0;
_usbCurrentStatus = 0; _usbCurrentStatus = 0;
_usbSuspendState = 0;
USB_ClockEnable(); USB_ClockEnable();
UDINT &= ~((1<<WAKEUPI) | (1<<SUSPI)); // clear already pending WAKEUP / SUSPEND requests
UDIEN = (1<<EORSTE) | (1<<SOFE) | (1<<SUSPE); // Enable interrupts for EOR (End of Reset), SOF (start of frame) and SUSPEND UDIEN = (1<<EORSTE) | (1<<SOFE) | (1<<SUSPE); // Enable interrupts for EOR (End of Reset), SOF (start of frame) and SUSPEND
UDCON &= ~((1<<RSTCPU | (1<<LSM) | (1<<RMWKUP) | (1<<DETACH))); // enable attach resistor, set full speed mode
TX_RX_LED_INIT; TX_RX_LED_INIT;
} }

Loading…
Cancel
Save