Moved out each demos' functionality library files (e.g. Ring Buffer library) to ...
[pub/lufa.git] / Demos / Host / MassStorageHost / Lib / MassStoreCommands.h
diff --git a/Demos/Host/MassStorageHost/Lib/MassStoreCommands.h b/Demos/Host/MassStorageHost/Lib/MassStoreCommands.h
new file mode 100644 (file)
index 0000000..28f6a15
--- /dev/null
@@ -0,0 +1,175 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2009.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+      www.fourwalledcubicle.com\r
+*/\r
+\r
+/*\r
+  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, and distribute this software\r
+  and its documentation for any purpose and without fee is hereby\r
+  granted, provided that the above copyright notice appear in all\r
+  copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *\r
+ *  Header file for MassStoreCommands.c.\r
+ */\r
\r
+#ifndef _MASS_STORE_COMMANDS_H_\r
+#define _MASS_STORE_COMMANDS_H_\r
+\r
+       /* Includes: */\r
+               #include <avr/io.h>\r
+\r
+               #include "MassStorageHost.h"\r
+               #include "SCSI_Codes.h"\r
+\r
+               #include <LUFA/Drivers/USB/USB.h>                    // USB Functionality\r
+\r
+       /* Macros: */\r
+               /** Class specific request to reset the Mass Storage interface of the attached device */\r
+               #define REQ_MassStorageReset             0xFF\r
+\r
+               /** Class specific request to retrieve the maximum Logical Unit Number (LUN) index of the attached device */\r
+               #define REQ_GetMaxLUN                    0xFE\r
+\r
+               /** Command Block Wrapper signature byte, for verification of valid CBW blocks */\r
+               #define CBW_SIGNATURE                    0x43425355UL\r
+\r
+               /** Command Static Wrapper signature byte, for verification of valid CSW blocks */\r
+               #define CSW_SIGNATURE                    0x53425355UL\r
+               \r
+               /** Data direction mask for the Flags field of a CBW, indicating Host-to-Device transfer direction */\r
+               #define COMMAND_DIRECTION_DATA_OUT       (0 << 7)\r
+\r
+               /** Data direction mask for the Flags field of a CBW, indicating Device-to-Host transfer direction */\r
+               #define COMMAND_DIRECTION_DATA_IN        (1 << 7)\r
+               \r
+               /** Timeout period between the issuing of a CBW to a device, and the reception of the first packet */\r
+               #define COMMAND_DATA_TIMEOUT_MS          500\r
+\r
+               /** Pipe number of the Mass Storage data IN pipe */\r
+               #define MASS_STORE_DATA_IN_PIPE          1\r
+\r
+               /** Pipe number of the Mass Storage data OUT pipe */\r
+               #define MASS_STORE_DATA_OUT_PIPE         2\r
+\r
+       /* Type defines: */\r
+               /** Type define for a Mass Storage class Command Block Wrapper, used to wrap SCSI\r
+                *  commands for transport over the USB bulk endpoints to the device.\r
+                */\r
+               typedef struct\r
+               {\r
+                       struct\r
+                       {\r
+                               uint32_t Signature; /**< Command block signature, always equal to CBW_SIGNATURE */\r
+                               uint32_t Tag; /**< Current CBW tag, to positively associate a CBW with a CSW */\r
+                               uint32_t DataTransferLength; /**< Length of data to transfer, following the CBW */\r
+                               uint8_t  Flags; /**< Block flags, equal to one of the COMMAND_DIRECTION_DATA_* macros */\r
+                               uint8_t  LUN; /**< Logical Unit Number the CBW is addressed to in the device */\r
+                               uint8_t  SCSICommandLength; /**< Length of the SCSI command in the CBW */\r
+                       } Header;\r
+                       \r
+                       uint8_t SCSICommandData[16]; /**< SCSI command to issue to the device */\r
+               } CommandBlockWrapper_t;\r
+               \r
+               /** Type define for a Mass Storage class Command Status Wrapper, used to wrap SCSI\r
+                *  responses for transport over the USB bulk endpoints from the device.\r
+                */\r
+               typedef struct\r
+               {\r
+                       uint32_t Signature; /**< Command status signature, always equal to CSW_SIGNATURE */\r
+                       uint32_t Tag; /**< Current CBW tag, to positively associate a CBW with a CSW */\r
+                       uint32_t DataTransferResidue; /**< Length of data not transferred */\r
+                       uint8_t  Status; /**< Command status, a value from the MassStorageHost_CommandStatusCodes_t enum */\r
+               } CommandStatusWrapper_t;\r
+               \r
+               /** Type define for a SCSI Sense structure. Structures of this type are filled out by the\r
+                *  device via the MassStore_RequestSense() function, indicating the current sense data of the\r
+                *  device (giving explicit error codes for the last issued command). For details of the\r
+                *  structure contents, refer to the SCSI specifications.\r
+                */\r
+               typedef struct\r
+               {\r
+                       uint8_t       ReponseCode;\r
+\r
+                       uint8_t       SegmentNumber;\r
+                       \r
+                       unsigned char SenseKey            : 4;\r
+                       unsigned char _RESERVED1          : 1;\r
+                       unsigned char ILI                 : 1;\r
+                       unsigned char EOM                 : 1;\r
+                       unsigned char FileMark            : 1;\r
+                       \r
+                       uint8_t      Information[4];\r
+                       uint8_t      AdditionalLength;\r
+                       uint8_t      CmdSpecificInformation[4];\r
+                       uint8_t      AdditionalSenseCode;\r
+                       uint8_t      AdditionalSenseQualifier;\r
+                       uint8_t      FieldReplaceableUnitCode;\r
+                       uint8_t      SenseKeySpecific[3];\r
+               } SCSI_Request_Sense_Response_t;\r
+\r
+               /** SCSI capacity structure, to hold the total capacity of the device in both the number\r
+                *  of blocks in the current LUN, and the size of each block. This structure is filled by\r
+                *  the device when the MassStore_ReadCapacity() function is called.\r
+                */\r
+               typedef struct\r
+               {\r
+                       uint32_t Blocks; /**< Number of blocks in the addressed LUN of the device */\r
+                       uint32_t BlockSize; /**< Number of bytes in each block in the addressed LUN */\r
+               } SCSI_Capacity_t;\r
+\r
+       /* Enums: */\r
+               /** CSW status return codes, indicating the overall status of the issued CBW */\r
+               enum MassStorageHost_CommandStatusCodes_t\r
+               {\r
+                       Command_Pass = 0, /**< Command completed successfully */\r
+                       Command_Fail = 1, /**< Command failed to complete successfully */\r
+                       Phase_Error  = 2 /**< Phase error while processing the issued command */\r
+               };\r
+               \r
+       /* External Variables: */\r
+               extern CommandStatusWrapper_t SCSICommandStatus;\r
+               \r
+       /* Function Prototypes: */\r
+               #if defined(INCLUDE_FROM_MASSSTORE_COMMANDS_C)\r
+                       static uint8_t MassStore_SendCommand(void);\r
+                       static uint8_t MassStore_WaitForDataReceived(void);\r
+                       static uint8_t MassStore_SendReceiveData(void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1);\r
+                       static uint8_t MassStore_GetReturnedStatus(void);\r
+               #endif\r
+               \r
+               uint8_t MassStore_ClearPipeStall(const uint8_t EndpointNum);\r
+               uint8_t MassStore_MassStorageReset(void);\r
+               uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex);\r
+               uint8_t MassStore_RequestSense(const uint8_t LUNIndex, const SCSI_Request_Sense_Response_t* const SensePtr)\r
+                                              ATTR_NON_NULL_PTR_ARG(2);\r
+               uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAddress,\r
+                                                 const uint8_t Blocks, const uint16_t BlockSize, void* BufferPtr) ATTR_NON_NULL_PTR_ARG(5);\r
+               uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAddress,\r
+                                           const uint8_t Blocks, const uint16_t BlockSize, void* BufferPtr) ATTR_NON_NULL_PTR_ARG(5);\r
+               uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const CapacityPtr)\r
+                                              ATTR_NON_NULL_PTR_ARG(2);\r
+               uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex);\r
+               uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex, const bool PreventRemoval);\r
+\r
+#endif\r