diff --git a/Demos/Host/CDCHost/CDCHost.c b/Demos/Host/CDCHost/CDCHost.c index a51f597a2f..9ecf060b3f 100644 --- a/Demos/Host/CDCHost/CDCHost.c +++ b/Demos/Host/CDCHost/CDCHost.c @@ -196,6 +196,9 @@ TASK(USB_CDC_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/GenericHIDHost/GenericHIDHost.c b/Demos/Host/GenericHIDHost/GenericHIDHost.c index 605fc6f678..4d2fefb38c 100644 --- a/Demos/Host/GenericHIDHost/GenericHIDHost.c +++ b/Demos/Host/GenericHIDHost/GenericHIDHost.c @@ -262,6 +262,9 @@ void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength) wLength: ReportLength, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request to the device */ USB_Host_SendControlRequest(ReportOUTData); } @@ -288,6 +291,9 @@ TASK(USB_HID_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/KeyboardHost/KeyboardHost.c b/Demos/Host/KeyboardHost/KeyboardHost.c index f73e568938..947f23281a 100644 --- a/Demos/Host/KeyboardHost/KeyboardHost.c +++ b/Demos/Host/KeyboardHost/KeyboardHost.c @@ -263,6 +263,9 @@ TASK(USB_Keyboard_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { @@ -310,6 +313,9 @@ TASK(USB_Keyboard_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/KeyboardHostWithParser/HIDReport.c b/Demos/Host/KeyboardHostWithParser/HIDReport.c index 89bd1c866e..d177a8877d 100644 --- a/Demos/Host/KeyboardHostWithParser/HIDReport.c +++ b/Demos/Host/KeyboardHostWithParser/HIDReport.c @@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void) wLength: HIDReportSize, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send control request to retrieve the HID report from the attached device */ if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful) return ParseControlError; diff --git a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c index eefd2fa56b..d19929d4d1 100644 --- a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c +++ b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c @@ -199,6 +199,9 @@ TASK(USB_Keyboard_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/MassStorageHost/MassStorageHost.c b/Demos/Host/MassStorageHost/MassStorageHost.c index a7b550ca74..ec5bc6107b 100644 --- a/Demos/Host/MassStorageHost/MassStorageHost.c +++ b/Demos/Host/MassStorageHost/MassStorageHost.c @@ -170,6 +170,9 @@ TASK(USB_MassStore_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/MassStorageHost/MassStoreCommands.c b/Demos/Host/MassStorageHost/MassStoreCommands.c index 0d88acbd56..bf736e79c4 100644 --- a/Demos/Host/MassStorageHost/MassStoreCommands.c +++ b/Demos/Host/MassStorageHost/MassStoreCommands.c @@ -256,6 +256,9 @@ uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(NULL); } @@ -275,6 +278,9 @@ uint8_t MassStore_MassStorageReset(void) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(NULL); } @@ -298,6 +304,9 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) wLength: 1, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) == HOST_SENDCONTROL_SetupStalled) { /* Clear the pipe stall */ diff --git a/Demos/Host/MouseHost/MouseHost.c b/Demos/Host/MouseHost/MouseHost.c index 29cbd8741b..ff2542834e 100644 --- a/Demos/Host/MouseHost/MouseHost.c +++ b/Demos/Host/MouseHost/MouseHost.c @@ -259,6 +259,9 @@ TASK(USB_Mouse_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { @@ -306,6 +309,9 @@ TASK(USB_Mouse_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/MouseHostWithParser/HIDReport.c b/Demos/Host/MouseHostWithParser/HIDReport.c index 55f250dd98..3d06bb1409 100644 --- a/Demos/Host/MouseHostWithParser/HIDReport.c +++ b/Demos/Host/MouseHostWithParser/HIDReport.c @@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void) wLength: HIDReportSize, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send control request to retrieve the HID report from the attached device */ if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful) return ParseControlError; diff --git a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c index 79cecdf5b2..6aeca4ba56 100644 --- a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c +++ b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c @@ -200,6 +200,9 @@ TASK(USB_Mouse_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) { diff --git a/Demos/Host/StillImageHost/StillImageCommands.c b/Demos/Host/StillImageHost/StillImageCommands.c index be6f7482df..43e57e126e 100644 --- a/Demos/Host/StillImageHost/StillImageCommands.c +++ b/Demos/Host/StillImageHost/StillImageCommands.c @@ -272,5 +272,8 @@ uint8_t SImage_ClearPipeStall(const uint8_t PipeEndpointNum) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(NULL); } diff --git a/Demos/Host/StillImageHost/StillImageHost.c b/Demos/Host/StillImageHost/StillImageHost.c index 787629c3b2..1694322ee8 100644 --- a/Demos/Host/StillImageHost/StillImageHost.c +++ b/Demos/Host/StillImageHost/StillImageHost.c @@ -165,6 +165,9 @@ TASK(USB_SImage_Host) wLength: 0, }; + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); + /* Send the request, display error and wait for device detach if request fails */ if (USB_Host_SendControlRequest(NULL) != HOST_SENDCONTROL_Successful) { diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt index 78f1ec7474..80436f66a9 100644 --- a/LUFA/ChangeLog.txt +++ b/LUFA/ChangeLog.txt @@ -31,6 +31,9 @@ * - Fixed WriteNextReport code in the GenericHIDHost demo using incorrect parameter types and not selecting the correct endpoint * - Adjusted sample CTC timer calculations in the AudioOutput and AudioInput demos to account for situations where the division results * in a value with no remainder, requiring one to be subtracted from the result (thanks to Robin Theunis) + * - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0), so that other control type + * pipes can be used with the function + * - The USB Host management task now saves and restores the currently selected pipe before and after the task completes * * \section Sec_ChangeLog090401 Version 090401 * diff --git a/LUFA/Drivers/USB/Class/ConfigDescriptor.c b/LUFA/Drivers/USB/Class/ConfigDescriptor.c index d79106916f..f22426bf06 100644 --- a/LUFA/Drivers/USB/Class/ConfigDescriptor.c +++ b/LUFA/Drivers/USB/Class/ConfigDescriptor.c @@ -43,6 +43,8 @@ uint8_t USB_Host_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* wLength: sizeof(USB_Descriptor_Configuration_Header_t), }; + Pipe_SelectPipe(PIPE_CONTROLPIPE); + if (BufferPtr == NULL) { uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)]; diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c index 395f2d25e4..e62ac687fc 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.c +++ b/LUFA/Drivers/USB/HighLevel/USBTask.c @@ -86,6 +86,10 @@ static void USB_HostTask(void) static uint16_t WaitMSRemaining; static uint8_t PostWaitState; + uint8_t PrevPipe = Pipe_GetCurrentPipe(); + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + switch (USB_HostState) { case HOST_STATE_WaitForDevice: @@ -249,5 +253,7 @@ static void USB_HostTask(void) USB_ResetInterface(); } + + Pipe_SelectPipe(PrevPipe); } #endif diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.c b/LUFA/Drivers/USB/LowLevel/HostChapter9.c index 123a1d25f3..5367c984cb 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.c @@ -50,7 +50,6 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) return ReturnStatus; - Pipe_SelectPipe(PIPE_CONTROLPIPE); Pipe_SetToken(PIPE_TOKEN_SETUP); Pipe_ClearErrorFlags(); Pipe_ClearSetupSent(); diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h index 84ee8ae8a8..7ced889b33 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h @@ -95,7 +95,7 @@ /* Function Prototypes: */ /** Sends the request stored in the USB_HostRequest global structure to the attached device, * and transfers the data stored in the buffer to the device, or from the device to the buffer - * as requested. + * as requested. The transfer is made on the currently selected pipe. * * \param BufferPtr Pointer to the start of the data buffer if the request has a data stage, or * NULL if the request transfers no data to or from the device. diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt index 9aa3b0005f..49fa25dea8 100644 --- a/LUFA/MigrationInformation.txt +++ b/LUFA/MigrationInformation.txt @@ -12,6 +12,12 @@ * * \section Sec_MigrationXXXXXX Migrating from 090401 to XXXXXX * + * Host Mode + * - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0) to allow it to be used on + * other control type pipes. Care should be taken to ensure that the Control pipe is always selected before the function is called + * in existing projects where the Control pipe is to be operated on. + * - The USB Host management task now saves and restores the currently selected pipe before and after the task runs. Projects no longer + * need to manage this manually when calling the USB management task. * * \section Sec_Migration090401 Migrating from 090209 to 090401 *