From 4ad0b47c76de20311fa223c01423cd98e15119e7 Mon Sep 17 00:00:00 2001 From: Dave Pifke Date: Thu, 21 Jun 2012 06:05:32 +0000 Subject: [PATCH 1/3] Add support for ZTEX BTCMiner firmware version 5. This adds support for a newer version of the ZTEX firmware, including the version supported on the 1.15y quad miner. --- modules/theseven/ztex/driver.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/modules/theseven/ztex/driver.py b/modules/theseven/ztex/driver.py index 10226ef..a9067cb 100644 --- a/modules/theseven/ztex/driver.py +++ b/modules/theseven/ztex/driver.py @@ -88,7 +88,7 @@ def __init__(self, proxy, serial, takeover, firmware): if version != 1: raise Exception("Bad ZTEX descriptor version: %d" % version) if magic != struct.unpack(" 5: raise Exception("Bad BTCMiner descriptor version: %d, firmware too new?" % version) + firmware_start = 11 if version > 4 else 10 + firmware_end = firmware_start + while descriptor[firmware_end] != 0 and firmware_end < len(descriptor): + firmware_end += 1 + firmware = ''.join([ chr(c) for c in descriptor[firmware_start:firmware_end] ]) self.num_nonces = numnonces + 1 self.nonce_offset = offset - 10000 self.base_frequency = basefreq * 10000 self.default_multiplier = min(defaultmultiplier, maxmultiplier) self.maximum_multiplier = maxmultiplier self.hashes_per_clock = hashesperclock / 128. + self.extra_solutions = extra if version > 4 else 0 self.firmware_name = firmware defaultspeed = self.base_frequency * self.default_multiplier * self.hashes_per_clock / 1000000 maxspeed = self.base_frequency * self.maximum_multiplier * self.hashes_per_clock / 1000000 @@ -147,11 +153,16 @@ def send_job(self, data): def read_nonces(self): + bs = 12 + self.extra_solutions * 4 with self.lock: - data = array("B", self.handle.controlMsg(0xc0, 0x81, 12 * self.num_nonces, 0, 0, 100)) + data = array("B", self.handle.controlMsg(0xc0, 0x81, bs * self.num_nonces, 0, 0, 100)) nonces = [] for i in range(self.num_nonces): - values = struct.unpack(" Date: Thu, 21 Jun 2012 06:12:56 +0000 Subject: [PATCH 2/3] Detect multi-FPGA ZTEX boards. In a future commit, I will be adding support for mining using all of the FPGAs on a ZTEX 1.15y. For now, we simply detect the presence of multiple FPGAs and log a message indicating that mining will only take place on the currently-selected chip. --- modules/theseven/ztex/driver.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/theseven/ztex/driver.py b/modules/theseven/ztex/driver.py index a9067cb..b87987c 100644 --- a/modules/theseven/ztex/driver.py +++ b/modules/theseven/ztex/driver.py @@ -112,6 +112,18 @@ def __init__(self, proxy, serial, takeover, firmware): self.hashes_per_clock = hashesperclock / 128. self.extra_solutions = extra if version > 4 else 0 self.firmware_name = firmware + + self.num_fpgas = 1 + if version > 4 and ifcaps[0] & 128: + try: + num_fpgas, sel_fpga, parallel_config = struct.unpack(" 1: + self.proxy.log("MPBM does not yet fully support multi-FPGA ZTEX boards. Your %s has %d FPGAs, only #%d will be used.\n" % (self.firmware_name, self.num_fpgas, sel_fpga), 400, "B") + defaultspeed = self.base_frequency * self.default_multiplier * self.hashes_per_clock / 1000000 maxspeed = self.base_frequency * self.maximum_multiplier * self.hashes_per_clock / 1000000 self.proxy.log("FPGA firmware: %s, default speed: %f MH/s, maximum speed: %f MH/s\n" % (self.firmware_name, defaultspeed, maxspeed), 400, "B") From 93088049e624eb1d7f8e08b5c3a70c8280eca526 Mon Sep 17 00:00:00 2001 From: Dave Pifke Date: Thu, 21 Jun 2012 06:13:50 +0000 Subject: [PATCH 3/3] Change ZTEX control message timeout. With the previous value of 100ms, I was seeing the occasional communication timeout talking to my ZTEX boards. Looking at the ZTEX SDK, it uses a value of 1000ms. This commit changes MPBM to use the same value. --- modules/theseven/ztex/driver.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/theseven/ztex/driver.py b/modules/theseven/ztex/driver.py index b87987c..923e6c6 100644 --- a/modules/theseven/ztex/driver.py +++ b/modules/theseven/ztex/driver.py @@ -45,6 +45,7 @@ def __init__(self, proxy, serial, takeover, firmware): self.takeover = takeover self.firmware = firmware self.handle = None + self.timeout = 1000 # ms, same value as used in ZTEX SDK permissionproblem = False deviceinuse = False for bus in usb.busses(): @@ -76,7 +77,7 @@ def __init__(self, proxy, serial, takeover, firmware): raise Exception("Can not open the specified device, possibly due to insufficient permissions") raise Exception("Can not open the specified device") - descriptor = array("B", self.handle.controlMsg(0xc0, 0x22, 40, 0, 0, 100)) + descriptor = array("B", self.handle.controlMsg(0xc0, 0x22, 40, timeout=self.timeout)) if len(descriptor) != 40: raise Exception("Bad ZTEX descriptor length: %d" % len(descriptor)) size, version, magic = struct.unpack("<2BI", descriptor[:6]) product = struct.unpack("4B", descriptor[6:10]) @@ -94,7 +95,7 @@ def __init__(self, proxy, serial, takeover, firmware): self.hs_supported = ifcaps[0] & 32 self.proxy.log("MCU firmware: %d.%d.%d.%d, version %d, serial number %s, high speed programming%s supported\n" % (product + (fwversion, sn, "" if self.hs_supported else " NOT")), 400, "B") - descriptor = array("B", self.handle.controlMsg(0xc0, 0x82, 64, 0, 0, 100)) + descriptor = array("B", self.handle.controlMsg(0xc0, 0x82, 64, timeout=self.timeout)) if len(descriptor) != 64: raise Exception("Bad BTCMiner descriptor length: %d" % len(descriptor)) version, numnonces, offset, basefreq, defaultmultiplier, maxmultiplier, hashesperclock, extra = struct.unpack(" 4 and ifcaps[0] & 128: try: - num_fpgas, sel_fpga, parallel_config = struct.unpack("= 0 and sig1 < sig2): raise Exception("Signature not found in bitstream, wrong bit order?") - self.handle.controlMsg(0x40, 0x31, b"", 0, 0, 100) + self.handle.controlMsg(0x40, 0x31, b"", timeout=self.timeout) if self.hs_supported: - ep, interface = struct.unpack("