From 918a04a159194bf4253b604fd9b223fed53616d9 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Fri, 26 Aug 2016 23:28:58 +1000 Subject: [PATCH] Synchronous support 5MB/s and 10MB/s working. Also fixes bug in FPGA interface that caused issues writing large files. --- CHANGELOG | 1 + Makefile | 3 ++- rtl/fpga_bitmap.o | Bin 32724 -> 32724 bytes src/firmware/bsp.h | 2 +- src/firmware/config.c | 2 +- src/firmware/diagnostic.c | 22 +++++++++++++++- src/firmware/inquiry.c | 2 +- src/firmware/scsi.c | 52 +++++++++++++++++++++++++++++++++++--- src/firmware/scsi.h | 5 ++++ src/firmware/scsiPhy.c | 50 +++++++++++++++++++++++++++++++----- src/firmware/scsiPhy.h | 2 ++ 11 files changed, 127 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3bbc3afc..f16e0648 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ 2016XXXX 6.0.7 + - Synchronous transfers supported ! 5MB/s and 10MB/s supported. - Fix for accessing data via USB with more than 2 devices configured. 20160815 6.0.6 diff --git a/Makefile b/Makefile index 61c82263..0839fcdf 100644 --- a/Makefile +++ b/Makefile @@ -6,8 +6,9 @@ CPPFLAGS=-DSTM32F205xx -DUSE_HAL_DRIVER -Wall -Werror CFLAGS=-mcpu=cortex-m3 -mthumb -mslow-flash-data \ -std=gnu11 \ -specs=nosys.specs \ - -Os -g \ + -g \ +# -Os -g \ LDFLAGS= \ "-Tsrc/firmware/link.ld" \ diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index 53348881e32cbbb16ff37342273e982052852b30..56551b363f91bcb0323785fb79e5b6eab51ae5ad 100644 GIT binary patch literal 32724 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 E01@%)_W%F@ literal 32724 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 diff --git a/src/firmware/bsp.h b/src/firmware/bsp.h index 5b9c8d14..fd1a7108 100644 --- a/src/firmware/bsp.h +++ b/src/firmware/bsp.h @@ -20,7 +20,7 @@ // For the STM32F205, DMA bursts may not cross 1KB address boundaries. // The maximum burst is 16 bytes. -#define S2S_DMA_ALIGN __attribute__((aligned(16))) +#define S2S_DMA_ALIGN __attribute__((aligned(1024))) #endif diff --git a/src/firmware/config.c b/src/firmware/config.c index eb6b3694..89772632 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -37,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x0606; +static const uint16_t FIRMWARE_VERSION = 0x0607; // 1 flash row static const uint8_t DEFAULT_CONFIG[128] = diff --git a/src/firmware/diagnostic.c b/src/firmware/diagnostic.c index 0f924062..faddace1 100755 --- a/src/firmware/diagnostic.c +++ b/src/firmware/diagnostic.c @@ -165,6 +165,26 @@ void scsiReadBuffer() (allocLength > MAX_SECTOR_SIZE) ? MAX_SECTOR_SIZE : allocLength; scsiDev.phase = DATA_IN; } + else if (mode == 0x2 && (scsiDev.cdb[2] == 0)) + { + // TODO support BUFFER OFFSET fields in CDB + scsiDev.dataLen = + (allocLength > MAX_SECTOR_SIZE) ? MAX_SECTOR_SIZE : allocLength; + scsiDev.phase = DATA_IN; + } + else if (mode == 0x3) + { + uint32_t maxSize = MAX_SECTOR_SIZE - 4; + // 4 byte header + scsiDev.data[0] = 0; + scsiDev.data[1] = (maxSize >> 16) & 0xff; + scsiDev.data[2] = (maxSize >> 8) & 0xff; + scsiDev.data[3] = maxSize & 0xff; + + scsiDev.dataLen = + (allocLength > 4) ? 4: allocLength; + scsiDev.phase = DATA_IN; + } else { // error. @@ -198,7 +218,7 @@ void scsiWriteBuffer() (((uint32_t) scsiDev.cdb[7]) << 8) + scsiDev.cdb[8]; - if (mode == 0 && allocLength <= sizeof(scsiDev.data)) + if ((mode == 0 || mode == 2) && allocLength <= sizeof(scsiDev.data)) { scsiDev.dataLen = allocLength; scsiDev.phase = DATA_OUT; diff --git a/src/firmware/inquiry.c b/src/firmware/inquiry.c index 549ee4f4..d51b3c0d 100755 --- a/src/firmware/inquiry.c +++ b/src/firmware/inquiry.c @@ -29,7 +29,7 @@ static uint8_t StandardResponse[] = 0x01, // Response format is compatible with the old CCS format. 0x1f, // standard length. 0, 0, // Reserved -0x08 // Enable linked commands +0x18 // Enable sync and linked commands }; // Vendor set by config 'c','o','d','e','s','r','c',' ', // prodId set by config'S','C','S','I','2','S','D',' ',' ',' ',' ',' ',' ',' ',' ',' ', diff --git a/src/firmware/scsi.c b/src/firmware/scsi.c index bbb3e484..e43afd24 100755 --- a/src/firmware/scsi.c +++ b/src/firmware/scsi.c @@ -480,6 +480,13 @@ static void scsiReset() scsiDev.target->sense.asc = NO_ADDITIONAL_SENSE_INFORMATION; } scsiDev.target = NULL; + + for (int i = 0; i < S2S_MAX_TARGETS; ++i) + { + scsiDev.target[i].syncOffset = 0; + scsiDev.target[i].syncPeriod = 0; + } + scsiDiskReset(); scsiDev.postDataOutHook = NULL; @@ -516,6 +523,8 @@ static void enter_SelectionPhase() transfer.currentBlock = 0; scsiDev.postDataOutHook = NULL; + + scsiDev.needSyncNegotiationAck = 0; } static void process_SelectionPhase() @@ -655,6 +664,11 @@ static void process_MessageOut() // ANY initiator can reset the reservation state via this message. scsiDev.target->reservedId = -1; scsiDev.target->reserverId = -1; + + // Cancel any sync negotiation + scsiDev.target->syncOffset = 0; + scsiDev.target->syncPeriod = 0; + enter_BusFree(); } else if (scsiDev.msgOut == 0x05) @@ -677,7 +691,13 @@ static void process_MessageOut() { // Message Reject // Oh well. - scsiDev.resetFlag = 1; + + if (scsiDev.needSyncNegotiationAck) + { + scsiDev.target->syncOffset = 0; + scsiDev.target->syncPeriod = 0; + scsiDev.needSyncNegotiationAck = 0; + } } else if (scsiDev.msgOut == 0x08) { @@ -737,10 +757,27 @@ static void process_MessageOut() } else if (extmsg[0] == 1 && msgLen == 3) // Synchronous data request { - // Negotiate back to async + int transferPeriod = extmsg[3]; + int offset = extmsg[4]; + + if (transferPeriod > 50) // 200ns, 5MB/s + { + scsiDev.target->syncOffset = 0; + scsiDev.target->syncPeriod = 0; + } else { + scsiDev.target->syncOffset = offset < 15 ? offset : 15; + if (transferPeriod <= 25) + { + scsiDev.target->syncPeriod = 25; // 10MB/s + } else { + scsiDev.target->syncPeriod = 50; // 5MB/s + } + } + scsiEnterPhase(MESSAGE_IN); - static const uint8_t SDTR[] = {0x01, 0x03, 0x01, 0x00, 0x00}; + uint8_t SDTR[] = {0x01, 0x03, 0x01, scsiDev.target->syncPeriod, scsiDev.target->syncOffset}; scsiWrite(SDTR, sizeof(SDTR)); + scsiDev.needSyncNegotiationAck = 1; // Check if this message is rejected. } else { @@ -755,6 +792,12 @@ static void process_MessageOut() // Re-check the ATN flag in case it stays asserted. scsiDev.atnFlag |= scsiStatusATN(); + + if (!scsiDev.atnFlag) + { + // Message wasn't rejected! + scsiDev.needSyncNegotiationAck = 0; + } } void scsiPoll(void) @@ -918,6 +961,9 @@ void scsiInit() } scsiDev.targets[i].sense.code = NO_SENSE; scsiDev.targets[i].sense.asc = NO_ADDITIONAL_SENSE_INFORMATION; + + scsiDev.targets[i].syncOffset = 0; + scsiDev.targets[i].syncPeriod = 0; } firstInit = 0; } diff --git a/src/firmware/scsi.h b/src/firmware/scsi.h index 2e3a5fa8..2ef223ec 100755 --- a/src/firmware/scsi.h +++ b/src/firmware/scsi.h @@ -93,6 +93,9 @@ typedef struct // A 3rd party may be sending the RESERVE/RELEASE commands int reservedId; // 0 -> 7 if reserved. -1 if not reserved. int reserverId; // 0 -> 7 if reserved. -1 if not reserved. + + uint8_t syncOffset; + uint8_t syncPeriod; } TargetState; typedef struct @@ -148,6 +151,8 @@ typedef struct uint8_t lastStatus; uint8_t lastSense; uint16_t lastSenseASC; + + int needSyncNegotiationAck; } ScsiDevice; extern ScsiDevice scsiDev; diff --git a/src/firmware/scsiPhy.c b/src/firmware/scsiPhy.c index 2231089d..71640f4f 100755 --- a/src/firmware/scsiPhy.c +++ b/src/firmware/scsiPhy.c @@ -28,6 +28,17 @@ #include +// Assumes a 60MHz fpga clock. +// 7:6 Hold count, 45ns +// 5:3 Assertion count, 90ns +// 2:0 Deskew count, 55ns +#define SCSI_DEFAULT_TIMING ((0x3 << 6) | (0x6 << 3) | 0x4) + +// 7:6 Hold count, 10ns +// 5:3 Assertion count, 30ns +// 2:0 Deskew count, 25ns +#define SCSI_FAST_TIMING ((0x1 << 6) | (0x2 << 3) | 0x2) + // Private DMA variables. static int dmaInProgress = 0; @@ -218,17 +229,21 @@ scsiRead(uint8_t* data, uint32_t count) }; } -#if FIFODEBUG - if (!scsiPhyFifoEmpty()) { + + i += chunk; + chunk = nextChunk; + } +#if 1 + if (!scsiPhyFifoEmpty() || !scsiPhyFifoAltEmpty()) { int j = 0; while (!scsiPhyFifoEmpty()) { scsiPhyRx(); ++j; } + scsiPhyFifoFlip(); + int k = 0; + while (!scsiPhyFifoEmpty()) { scsiPhyRx(); ++k; } // Force a lock-up. assertFail(); } #endif - i += chunk; - chunk = nextChunk; - } } void @@ -382,12 +397,29 @@ void scsiEnterPhase(int phase) int newPhase = phase > 0 ? phase : 0; int oldPhase = *SCSI_CTRL_PHASE; - if (!scsiPhyFifoEmpty() || !scsiPhyFifoAltEmpty()) { + if (!scsiDev.resetFlag && (!scsiPhyFifoEmpty() || !scsiPhyFifoAltEmpty())) { // Force a lock-up. assertFail(); } if (newPhase != oldPhase) { + if ((newPhase == DATA_IN || newPhase == DATA_OUT) && + scsiDev.target->syncOffset) + { + if (scsiDev.target->syncPeriod == 25) + { + // SCSI2 FAST Timing. 10MB/s. + *SCSI_CTRL_TIMING = SCSI_FAST_TIMING; + } else { + // 5MB/s Timing + *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + } + *SCSI_CTRL_SYNC_OFFSET = scsiDev.target->syncOffset; + } else { + *SCSI_CTRL_SYNC_OFFSET = 0; + *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + } + *SCSI_CTRL_PHASE = newPhase; busSettleDelay(); @@ -446,6 +478,9 @@ void scsiPhyReset() *SCSI_FIFO_SEL = 0; *SCSI_CTRL_DBX = 0; + *SCSI_CTRL_SYNC_OFFSET = 0; + *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + // DMA Benchmark code // Currently 10MB/s. Assume 20MB/s is achievable with 16 bits. #ifdef DMA_BENCHMARK @@ -609,6 +644,9 @@ void scsiPhyInit() *SCSI_FIFO_SEL = 0; *SCSI_CTRL_DBX = 0; + *SCSI_CTRL_SYNC_OFFSET = 0; + *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + } void scsiPhyConfig() diff --git a/src/firmware/scsiPhy.h b/src/firmware/scsiPhy.h index fcdf3e45..b70ff7bc 100755 --- a/src/firmware/scsiPhy.h +++ b/src/firmware/scsiPhy.h @@ -25,6 +25,8 @@ #define SCSI_DATA_CNT_LO ((volatile uint8_t*)0x60000005) #define SCSI_DATA_CNT_SET ((volatile uint8_t*)0x60000006) #define SCSI_CTRL_DBX ((volatile uint8_t*)0x60000007) +#define SCSI_CTRL_SYNC_OFFSET ((volatile uint8_t*)0x60000008) +#define SCSI_CTRL_TIMING ((volatile uint8_t*)0x60000009) #define SCSI_STS_FIFO ((volatile uint8_t*)0x60000010) #define SCSI_STS_ALTFIFO ((volatile uint8_t*)0x60000011) -- 2.38.5