Commit 01fecac0 authored by Dean Camera's avatar Dean Camera
Browse files

Ensure device address latch bit is not set at the same time as the new address, as per datasheet.

Minor documentation fixes.

Fix broken USB host mode due to the USB frame counter not being updated during the early enumeration steps, causing USB_Host_DelayMS() to spinloop forever.
parent cce8760b
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
* *
* Dual Communications Device Class demonstration application. * Dual Communications Device Class demonstration application.
* This gives a simple reference application for implementing * This gives a simple reference application for implementing
* a compound device with dual CDC functions acting as a pair * a composite device with dual CDC functions acting as a pair
* of virtual serial ports. This demo uses Interface Association * of virtual serial ports. This demo uses Interface Association
* Descriptors to link together the pair of related CDC * Descriptors to link together the pair of related CDC
* descriptors for each virtual serial port, which may not be * descriptors for each virtual serial port, which may not be
......
...@@ -62,12 +62,14 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Device_Interface = ...@@ -62,12 +62,14 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Device_Interface =
/** Event handler for the library USB WakeUp event. */ /** Event handler for the library USB WakeUp event. */
void EVENT_USB_Device_Connect(void) void EVENT_USB_Device_Connect(void)
{ {
puts_P(PSTR("Device Connected.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Suspend event. */ /** Event handler for the library USB Suspend event. */
void EVENT_USB_Device_Disconnect(void) void EVENT_USB_Device_Disconnect(void)
{ {
puts_P(PSTR("Device Disconnected.\r\n"));
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
......
...@@ -82,3 +82,12 @@ void SetupHardware(void) ...@@ -82,3 +82,12 @@ void SetupHardware(void)
Buttons_Init(); Buttons_Init();
USB_Init(USB_MODE_UID); USB_Init(USB_MODE_UID);
} }
/** Event handler for the library USB mode change event. */
void EVENT_USB_UIDChange(void)
{
printf_P(PSTR(ESC_FG_YELLOW "UID Change to %S mode\r\n" ESC_FG_WHITE),
(USB_CurrentMode == USB_MODE_DEVICE) ? PSTR("Device") : PSTR("Host"));
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
}
...@@ -459,7 +459,7 @@ ...@@ -459,7 +459,7 @@
* to make each element's purpose clearer. * to make each element's purpose clearer.
* *
* This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
* <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows compound * <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
* devices with multiple interfaces related to the same function to have the multiple interfaces bound * devices with multiple interfaces related to the same function to have the multiple interfaces bound
* together at the point of enumeration, loading one generic driver for all the interfaces in the single * together at the point of enumeration, loading one generic driver for all the interfaces in the single
* function. Read the ECN for more information. * function. Read the ECN for more information.
...@@ -488,7 +488,7 @@ ...@@ -488,7 +488,7 @@
* element names to ensure compatibility with the standard. * element names to ensure compatibility with the standard.
* *
* This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at * This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
* <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows compound * <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
* devices with multiple interfaces related to the same function to have the multiple interfaces bound * devices with multiple interfaces related to the same function to have the multiple interfaces bound
* together at the point of enumeration, loading one generic driver for all the interfaces in the single * together at the point of enumeration, loading one generic driver for all the interfaces in the single
* function. Read the ECN for more information. * function. Read the ECN for more information.
......
...@@ -221,7 +221,8 @@ ...@@ -221,7 +221,8 @@
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
{ {
UDADDR = ((1 << ADDEN) | (Address & 0x7F)); UDADDR = ((UDADDR & (1 << ADDEN)) | (Address & 0x7F));
UDADDR |= (1 << ADDEN);
} }
#endif #endif
......
...@@ -194,19 +194,21 @@ void USB_Host_ProcessNextHostState(void) ...@@ -194,19 +194,21 @@ void USB_Host_ProcessNextHostState(void)
uint8_t USB_Host_WaitMS(uint8_t MS) uint8_t USB_Host_WaitMS(uint8_t MS)
{ {
bool BusSuspended = USB_Host_IsBusSuspended(); bool BusSuspended = USB_Host_IsBusSuspended();
uint8_t ErrorCode = HOST_WAITERROR_Successful; uint8_t ErrorCode = HOST_WAITERROR_Successful;
uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
USB_Host_ResumeBus(); USB_Host_ResumeBus();
bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
USB_INT_Disable(USB_INT_HSOFI);
USB_INT_Clear(USB_INT_HSOFI);
while (MS) while (MS)
{ {
uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); if (USB_INT_HasOccurred(USB_INT_HSOFI))
if (CurrentFrameNumber != PreviousFrameNumber)
{ {
PreviousFrameNumber = CurrentFrameNumber; USB_INT_Clear(USB_INT_HSOFI);
MS--; MS--;
} }
...@@ -234,6 +236,9 @@ uint8_t USB_Host_WaitMS(uint8_t MS) ...@@ -234,6 +236,9 @@ uint8_t USB_Host_WaitMS(uint8_t MS)
} }
} }
if (HSOFIEnabled)
USB_INT_Enable(USB_INT_HSOFI);
if (BusSuspended) if (BusSuspended)
USB_Host_SuspendBus(); USB_Host_SuspendBus();
......
...@@ -34,14 +34,17 @@ ...@@ -34,14 +34,17 @@
void USB_INT_DisableAllInterrupts(void) void USB_INT_DisableAllInterrupts(void)
{ {
#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
USBCON &= ~((1 << VBUSTE) | (1 << IDTE)); USBCON &= ~((1 << OTGPADE) | (1 << VBUSTE) | (1 << IDTE));
#elif defined(USB_SERIES_4_AVR) #elif defined(USB_SERIES_4_AVR)
USBCON &= ~(1 << VBUSTE); USBCON &= ~(1 << VBUSTE);
#endif #endif
#if defined(USB_CAN_BE_BOTH)
OTGIEN = 0;
#endif
#if defined(USB_CAN_BE_HOST) #if defined(USB_CAN_BE_HOST)
UHIEN = 0; UHIEN = 0;
OTGIEN = 0;
#endif #endif
#if defined(USB_CAN_BE_DEVICE) #if defined(USB_CAN_BE_DEVICE)
...@@ -55,9 +58,12 @@ void USB_INT_ClearAllInterrupts(void) ...@@ -55,9 +58,12 @@ void USB_INT_ClearAllInterrupts(void)
USBINT = 0; USBINT = 0;
#endif #endif
#if defined(USB_CAN_BE_BOTH)
OTGINT = 0;
#endif
#if defined(USB_CAN_BE_HOST) #if defined(USB_CAN_BE_HOST)
UHINT = 0; UHINT = 0;
OTGINT = 0;
#endif #endif
#if defined(USB_CAN_BE_DEVICE) #if defined(USB_CAN_BE_DEVICE)
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* <b>Targeted for Future Releases:</b> * <b>Targeted for Future Releases:</b>
* - Code Features * - Code Features
* -# Add hub support when in Host mode for multiple devices * -# Add hub support when in Host mode for multiple devices
* -# Investigate virtual hubs when in device mode instead of compound devices * -# Investigate virtual hubs when in device mode instead of composite devices
* -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error * -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error
* -# Change makefiles to allow for absolute LUFA location to be used * -# Change makefiles to allow for absolute LUFA location to be used
* -# Re-add interrupt Pipe/Endpoint support * -# Re-add interrupt Pipe/Endpoint support
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment