\r
uint16_t DataINPipeSize; /**< Size in bytes of the MS interface's IN data pipe */\r
uint16_t DataOUTPipeSize; /**< Size in bytes of the MS interface's OUT data pipe */\r
+ \r
+ uint32_t TransactionTag; /**< Current transaction tag for data synchronising of packets */\r
} State; /**< State data for the USB class interface within the device. All elements in this section\r
* <b>may</b> be set to initial values, but may also be ignored to default to sane values when\r
* the interface is enumerated.\r
*/\r
} USB_ClassInfo_MS_Host_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
+ /** Type define for a SCSI Inquiry structure. Structures of this type are filled out by the\r
+ * device via the MassStore_Inquiry() function, retrieving the attached device's information.\r
+ * For details of the structure contents, refer to the SCSI specifications.\r
+ */\r
+ typedef struct\r
+ {\r
+ unsigned char DeviceType : 5;\r
+ unsigned char PeripheralQualifier : 3;\r
+ \r
+ unsigned char _RESERVED1 : 7;\r
+ unsigned char Removable : 1;\r
+ \r
+ uint8_t Version;\r
+ \r
+ unsigned char ResponseDataFormat : 4;\r
+ unsigned char _RESERVED2 : 1;\r
+ unsigned char NormACA : 1;\r
+ unsigned char TrmTsk : 1;\r
+ unsigned char AERC : 1;\r
+\r
+ uint8_t AdditionalLength;\r
+ uint8_t _RESERVED3[2];\r
+\r
+ unsigned char SoftReset : 1;\r
+ unsigned char CmdQue : 1;\r
+ unsigned char _RESERVED4 : 1;\r
+ unsigned char Linked : 1;\r
+ unsigned char Sync : 1;\r
+ unsigned char WideBus16Bit : 1;\r
+ unsigned char WideBus32Bit : 1;\r
+ unsigned char RelAddr : 1;\r
+ \r
+ uint8_t VendorID[8];\r
+ uint8_t ProductID[16];\r
+ uint8_t RevisionID[4];\r
+ } SCSI_Inquiry_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
enum\r
{\r
MS_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */\r
MS_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor */\r
- MS_ENUMERROR_NoMSInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor */\r
+ MS_ENUMERROR_NoMSInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor */\r
MS_ENUMERROR_EndpointsNotFound = 3, /**< Compatible Mass Storage endpoints were not found in the device's interfaces */\r
} MSHost_EnumerationFailure_ErrorCodes_t;\r
\r
/* Function Prototypes: */\r
- void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* MSInterfaceInfo);\r
+ /** General management task for a given Mass Storage host class interface, required for the correct operation of\r
+ * the interface. This should be called frequently in the main program loop, before the master USB management task\r
+ * \ref USB_USBTask().\r
+ *\r
+ * \param[in,out] MSInterfaceInfo Pointer to a structure containing an MS Class host configuration and state\r
+ */\r
+ void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);\r
+ \r
+ /** Host interface configuration routine, to configure a given Mass Storage host interface instance using the\r
+ * Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass\r
+ * Storage Host instance's state values and configures the pipes required to communicate with the interface if it\r
+ * is found within the device. This should be called once after the stack has enumerated the attached device, while\r
+ * the host state machine is in the Addressed state.\r
+ *\r
+ * \param[in,out] MSInterfaceInfo Pointer to a structure containing an MS Class host configuration and state\r
+ * \param[in] ConfigDescriptorLength Length of the attached device's Configuration Descriptor\r
+ * \param[in] DeviceConfigDescriptor Pointer to a buffer containing the attached device's Configuration Descriptor\r
+ */\r
uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint16_t ConfigDescriptorLength,\r
- uint8_t* DeviceConfigDescriptor);\r
+ uint8_t* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1, 3);\r
+\r
+ /** Sends a MASS STORAGE RESET control request to the attached device, resetting the Mass Storage Interface\r
+ * and readying it for the next Mass Storage command.\r
+ *\r
+ * \param[in,out] MSInterfaceInfo Pointer to a structure containing a MS Class host configuration and state\r
+ *\r
+ * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum\r
+ */\r
+ uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+ uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t* MaxLUNIndex) ATTR_NON_NULL_PTR_ARG(1, 2);\r
+\r
+ uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,\r
+ SCSI_Inquiry_Response_t* InquiryData) ATTR_NON_NULL_PTR_ARG(1, 2);\r
+\r
+ uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,\r
+ bool* DeviceReady) ATTR_NON_NULL_PTR_ARG(1, 3);\r
+\r
+ uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, uint8_t LUNIndex,\r
+ SCSI_Capacity_t* DeviceCapacity) ATTR_NON_NULL_PTR_ARG(1, 3);\r
\r
/* Private Interface - For use in library only: */\r
#if !defined(__DOXYGEN__)\r
#define MASS_STORE_SUBCLASS 0x06\r
#define MASS_STORE_PROTOCOL 0x50\r
\r
+ #define REQ_MassStorageReset 0xFF\r
+ #define REQ_GetMaxLUN 0xFE\r
+\r
+ #define CBW_SIGNATURE 0x43425355UL\r
+ #define CSW_SIGNATURE 0x53425355UL\r
+ \r
+ #define COMMAND_DIRECTION_DATA_OUT (0 << 7)\r
+ #define COMMAND_DIRECTION_DATA_IN (1 << 7)\r
+ \r
+ #define COMMAND_DATA_TIMEOUT_MS 2000\r
+\r
#define MS_FOUND_DATAPIPE_IN (1 << 0)\r
#define MS_FOUND_DATAPIPE_OUT (1 << 1)\r
\r
#if defined(INCLUDE_FROM_MS_CLASS_HOST_C) \r
static uint8_t DComp_NextMassStorageInterface(void* CurrentDescriptor);\r
static uint8_t DComp_NextInterfaceBulkDataEndpoint(void* CurrentDescriptor);\r
+ \r
+ static uint8_t MassStore_SendCommand(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,\r
+ MS_CommandBlockWrapper_t* SCSICommandBlock);\r
+ static uint8_t MassStore_WaitForDataReceived(USB_ClassInfo_MS_Host_t* MSInterfaceInfo);\r
+ static uint8_t MassStore_SendReceiveData(USB_ClassInfo_MS_Host_t* MSInterfaceInfo, \r
+ MS_CommandBlockWrapper_t* SCSICommandBlock, void* BufferPtr);\r
+ static uint8_t MassStore_GetReturnedStatus(USB_ClassInfo_MS_Host_t* MSInterfaceInfo,\r
+ MS_CommandStatusWrapper_t* SCSICommandStatus);\r
#endif\r
#endif\r
\r