X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/071e02c6b6b4837fa9cf0b6d4c749994e02638d7..6fa8da4e561ee920f66ece42ce7e937a5399626d:/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c index 129c50af8..e2887f513 100644 --- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c +++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. - + Copyright (C) Dean Camera, 2012. + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) - Permission to use, copy, modify, distribute, and sell this + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -46,7 +46,7 @@ * larger value in the project makefile and passing it to the compiler * via the -D switch. */ - + #define INCLUDE_FROM_MASSSTORE_COMMANDS_C #include "MassStoreCommands.h" @@ -63,43 +63,55 @@ static uint32_t MassStore_Tag = 1; * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum */ -static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr) +static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommandBlock, + void* BufferPtr) { uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Each transmission should have a unique tag value, increment before use */ - SCSICommandBlock->Tag = ++MassStore_Tag; - /* Wrap Tag value when invalid - MS class defines tag values of 0 and 0xFFFFFFFF to be invalid */ - if (MassStore_Tag == 0xFFFFFFFF) + if (++MassStore_Tag == 0xFFFFFFFF) MassStore_Tag = 1; + /* Each transmission should have a unique tag value, increment before use */ + SCSICommandBlock->Tag = MassStore_Tag; + /* Select the OUT data pipe for CBW transmission */ Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE); Pipe_Unfreeze(); /* Write the CBW command to the OUT pipe */ - if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(CommandBlockWrapper_t))) != PIPE_RWSTREAM_NoError) - return ErrorCode; + if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t), NULL)) != + PIPE_RWSTREAM_NoError) + { + Pipe_Freeze(); + return ErrorCode; + } /* Send the data in the OUT pipe to the attached device */ Pipe_ClearOUT(); - + /* Wait until command has been sent */ Pipe_WaitUntilReady(); /* Freeze pipe after use */ Pipe_Freeze(); - - /* Send data if any */ - if ((BufferPtr != NULL) && - ((ErrorCode = MassStore_SendReceiveData(SCSICommandBlock, BufferPtr)) != PIPE_READYWAIT_NoError)) + + if (BufferPtr != NULL) { - Pipe_Freeze(); - return ErrorCode; + /* Transfer the requested data (if any) to or from the device */ + ErrorCode = MassStore_SendReceiveData(SCSICommandBlock, (void*)BufferPtr); + + /* Only fail completely if the transfer fails without a STALL, as a logical STALL can be recovered from */ + if ((ErrorCode != PIPE_RWSTREAM_NoError) && (ErrorCode != PIPE_RWSTREAM_PipeStalled)) + { + Pipe_Freeze(); + return ErrorCode; + } } - - return ErrorCode; + + /* Retrieve the returned SCSI status from the device */ + MS_CommandStatusWrapper_t SCSIStatusBlock; + return MassStore_GetReturnedStatus(&SCSIStatusBlock); } /** Waits until the attached device is ready to accept data following a CBW, checking @@ -109,7 +121,8 @@ static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* SCSICommandBlock, vo */ static uint8_t MassStore_WaitForDataReceived(void) { - uint16_t TimeoutMSRem = COMMAND_DATA_TIMEOUT_MS; + uint16_t TimeoutMSRem = COMMAND_DATA_TIMEOUT_MS; + uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber(); /* Select the IN data pipe for data reception */ Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); @@ -118,18 +131,20 @@ static uint8_t MassStore_WaitForDataReceived(void) /* Wait until data received in the IN pipe */ while (!(Pipe_IsINReceived())) { + uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); + /* Check to see if a new frame has been issued (1ms elapsed) */ - if (USB_INT_HasOccurred(USB_INT_HSOFI)) + if (CurrentFrameNumber != PreviousFrameNumber) { - /* Clear the flag and decrement the timeout period counter */ - USB_INT_Clear(USB_INT_HSOFI); + /* Save the new frame number and decrement the timeout period */ + PreviousFrameNumber = CurrentFrameNumber; TimeoutMSRem--; /* Check to see if the timeout period for the command has elapsed */ if (!(TimeoutMSRem)) return PIPE_RWSTREAM_Timeout; } - + Pipe_Freeze(); Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE); Pipe_Unfreeze(); @@ -138,11 +153,11 @@ 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; } - + Pipe_Freeze(); Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Unfreeze(); @@ -151,19 +166,19 @@ 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; } - + /* Check to see if the device was disconnected, if so exit function */ if (USB_HostState == HOST_STATE_Unattached) return PIPE_RWSTREAM_DeviceDisconnected; }; - + Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Freeze(); - + Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE); Pipe_Freeze(); @@ -178,24 +193,25 @@ static uint8_t MassStore_WaitForDataReceived(void) * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum */ -static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr) +static uint8_t MassStore_SendReceiveData(MS_CommandBlockWrapper_t* const SCSICommandBlock, + void* BufferPtr) { uint8_t ErrorCode = PIPE_RWSTREAM_NoError; uint16_t BytesRem = SCSICommandBlock->DataTransferLength; /* Check the direction of the SCSI command data stage */ - if (SCSICommandBlock->Flags & COMMAND_DIRECTION_DATA_IN) + if (SCSICommandBlock->Flags & MS_COMMAND_DIR_DATA_IN) { /* Wait until the device has replied with some data */ if ((ErrorCode = MassStore_WaitForDataReceived()) != PIPE_RWSTREAM_NoError) return ErrorCode; - + /* Select the IN data pipe for data reception */ Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Unfreeze(); - + /* Read in the block data from the pipe */ - if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_NoError) + if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError) return ErrorCode; /* Acknowledge the packet */ @@ -208,19 +224,19 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* SCSICommandBlock Pipe_Unfreeze(); /* Write the block data to the pipe */ - if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_NoError) + if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError) return ErrorCode; /* Acknowledge the packet */ Pipe_ClearOUT(); - + while (!(Pipe_IsOUTReady())) { if (USB_HostState == HOST_STATE_Unattached) return PIPE_RWSTREAM_DeviceDisconnected; } } - + /* Freeze used pipe after use */ Pipe_Freeze(); @@ -233,7 +249,7 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* SCSICommandBlock * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* SCSICommandStatus) +static uint8_t MassStore_GetReturnedStatus(MS_CommandStatusWrapper_t* const SCSICommandStatus) { uint8_t ErrorCode = PIPE_RWSTREAM_NoError; @@ -244,44 +260,65 @@ static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* SCSICommandSt /* Select the IN data pipe for data reception */ Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Unfreeze(); - + /* Load in the CSW from the attached device */ - if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(CommandStatusWrapper_t))) != PIPE_RWSTREAM_NoError) - return ErrorCode; - + if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t), NULL)) != + PIPE_RWSTREAM_NoError) + { + return ErrorCode; + } + /* Clear the data ready for next reception */ Pipe_ClearIN(); - + /* Freeze the IN pipe after use */ Pipe_Freeze(); - + /* Check to see if command failed */ - if (SCSICommandStatus->Status != Command_Pass) + if (SCSICommandStatus->Status != MS_SCSI_COMMAND_Pass) ErrorCode = MASS_STORE_SCSI_COMMAND_FAILED; - + return ErrorCode; } /** 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 successfully. * * \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), - .bRequest = REQ_MassStorageReset, + .bRequest = MS_REQ_MassStorageReset, .wValue = 0, .wIndex = 0, .wLength = 0, }; - + /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); - return USB_Host_SendControlRequest(NULL); + 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); + + 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 @@ -297,17 +334,17 @@ uint8_t MassStore_MassStorageReset(void) */ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) { - uint8_t ErrorCode = HOST_SENDCONTROL_Successful; + uint8_t ErrorCode; USB_ControlRequest = (USB_Request_Header_t) { .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), - .bRequest = REQ_GetMaxLUN, + .bRequest = MS_REQ_GetMaxLUN, .wValue = 0, .wIndex = 0, .wLength = 1, }; - + /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); @@ -315,14 +352,14 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) { /* Clear the pipe stall */ Pipe_ClearStall(); - + /* Some faulty Mass Storage devices don't implement the GET_MAX_LUN request, so assume a single LUN */ *MaxLUNIndex = 0; - + /* Clear the error, and pretend the request executed correctly if the device STALLed it */ ErrorCode = HOST_SENDCONTROL_Successful; } - + return ErrorCode; } @@ -334,16 +371,15 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_Inquiry(const uint8_t LUNIndex, SCSI_Inquiry_Response_t* const InquiryPtr) +uint8_t MassStore_Inquiry(const uint8_t LUNIndex, + SCSI_Inquiry_Response_t* const InquiryPtr) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to issue INQUIRY command */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = sizeof(SCSI_Inquiry_Response_t), - .Flags = COMMAND_DIRECTION_DATA_IN, + .Flags = MS_COMMAND_DIR_DATA_IN, .LUN = LUNIndex, .SCSICommandLength = 6, .SCSICommandData = @@ -356,24 +392,9 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex, SCSI_Inquiry_Response_t* const 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, InquiryPtr)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, InquiryPtr); } /** Issues a SCSI Request Sense command to the attached device, to determine the current SCSI sense information. This @@ -384,16 +405,15 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex, SCSI_Inquiry_Response_t* const * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_RequestSense(const uint8_t LUNIndex, SCSI_Request_Sense_Response_t* const SensePtr) +uint8_t MassStore_RequestSense(const uint8_t LUNIndex, + SCSI_Request_Sense_Response_t* const SensePtr) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to issue REQUEST SENSE command */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = sizeof(SCSI_Request_Sense_Response_t), - .Flags = COMMAND_DIRECTION_DATA_IN, + .Flags = MS_COMMAND_DIR_DATA_IN, .LUN = LUNIndex, .SCSICommandLength = 6, .SCSICommandData = @@ -406,24 +426,9 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, SCSI_Request_Sense_Respon 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, SensePtr)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, SensePtr); } /** Issues a SCSI Device Block Read command to the attached device, to read in one or more data blocks from the @@ -437,17 +442,18 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, SCSI_Request_Sense_Respon * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAddress, - const uint8_t Blocks, const uint16_t BlockSize, void* BufferPtr) +uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, + const uint32_t BlockAddress, + const uint8_t Blocks, + const uint16_t BlockSize, + void* BufferPtr) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to read in the given blocks from the device */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = ((uint32_t)Blocks * BlockSize), - .Flags = COMMAND_DIRECTION_DATA_IN, + .Flags = MS_COMMAND_DIR_DATA_IN, .LUN = LUNIndex, .SCSICommandLength = 10, .SCSICommandData = @@ -458,30 +464,15 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAd (BlockAddress >> 16), (BlockAddress >> 8), (BlockAddress & 0xFF), // LSB of Block Address - 0x00, // Unused (reserved) + 0x00, // Reserved 0x00, // MSB of Total Blocks to Read Blocks, // LSB of Total Blocks to Read 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, BufferPtr); } /** Issues a SCSI Device Block Write command to the attached device, to write one or more data blocks to the @@ -495,17 +486,18 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAd * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAddress, - const uint8_t Blocks, const uint16_t BlockSize, void* BufferPtr) +uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, + const uint32_t BlockAddress, + const uint8_t Blocks, + const uint16_t BlockSize, + void* BufferPtr) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to write the given blocks to the device */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = ((uint32_t)Blocks * BlockSize), - .Flags = COMMAND_DIRECTION_DATA_OUT, + .Flags = MS_COMMAND_DIR_DATA_OUT, .LUN = LUNIndex, .SCSICommandLength = 10, .SCSICommandData = @@ -522,24 +514,9 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockA 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, BufferPtr); } /** Issues a SCSI Device Test Unit Ready command to the attached device, to determine if the device is ready to accept @@ -551,14 +528,12 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockA */ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to issue TEST UNIT READY command */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = 0, - .Flags = COMMAND_DIRECTION_DATA_IN, + .Flags = MS_COMMAND_DIR_DATA_IN, .LUN = LUNIndex, .SCSICommandLength = 6, .SCSICommandData = @@ -571,24 +546,9 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, NULL); } /** Issues a SCSI Device Read Capacity command to the attached device, to determine the capacity of the @@ -599,16 +559,17 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const CapacityPtr) +uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, + SCSI_Capacity_t* const CapacityPtr) { uint8_t ErrorCode = PIPE_RWSTREAM_NoError; /* Create a CBW with a SCSI command to issue READ CAPACITY command */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = sizeof(SCSI_Capacity_t), - .Flags = COMMAND_DIRECTION_DATA_IN, + .Flags = MS_COMMAND_DIR_DATA_IN, .LUN = LUNIndex, .SCSICommandLength = 10, .SCSICommandData = @@ -625,26 +586,14 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const Ca 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, CapacityPtr)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - + return ErrorCode; + /* Endian-correct the read data */ CapacityPtr->Blocks = SwapEndian_32(CapacityPtr->Blocks); CapacityPtr->BlockSize = SwapEndian_32(CapacityPtr->BlockSize); - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } return ErrorCode; } @@ -658,16 +607,15 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const Ca * * \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails */ -uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, const bool PreventRemoval) +uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, + const bool PreventRemoval) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; - /* Create a CBW with a SCSI command to issue PREVENT ALLOW MEDIUM REMOVAL command */ - CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) + MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) { - .Signature = CBW_SIGNATURE, + .Signature = MS_CBW_SIGNATURE, .DataTransferLength = 0, - .Flags = COMMAND_DIRECTION_DATA_OUT, + .Flags = MS_COMMAND_DIR_DATA_OUT, .LUN = LUNIndex, .SCSICommandLength = 6, .SCSICommandData = @@ -680,22 +628,8 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, const bool P 0x00 // Unused (control) } }; - - CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ - if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - /* Retrieve status information from the attached device */ - if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) - { - Pipe_Freeze(); - return ErrorCode; - } - - return ErrorCode; + return MassStore_SendCommand(&SCSICommandBlock, NULL); } +