diff --git a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt index 03a97cee93..3959f89c43 100644 --- a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt +++ b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt @@ -50,7 +50,7 @@ * * Dual Communications Device Class demonstration application. * 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 * Descriptors to link together the pair of related CDC * descriptors for each virtual serial port, which may not be diff --git a/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c b/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c index e2a2128e93..8d1cae9adc 100644 --- a/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c +++ b/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c @@ -62,12 +62,14 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Device_Interface = /** Event handler for the library USB WakeUp event. */ void EVENT_USB_Device_Connect(void) { + puts_P(PSTR("Device Connected.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); } /** Event handler for the library USB Suspend event. */ void EVENT_USB_Device_Disconnect(void) { + puts_P(PSTR("Device Disconnected.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); } diff --git a/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c b/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c index cd6bf59ee9..1b905b1145 100644 --- a/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c +++ b/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c @@ -82,3 +82,12 @@ void SetupHardware(void) Buttons_Init(); 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); +} diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h index 89c2c97cb2..4339479977 100644 --- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h +++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h @@ -459,7 +459,7 @@ * 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 - * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows compound + * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite * 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 * function. Read the ECN for more information. @@ -488,7 +488,7 @@ * 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 - * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows compound + * http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf. It allows composite * 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 * function. Read the ECN for more information. diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h index 3007936125..a37e6d939f 100644 --- a/LUFA/Drivers/USB/LowLevel/Device.h +++ b/LUFA/Drivers/USB/LowLevel/Device.h @@ -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) { - UDADDR = ((1 << ADDEN) | (Address & 0x7F)); + UDADDR = ((UDADDR & (1 << ADDEN)) | (Address & 0x7F)); + UDADDR |= (1 << ADDEN); } #endif diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c index 2b66e28b4b..6c66083a8b 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.c +++ b/LUFA/Drivers/USB/LowLevel/Host.c @@ -194,19 +194,21 @@ void USB_Host_ProcessNextHostState(void) uint8_t USB_Host_WaitMS(uint8_t MS) { - bool BusSuspended = USB_Host_IsBusSuspended(); - uint8_t ErrorCode = HOST_WAITERROR_Successful; - uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber(); + bool BusSuspended = USB_Host_IsBusSuspended(); + uint8_t ErrorCode = HOST_WAITERROR_Successful; 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) { - uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); - - if (CurrentFrameNumber != PreviousFrameNumber) + if (USB_INT_HasOccurred(USB_INT_HSOFI)) { - PreviousFrameNumber = CurrentFrameNumber; + USB_INT_Clear(USB_INT_HSOFI); MS--; } @@ -234,6 +236,9 @@ uint8_t USB_Host_WaitMS(uint8_t MS) } } + if (HSOFIEnabled) + USB_INT_Enable(USB_INT_HSOFI); + if (BusSuspended) USB_Host_SuspendBus(); diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c index a49b8da7b9..52951fc39f 100644 --- a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c +++ b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c @@ -34,14 +34,17 @@ void USB_INT_DisableAllInterrupts(void) { #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) USBCON &= ~(1 << VBUSTE); #endif + #if defined(USB_CAN_BE_BOTH) + OTGIEN = 0; + #endif + #if defined(USB_CAN_BE_HOST) UHIEN = 0; - OTGIEN = 0; #endif #if defined(USB_CAN_BE_DEVICE) @@ -55,9 +58,12 @@ void USB_INT_ClearAllInterrupts(void) USBINT = 0; #endif + #if defined(USB_CAN_BE_BOTH) + OTGINT = 0; + #endif + #if defined(USB_CAN_BE_HOST) UHINT = 0; - OTGINT = 0; #endif #if defined(USB_CAN_BE_DEVICE) diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt index 555971f8ec..6e77effbf5 100644 --- a/LUFA/ManPages/FutureChanges.txt +++ b/LUFA/ManPages/FutureChanges.txt @@ -14,7 +14,7 @@ * Targeted for Future Releases: * - Code Features * -# 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 * -# Change makefiles to allow for absolute LUFA location to be used * -# Re-add interrupt Pipe/Endpoint support