All USB class drivers are now automatically included when LUFA/Drivers/USB.h is included, and no longer need to be seperately included.
All LowLevel demos changed to use the constants and types defined in the USB class drivers.
This commit is contained in:
		
							parent
							
								
									8f3bee7d86
								
							
						
					
					
						commit
						b37d77eab3
					
				
					 208 changed files with 589 additions and 2910 deletions
				
			
		| 
						 | 
				
			
			@ -63,7 +63,7 @@ static uint32_t MassStore_Tag = 1;
 | 
			
		|||
 *
 | 
			
		||||
 *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
 | 
			
		||||
 */
 | 
			
		||||
static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
                                     void* BufferPtr)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlo
 | 
			
		|||
	Pipe_Unfreeze();
 | 
			
		||||
 | 
			
		||||
	/* Write the CBW command to the OUT pipe */
 | 
			
		||||
	if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(CommandBlockWrapper_t))) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
	if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t))) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
 | 
			
		||||
	/* Send the data in the OUT pipe to the attached device */
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +182,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
 | 
			
		|||
 *
 | 
			
		||||
 *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
 | 
			
		||||
 */
 | 
			
		||||
static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
static uint8_t MassStore_SendReceiveData(MS_CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
                                         void* BufferPtr)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  ErrorCode = PIPE_RWSTREAM_NoError;
 | 
			
		||||
| 
						 | 
				
			
			@ -238,7 +238,7 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSIComman
 | 
			
		|||
 *
 | 
			
		||||
 *  \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* const SCSICommandStatus)
 | 
			
		||||
static uint8_t MassStore_GetReturnedStatus(MS_CommandStatusWrapper_t* const SCSICommandStatus)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +251,7 @@ static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICom
 | 
			
		|||
	Pipe_Unfreeze();
 | 
			
		||||
 | 
			
		||||
	/* Load in the CSW from the attached device */
 | 
			
		||||
	if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(CommandStatusWrapper_t))) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
	if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t))) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
 | 
			
		||||
	/* Clear the data ready for next reception */
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +261,7 @@ static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICom
 | 
			
		|||
	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;
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +277,7 @@ uint8_t MassStore_MassStorageReset(void)
 | 
			
		|||
	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,
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +307,7 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
 | 
			
		|||
	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,
 | 
			
		||||
| 
						 | 
				
			
			@ -345,7 +345,7 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = sizeof(SCSI_Inquiry_Response_t),
 | 
			
		||||
| 
						 | 
				
			
			@ -363,7 +363,7 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, InquiryPtr)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -396,7 +396,7 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = sizeof(SCSI_Request_Sense_Response_t),
 | 
			
		||||
| 
						 | 
				
			
			@ -414,7 +414,7 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, SensePtr)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -453,7 +453,7 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = ((uint32_t)Blocks * BlockSize),
 | 
			
		||||
| 
						 | 
				
			
			@ -475,7 +475,7 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -514,7 +514,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = ((uint32_t)Blocks * BlockSize),
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +536,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -567,7 +567,7 @@ 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,
 | 
			
		||||
			.DataTransferLength = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -585,7 +585,7 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -618,7 +618,7 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = sizeof(SCSI_Capacity_t),
 | 
			
		||||
| 
						 | 
				
			
			@ -640,7 +640,7 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, CapacityPtr)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			@ -678,7 +678,7 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex,
 | 
			
		|||
	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,
 | 
			
		||||
			.DataTransferLength = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -696,7 +696,7 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex,
 | 
			
		|||
				}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
	CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
	MS_CommandStatusWrapper_t SCSICommandStatus;
 | 
			
		||||
 | 
			
		||||
	/* Send the command and any data to the attached device */
 | 
			
		||||
	if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,151 +40,24 @@
 | 
			
		|||
		#include <avr/io.h>
 | 
			
		||||
 | 
			
		||||
		#include "MassStorageHost.h"
 | 
			
		||||
		#include "SCSI_Codes.h"
 | 
			
		||||
 | 
			
		||||
		#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		/** Class specific request to reset the Mass Storage interface of the attached device. */
 | 
			
		||||
		#define REQ_MassStorageReset                0xFF
 | 
			
		||||
 | 
			
		||||
		/** Class specific request to retrieve the maximum Logical Unit Number (LUN) index of the attached device. */
 | 
			
		||||
		#define REQ_GetMaxLUN                       0xFE
 | 
			
		||||
 | 
			
		||||
		/** Command Block Wrapper signature byte, for verification of valid CBW blocks. */
 | 
			
		||||
		#define CBW_SIGNATURE                       0x43425355UL
 | 
			
		||||
 | 
			
		||||
		/** 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
 | 
			
		||||
 | 
			
		||||
	/* Type Defines: */
 | 
			
		||||
		/** Type define for a Mass Storage class Command Block Wrapper, used to wrap SCSI
 | 
			
		||||
		 *  commands for transport over the USB bulk endpoints to the device.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint32_t Signature; /**< Command block signature, always equal to CBW_SIGNATURE */
 | 
			
		||||
			uint32_t Tag; /**< Current CBW tag, to positively associate a CBW with a CSW (filled automatically) */
 | 
			
		||||
			uint32_t DataTransferLength; /**< Length of data to transfer, following the CBW */
 | 
			
		||||
			uint8_t  Flags; /**< Block flags, equal to one of the COMMAND_DIRECTION_DATA_* macros */
 | 
			
		||||
			uint8_t  LUN; /**< Logical Unit Number the CBW is addressed to in the device */
 | 
			
		||||
			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.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint32_t Signature; /**< Command status signature, always equal to CSW_SIGNATURE */
 | 
			
		||||
			uint32_t Tag; /**< Current CBW tag, to positively associate a CBW with a CSW */
 | 
			
		||||
			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
 | 
			
		||||
		 *  structure contents, refer to the SCSI specifications.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			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];
 | 
			
		||||
			uint8_t      AdditionalSenseCode;
 | 
			
		||||
			uint8_t      AdditionalSenseQualifier;
 | 
			
		||||
			uint8_t      FieldReplaceableUnitCode;
 | 
			
		||||
			uint8_t      SenseKeySpecific[3];
 | 
			
		||||
		} SCSI_Request_Sense_Response_t;
 | 
			
		||||
 | 
			
		||||
		/** Type define for a SCSI Inquiry structure. Structures of this type are filled out by the
 | 
			
		||||
		 *  device via the \ref MassStore_Inquiry() function, retrieving the attached device's information.
 | 
			
		||||
		 *  For details of the structure contents, refer to the SCSI specifications.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			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;
 | 
			
		||||
			unsigned char TrmTsk              : 1;
 | 
			
		||||
			unsigned char AERC                : 1;
 | 
			
		||||
 | 
			
		||||
			uint8_t      AdditionalLength;
 | 
			
		||||
			uint8_t      Reserved3[2];
 | 
			
		||||
 | 
			
		||||
			unsigned char SoftReset           : 1;
 | 
			
		||||
			unsigned char CmdQue              : 1;
 | 
			
		||||
			unsigned char Reserved4           : 1;
 | 
			
		||||
			unsigned char Linked              : 1;
 | 
			
		||||
			unsigned char Sync                : 1;
 | 
			
		||||
			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.
 | 
			
		||||
		 */
 | 
			
		||||
		typedef struct
 | 
			
		||||
		{
 | 
			
		||||
			uint32_t Blocks; /**< Number of blocks in the addressed LUN of the device */
 | 
			
		||||
			uint32_t BlockSize; /**< Number of bytes in each block in the addressed LUN */
 | 
			
		||||
		} SCSI_Capacity_t;
 | 
			
		||||
 | 
			
		||||
	/* Enums: */
 | 
			
		||||
		/** CSW status return codes, indicating the overall status of the issued CBW. */
 | 
			
		||||
		enum MassStorageHost_CommandStatusCodes_t
 | 
			
		||||
		{
 | 
			
		||||
			Command_Pass = 0, /**< Command completed successfully */
 | 
			
		||||
			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,
 | 
			
		||||
			static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
			                                     void* BufferPtr);
 | 
			
		||||
			static uint8_t MassStore_WaitForDataReceived(void);
 | 
			
		||||
			static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
			static uint8_t MassStore_SendReceiveData(MS_CommandBlockWrapper_t* const SCSICommandBlock,
 | 
			
		||||
			                                         void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICommandStatus) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			static uint8_t MassStore_GetReturnedStatus(MS_CommandStatusWrapper_t* const SCSICommandStatus) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		uint8_t MassStore_MassStorageReset(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,87 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2010.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
      www.fourwalledcubicle.com
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  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
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header containing macros for possible SCSI commands and SENSE data. Refer to
 | 
			
		||||
 *  the SCSI standard documentation for more information on each SCSI command and
 | 
			
		||||
 *  the SENSE data.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _SCSI_CODES_H_
 | 
			
		||||
#define _SCSI_CODES_H_
 | 
			
		||||
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		#define SCSI_CMD_INQUIRY                               0x12
 | 
			
		||||
		#define SCSI_CMD_REQUEST_SENSE                         0x03
 | 
			
		||||
		#define SCSI_CMD_TEST_UNIT_READY                       0x00
 | 
			
		||||
		#define SCSI_CMD_READ_CAPACITY_10                      0x25
 | 
			
		||||
		#define SCSI_CMD_SEND_DIAGNOSTIC                       0x1D
 | 
			
		||||
		#define SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL          0x1E
 | 
			
		||||
		#define SCSI_CMD_WRITE_10                              0x2A
 | 
			
		||||
		#define SCSI_CMD_READ_10                               0x28
 | 
			
		||||
		#define SCSI_CMD_WRITE_6                               0x0A
 | 
			
		||||
		#define SCSI_CMD_READ_6                                0x08
 | 
			
		||||
		#define SCSI_CMD_VERIFY_10                             0x2F
 | 
			
		||||
		#define SCSI_CMD_MODE_SENSE_6                          0x1A
 | 
			
		||||
		#define SCSI_CMD_MODE_SENSE_10                         0x5A
 | 
			
		||||
 | 
			
		||||
		#define SCSI_SENSE_KEY_GOOD                            0x00
 | 
			
		||||
		#define SCSI_SENSE_KEY_RECOVERED_ERROR                 0x01
 | 
			
		||||
		#define SCSI_SENSE_KEY_NOT_READY                       0x02
 | 
			
		||||
		#define SCSI_SENSE_KEY_MEDIUM_ERROR                    0x03
 | 
			
		||||
		#define SCSI_SENSE_KEY_HARDWARE_ERROR                  0x04
 | 
			
		||||
		#define SCSI_SENSE_KEY_ILLEGAL_REQUEST                 0x05
 | 
			
		||||
		#define SCSI_SENSE_KEY_UNIT_ATTENTION                  0x06
 | 
			
		||||
		#define SCSI_SENSE_KEY_DATA_PROTECT                    0x07
 | 
			
		||||
		#define SCSI_SENSE_KEY_BLANK_CHECK                     0x08
 | 
			
		||||
		#define SCSI_SENSE_KEY_VENDOR_SPECIFIC                 0x09
 | 
			
		||||
		#define SCSI_SENSE_KEY_COPY_ABORTED                    0x0A
 | 
			
		||||
		#define SCSI_SENSE_KEY_ABORTED_COMMAND                 0x0B
 | 
			
		||||
		#define SCSI_SENSE_KEY_VOLUME_OVERFLOW                 0x0D
 | 
			
		||||
		#define SCSI_SENSE_KEY_MISCOMPARE                      0x0E
 | 
			
		||||
 | 
			
		||||
		#define SCSI_ASENSE_NO_ADDITIONAL_INFORMATION          0x00
 | 
			
		||||
		#define SCSI_ASENSE_LOGICAL_UNIT_NOT_READY             0x04
 | 
			
		||||
		#define SCSI_ASENSE_INVALID_COMMAND                    0x20
 | 
			
		||||
		#define SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21
 | 
			
		||||
		#define SCSI_ASENSE_INVALID_FIELD_IN_CDB               0x24
 | 
			
		||||
		#define SCSI_ASENSE_WRITE_PROTECTED                    0x27
 | 
			
		||||
		#define SCSI_ASENSE_NOT_READY_TO_READY_CHANGE          0x28
 | 
			
		||||
		#define SCSI_ASENSE_FORMAT_ERROR                       0x31
 | 
			
		||||
		#define SCSI_ASENSE_MEDIUM_NOT_PRESENT                 0x3A
 | 
			
		||||
 | 
			
		||||
		#define SCSI_ASENSEQ_NO_QUALIFIER                      0x00
 | 
			
		||||
		#define SCSI_ASENSEQ_FORMAT_COMMAND_FAILED             0x01
 | 
			
		||||
		#define SCSI_ASENSEQ_INITIALIZING_COMMAND_REQUIRED     0x02
 | 
			
		||||
		#define SCSI_ASENSEQ_OPERATION_IN_PROGRESS             0x07
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue