Skip to content

Instantly share code, notes, and snippets.

@vdudouyt
Last active April 28, 2018 19:47
Show Gist options
  • Save vdudouyt/822ec164c960c841f7b8 to your computer and use it in GitHub Desktop.
Save vdudouyt/822ec164c960c841f7b8 to your computer and use it in GitHub Desktop.
import itertools, struct, re
def swap_bytes(dword, size):
byte_string = struct.pack("<I", dword)
shift = (4 - size) * 8
return struct.unpack(">I", byte_string)[0] >> shift
class Vendor():
def __init__(self, vendor_id):
start = 0x101674C0 + vendor_id*19*4
self.vendor_id = Dword(start + 0)
self.name = GetCString(start + 8)
self.devices_ptr = Dword(start + 0x44)
self.devices_count = Dword(0x10167508 + vendor_id * 76)
class Device():
dword_51BC08 = 0
dword_51BC10 = 0
dword_51BC1C = 0
dword_51BC20 = 0
dword_51BC24 = 0
dword_51BC28 = 0
dword_51BC2C = 0
dword_51BC30 = 0
dword_51BC34 = 0
dword_51BC38 = 0
dword_51BC3C = 0
extra_memory = 0
lParam = 0
protocol_id = 0
read_buffer_size = 0
write_buffer_size = 0
def __init__(self, vendor, device_id):
start = vendor.devices_ptr + device_id * 0x6c
self.protocol_id = Byte(start)
# self.variant = Byte(vendor.devices_ptr + device_id * 0x34)
self.name = re.sub('\s+', ' ', GetCString(start + 0xc))
self.name = re.sub('\s+$', '', self.name)
self.variant = Byte(start + 0x34) # dword_51BC08
self.data_memory2_size = Dword(start + 0x40) # 51BC10
self.opts1 = Word(start + 0x4A) # dword_51BC1C
# 00415223: cmd[4] = dword_51BC20 & 0xFF if cmd[0] == 0x30 && dword_51BC38 & 0x1000
# 00415235: cmd[5] = (dword_51BC20 >> 8) & 0xFF
# 0041523B: cmd[6] = (dword_51BC20 >> 0x10) & 0xFF
self.opts2 = Dword(start + 0x4C) # dword_51BC20
# Default fuses ptr / e.t.c.
self.opts3 = Dword(start + 0x50) # opts3
self.chip_id = Dword(start + 0x54) # dword_51BC28
self.chip_id_bytes_count = Dword(start + 0x5C) # 51BC2C
# Convert to big-endian for convenience
self.chip_id = swap_bytes(self.chip_id, self.chip_id_bytes_count)
dword_51BC30 = Dword(start + 0x60)
# adapter_filename = "Adapter%s.JPG" % dword_51BC34 & 0xFF
# adapter_required = istrue(dword_51BC34 & 0xFF)
# pins_count = ((dword_51BC34 & 0xFF000000) >> 8*3) || 4
self.package_details = Dword(start + 0x64) # dword_51BC34
# Skip 0xFF, Off-protect before programming, protect after programming, Erase before, User.Row...
self.opts4 = Dword(start + 0x68) # dword_51BC38
dword_51BC3C = Dword(start + 0x08)
dword_51BC24 = Dword(start + 0x50)
self.code_memory_size = Dword(start + 0x38)
self.data_memory_size = Dword(start + 0x3c) # 51BC0C
self.read_buffer_size = Word(start + 0x46) # 51BC14
self.write_buffer_size = Word(start + 0x48) # 51BC18
self.write_unlock = Byte(0x495528 + dword_51BC24 * 5 * 4) + Byte(0x495528 + dword_51BC24 * 5 * 4 + 1) + 1
def devices_iterator():
for i in xrange(0, 0x88):
vendor = Vendor(i)
for d in xrange(0, vendor.devices_count):
yield(vendor, d)
def dump_devices():
file = open("C:\minipro_devices.txt", "w")
for (vendor_id, device_id) in devices_iterator():
device = Device(vendor_id, device_id)
file.write("%s\n" % vars(device))
file.close()
def dump_as_c_header():
field_names = [ 'name',
'protocol_id',
'variant',
# 'addressing_mode',
'read_buffer_size',
'write_buffer_size',
# 'word_size',
'code_memory_size',
'data_memory_size',
'data_memory2_size',
'chip_id',
'chip_id_bytes_count',
'opts1',
'opts2',
'opts3',
'opts4',
'package_details',
'write_unlock'
# 'config'
]
file = open("C:\devices.h", "w")
devices = itertools.starmap(Device, devices_iterator())
for device in sorted(devices, key = lambda t: t.name):
file.write("{\n")
for field in field_names:
value_fmt = '"%s"' if field == 'name' else '0x%02x'
value = value_fmt % dict(vars(device))[field]
file.write("\t.%s = %s,\n" % (field, value))
file.write("},\n")
file.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment