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