浏览代码

Add new "blind write" option to increase write command performance. This causes issues with some SCSI hosts and is now disabled by default.

Michael McMaster 5 年之前
父节点
当前提交
10cd4dff83

+ 4 - 1
lib/SCSI2SD/CHANGELOG

@@ -1,6 +1,9 @@
-2020xxxx		6.X.X
+20201012		6.3.2
 	- Increase limit of READ/WRITE BUFFER command for improved compatibility
 	SGI Iris hosts
+	- Add new config option to enable blind writes to improve SD card write
+	performance. This was previously enabled default but causes problems
+	with some SCSI hosts.
 
 20200419		6.3.1
 	- Added checks to ensure the correct firmware version is loaded.

+ 1 - 1
lib/SCSI2SD/Makefile

@@ -2,7 +2,7 @@
 ARMCC=arm-none-eabi-gcc
 OBJCOPY=arm-none-eabi-objcopy
 
-CPPFLAGS=-DSTM32F205xx -DUSE_HAL_DRIVER -Wall -Werror
+CPPFLAGS=-DSTM32F205xx -DUSE_HAL_DRIVER -Wall 
 CFLAGS=-mcpu=cortex-m3 -mthumb -mslow-flash-data \
 	-std=gnu11 \
 	-specs=nosys.specs \

+ 2 - 1
lib/SCSI2SD/include/scsi2sd.h

@@ -62,7 +62,8 @@ typedef enum
 
 typedef enum
 {
-	S2S_CFG_ENABLE_TERMINATOR = 1
+	S2S_CFG_ENABLE_TERMINATOR = 1,
+	S2S_CFG_ENABLE_BLIND_WRITES = 2,
 } S2S_CFG_FLAGS6;
 
 typedef enum

+ 1 - 1
lib/SCSI2SD/src/firmware/config.c

@@ -37,7 +37,7 @@
 
 #include <string.h>
 
-static const uint16_t FIRMWARE_VERSION = 0x0631;
+static const uint16_t FIRMWARE_VERSION = 0x0632;
 
 // Optional static config
 extern uint8_t* __fixed_config;

+ 3 - 1
lib/SCSI2SD/src/firmware/disk.c

@@ -551,7 +551,9 @@ int scsiDiskCommand()
 static uint32_t
 calcReadahead(uint32_t totalBytes, uint32_t sdSpeedKBs, uint32_t scsiSpeedKBs)
 {
-	if (scsiSpeedKBs == 0 || scsiDev.hostSpeedMeasured == 0)
+	if (!(scsiDev.boardCfg.flags6 & S2S_CFG_ENABLE_BLIND_WRITES) ||
+		(scsiSpeedKBs == 0) ||
+		(scsiDev.hostSpeedMeasured == 0))
 	{
 		return totalBytes;
 	}

+ 12 - 0
lib/SCSI2SD/src/scsi2sd-util6/BoardPanel.cc

@@ -158,6 +158,16 @@ BoardPanel::BoardPanel(wxWindow* parent, const S2S_BoardCfg& initialConfig) :
 	myMapLunsCtrl->SetToolTip(_("Treat LUNS as IDs instead. Supports multiple drives on XEBEC S1410 SASI Bridge"));
 	fgs->Add(myMapLunsCtrl);
 
+
+	fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
+	myBlindWriteCtrl =
+		new wxCheckBox(
+			this,
+			ID_blindWriteCtrl,
+			_("Enable Blind Writes"));
+	myBlindWriteCtrl->SetToolTip(_("Enable writing to the SD card before all the SCSI data has been received."));
+	fgs->Add(myBlindWriteCtrl);
+
 	wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL);
 	hbox->Add(fgs, 1, wxALL | wxEXPAND, 15);
 	this->SetSizer(hbox);
@@ -184,6 +194,7 @@ BoardPanel::getConfig() const
 		(myMapLunsCtrl->IsChecked() ? S2S_CFG_MAP_LUNS_TO_IDS : 0);
 
 	config.flags6 = (myTermCtrl->IsChecked() ? S2S_CFG_ENABLE_TERMINATOR : 0);
+	config.flags6 = (myBlindWriteCtrl->IsChecked() ? S2S_CFG_ENABLE_BLIND_WRITES : 0);
 
 	config.startupDelay = CtrlGetValue<unsigned int>(myStartDelayCtrl).first;
 	config.selectionDelay = CtrlGetValue<unsigned int>(mySelDelayCtrl).first;
@@ -200,6 +211,7 @@ BoardPanel::setConfig(const S2S_BoardCfg& config)
 	myUnitAttCtrl->SetValue(config.flags & S2S_CFG_ENABLE_UNIT_ATTENTION);
 	myScsi2Ctrl->SetValue(config.flags & S2S_CFG_ENABLE_SCSI2);
 	myTermCtrl->SetValue(config.flags6 & S2S_CFG_ENABLE_TERMINATOR);
+	myBlindWriteCtrl->SetValue(config.flags6 & S2S_CFG_ENABLE_BLIND_WRITES);
 	mySelLatchCtrl->SetValue(config.flags & S2S_CFG_ENABLE_SEL_LATCH);
 	myMapLunsCtrl->SetValue(config.flags & S2S_CFG_MAP_LUNS_TO_IDS);
 

+ 3 - 1
lib/SCSI2SD/src/scsi2sd-util6/BoardPanel.hh

@@ -60,7 +60,8 @@ private:
 		ID_mapLunsCtrl,
 		ID_startDelayCtrl,
 		ID_selDelayCtrl,
-		ID_scsiSpeedCtrl
+		ID_scsiSpeedCtrl,
+		ID_blindWriteCtrl,
 	};
 
 	wxWindow* myParent;
@@ -73,6 +74,7 @@ private:
 	wxCheckBox* myTermCtrl;
 	wxCheckBox* mySelLatchCtrl;
 	wxCheckBox* myMapLunsCtrl;
+	wxCheckBox* myBlindWriteCtrl;
 
 	wxIntegerValidator<uint8_t>* myDelayValidator;
 	wxTextCtrl* myStartDelayCtrl;

+ 21 - 0
lib/SCSI2SD/src/scsi2sd-util6/ConfigUtil.cc

@@ -384,6 +384,15 @@ ConfigUtil::toXML(const S2S_BoardCfg& config)
 		"	********************************************************* -->\n" <<
 		"	<scsiSpeed>" << static_cast<int>(config.scsiSpeed) << "</scsiSpeed>\n" <<
 
+		"	<!-- ********************************************************\n" <<
+		"	Enable SD card blind writes, which starts writing to the SD\n"
+		"	card before all the SCSI data has been received. Can cause problems\n" <<
+		"	with some SCSI hosts\n" <<
+		"	********************************************************* -->\n" <<
+		"	<blindWrites>" <<
+			(config.flags6 & S2S_CFG_ENABLE_BLIND_WRITES ? "true" : "false") <<
+			"</blindWrites>\n" <<
+
 		"</S2S_BoardCfg>\n";
 
 	return s.str();
@@ -603,6 +612,18 @@ parseBoardConfig(wxXmlNode* node)
 				result.flags6 = result.flags & ~S2S_CFG_ENABLE_TERMINATOR;
 			}
 		}
+		else if (child->GetName() == "blindWrites")
+		{
+			std::string s(child->GetNodeContent().mb_str());
+			if (s == "true")
+			{
+				result.flags6 |= S2S_CFG_ENABLE_BLIND_WRITES;
+			}
+			else
+			{
+				result.flags6 = result.flags & ~S2S_CFG_ENABLE_BLIND_WRITES;
+			}
+		}
 		else if (child->GetName() == "selLatch")
 		{
 			std::string s(child->GetNodeContent().mb_str());

+ 3 - 1
lib/SCSI2SD/src/scsi2sd-util6/Makefile

@@ -106,6 +106,7 @@ ifeq ($(TARGET),Darwin)
 	CC=clang -mmacosx-version-min=10.7
 	CXX=clang++ -stdlib=libc++ -mmacosx-version-min=10.7
 	WX_CONFIG += --with-macosx-version-min=10.7
+	CPPFLAGS_WXBUILD += -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=1
 	LIBUSB_CONFIG += --with-macosx-version-min=10.7 --disable-shared
 	LDFLAGS_LIBUSB += -lobjc
 	DFU-UTIL_CONFIG += --with-macosx-version-min=10.7 --disable-shared
@@ -189,6 +190,7 @@ $(BUILD)/libusb/buildstamp:
 endif
 
 ifneq ($(USE_SYSTEM_WX),Yes)
+$(OBJ): $(BUILD)/wx/buildstamp
 $(WXOBJ): $(BUILD)/wx/buildstamp
 $(EXEOBJ): $(BUILD)/wx/buildstamp
 ifneq ($(USE_SYSTEM_ZLIB),Yes)
@@ -199,7 +201,7 @@ endif
 	mkdir -p $(dir $@)
 	( \
 		cd $(dir $@) && \
-		$(CURDIR)/wxWidgets/configure $(WX_CONFIG) CPPFLAGS="$(CPPFLAGS_ZLIB)" LDFLAGS="$(LDFLAGS_ZLIB)" && \
+		$(CURDIR)/wxWidgets/configure $(WX_CONFIG) CPPFLAGS="$(CPPFLAGS_ZLIB) $(CPPFLAGS_WXBUILD)" LDFLAGS="$(LDFLAGS_ZLIB)" && \
 		$(MAKE) \
 	) && \
 	touch $@