From: Michael McMaster Date: Thu, 22 Sep 2016 09:21:55 +0000 (+1000) Subject: Fixed scsi timing error and added glitch filter. X-Git-Tag: v6.0.12~1 X-Git-Url: http://git.codesrc.com/?a=commitdiff_plain;h=4eaf57cdc7d30a25e1679766fb42bfe646246c6e;p=SCSI2SD-V6.git Fixed scsi timing error and added glitch filter. --- diff --git a/CHANGELOG b/CHANGELOG index 18309e9a..a6cd8c64 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +20160922 6.0.?? + - Fixed SCSI timing issue + - Added glitch filter on SCSI signals. + 20160912 6.0.10 - Fixed write issue with UHS-I Speed Class 3 SD cards. - More stability bug fixes diff --git a/STM32CubeMX/SCSI2SD-V6/Src/main.c b/STM32CubeMX/SCSI2SD-V6/Src/main.c index 45f98d9c..5433bbf6 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/main.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/main.c @@ -91,7 +91,7 @@ int main(void) MX_FSMC_Init(); MX_SDIO_SD_Init(); MX_SPI1_Init(); - MX_TIM4_Init(); + // TODO re-enable MX_TIM4_Init(); // TODO re-enable MX_USART3_UART_Init(); // TODO re-enable MX_USB_HOST_Init(); diff --git a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c index 678a9e7a..0f9a34b1 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c @@ -88,7 +88,7 @@ void HAL_SD_MspInit(SD_HandleTypeDef* hsd) GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - // No pullup on CMD + // No pullup on CLK GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; diff --git a/STM32CubeMX/SCSI2SD-V6/Src/spi.c b/STM32CubeMX/SCSI2SD-V6/Src/spi.c index bef2045f..25e0745e 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/spi.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/spi.c @@ -54,7 +54,8 @@ void MX_SPI1_Init(void) hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + // (96MHz / 2) / 4 = 12MHz. FPGA device allows up to 25MHz write + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLED; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; diff --git a/include/scsi2sd.h b/include/scsi2sd.h index a59fd38d..e15d0b09 100755 --- a/include/scsi2sd.h +++ b/include/scsi2sd.h @@ -53,7 +53,7 @@ typedef enum S2S_CFG_ENABLE_UNIT_ATTENTION = 1, S2S_CFG_ENABLE_PARITY = 2, S2S_CFG_ENABLE_SCSI2 = 4, - // OBSOLETE S2S_CFG_DISABLE_GLITCH = 8, + S2S_CFG_DISABLE_GLITCH = 8, S2S_CFG_ENABLE_CACHE = 16, S2S_CFG_ENABLE_DISCONNECT = 32, S2S_CFG_ENABLE_SEL_LATCH = 64, @@ -203,7 +203,8 @@ typedef enum typedef enum { S2S_CFG_STATUS_GOOD, - S2S_CFG_STATUS_ERR + S2S_CFG_STATUS_ERR, + S2S_CFG_STATUS_BUSY } S2S_CFG_STATUS; diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index 604983ff..20717dbc 100644 Binary files a/rtl/fpga_bitmap.o and b/rtl/fpga_bitmap.o differ diff --git a/src/firmware/config.c b/src/firmware/config.c index 6430d573..7ab2001b 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -37,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x060A; +static const uint16_t FIRMWARE_VERSION = 0x060B; // 1 flash row static const uint8_t DEFAULT_CONFIG[128] = diff --git a/src/firmware/fpga.c b/src/firmware/fpga.c index 441d7851..bc1782d6 100755 --- a/src/firmware/fpga.c +++ b/src/firmware/fpga.c @@ -39,10 +39,8 @@ void s2s_fpgaInit() HAL_GPIO_WritePin( nFGPA_CRESET_B_GPIO_Port, nFGPA_CRESET_B_Pin, GPIO_PIN_SET); - // 800uS for iCE40HX1K. 1200uS for HX4K according to Appendix A of - // TN1248 - iCE40 Programming and Configuration. Note that the - // earlier text of the document says 300uS. - s2s_delay_us(1200); // Be generous + // 800uS for iCE40HX1K. tCR_SCK parameter in datasheet. + s2s_delay_us(800); uint8_t* fpgaData = &_fpga_bitmap_start; uint32_t fpgaBytes = (uint32_t) &_fpga_bitmap_size; diff --git a/src/firmware/scsiPhy.c b/src/firmware/scsiPhy.c index 7b4e4633..ca3b494a 100755 --- a/src/firmware/scsiPhy.c +++ b/src/firmware/scsiPhy.c @@ -28,13 +28,18 @@ #include -// 5MB/s +// Slowest timing. Aim for 1.5MB/s, but it's likely to be faster. +// Assumes a 96MHz fpga clock. +#define SCSI_SCSI1_DESKEW 0x7 +#define SCSI_SCSI1_TIMING ((0x7 << 4) | 0xF) + +// 5MB/s sync and async. // Assumes a 96MHz fpga clock. // 2:0 Deskew count, 55ns // 6:4 Hold count, 53ns // 3:0 Assertion count, 80ns -#define SCSI_DEFAULT_DESKEW 0x6 -#define SCSI_DEFAULT_TIMING ((0x5 << 4) | 0x8) +#define SCSI_SCSI2_DESKEW 0x6 +#define SCSI_SCSI2_TIMING ((0x5 << 4) | 0x8) // 10MB/s // 2:0 Deskew count, 25ns @@ -441,23 +446,32 @@ void scsiEnterPhase(int phase) if (scsiDev.target->syncPeriod == 12) { // SCSI2 FAST-20 Timing. 20MB/s. - *SCSI_CTRL_TIMING = SCSI_FAST20_DESKEW; - *SCSI_CTRL_TIMING2 = SCSI_FAST20_TIMING; + *SCSI_CTRL_DESKEW = SCSI_FAST20_DESKEW; + *SCSI_CTRL_TIMING = SCSI_FAST20_TIMING; } else if (scsiDev.target->syncPeriod == 25) { // SCSI2 FAST Timing. 10MB/s. - *SCSI_CTRL_TIMING = SCSI_FAST10_DESKEW; - *SCSI_CTRL_TIMING2 = SCSI_FAST10_TIMING; + *SCSI_CTRL_DESKEW = SCSI_FAST10_DESKEW; + *SCSI_CTRL_TIMING = SCSI_FAST10_TIMING; } else { // 5MB/s Timing - *SCSI_CTRL_TIMING = SCSI_DEFAULT_DESKEW; - *SCSI_CTRL_TIMING2 = SCSI_DEFAULT_TIMING; + *SCSI_CTRL_DESKEW = SCSI_SCSI2_DESKEW; + *SCSI_CTRL_TIMING = SCSI_SCSI2_TIMING; } + *SCSI_CTRL_SYNC_OFFSET = scsiDev.target->syncOffset; } else { *SCSI_CTRL_SYNC_OFFSET = 0; - *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + + if (scsiDev.compatMode >= COMPAT_SCSI2) { + // 5MB/s Timing + *SCSI_CTRL_DESKEW = SCSI_SCSI2_DESKEW; + *SCSI_CTRL_TIMING = SCSI_SCSI2_TIMING; + } else { + *SCSI_CTRL_DESKEW = SCSI_SCSI1_DESKEW; + *SCSI_CTRL_TIMING = SCSI_SCSI1_TIMING; + } } *SCSI_CTRL_PHASE = newPhase; @@ -492,7 +506,8 @@ void scsiPhyReset() *SCSI_CTRL_DBX = 0; *SCSI_CTRL_SYNC_OFFSET = 0; - *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + *SCSI_CTRL_DESKEW = SCSI_SCSI1_DESKEW; + *SCSI_CTRL_TIMING = SCSI_SCSI1_TIMING; // DMA Benchmark code // Currently 11MB/s. @@ -658,7 +673,8 @@ void scsiPhyInit() *SCSI_CTRL_DBX = 0; *SCSI_CTRL_SYNC_OFFSET = 0; - *SCSI_CTRL_TIMING = SCSI_DEFAULT_TIMING; + *SCSI_CTRL_DESKEW = SCSI_SCSI1_DESKEW; + *SCSI_CTRL_TIMING = SCSI_SCSI1_TIMING; } @@ -684,6 +700,10 @@ void scsiPhyConfig() } } *SCSI_CTRL_IDMASK = idMask; + + *SCSI_CTRL_FLAGS = + (scsiDev.boardCfg.flags & S2S_CFG_DISABLE_GLITCH) ? 1 : 0; + } diff --git a/src/firmware/scsiPhy.h b/src/firmware/scsiPhy.h index 718b25fb..7f52280c 100755 --- a/src/firmware/scsiPhy.h +++ b/src/firmware/scsiPhy.h @@ -26,8 +26,9 @@ #define SCSI_DATA_CNT_SET ((volatile uint8_t*)0x6000000C) #define SCSI_CTRL_DBX ((volatile uint8_t*)0x6000000E) #define SCSI_CTRL_SYNC_OFFSET ((volatile uint8_t*)0x60000010) -#define SCSI_CTRL_TIMING ((volatile uint8_t*)0x60000012) -#define SCSI_CTRL_TIMING2 ((volatile uint8_t*)0x60000014) +#define SCSI_CTRL_DESKEW ((volatile uint8_t*)0x60000012) +#define SCSI_CTRL_TIMING ((volatile uint8_t*)0x60000014) +#define SCSI_CTRL_FLAGS ((volatile uint8_t*)0x60000016) #define SCSI_STS_FIFO ((volatile uint8_t*)0x60000020) #define SCSI_STS_ALTFIFO ((volatile uint8_t*)0x60000022) diff --git a/src/scsi2sd-util6/BoardPanel.cc b/src/scsi2sd-util6/BoardPanel.cc index 90fd6cd4..54ea2352 100644 --- a/src/scsi2sd-util6/BoardPanel.cc +++ b/src/scsi2sd-util6/BoardPanel.cc @@ -53,7 +53,7 @@ BoardPanel::BoardPanel(wxWindow* parent, const S2S_BoardCfg& initialConfig) : myParent(parent), myDelayValidator(new wxIntegerValidator) { - wxFlexGridSizer *fgs = new wxFlexGridSizer(10, 2, 9, 25); + wxFlexGridSizer *fgs = new wxFlexGridSizer(11, 2, 9, 25); fgs->Add(new wxStaticText(this, wxID_ANY, wxT(""))); myTermCtrl = @@ -118,6 +118,15 @@ BoardPanel::BoardPanel(wxWindow* parent, const S2S_BoardCfg& initialConfig) : myScsi2Ctrl->SetToolTip(_("Enable high-performance mode. May cause problems with SASI/SCSI1 hosts.")); fgs->Add(myScsi2Ctrl); + fgs->Add(new wxStaticText(this, wxID_ANY, wxT(""))); + myGlitchCtrl = + new wxCheckBox( + this, + ID_glitchCtrl, + _("Disable glitch filter")); + myGlitchCtrl->SetToolTip(_("Improve performance at the cost of noise immunity. Only use with short cables.")); + fgs->Add(myGlitchCtrl); + fgs->Add(new wxStaticText(this, wxID_ANY, wxT(""))); myCacheCtrl = new wxCheckBox( @@ -176,6 +185,7 @@ BoardPanel::getConfig() const (myParityCtrl->IsChecked() ? S2S_CFG_ENABLE_PARITY : 0) | (myUnitAttCtrl->IsChecked() ? S2S_CFG_ENABLE_UNIT_ATTENTION : 0) | (myScsi2Ctrl->IsChecked() ? S2S_CFG_ENABLE_SCSI2 : 0) | + (myGlitchCtrl->IsChecked() ? S2S_CFG_DISABLE_GLITCH : 0) | (myCacheCtrl->IsChecked() ? S2S_CFG_ENABLE_CACHE: 0) | (myDisconnectCtrl->IsChecked() ? S2S_CFG_ENABLE_DISCONNECT: 0) | (mySelLatchCtrl->IsChecked() ? S2S_CFG_ENABLE_SEL_LATCH : 0) | @@ -196,6 +206,7 @@ BoardPanel::setConfig(const S2S_BoardCfg& config) myParityCtrl->SetValue(config.flags & S2S_CFG_ENABLE_PARITY); myUnitAttCtrl->SetValue(config.flags & S2S_CFG_ENABLE_UNIT_ATTENTION); myScsi2Ctrl->SetValue(config.flags & S2S_CFG_ENABLE_SCSI2); + myGlitchCtrl->SetValue(config.flags & S2S_CFG_DISABLE_GLITCH); myTermCtrl->SetValue(config.flags6 & S2S_CFG_ENABLE_TERMINATOR); myCacheCtrl->SetValue(config.flags & S2S_CFG_ENABLE_CACHE); myDisconnectCtrl->SetValue(config.flags & S2S_CFG_ENABLE_DISCONNECT); diff --git a/src/scsi2sd-util6/BoardPanel.hh b/src/scsi2sd-util6/BoardPanel.hh index 06fadf31..8a8bc04f 100644 --- a/src/scsi2sd-util6/BoardPanel.hh +++ b/src/scsi2sd-util6/BoardPanel.hh @@ -55,6 +55,7 @@ private: ID_parityCtrl = wxID_HIGHEST + 1, ID_unitAttCtrl, ID_scsi2Ctrl, + ID_glitchCtrl, ID_termCtrl, ID_cacheCtrl, ID_disconnectCtrl, @@ -71,6 +72,7 @@ private: wxCheckBox* myParityCtrl; wxCheckBox* myUnitAttCtrl; wxCheckBox* myScsi2Ctrl; + wxCheckBox* myGlitchCtrl; wxCheckBox* myTermCtrl; wxCheckBox* myCacheCtrl; wxCheckBox* myDisconnectCtrl; diff --git a/src/scsi2sd-util6/ConfigUtil.cc b/src/scsi2sd-util6/ConfigUtil.cc index 1b68f5d2..9db2ded6 100755 --- a/src/scsi2sd-util6/ConfigUtil.cc +++ b/src/scsi2sd-util6/ConfigUtil.cc @@ -319,6 +319,18 @@ ConfigUtil::toXML(const S2S_BoardCfg& config) (config.flags & S2S_CFG_ENABLE_CACHE ? "true" : "false") << "\n" << + " \n" << + " " << + (config.flags & S2S_CFG_DISABLE_GLITCH ? "true" : "false") << + "\n" << + + " " << (config.flags & S2S_CFG_ENABLE_DISCONNECT ? "true" : "false") << "\n" << @@ -532,6 +544,18 @@ parseBoardConfig(wxXmlNode* node) result.flags = result.flags & ~S2S_CFG_ENABLE_SCSI2; } } + else if (child->GetName() == "disableGlitchFilter") + { + std::string s(child->GetNodeContent().mb_str()); + if (s == "true") + { + result.flags |= S2S_CFG_DISABLE_GLITCH; + } + else + { + result.flags = result.flags & ~S2S_CFG_DISABLE_GLITCH; + } + } else if (child->GetName() == "enableTerminator") { std::string s(child->GetNodeContent().mb_str());