add hantek-dso-extract tool.
authorBert Vermeulen <bert@biot.com>
Mon, 18 Jun 2012 01:14:55 +0000 (03:14 +0200)
committerBert Vermeulen <bert@biot.com>
Mon, 18 Jun 2012 01:14:55 +0000 (03:14 +0200)
firmware/README.hantek-dso-extract [new file with mode: 0644]
firmware/hantek-dso-extract.py [new file with mode: 0755]

diff --git a/firmware/README.hantek-dso-extract b/firmware/README.hantek-dso-extract
new file mode 100644 (file)
index 0000000..f0a765a
--- /dev/null
@@ -0,0 +1,10 @@
+The hantek-dso-extract.py tool extracts firmware from the driver that comes
+with the Hantek DSO-2xxx/52xx series USB oscilloscopes. Find the 32-bit
+driver installed on the windows system -- typically called DSOxxxx1.sys or
+DsoxxxxX861.sys, where xxxx is your device's model. Use it like this:
+
+$ ./hantek-dso-extract.py Dso2090X861.sys
+saved 4730 bytes to hantek-dso-2090.fw
+
+Copy the resulting file over to the location where sigrok installed its
+firmware files. By default this is /usr/local/share/sigrok-firmware
diff --git a/firmware/hantek-dso-extract.py b/firmware/hantek-dso-extract.py
new file mode 100755 (executable)
index 0000000..e99236b
--- /dev/null
@@ -0,0 +1,93 @@
+#!/usr/bin/python3
+##
+## This file is part of the sigrok project.
+##
+## Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+##
+
+import sys
+import os
+import re
+import struct
+from array import array
+
+import parsepe
+
+
+def find_model(filename):
+       filename = os.path.split(filename)[-1]
+       m = re.search('^dso([a-z0-9]+)1.sys$', filename, re.I)
+       if m:
+               model = m.group(1).upper()
+               model = model.replace('X86', '').replace('AMD64', '').replace('IA64', '')
+               if model == '520A':
+                       model = '5200A'
+       else:
+               model = 'unknown'
+
+       return model
+
+
+def unsparse(data):
+       p = 0
+       maxaddr = 0
+       blob = array('B', [0] * 0x4000)
+       while p <= len(data) and data[p+4] == 0:
+               num_bytes = struct.unpack("<H", data[p:p+2])[0]
+               address = struct.unpack("<H", data[p+2:p+4])[0]
+               chunk = array('B')
+               chunk.frombytes(data[p+5:p+5+num_bytes])
+               p += 22
+
+               if address > 0x4000:
+                       # the FX2 only has 16K RAM. other writes are to registers
+                       # in the 0xe000 region, skip those
+                       continue
+
+               blob[address:address+num_bytes] = chunk
+
+               if address + num_bytes > maxaddr:
+                       maxaddr = address + num_bytes
+
+       return blob[:maxaddr].tostring()
+
+
+def usage():
+       print("hantek-dso-extract.py <driverfile>")
+       sys.exit()
+
+
+#
+# main
+#
+
+if len(sys.argv) != 2:
+       usage()
+
+try:
+       filename = sys.argv[1]
+       binihx = parsepe.extract_symbol(filename, '_firmware')
+       if binihx is None:
+               raise Exception("no firmware found")
+       blob = unsparse(binihx)
+       outfile = 'hantek-dso-' + find_model(filename) + '.fw'
+       open(outfile, 'wb').write(blob)
+       print("saved %d bytes to %s" % (len(blob), outfile))
+except Exception as e:
+       print("Error: %s" % str(e))
+
+
+