| 
														
															@@ -93,6 +93,7 @@ void scsiInitiatorMainLoop() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             delay(1000); 
														 | 
														
														 | 
														
															             delay(1000); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             LED_ON(); 
														 | 
														
														 | 
														
															             LED_ON(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             bool readcapok = 
														 | 
														
														 | 
														
															             bool readcapok = 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                scsiTestUnitReady(g_initiator_state.target_id) && 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 scsiStartStopUnit(g_initiator_state.target_id, true) && 
														 | 
														
														 | 
														
															                 scsiStartStopUnit(g_initiator_state.target_id, true) && 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 scsiInitiatorReadCapacity(g_initiator_state.target_id, &g_initiator_state.sectorcount, &g_initiator_state.sectorsize); 
														 | 
														
														 | 
														
															                 scsiInitiatorReadCapacity(g_initiator_state.target_id, &g_initiator_state.sectorcount, &g_initiator_state.sectorsize); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             LED_OFF(); 
														 | 
														
														 | 
														
															             LED_OFF(); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -322,13 +323,15 @@ bool scsiInitiatorReadCapacity(int target_id, uint32_t *sectorcount, uint32_t *s 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 bool scsiRequestSense(int target_id, uint8_t *sense_key) 
														 | 
														
														 | 
														
															 bool scsiRequestSense(int target_id, uint8_t *sense_key) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     uint8_t command[6] = {0x03, 0, 0, 0, 4, 0}; 
														 | 
														
														 | 
														
															     uint8_t command[6] = {0x03, 0, 0, 0, 4, 0}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    uint8_t response[4] = {0}; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    uint8_t response[18] = {0}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     int status = scsiInitiatorRunCommand(target_id, 
														 | 
														
														 | 
														
															     int status = scsiInitiatorRunCommand(target_id, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                                          command, sizeof(command), 
														 | 
														
														 | 
														
															                                          command, sizeof(command), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                                          response, sizeof(response), 
														 | 
														
														 | 
														
															                                          response, sizeof(response), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                                          NULL, 0); 
														 | 
														
														 | 
														
															                                          NULL, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    azdbg("RequestSense response: ", bytearray(response, 18)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     *sense_key = response[2]; 
														 | 
														
														 | 
														
															     *sense_key = response[2]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return status == 0; 
														 | 
														
														 | 
														
															     return status == 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -356,6 +359,58 @@ bool scsiStartStopUnit(int target_id, bool start) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return status == 0; 
														 | 
														
														 | 
														
															     return status == 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+// Execute INQUIRY command 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+bool scsiInquiry(int target_id, uint8_t inquiry_data[36]) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    uint8_t command[6] = {0x12, 0, 0, 0, 36, 0}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    int status = scsiInitiatorRunCommand(target_id, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                         command, sizeof(command), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                         inquiry_data, 36, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                         NULL, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    return status == 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+// Execute TEST UNIT READY command and handle unit attention state 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+bool scsiTestUnitReady(int target_id) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    for (int retries = 0; retries < 2; retries++) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        uint8_t command[6] = {0x00, 0, 0, 0, 0, 0}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        int status = scsiInitiatorRunCommand(target_id, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                            command, sizeof(command), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                            NULL, 0, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                            NULL, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (status == 0) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            return true; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        else if (status == 2) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            uint8_t sense_key; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            scsiRequestSense(target_id, &sense_key); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            if (sense_key == 6) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                uint8_t inquiry[36]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                azlog("Target ", target_id, " reports UNIT_ATTENTION, running INQUIRY"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                scsiInquiry(target_id, inquiry); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            else if (sense_key == 2) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                azlog("Target ", target_id, " reports NOT_READY, running STARTSTOPUNIT"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                scsiStartStopUnit(target_id, true); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        else 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            azlog("Target ", target_id, " TEST UNIT READY response: ", status); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    return false; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 // This uses callbacks to run SD and SCSI transfers in parallel 
														 | 
														
														 | 
														
															 // This uses callbacks to run SD and SCSI transfers in parallel 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 static struct { 
														 | 
														
														 | 
														
															 static struct { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     uint32_t bytes_sd; // Number of bytes that have been transferred on SD card side 
														 | 
														
														 | 
														
															     uint32_t bytes_sd; // Number of bytes that have been transferred on SD card side 
														 |