From 1a17e9ff1f44f35410e6a08d17a9b9406634056e Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Tue, 9 Mar 2021 21:58:04 +1000 Subject: [PATCH] Don't check if the SD card is removed while in the middle of USB reads/writes --- src/firmware/main.c | 18 +++++++++++------- src/firmware/usb_device/usbd_composite.c | 8 +++++++- src/firmware/usb_device/usbd_composite.h | 3 ++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/firmware/main.c b/src/firmware/main.c index d2d88166..caea8e20 100755 --- a/src/firmware/main.c +++ b/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(); diff --git a/src/firmware/usb_device/usbd_composite.c b/src/firmware/usb_device/usbd_composite.c index 32d98304..a545b8ba 100755 --- a/src/firmware/usb_device/usbd_composite.c +++ b/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; } diff --git a/src/firmware/usb_device/usbd_composite.h b/src/firmware/usb_device/usbd_composite.h index dbb9778d..7b331cd8 100755 --- a/src/firmware/usb_device/usbd_composite.h +++ b/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; -- 2.38.5