MassStorageHost demo now retrieves Inquiry data from the device during enumeration...
[pub/USBasp.git] / Demos / Host / LowLevel / MassStorageHost / Lib / MassStoreCommands.c
index b89ad19..e2a64da 100644 (file)
@@ -301,6 +301,69 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
        return ErrorCode;\r
 }\r
 \r
+/** Issues a SCSI Inquiry command to the attached device, to determine the device's information. This\r
+ *  gives information on the device's capabilities.\r
+ *\r
+ *  \param LUNIndex    Index of the LUN inside the device the command is being addressed to\r
+ *  \param InquiryPtr  Pointer to the inquiry data structure where the inquiry data from the device is to be stored\r
+ *\r
+ *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
+ */\r
+uint8_t MassStore_Inquiry(const uint8_t LUNIndex, const SCSI_Inquiry_Response_t* const InquiryPtr)\r
+{\r
+       uint8_t ReturnCode = PIPE_RWSTREAM_NoError;\r
+\r
+       /* Create a CBW with a SCSI command to issue INQUIRY command */\r
+       SCSICommandBlock = (CommandBlockWrapper_t)\r
+               {\r
+                       .Header =\r
+                               {\r
+                                       .Signature          = CBW_SIGNATURE,\r
+                                       .Tag                = MassStore_Tag,\r
+                                       .DataTransferLength = sizeof(SCSI_Inquiry_Response_t),\r
+                                       .Flags              = COMMAND_DIRECTION_DATA_IN,\r
+                                       .LUN                = LUNIndex,\r
+                                       .SCSICommandLength  = 6\r
+                               },\r
+                                       \r
+                       .SCSICommandData =\r
+                               {\r
+                                       SCSI_CMD_INQUIRY,\r
+                                       0x00,                   // Reserved\r
+                                       0x00,                   // Reserved\r
+                                       0x00,                   // Reserved\r
+                                       sizeof(SCSI_Inquiry_Response_t), // Allocation Length\r
+                                       0x00                    // Unused (control)\r
+                               }\r
+               };\r
+       \r
+       /* Send SCSI command to the attached device */\r
+       MassStore_SendCommand();\r
+\r
+       /* Wait until data received from the device */\r
+       if ((ReturnCode = MassStore_WaitForDataReceived()) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               Pipe_Freeze();\r
+               return ReturnCode;\r
+       }\r
+\r
+       /* Read the returned sense data into the buffer */\r
+       if ((ReturnCode = MassStore_SendReceiveData((uint8_t*)InquiryPtr)) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               Pipe_Freeze();\r
+               return ReturnCode;\r
+       }       \r
+       \r
+       /* Read in the returned CSW from the device */\r
+       if ((ReturnCode = MassStore_GetReturnedStatus()) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               Pipe_Freeze();\r
+               return ReturnCode;\r
+       }\r
+       \r
+       return PIPE_RWSTREAM_NoError;\r
+}\r
+\r
 /** Issues a SCSI Request Sense command to the attached device, to determine the current SCSI sense information. This\r
  *  gives error codes for the last issued SCSI command to the device.\r
  *\r