diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c index b8e87cb603..3222b770ec 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c @@ -139,14 +139,11 @@ void Bluetooth_Management_Task(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } puts_P(PSTR("Bluetooth Dongle Detected.\r\n")); - - /* Select the control pipe for the request transfer */ - Pipe_SelectPipe(PIPE_CONTROLPIPE); /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) @@ -158,7 +155,7 @@ void Bluetooth_Management_Task(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -181,17 +178,13 @@ void Bluetooth_Management_Task(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } puts_P(PSTR("Bluetooth Dongle Enumerated.\r\n")); USB_HostState = HOST_STATE_Ready; - break; - case HOST_STATE_Ready: - /* Do nothing, Bluetooth stack will take care of enumeration */ - break; } } diff --git a/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c b/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c index e9f575c55e..f68f957c01 100644 --- a/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c +++ b/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c @@ -34,28 +34,15 @@ uint8_t ProcessDeviceDescriptor(void) { USB_Descriptor_Device_t DeviceDescriptor; - /* Standard request to get the device descriptor */ - USB_ControlRequest = (USB_Request_Header_t) - { - bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), - bRequest: REQ_GetDescriptor, - wValue: (DTYPE_Device << 8), - wIndex: 0, - wLength: sizeof(USB_Descriptor_Device_t), - }; - - /* Select the control pipe for the request transfer */ - Pipe_SelectPipe(PIPE_CONTROLPIPE); - /* Send the request to retrieve the device descriptor */ - if (USB_Host_SendControlRequest((void*)&DeviceDescriptor) != HOST_SENDCONTROL_Successful) + if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful) return ControlErrorDuringDeviceRead; /* Validate returned data - ensure the returned data is a device descriptor */ if (DeviceDescriptor.Header.Type != DTYPE_Device) return InvalidDeviceDataReturned; - if ((DeviceDescriptor.Class != BLUETOOTH_DEVICE_CLASS) || + if ((DeviceDescriptor.Class != BLUETOOTH_DEVICE_CLASS) || (DeviceDescriptor.SubClass != BLUETOOTH_DEVICE_SUBCLASS) || (DeviceDescriptor.Protocol != BLUETOOTH_DEVICE_PROTOCOL)) { diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c index df80789dd3..7b98542d09 100644 --- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c +++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c @@ -133,7 +133,7 @@ void USB_Printer_Host(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -147,7 +147,7 @@ void USB_Printer_Host(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -173,7 +173,7 @@ void USB_Printer_Host(void) LEDs_SetAllLEDs(LEDS_LED1); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -181,10 +181,8 @@ void USB_Printer_Host(void) /* Indicate device no longer busy */ LEDs_SetAllLEDs(LEDS_LED4); - - /* Wait until USB device disconnected */ - while (USB_IsConnected); - + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } } diff --git a/Demos/Host/LowLevel/CDCHost/CDCHost.c b/Demos/Host/LowLevel/CDCHost/CDCHost.c index b3e0674180..de7ab88c67 100644 --- a/Demos/Host/LowLevel/CDCHost/CDCHost.c +++ b/Demos/Host/LowLevel/CDCHost/CDCHost.c @@ -148,7 +148,7 @@ void CDC_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -162,7 +162,7 @@ void CDC_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c index 9f7da59982..a1b62ac62b 100644 --- a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c +++ b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c @@ -249,7 +249,7 @@ void HID_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -263,7 +263,7 @@ void HID_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c b/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c index 734ef2a572..2517848b00 100644 --- a/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c +++ b/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c @@ -213,7 +213,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -227,7 +227,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -257,7 +257,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c index 4e78b0de91..2ef15e7b81 100644 --- a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c +++ b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c @@ -148,7 +148,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -163,7 +163,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -182,7 +182,7 @@ void Keyboard_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c index 2f84d0fb83..1bb94f6c85 100644 --- a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c +++ b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c @@ -154,7 +154,7 @@ void MassStorage_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -168,7 +168,7 @@ void MassStorage_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -187,6 +187,8 @@ void MassStorage_Task(void) if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful) { ShowDiskReadError(PSTR("Get Max LUN"), false, ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -197,6 +199,8 @@ void MassStorage_Task(void) if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful) { ShowDiskReadError(PSTR("Mass Storage Reset"), false, ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -213,6 +217,8 @@ void MassStorage_Task(void) if (((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) || (SCSICommandStatus.Status != Command_Pass)) { ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -221,6 +227,8 @@ void MassStorage_Task(void) if (((ErrorCode = MassStore_Inquiry(0, &InquiryData)) != 0) || (SCSICommandStatus.Status != Command_Pass)) { ShowDiskReadError(PSTR("Inquiry"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -237,7 +245,9 @@ void MassStorage_Task(void) if ((ErrorCode = MassStore_TestUnitReady(0)) != 0) { ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode); - break; + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; } } while ((SCSICommandStatus.Status != Command_Pass) && USB_IsConnected); @@ -255,6 +265,8 @@ void MassStorage_Task(void) if (((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) || (SCSICommandStatus.Status != Command_Pass)) { ShowDiskReadError(PSTR("Read Capacity"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -269,6 +281,8 @@ void MassStorage_Task(void) (SCSICommandStatus.Status != Command_Pass)) { ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -319,6 +333,8 @@ void MassStorage_Task(void) (SCSICommandStatus.Status != Command_Pass)) { ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -339,8 +355,7 @@ void MassStorage_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_READY); /* Wait until USB device disconnected */ - while (USB_IsConnected); - + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } } @@ -372,7 +387,4 @@ void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t Erro /* Indicate device error via the status LEDs */ LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - - /* Wait until USB device disconnected */ - while (USB_IsConnected); } diff --git a/Demos/Host/LowLevel/MouseHost/MouseHost.c b/Demos/Host/LowLevel/MouseHost/MouseHost.c index 2a2e1b9948..d5c4bf9410 100644 --- a/Demos/Host/LowLevel/MouseHost/MouseHost.c +++ b/Demos/Host/LowLevel/MouseHost/MouseHost.c @@ -209,7 +209,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -223,7 +223,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -253,7 +253,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c index d7a947105c..1e931232c8 100644 --- a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c +++ b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c @@ -149,7 +149,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -163,7 +163,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -182,7 +182,7 @@ void Mouse_HID_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } diff --git a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c index 5243871239..0f511ad7aa 100644 --- a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c +++ b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c @@ -149,7 +149,7 @@ void StillImage_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -162,7 +162,7 @@ void StillImage_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -195,6 +195,8 @@ void StillImage_Task(void) if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError) { ShowCommandError(ErrorCode, false); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -246,6 +248,8 @@ void StillImage_Task(void) if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError) { ShowCommandError(ErrorCode, false); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -253,6 +257,8 @@ void StillImage_Task(void) if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK)) { ShowCommandError(PIMA_ReceivedBlock.Code, true); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -274,6 +280,8 @@ void StillImage_Task(void) if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError) { ShowCommandError(ErrorCode, false); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -281,6 +289,8 @@ void StillImage_Task(void) if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK)) { ShowCommandError(PIMA_ReceivedBlock.Code, true); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -302,6 +312,8 @@ void StillImage_Task(void) if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError) { ShowCommandError(ErrorCode, false); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -309,6 +321,8 @@ void StillImage_Task(void) if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK)) { ShowCommandError(PIMA_ReceivedBlock.Code, true); + + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -363,7 +377,4 @@ void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError) /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - - /* Wait until USB device disconnected */ - while (USB_IsConnected); } diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index 943cb73630..688143c08c 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.c +++ b/LUFA/Drivers/USB/Class/Host/CDC.c @@ -203,12 +203,12 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo) case HOST_STATE_Addressed: if ((ErrorCode = CDC_Host_ProcessConfigDescriptor(CDCInterfaceInfo)) != CDC_ENUMERROR_NoError) { - USB_HostState = HOST_STATE_Unattached; + USB_HostState = HOST_STATE_WaitForDeviceRemoval; } if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) { - USB_HostState = HOST_STATE_Unattached; + USB_HostState = HOST_STATE_WaitForDeviceRemoval; } USB_HostState = HOST_STATE_Configured; diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c index 037e6d80a8..78a9ca8fbd 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.c +++ b/LUFA/Drivers/USB/LowLevel/Host.c @@ -66,6 +66,7 @@ void USB_Host_ProcessNextHostState(void) USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle; break; case HOST_STATE_Attached_WaitForDeviceSettle: + #if HOST_DEVICE_SETTLE_DELAY_MS > 0 _delay_ms(1); if (!(WaitMSRemaining--)) @@ -78,6 +79,9 @@ void USB_Host_ProcessNextHostState(void) USB_HostState = HOST_STATE_Attached_WaitForConnect; } + #else + USB_HostState = HOST_STATE_Attached_WaitForConnect; + #endif break; case HOST_STATE_Attached_WaitForConnect: diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h index 08b21f688f..d91c1d82d5 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.h +++ b/LUFA/Drivers/USB/LowLevel/Host.h @@ -221,20 +221,103 @@ */ enum USB_Host_States_t { - HOST_STATE_WaitForDevice = 0, /**< Internally implemented by the library. */ - HOST_STATE_Unattached = 1, /**< Internally implemented by the library. */ - HOST_STATE_Attached = 2, /**< Internally implemented by the library. */ - HOST_STATE_Attached_WaitForDeviceSettle = 3, /**< Internally implemented by the library. */ - HOST_STATE_Attached_WaitForConnect = 4, /**< Internally implemented by the library. */ - HOST_STATE_Attached_DoReset = 5, /**< Internally implemented by the library. */ - HOST_STATE_Powered = 6, /**< Internally implemented by the library. */ - HOST_STATE_Default = 7, /**< Internally implemented by the library. */ - HOST_STATE_Default_PostReset = 8, /**< Internally implemented by the library. */ - HOST_STATE_Default_PostAddressSet = 9, /**< Internally implemented by the library. */ - HOST_STATE_Addressed = 10, /**< May be implemented by the user project. */ - HOST_STATE_Configured = 11, /**< May be implemented by the user project. */ - HOST_STATE_Ready = 12, /**< May be implemented by the user project. */ - HOST_STATE_Suspended = 13, /**< May be implemented by the user project. */ + HOST_STATE_WaitForDeviceRemoval = 0, /**< Internally implemented by the library. This state can be + * used by the library to wait until the attached device is + * removed by the user - useful for when an error occurs or + * further communication with the device is not needed. This + * allows for other code to run while the state machine is + * effectively disabled. + */ + HOST_STATE_WaitForDevice = 1, /**< Internally implemented by the library. This state indicates + * that the stack is waiting for an interval to elapse before + * continuing with the next step of the device enumeration + * process. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Unattached = 2, /**< Internally implemented by the library. This state indicates + * that the host state machine is waiting for a device to be + * attached so that it can start the enumeration process. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Attached = 3, /**< Internally implemented by the library. This state indicates + * that a device has been attached, and the library's internals + * are being configured to begin the enumeration process. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Attached_WaitForDeviceSettle = 4, /**< Internally implemented by the library. This state indicates + * that the stack is waiting for the initial settling period to + * elapse before beginning the enumeration process. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Attached_WaitForConnect = 5, /**< Internally implemented by the library. This state indicates + * that the stack is waiting for a connection event from the USB + * controller to indicate a valid USB device has been attached to + * the bus and is ready to be enumerated. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Attached_DoReset = 6, /**< Internally implemented by the library. This state indicates + * that a valid USB device has been attached, and that it is + * will now be reset to ensure it is ready for enumeration. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Powered = 7, /**< Internally implemented by the library. This state indicates + * that the attached device is currently powered and reset, and + * that the control pipe is now being configured by the stack. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Default = 8, /**< Internally implemented by the library. This state indicates + * that the stack is currently retrieving the control endpoint's + * size from the device, so that the control pipe can be altered + * to match. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Default_PostReset = 9, /**< Internally implemented by the library. This state indicates that + * the control pipe is being reconfigured to match the retrieved + * control endpoint size from the device, and the device's USB bus + * address is being set. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Default_PostAddressSet = 10, /**< Internally implemented by the library. This state indicates that + * the device's address has now been set, and the stack is has now + * completed the device enumeration process. This state causes the + * stack to change the current USB device address to that set for + * the connected device, before progressing to the user-implemented + * HOST_STATE_Addressed state for further communications. + * + * \note Do not manually change to this state in the user code. + */ + HOST_STATE_Addressed = 11, /**< May be implemented by the user project. This state should + * set the device configuration before progressing to the + * HOST_STATE_Configured state. Other processing (such as the + * retrieval and processing of the device descriptor) should also + * be placed in this state. + */ + HOST_STATE_Configured = 12, /**< May be implemented by the user project. This state should + * implement any extra device configuration (such as the setting of + * class-specific parameters) before normal communication is begun + * in the HOST_STATE_Ready state. + */ + HOST_STATE_Ready = 13, /**< May be implemented by the user project. This state should + * contain the main communications with the attached device. From this + * this state the host state machine should be changed to either + * HOST_STATE_Suspended (after the bus is manually suspended using the + * USB_Host_SuspendBus() macro) or HOST_STATE_WaitForDeviceRemoval as + * needed. + */ + HOST_STATE_Suspended = 15, /**< May be implemented by the user project. This state should be maintained + * while the bus is suspended, and changed to either the HOST_STATE_Ready + * (after resuming the bus with the USB_Host_ResumeBus() macro) or the + * HOST_STATE_WaitForDeviceRemoval states as needed. + */ }; /** Enum for the error codes for the \ref EVENT_USB_HostError() event. diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 0f582a6579..f22a9ff04f 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -21,6 +21,8 @@ * added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code * - Added new DATAFLASH_CHIP_MASK() macro to the Dataflash driver, which returns the Dataflash select mask for the given chip index * - Updated MassStorage device block write routines to use ping-pong Dataflash buffering to increase throughput by around 30% + * - Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking disabling of device communications until the + * device has been removed (for use when an error occurs or communications with the device have completed) * * Changed: * - Deprecated psuedo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused) diff --git a/LUFA/ManPages/CompileTimeTokens.txt b/LUFA/ManPages/CompileTimeTokens.txt index bc49ba2cc9..796ee84848 100644 --- a/LUFA/ManPages/CompileTimeTokens.txt +++ b/LUFA/ManPages/CompileTimeTokens.txt @@ -120,8 +120,8 @@ * HOST_DEVICE_SETTLE_DELAY_MS - ( \ref Group_Host ) \n * Some devices require a delay of up to 5 seconds after they are connected to VBUS before the enumeration process can be started, or * they will fail to enumerate correctly. By placing a delay before the enumeration process, it can be ensured that the bus has settled - * back to a known idle state before communications occur with the device. This token may be defined to a non-zero 16-bit value to set - * the device settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead. + * back to a known idle state before communications occur with the device. This token may be defined to a 16-bit value to set the device + * settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead. * * USE_STATIC_OPTIONS - ( \ref Group_USBManagement ) \n * By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt index 59a2790723..2e348d53ec 100644 --- a/LUFA/ManPages/FutureChanges.txt +++ b/LUFA/ManPages/FutureChanges.txt @@ -19,9 +19,9 @@ * -# Re-enable Host mode Class driver builds after completion * -# Update Host mode Class Driver demo .txt files * - Add standardized descriptor names to device and host class driver structures - * - Remove USE_NONSTANDARD_DESCRIPTOR_NAMES, make all typedefs unions to allow either naming scheme to be used * - Add in INTERRUPT_CONTROL_PIPE to use HSOFI to trigger calls to the host state machine * - Make Suspend host state suspend USB bus frames + * - Split StillImageHost demo into lib directory * - Add in Stream functions for PROGMEM, EEPROM -- move to templated system * - Debug mode for pipe/endpoint calls * - Test and document new FAST_STREAM_TRANSFERS compile time option diff --git a/Projects/MissileLauncher/MissileLauncher.c b/Projects/MissileLauncher/MissileLauncher.c index 192ca3340a..046c132f06 100644 --- a/Projects/MissileLauncher/MissileLauncher.c +++ b/Projects/MissileLauncher/MissileLauncher.c @@ -318,7 +318,7 @@ void HID_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } @@ -329,7 +329,7 @@ void HID_Host_Task(void) LEDs_SetAllLEDs(LEDMASK_USB_ERROR); /* Wait until USB device disconnected */ - while (USB_IsConnected); + USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; }