From c864bf221abc4b56b9444dfe58a7e0d2b640e15c Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Mon, 31 May 2021 15:53:30 +1000 Subject: [PATCH] Add SD keep-alive to ensure it responds immediately --- CHANGELOG | 1 + src/firmware/config.c | 2 +- src/firmware/main.c | 11 +++++++++-- src/firmware/scsi.c | 8 ++++---- src/firmware/sd.c | 4 ++++ src/firmware/sd.h | 1 + 6 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f37416a3..c0359db8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ 20210628 6.4.11 - Remove the "Blind Writes" option from scsi2sd-util. The firmware no longer requires this option for improved write performance + - Fix firmware hang if there was no activity for a few minutes 20210508 6.4.4 - More bug fixes for firmware hanging during read/writes diff --git a/src/firmware/config.c b/src/firmware/config.c index 17ceab7d..9a44d371 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -36,7 +36,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x064A; +static const uint16_t FIRMWARE_VERSION = 0x064B; // Optional static config extern uint8_t* __fixed_config; diff --git a/src/firmware/main.c b/src/firmware/main.c index 46c9208d..f79ebd6e 100755 --- a/src/firmware/main.c +++ b/src/firmware/main.c @@ -42,6 +42,7 @@ const char* Notice = "Copyright (C) 2020 Michael McMaster "; uint32_t lastSDPoll; +uint32_t lastSDKeepAlive; static int isUsbStarted; @@ -131,7 +132,7 @@ void mainInit() s2s_ledOff(); #endif - lastSDPoll = s2s_getTime_ms(); + lastSDPoll = lastSDKeepAlive = s2s_getTime_ms(); } void mainLoop() @@ -180,11 +181,17 @@ void mainLoop() } } } + else if (lastSDKeepAlive > 10000) // 10 seconds + { + // 2021 boards fail if there's no commands sent in a while + sdKeepAlive(); + lastSDKeepAlive = s2s_getTime_ms(); + } } 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(); + lastSDPoll = lastSDKeepAlive = s2s_getTime_ms(); } } diff --git a/src/firmware/scsi.c b/src/firmware/scsi.c index 016ecbb5..d4077b9f 100755 --- a/src/firmware/scsi.c +++ b/src/firmware/scsi.c @@ -56,13 +56,13 @@ void enter_BusFree() s2s_delay_us(2); } -#if 0 - if (scsiDev.status != GOOD && isDebugEnabled()) +//#if 0 + if (scsiDev.status != GOOD)// && isDebugEnabled()) { // We want to capture debug information for failure cases. - s2s_delay_ms(64); + s2s_delay_ms(80); } -#endif +//#endif scsiEnterBusFree(); diff --git a/src/firmware/sd.c b/src/firmware/sd.c index 0eff83d3..a3c2c3bd 100755 --- a/src/firmware/sd.c +++ b/src/firmware/sd.c @@ -222,3 +222,7 @@ int sdIsBusy() return HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8) == 0; } +void sdKeepAlive() +{ + /*HAL_SD_CardStateTypeDef cardState = */HAL_SD_GetCardState(&hsd); +} diff --git a/src/firmware/sd.h b/src/firmware/sd.h index 5a1d79a1..438c07bb 100755 --- a/src/firmware/sd.h +++ b/src/firmware/sd.h @@ -37,6 +37,7 @@ int sdInit(void); void sdReadDMA(uint32_t lba, uint32_t sectors, uint8_t* outputBuffer); int sdReadDMAPoll(uint32_t remainingSectors); void sdCompleteTransfer(); +void sdKeepAlive(); int sdIsBusy(); -- 2.38.5