From b2a964db2ab86b6c7a0ac08f627f7af35ec5a42a Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Thu, 2 May 2019 19:54:15 +1000 Subject: [PATCH] Fix timeout issue on entering data-in phase --- CHANGELOG | 3 ++- rtl/fpga_bitmap.o | Bin 32724 -> 32724 bytes src/firmware/config.c | 2 +- src/firmware/disk.c | 19 +++++++++++++------ src/firmware/scsiPhy.c | 23 +++++++++++++++++++---- src/firmware/scsiPhy.h | 1 + 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a98974e6..a30aa5e1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,8 @@ -2019XXXX +20190502 6.2.4 - Port XEBEC support from v5 firmware - Add Flexible Disk Drive Geometry SCSI MODE page - Stability improvements + - Fix regression from 6.1.3 firmware for Kurzweil K2000 20181011 6.2.1 - Fix bug in USB disk interface with disks over 4GB diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index 48d78e9ea3b294797d62feb72e818df30111e67c..857b042a4710966e0f151d47775538b67d5c1497 100644 GIT binary patch literal 32724 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⪌C%h}77L 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 s3T1A`bpGy!KjGky+X}K!qz>>M#f3Z+t<8 literal 32724 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 diff --git a/src/firmware/config.c b/src/firmware/config.c index 503833ac..442a9fa7 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -37,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x0623; +static const uint16_t FIRMWARE_VERSION = 0x0624; // 1 flash row static const uint8_t DEFAULT_CONFIG[128] = diff --git a/src/firmware/disk.c b/src/firmware/disk.c index 55eecdc6..961387fa 100755 --- a/src/firmware/disk.c +++ b/src/firmware/disk.c @@ -543,6 +543,8 @@ void scsiDiskPoll() if (scsiDev.phase == DATA_IN && transfer.currentBlock != transfer.blocks) { + // Take responsibility for waiting for the phase delays + uint32_t phaseChangeDelayUs = scsiEnterPhaseImmediate(DATA_IN); int totalSDSectors = transfer.blocks * SDSectorsPerSCSISector(bytesPerSector); @@ -562,7 +564,7 @@ void scsiDiskPoll() uint32_t partialScsiChunk = 0; // Start reading from the SD card FIRST, because we change state and - // wai for SCSI signals + // wait for SCSI signals int dataInStarted = 0; while ((i < totalSDSectors) && @@ -611,10 +613,14 @@ void scsiDiskPoll() sdActive = sectors; - if (!dataInStarted) + // Wait now that the SD card is busy + // Chances are we've probably already waited sufficient time, + // but it's hard to measure microseconds cheaply. So just wait + // extra just-in-case. Hopefully it's in parallel with dma. + if (phaseChangeDelayUs > 0) { - dataInStarted = 1; - scsiEnterPhase(DATA_IN); // Will wait a few microseconds. + s2s_delay_us(phaseChangeDelayUs); + phaseChangeDelayUs = 0; } } @@ -685,9 +691,10 @@ void scsiDiskPoll() #endif } - if (!dataInStarted && !scsiDev.resetFlag) // zero bytes ? + if (phaseChangeDelayUs > 0 && !scsiDev.resetFlag) // zero bytes ? { - scsiEnterPhase(DATA_IN); // Will wait a few microseconds. + s2s_delay_us(phaseChangeDelayUs); + phaseChangeDelayUs = 0; } // We've finished transferring the data to the FPGA, now wait until it's diff --git a/src/firmware/scsiPhy.c b/src/firmware/scsiPhy.c index c00b8d56..deb67b25 100755 --- a/src/firmware/scsiPhy.c +++ b/src/firmware/scsiPhy.c @@ -30,8 +30,8 @@ static uint8_t asyncTimings[][4] = { /* Speed, Assert, Deskew, Hold, Glitch */ -{/*1.5MB/s*/ 28, 18, 13, 6}, -{/*3.3MB/s*/ 13, 6, 6, 6}, +{/*1.5MB/s*/ 28, 18, 13, 15}, +{/*3.3MB/s*/ 13, 6, 6, 13}, {/*5MB/s*/ 9, 6, 6, 6}, // 80ns {/*safe*/ 3, 6, 6, 6}, // Probably safe {/*turbo*/ 3, 3, 3, 2} @@ -481,6 +481,16 @@ scsiSetDefaultTiming() } void scsiEnterPhase(int newPhase) +{ + uint32_t delay = scsiEnterPhaseImmediate(newPhase); + if (delay > 0) + { + s2s_delay_us(delay); + } +} + +// Returns microsecond delay +uint32_t scsiEnterPhaseImmediate(int newPhase) { // ANSI INCITS 362-2002 SPI-3 10.7.1: // Phase changes are not allowed while REQ or ACK is asserted. @@ -569,22 +579,27 @@ void scsiEnterPhase(int newPhase) asyncTiming[3]); } + uint32_t delayUs = 0; if (newPhase >= 0) { *SCSI_CTRL_PHASE = newPhase; - busSettleDelay(); + delayUs += 1; // busSettleDelay if (scsiDev.compatMode < COMPAT_SCSI2) { // EMU EMAX needs 100uS ! 10uS is not enough. - s2s_delay_us(100); + delayUs += 100; } } else { *SCSI_CTRL_PHASE = 0; } + + return delayUs; } + + return 0; // No change } uint32_t s2s_getScsiRateMBs() diff --git a/src/firmware/scsiPhy.h b/src/firmware/scsiPhy.h index a99ed365..19f0aa6f 100755 --- a/src/firmware/scsiPhy.h +++ b/src/firmware/scsiPhy.h @@ -89,6 +89,7 @@ void scsiPhyConfig(void); void scsiPhyReset(void); void scsiEnterPhase(int phase); +uint32_t scsiEnterPhaseImmediate(int phase); void scsiEnterBusFree(void); void scsiSetDataCount(uint32_t count); -- 2.38.5