diff options
Diffstat (limited to 'Demos/Host/LowLevel/MassStorageHost/Lib')
3 files changed, 78 insertions, 75 deletions
diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c index c86e51b0c..712589660 100644 --- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c +++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.c @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 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" @@ -85,13 +85,13 @@ static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlo /* 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)) @@ -99,7 +99,7 @@ static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlo Pipe_Freeze(); return ErrorCode; } - + return ErrorCode; } @@ -116,12 +116,12 @@ static uint8_t MassStore_WaitForDataReceived(void) /* Select the IN data pipe for data reception */ Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Unfreeze(); - + /* 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 (CurrentFrameNumber != PreviousFrameNumber) { @@ -133,7 +133,7 @@ static uint8_t MassStore_WaitForDataReceived(void) if (!(TimeoutMSRem)) return PIPE_RWSTREAM_Timeout; } - + Pipe_Freeze(); Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE); Pipe_Unfreeze(); @@ -146,7 +146,7 @@ static uint8_t MassStore_WaitForDataReceived(void) return PIPE_RWSTREAM_PipeStalled; } - + Pipe_Freeze(); Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); Pipe_Unfreeze(); @@ -159,15 +159,15 @@ static uint8_t MassStore_WaitForDataReceived(void) 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(); @@ -194,11 +194,11 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSIComman /* 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) return ErrorCode; @@ -218,14 +218,14 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSIComman /* 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(); @@ -249,21 +249,21 @@ static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICom /* 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; - + /* 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) ErrorCode = MASS_STORE_SCSI_COMMAND_FAILED; - + return ErrorCode; } @@ -282,7 +282,7 @@ uint8_t MassStore_MassStorageReset(void) .wIndex = 0, .wLength = 0, }; - + /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); @@ -312,7 +312,7 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex) .wIndex = 0, .wLength = 1, }; - + /* Select the control pipe for the request transfer */ Pipe_SelectPipe(PIPE_CONTROLPIPE); @@ -320,14 +320,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; } @@ -362,7 +362,7 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -371,7 +371,7 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex, Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -413,7 +413,7 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -422,7 +422,7 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -474,7 +474,7 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -483,7 +483,7 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -535,7 +535,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -544,7 +544,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -564,7 +564,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, */ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) { - uint8_t ErrorCode = PIPE_RWSTREAM_NoError; + uint8_t ErrorCode = PIPE_RWSTREAM_NoError; /* Create a CBW with a SCSI command to issue TEST UNIT READY command */ CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t) @@ -584,7 +584,7 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -593,7 +593,7 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex) Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -639,7 +639,7 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -648,11 +648,11 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, Pipe_Freeze(); 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) { @@ -695,7 +695,7 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, 0x00 // Unused (control) } }; - + CommandStatusWrapper_t SCSICommandStatus; /* Send the command and any data to the attached device */ @@ -704,7 +704,7 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, Pipe_Freeze(); return ErrorCode; } - + /* Retrieve status information from the attached device */ if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError) { @@ -714,3 +714,4 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, return ErrorCode; } + diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h index 628066363..8fcffe424 100644 --- a/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h +++ b/Demos/Host/LowLevel/MassStorageHost/Lib/MassStoreCommands.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 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 @@ -32,7 +32,7 @@ * * Header file for MassStoreCommands.c. */ - + #ifndef _MASS_STORE_COMMANDS_H_ #define _MASS_STORE_COMMANDS_H_ @@ -56,16 +56,16 @@ /** Command Static Wrapper signature byte, for verification of valid CSW blocks. */ #define CSW_SIGNATURE 0x53425355UL - + /** Data direction mask for the Flags field of a CBW, indicating Host-to-Device transfer direction. */ #define COMMAND_DIRECTION_DATA_OUT (0 << 7) /** Data direction mask for the Flags field of a CBW, indicating Device-to-Host transfer direction. */ #define COMMAND_DIRECTION_DATA_IN (1 << 7) - + /** Timeout period between the issuing of a CBW to a device, and the reception of the first packet. */ #define COMMAND_DATA_TIMEOUT_MS 10000 - + /** Additional error code for Mass Storage functions when a device returns a logical command failure. */ #define MASS_STORE_SCSI_COMMAND_FAILED 0xC0 @@ -83,7 +83,7 @@ uint8_t SCSICommandLength; /**< Length of the SCSI command in the CBW */ uint8_t SCSICommandData[16]; /**< SCSI command to issue to the device */ } CommandBlockWrapper_t; - + /** Type define for a Mass Storage class Command Status Wrapper, used to wrap SCSI * responses for transport over the USB bulk endpoints from the device. */ @@ -94,7 +94,7 @@ uint32_t DataTransferResidue; /**< Length of data not transferred */ uint8_t Status; /**< Command status, a value from the MassStorageHost_CommandStatusCodes_t enum */ } CommandStatusWrapper_t; - + /** Type define for a SCSI Sense structure. Structures of this type are filled out by the * device via the \ref MassStore_RequestSense() function, indicating the current sense data of the * device (giving explicit error codes for the last issued command). For details of the @@ -105,13 +105,13 @@ uint8_t ResponseCode; uint8_t SegmentNumber; - + unsigned char SenseKey : 4; unsigned char Reserved : 1; unsigned char ILI : 1; unsigned char EOM : 1; unsigned char FileMark : 1; - + uint8_t Information[4]; uint8_t AdditionalLength; uint8_t CmdSpecificInformation[4]; @@ -129,12 +129,12 @@ { unsigned char DeviceType : 5; unsigned char PeripheralQualifier : 3; - + unsigned char Reserved : 7; unsigned char Removable : 1; - + uint8_t Version; - + unsigned char ResponseDataFormat : 4; unsigned char Reserved2 : 1; unsigned char NormACA : 1; @@ -152,12 +152,12 @@ unsigned char WideBus16Bit : 1; unsigned char WideBus32Bit : 1; unsigned char RelAddr : 1; - + uint8_t VendorID[8]; uint8_t ProductID[16]; uint8_t RevisionID[4]; } SCSI_Inquiry_Response_t; - + /** SCSI capacity structure, to hold the total capacity of the device in both the number * of blocks in the current LUN, and the size of each block. This structure is filled by * the device when the \ref MassStore_ReadCapacity() function is called. @@ -176,7 +176,7 @@ Command_Fail = 1, /**< Command failed to complete successfully */ Phase_Error = 2 /**< Phase error while processing the issued command */ }; - + /* Function Prototypes: */ #if defined(INCLUDE_FROM_MASSSTORE_COMMANDS_C) static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlock, @@ -186,7 +186,7 @@ void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1); static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICommandStatus) ATTR_NON_NULL_PTR_ARG(1); #endif - + uint8_t MassStore_MassStorageReset(void); uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex); uint8_t MassStore_RequestSense(const uint8_t LUNIndex, @@ -210,3 +210,4 @@ const bool PreventRemoval); #endif + diff --git a/Demos/Host/LowLevel/MassStorageHost/Lib/SCSI_Codes.h b/Demos/Host/LowLevel/MassStorageHost/Lib/SCSI_Codes.h index a69aa56fe..6bcd5780f 100644 --- a/Demos/Host/LowLevel/MassStorageHost/Lib/SCSI_Codes.h +++ b/Demos/Host/LowLevel/MassStorageHost/Lib/SCSI_Codes.h @@ -1,7 +1,7 @@ /* LUFA Library Copyright (C) Dean Camera, 2010. - + dean [at] fourwalledcubicle [dot] com www.fourwalledcubicle.com */ @@ -9,13 +9,13 @@ /* Copyright 2010 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 @@ -34,7 +34,7 @@ * the SCSI standard documentation for more information on each SCSI command and * the SENSE data. */ - + #ifndef _SCSI_CODES_H_ #define _SCSI_CODES_H_ @@ -84,3 +84,4 @@ #define SCSI_ASENSEQ_OPERATION_IN_PROGRESS 0x07 #endif + |