Răsfoiți Sursa

Don't check if the SD card is removed while in the middle of USB reads/writes

Michael McMaster 4 ani în urmă
părinte
comite
db16297679

+ 11 - 7
lib/SCSI2SD/src/firmware/main.c

@@ -106,10 +106,10 @@ void mainLoop()
 	s2s_configPoll();
 
 #ifdef S2S_USB_FS
-	s2s_usbDevicePoll(&hUsbDeviceFS);
+	int usbBusy = s2s_usbDevicePoll(&hUsbDeviceFS);
 #endif
 #ifdef S2S_USB_HS
-	s2s_usbDevicePoll(&hUsbDeviceHS);
+	int usbBusy = s2s_usbDevicePoll(&hUsbDeviceHS);
 #endif
 
 #if 0
@@ -117,7 +117,7 @@ void mainLoop()
 #endif
 
     // TODO test if USB transfer is in progress
-	if (unlikely(scsiDev.phase == BUS_FREE))
+	if (unlikely(scsiDev.phase == BUS_FREE) && !usbBusy)
 	{
 		if (unlikely(s2s_elapsedTime_ms(lastSDPoll) > 200))
 		{
@@ -128,19 +128,23 @@ void mainLoop()
 				scsiPhyConfig();
 				scsiInit();
 
-/* TODO DEAL WITH THIS
 				if (isUsbStarted)
 				{
+#ifdef S2S_USB_FS
 					USBD_Stop(&hUsbDeviceFS);
 					s2s_delay_ms(128);
 					USBD_Start(&hUsbDeviceFS);
+#endif
+#ifdef S2S_USB_HS
+					USBD_Stop(&hUsbDeviceHS);
+					s2s_delay_ms(128);
+					USBD_Start(&hUsbDeviceHS);
+#endif
 				}
-*/			
 			}
-
 		}
 	}
-	else if ((scsiDev.phase >= 0) && (blockDev.state & DISK_PRESENT))
+	else if (usbBusy || ((scsiDev.phase >= 0) && (blockDev.state & DISK_PRESENT)))
 	{
 		// don't waste time scanning SD cards while we're doing disk IO
 		lastSDPoll = s2s_getTime_ms();

+ 7 - 1
lib/SCSI2SD/src/firmware/usb_device/usbd_composite.c

@@ -506,20 +506,26 @@ static uint8_t USBD_Composite_DataOut(USBD_HandleTypeDef  *pdev, uint8_t epnum)
 	return USBD_OK;
 }
 
-void s2s_usbDevicePoll(USBD_HandleTypeDef  *pdev) {
+int s2s_usbDevicePoll(USBD_HandleTypeDef  *pdev) {
 	USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 
+    int busy = 0;
+
 	if (classData->DataInReady)
 	{
 		classData->DataInReady = 0;
 		MSC_BOT_DataIn(pdev);
+        busy = busy || 1;
 	}
 
 	if (classData->DataOutReady)
     {
 		classData->DataOutReady = 0;
 		MSC_BOT_DataOut(pdev);
+        busy = busy || 1;
 	}
+
+    return busy;
 }
 
 

+ 2 - 1
lib/SCSI2SD/src/firmware/usb_device/usbd_composite.h

@@ -48,7 +48,8 @@ typedef struct {
 } USBD_CompositeClassData;
 
 
-void s2s_usbDevicePoll(USBD_HandleTypeDef* pdev);
+// Returns 1 if busy
+int s2s_usbDevicePoll(USBD_HandleTypeDef* pdev);
 
 static inline uint8_t USBD_Composite_IsConfigured(USBD_HandleTypeDef *pdev) {
 	return pdev->dev_state == USBD_STATE_CONFIGURED;