Remove old OTG demo directory with useless TestApp demo. Add new DualRole directory...
[pub/USBasp.git] / Demos / Host / LowLevel / MassStorageHost / MassStorageHost.c
index 2b27b12..855ce8d 100644 (file)
@@ -182,7 +182,7 @@ void MassStorage_Task(void)
                        /* Send the request, display error and wait for device detach if request fails */\r
                        if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful)\r
                        {       \r
                        /* Send the request, display error and wait for device detach if request fails */\r
                        if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful)\r
                        {       \r
-                               ShowDiskReadError(PSTR("Get Max LUN"), false, ErrorCode);\r
+                               ShowDiskReadError(PSTR("Get Max LUN"), ErrorCode);\r
 \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
 \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -194,7 +194,7 @@ void MassStorage_Task(void)
                        /* Reset the Mass Storage device interface, ready for use */\r
                        if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful)\r
                        {\r
                        /* Reset the Mass Storage device interface, ready for use */\r
                        if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful)\r
                        {\r
-                               ShowDiskReadError(PSTR("Mass Storage Reset"), false, ErrorCode);\r
+                               ShowDiskReadError(PSTR("Mass Storage Reset"), ErrorCode);\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -203,16 +203,17 @@ void MassStorage_Task(void)
                        /* Get sense data from the device - many devices will not accept any other commands until the sense data\r
                         * is read - both on start-up and after a failed command */\r
                        SCSI_Request_Sense_Response_t SenseData;\r
                        /* Get sense data from the device - many devices will not accept any other commands until the sense data\r
                         * is read - both on start-up and after a failed command */\r
                        SCSI_Request_Sense_Response_t SenseData;\r
-                       if (((ErrorCode = MassStore_RequestSense(0, &SenseData)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
+                       if ((ErrorCode = MassStore_RequestSense(0, &SenseData)) != 0)\r
                        {\r
                        {\r
-                               ShowDiskReadError(PSTR("Request Sense"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               ShowDiskReadError(PSTR("Request Sense"), ErrorCode);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
                        /* Set the prevent removal flag for the device, allowing it to be accessed */\r
                                break;\r
                        }\r
                        \r
                        /* Set the prevent removal flag for the device, allowing it to be accessed */\r
-                       if (((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
+                       if ((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0)\r
                        {\r
                        {\r
-                               ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), ErrorCode);\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -220,9 +221,9 @@ void MassStorage_Task(void)
 \r
                        /* Get inquiry data from the device */\r
                        SCSI_Inquiry_Response_t InquiryData;\r
 \r
                        /* Get inquiry data from the device */\r
                        SCSI_Inquiry_Response_t InquiryData;\r
-                       if (((ErrorCode = MassStore_Inquiry(0, &InquiryData)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
+                       if ((ErrorCode = MassStore_Inquiry(0, &InquiryData)) != 0)\r
                        {\r
                        {\r
-                               ShowDiskReadError(PSTR("Inquiry"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               ShowDiskReadError(PSTR("Inquiry"), ErrorCode);\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -234,23 +235,30 @@ void MassStorage_Task(void)
                        /* Wait until disk ready */\r
                        puts_P(PSTR("Waiting until ready.."));\r
 \r
                        /* Wait until disk ready */\r
                        puts_P(PSTR("Waiting until ready.."));\r
 \r
-                       do\r
+                       for (;;)\r
                        {\r
                                Serial_TxByte('.');\r
                        {\r
                                Serial_TxByte('.');\r
-                               \r
+\r
                                /* Abort if device removed */\r
                                if (USB_HostState == HOST_STATE_Unattached)\r
                                  break;\r
 \r
                                /* Abort if device removed */\r
                                if (USB_HostState == HOST_STATE_Unattached)\r
                                  break;\r
 \r
-                               if ((ErrorCode = MassStore_TestUnitReady(0)) != PIPE_RWSTREAM_NoError)\r
+                               /* Check to see if the attached device is ready for new commands */\r
+                               ErrorCode = MassStore_TestUnitReady(0);\r
+                                 \r
+                               /* If attached device is ready, abort the loop */\r
+                               if (!(ErrorCode))\r
+                                 break;\r
+\r
+                               /* If an error othe than a logical command failure (indicating device busy) returned, abort */\r
+                               if (ErrorCode != MASS_STORE_SCSI_COMMAND_FAILED)\r
                                {\r
                                {\r
-                                       ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode);\r
+                                       ShowDiskReadError(PSTR("Test Unit Ready"), ErrorCode);\r
 \r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                        break;\r
                                }\r
                        }\r
 \r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                        break;\r
                                }\r
                        }\r
-                       while (SCSICommandStatus.Status != Command_Pass);\r
 \r
                        puts_P(PSTR("\r\nRetrieving Capacity... "));\r
 \r
 \r
                        puts_P(PSTR("\r\nRetrieving Capacity... "));\r
 \r
@@ -258,9 +266,9 @@ void MassStorage_Task(void)
                        SCSI_Capacity_t DiskCapacity;\r
 \r
                        /* Retrieve disk capacity */\r
                        SCSI_Capacity_t DiskCapacity;\r
 \r
                        /* Retrieve disk capacity */\r
-                       if (((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
+                       if ((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0)\r
                        {\r
                        {\r
-                               ShowDiskReadError(PSTR("Read Capacity"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               ShowDiskReadError(PSTR("Read Capacity"), ErrorCode);\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -273,10 +281,9 @@ void MassStorage_Task(void)
                        uint8_t BlockBuffer[DiskCapacity.BlockSize];\r
 \r
                        /* Read in the first 512 byte block from the device */\r
                        uint8_t BlockBuffer[DiskCapacity.BlockSize];\r
 \r
                        /* Read in the first 512 byte block from the device */\r
-                       if (((ErrorCode = MassStore_ReadDeviceBlock(0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) ||\r
-                           (SCSICommandStatus.Status != Command_Pass))\r
+                       if ((ErrorCode = MassStore_ReadDeviceBlock(0, 0x00000000, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0)\r
                        {\r
                        {\r
-                               ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               ShowDiskReadError(PSTR("Read Device Block"), ErrorCode);\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                                \r
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
@@ -320,15 +327,18 @@ void MassStorage_Task(void)
                                if (USB_HostState == HOST_STATE_Unattached)\r
                                  break;\r
                        }\r
                                if (USB_HostState == HOST_STATE_Unattached)\r
                                  break;\r
                        }\r
+\r
+                       /* Abort if device removed */\r
+                       if (USB_HostState == HOST_STATE_Unattached)\r
+                         break;\r
                        \r
                        /* Print out the entire disk contents in ASCII format */\r
                        \r
                        /* Print out the entire disk contents in ASCII format */\r
-                       for (uint32_t CurrBlock = 0; CurrBlock < DiskCapacity.Blocks; CurrBlock++)\r
+                       for (uint32_t CurrBlockAddress = 0; CurrBlockAddress < DiskCapacity.Blocks; CurrBlockAddress++)\r
                        {\r
                                /* Read in the next block of data from the device */\r
                        {\r
                                /* Read in the next block of data from the device */\r
-                               if (((ErrorCode = MassStore_ReadDeviceBlock(0, CurrBlock, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0) ||\r
-                                   (SCSICommandStatus.Status != Command_Pass))\r
+                               if ((ErrorCode = MassStore_ReadDeviceBlock(0, CurrBlockAddress, 1, DiskCapacity.BlockSize, BlockBuffer)) != 0)\r
                                {\r
                                {\r
-                                       ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                                       ShowDiskReadError(PSTR("Read Device Block"), ErrorCode);\r
                                        \r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                        break;\r
                                        \r
                                        USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                        break;\r
@@ -360,17 +370,15 @@ void MassStorage_Task(void)
  *  printing error codes to the serial port and waiting until the device is removed before\r
  *  continuing.\r
  *\r
  *  printing error codes to the serial port and waiting until the device is removed before\r
  *  continuing.\r
  *\r
- *  \param[in] CommandString      ASCII string located in PROGMEM space indicating what operation failed\r
- *  \param[in] FailedAtSCSILayer  Indicates if the command failed at the (logical) SCSI layer or at the physical USB layer\r
- *  \param[in] ErrorCode          Error code of the function which failed to complete successfully\r
+ *  \param[in] CommandString  ASCII string located in PROGMEM space indicating what operation failed\r
+ *  \param[in] ErrorCode      Error code of the function which failed to complete successfully\r
  */\r
  */\r
-void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t ErrorCode)\r
+void ShowDiskReadError(char* CommandString, uint8_t ErrorCode)\r
 {\r
 {\r
-       if (FailedAtSCSILayer)\r
+       if (ErrorCode == MASS_STORE_SCSI_COMMAND_FAILED)\r
        {\r
                /* Display the error code */\r
                printf_P(PSTR(ESC_FG_RED "SCSI command error (%S).\r\n"), CommandString);\r
        {\r
                /* Display the error code */\r
                printf_P(PSTR(ESC_FG_RED "SCSI command error (%S).\r\n"), CommandString);\r
-               printf_P(PSTR("  -- Status Code: %d" ESC_FG_WHITE), ErrorCode);\r
        }\r
        else\r
        {\r
        }\r
        else\r
        {\r