Commit 6a5a37d7 authored by Dean Camera's avatar Dean Camera
Browse files

The USB_Host_SendControlRequest() function no longer automatically selects the...

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.
parent fea5d085
...@@ -196,6 +196,9 @@ TASK(USB_CDC_Host) ...@@ -196,6 +196,9 @@ TASK(USB_CDC_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -262,6 +262,9 @@ void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength) ...@@ -262,6 +262,9 @@ void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength)
wLength: ReportLength, wLength: ReportLength,
}; };
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
/* Send the request to the device */ /* Send the request to the device */
USB_Host_SendControlRequest(ReportOUTData); USB_Host_SendControlRequest(ReportOUTData);
} }
...@@ -288,6 +291,9 @@ TASK(USB_HID_Host) ...@@ -288,6 +291,9 @@ TASK(USB_HID_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -263,6 +263,9 @@ TASK(USB_Keyboard_Host) ...@@ -263,6 +263,9 @@ TASK(USB_Keyboard_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
...@@ -310,6 +313,9 @@ TASK(USB_Keyboard_Host) ...@@ -310,6 +313,9 @@ TASK(USB_Keyboard_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void) ...@@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void)
wLength: HIDReportSize, 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 */ /* Send control request to retrieve the HID report from the attached device */
if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful) if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful)
return ParseControlError; return ParseControlError;
......
...@@ -199,6 +199,9 @@ TASK(USB_Keyboard_Host) ...@@ -199,6 +199,9 @@ TASK(USB_Keyboard_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -170,6 +170,9 @@ TASK(USB_MassStore_Host) ...@@ -170,6 +170,9 @@ TASK(USB_MassStore_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -256,6 +256,9 @@ uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum) ...@@ -256,6 +256,9 @@ uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum)
wLength: 0, wLength: 0,
}; };
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
return USB_Host_SendControlRequest(NULL); return USB_Host_SendControlRequest(NULL);
} }
...@@ -275,6 +278,9 @@ uint8_t MassStore_MassStorageReset(void) ...@@ -275,6 +278,9 @@ uint8_t MassStore_MassStorageReset(void)
wLength: 0, wLength: 0,
}; };
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
return USB_Host_SendControlRequest(NULL); return USB_Host_SendControlRequest(NULL);
} }
...@@ -298,6 +304,9 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) ...@@ -298,6 +304,9 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
wLength: 1, wLength: 1,
}; };
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) == HOST_SENDCONTROL_SetupStalled) if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) == HOST_SENDCONTROL_SetupStalled)
{ {
/* Clear the pipe stall */ /* Clear the pipe stall */
......
...@@ -259,6 +259,9 @@ TASK(USB_Mouse_Host) ...@@ -259,6 +259,9 @@ TASK(USB_Mouse_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
...@@ -306,6 +309,9 @@ TASK(USB_Mouse_Host) ...@@ -306,6 +309,9 @@ TASK(USB_Mouse_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void) ...@@ -56,6 +56,9 @@ uint8_t GetHIDReportData(void)
wLength: HIDReportSize, 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 */ /* Send control request to retrieve the HID report from the attached device */
if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful) if (USB_Host_SendControlRequest(HIDReportData) != HOST_SENDCONTROL_Successful)
return ParseControlError; return ParseControlError;
......
...@@ -200,6 +200,9 @@ TASK(USB_Mouse_Host) ...@@ -200,6 +200,9 @@ TASK(USB_Mouse_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -272,5 +272,8 @@ uint8_t SImage_ClearPipeStall(const uint8_t PipeEndpointNum) ...@@ -272,5 +272,8 @@ uint8_t SImage_ClearPipeStall(const uint8_t PipeEndpointNum)
wLength: 0, wLength: 0,
}; };
/* Select the control pipe for the request transfer */
Pipe_SelectPipe(PIPE_CONTROLPIPE);
return USB_Host_SendControlRequest(NULL); return USB_Host_SendControlRequest(NULL);
} }
...@@ -165,6 +165,9 @@ TASK(USB_SImage_Host) ...@@ -165,6 +165,9 @@ TASK(USB_SImage_Host)
wLength: 0, 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 */ /* Send the request, display error and wait for device detach if request fails */
if (USB_Host_SendControlRequest(NULL) != HOST_SENDCONTROL_Successful) if (USB_Host_SendControlRequest(NULL) != HOST_SENDCONTROL_Successful)
{ {
......
...@@ -31,6 +31,9 @@ ...@@ -31,6 +31,9 @@
* - Fixed WriteNextReport code in the GenericHIDHost demo using incorrect parameter types and not selecting the correct endpoint * - 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 * - 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) * 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 * \section Sec_ChangeLog090401 Version 090401
* *
......
...@@ -43,6 +43,8 @@ uint8_t USB_Host_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* ...@@ -43,6 +43,8 @@ uint8_t USB_Host_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void*
wLength: sizeof(USB_Descriptor_Configuration_Header_t), wLength: sizeof(USB_Descriptor_Configuration_Header_t),
}; };
Pipe_SelectPipe(PIPE_CONTROLPIPE);
if (BufferPtr == NULL) if (BufferPtr == NULL)
{ {
uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)]; uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
......
...@@ -86,6 +86,10 @@ static void USB_HostTask(void) ...@@ -86,6 +86,10 @@ static void USB_HostTask(void)
static uint16_t WaitMSRemaining; static uint16_t WaitMSRemaining;
static uint8_t PostWaitState; static uint8_t PostWaitState;
uint8_t PrevPipe = Pipe_GetCurrentPipe();
Pipe_SelectPipe(PIPE_CONTROLPIPE);
switch (USB_HostState) switch (USB_HostState)
{ {
case HOST_STATE_WaitForDevice: case HOST_STATE_WaitForDevice:
...@@ -249,5 +253,7 @@ static void USB_HostTask(void) ...@@ -249,5 +253,7 @@ static void USB_HostTask(void)
USB_ResetInterface(); USB_ResetInterface();
} }
Pipe_SelectPipe(PrevPipe);
} }
#endif #endif
...@@ -50,7 +50,6 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) ...@@ -50,7 +50,6 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
return ReturnStatus; return ReturnStatus;
Pipe_SelectPipe(PIPE_CONTROLPIPE);
Pipe_SetToken(PIPE_TOKEN_SETUP); Pipe_SetToken(PIPE_TOKEN_SETUP);
Pipe_ClearErrorFlags(); Pipe_ClearErrorFlags();
Pipe_ClearSetupSent(); Pipe_ClearSetupSent();
......
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
/* Function Prototypes: */ /* Function Prototypes: */
/** Sends the request stored in the USB_HostRequest global structure to the attached device, /** 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 * 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 * \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. * NULL if the request transfers no data to or from the device.
......
...@@ -12,6 +12,12 @@ ...@@ -12,6 +12,12 @@
* *
* \section Sec_MigrationXXXXXX Migrating from 090401 to XXXXXX * \section Sec_MigrationXXXXXX Migrating from 090401 to XXXXXX
* *
* <b>Host Mode</b>
* - 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 * \section Sec_Migration090401 Migrating from 090209 to 090401
* *
......
Supports Markdown
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