From a233109909f0e8d3cf578733f088a20474b3c43f Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 24 Aug 2011 09:50:21 +0000 Subject: Renamed USB_Host_ClearPipeStall() to USB_Host_ClearEndpointStall() as the function works on an endpoint address within the attached device, and not a Pipe within the host. Updated MS_Host_ResetMSInterface() to now perform a full Mass Storage reset sequence to prevent data corruption in the event of a device lock up or timeout (thanks to David Lyons). Add parenthesis around the library Endianness macros that do nothing on a particular architecture to prevent operator precedence issues depending on usage. Minor documentation corrections. --- .../MassStorageHost/Lib/MassStoreCommands.c | 26 ++++++++++++++++++---- .../StillImageHost/Lib/StillImageCommands.c | 4 ++-- 2 files changed, 24 insertions(+), 6 deletions(-) (limited to 'Demos') diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c index 48d6035695..fea9704f1d 100644 --- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c +++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c @@ -145,7 +145,7 @@ static uint8_t MassStore_WaitForDataReceived(void) if (Pipe_IsStalled()) { /* Clear the stall condition on the OUT pipe */ - USB_Host_ClearPipeStall(MASS_STORE_DATA_OUT_PIPE); + USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); return PIPE_RWSTREAM_PipeStalled; } @@ -158,7 +158,7 @@ static uint8_t MassStore_WaitForDataReceived(void) if (Pipe_IsStalled()) { /* Clear the stall condition on the IN pipe */ - USB_Host_ClearPipeStall(MASS_STORE_DATA_IN_PIPE); + USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); return PIPE_RWSTREAM_PipeStalled; } @@ -274,12 +274,15 @@ static uint8_t MassStore_GetReturnedStatus(MS_CommandStatusWrapper_t* const SCSI } /** Issues a Mass Storage class specific request to reset the attached device's Mass Storage interface, - * readying the device for the next CBW. + * readying the device for the next CBW. The Data endpoints are cleared of any STALL condition once this + * command completes sucessfuly. * * \return A value from the USB_Host_SendControlErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ uint8_t MassStore_MassStorageReset(void) { + uint8_t ErrorCode; + USB_ControlRequest = (USB_Request_Header_t) { .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), @@ -291,8 +294,23 @@ uint8_t MassStore_MassStorageReset(void) /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); + + if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) + return ErrorCode; + + /* Select first data pipe to clear STALL condition if one exists */ + Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); + + if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful) + return ErrorCode; + + /* Select second data pipe to clear STALL condition if one exists */ + Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE); - return USB_Host_SendControlRequest(NULL); + if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful) + return ErrorCode; + + return HOST_SENDCONTROL_Successful; } /** Issues a Mass Storage class specific request to determine the index of the highest numbered Logical diff --git a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c index 846a1387a7..5274ab0932 100644 --- a/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c +++ b/Demos/Host/LowLevel/StillImageHost/Lib/StillImageCommands.c @@ -140,7 +140,7 @@ uint8_t SImage_ReceiveBlockHeader(void) if (Pipe_IsStalled()) { /* Clear the stall condition on the OUT pipe */ - USB_Host_ClearPipeStall(SIMAGE_DATA_OUT_PIPE); + USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); /* Return error code and break out of the loop */ return PIPE_RWSTREAM_PipeStalled; @@ -154,7 +154,7 @@ uint8_t SImage_ReceiveBlockHeader(void) if (Pipe_IsStalled()) { /* Clear the stall condition on the IN pipe */ - USB_Host_ClearPipeStall(SIMAGE_DATA_IN_PIPE); + USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); /* Return error code */ return PIPE_RWSTREAM_PipeStalled; -- cgit v1.2.3