Add extra tests to the MassStorage device demo and class driver for validating comman...
[pub/USBasp.git] / Demos / Host / LowLevel / MassStorageHost / Lib / MassStoreCommands.c
index c524b53..7ee7de1 100644 (file)
@@ -90,6 +90,7 @@ static uint8_t MassStore_SendCommand(void)
        /* Send the data in the OUT pipe to the attached device */\r
        Pipe_ClearOUT();\r
        \r
+       /* Wait until command has been sent */\r
        while(!(Pipe_IsOUTReady()));\r
 \r
        /* Freeze pipe after use */\r
@@ -169,7 +170,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
 /** Sends or receives the transaction's data stage to or from the attached device, reading or\r
  *  writing to the nominated buffer.\r
  *\r
- *  \param  BufferPtr  Pointer to the data buffer to read from or write to\r
+ *  \param[in,out]  BufferPtr  Pointer to the data buffer to read from or write to\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -268,7 +269,7 @@ uint8_t MassStore_MassStorageReset(void)
 /** Issues a Mass Storage class specific request to determine the index of the highest numbered Logical\r
  *  Unit in the attached device.\r
  *\r
- *  \param MaxLUNIndex  Pointer to the location that the maximum LUN index value should be stored\r
+ *  \param[out] MaxLUNIndex  Pointer to the location that the maximum LUN index value should be stored\r
  *\r
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum\r
  */\r
@@ -300,11 +301,74 @@ 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[in] LUNIndex    Index of the LUN inside the device the command is being addressed to\r
+ *  \param[out] 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
- *  \param LUNIndex  Index of the LUN inside the device the command is being addressed to\r
- *  \param SensePtr  Pointer to the sense data structure where the sense data from the device is to be stored\r
+ *  \param[in] LUNIndex   Index of the LUN inside the device the command is being addressed to\r
+ *  \param[out] SensePtr  Pointer to the sense data structure where the sense data from the device is to be stored\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -366,11 +430,11 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex, const SCSI_Request_Sense_
 /** Issues a SCSI Device Block Read command to the attached device, to read in one or more data blocks from the\r
  *  storage medium into a buffer.\r
  *\r
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to\r
- *  \param BlockAddress  Start block address to read from\r
- *  \param Blocks        Number of blocks to read from the device\r
- *  \param BlockSize     Size in bytes of each block to read\r
- *  \param BufferPtr     Pointer to the buffer where the read data is to be written to\r
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to\r
+ *  \param[in] BlockAddress  Start block address to read from\r
+ *  \param[in] Blocks        Number of blocks to read from the device\r
+ *  \param[in] BlockSize     Size in bytes of each block to read\r
+ *  \param[out] BufferPtr    Pointer to the buffer where the read data is to be written to\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -437,11 +501,11 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockAd
 /** Issues a SCSI Device Block Write command to the attached device, to write one or more data blocks to the\r
  *  storage medium from a buffer.\r
  *\r
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to\r
- *  \param BlockAddress  Start block address to write to\r
- *  \param Blocks        Number of blocks to write to in the device\r
- *  \param BlockSize     Size in bytes of each block to write\r
- *  \param BufferPtr     Pointer to the buffer where the write data is to be sourced from\r
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to\r
+ *  \param[in] BlockAddress  Start block address to write to\r
+ *  \param[in] Blocks        Number of blocks to write to in the device\r
+ *  \param[in] BlockSize     Size in bytes of each block to write\r
+ *  \param[in] BufferPtr     Pointer to the buffer where the write data is to be sourced from\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -501,7 +565,7 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex, const uint32_t BlockA
 /** Issues a SCSI Device Test Unit Ready command to the attached device, to determine if the device is ready to accept\r
  *  other commands.\r
  *\r
- *  \param LUNIndex      Index of the LUN inside the device the command is being addressed to\r
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -549,8 +613,8 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
 /** Issues a SCSI Device Read Capacity command to the attached device, to determine the capacity of the\r
  *  given Logical Unit within the device.\r
  *\r
- *  \param LUNIndex     Index of the LUN inside the device the command is being addressed to\r
- *  \param CapacityPtr  Device capacity structure where the capacity data is to be stored\r
+ *  \param[in] LUNIndex      Index of the LUN inside the device the command is being addressed to\r
+ *  \param[out] CapacityPtr  Device capacity structure where the capacity data is to be stored\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r
@@ -621,8 +685,8 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex, SCSI_Capacity_t* const Ca
  *  being removed. This is a legacy command for SCSI disks with removable storage (such as ZIP disks), but should still\r
  *  be issued before the first read or write command is sent.\r
  *\r
- *  \param LUNIndex        Index of the LUN inside the device the command is being addressed to\r
- *  \param PreventRemoval  Whether or not the LUN media should be locked to prevent removal or not\r
+ *  \param[in] LUNIndex        Index of the LUN inside the device the command is being addressed to\r
+ *  \param[in] PreventRemoval  Whether or not the LUN media should be locked to prevent removal or not\r
  *\r
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
  */\r