Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Modular Python Bitcoin Miner
- # Copyright (C) 2012 Michael Sparmann (TheSeven)
- #
- # 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 2
- # 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, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # Please consider donating to 1PLAPWDejJPJnY2ppYCgtw5ko8G5Q4hPzh if you
- # want to support further development of the Modular Python Bitcoin Miner.
- ##############################################
- # JTAG Transaction Bitbanging Data Generator #
- ##############################################
- import sys
- import struct
- from binascii import hexlify
- class FTDIJTAG(object):
- def __init__(self, tck, tms, tdi, tdo, overlay = 0):
- self.tck = tck
- self.tms = tms
- self.tdi = tdi
- self.tdo = tdo
- self.overlay = overlay
- self.data = b""
- def format(self, tck, tms, tdi, tdo = 0, overlay = None):
- if overlay is None: overlay = self.overlay
- return struct.pack("B", (tck << self.tck) | (tms << self.tms) | (tdi << self.tdi) | (tdo << self.tdo) | overlay)
- def clock(self, tms, tdi):
- self.data += self.format(0, tms, tdi) + self.format(1, tms, tdi)
- def flush(self):
- data = self.data
- self.data = b""
- return data
- class JTAG(object):
- def __init__(self, interface):
- self.interface = interface
- def format(self, *args, **kwargs):
- return self.interface.format(*args, **kwargs)
- def clock(self, tms, tdi):
- self.interface.clock(tms, tdi)
- def flush(self):
- return self.interface.flush()
- def tap_reset(self):
- self.clock(1, 0)
- self.clock(1, 0)
- self.clock(1, 0)
- self.clock(1, 0)
- self.clock(1, 0)
- self.clock(0, 0)
- def select_ir(self):
- self.clock(1, 0)
- def enter_shift(self):
- self.clock(1, 0)
- self.clock(0, 0)
- self.clock(0, 0)
- def leave_shift(self):
- self.clock(1, 0)
- def shift_bits(self, bits):
- for bit in bits: self.clock(0, bit)
- def shift_multiple(self, num, bit = 0):
- self.shift_bits([bit] * num)
- def shift_value(self, bits, value):
- data = []
- for bit in range(bits):
- data.append(data & 1)
- data = data >> 1
- self.shift_bits(data)
- def gen_jtag_common(jtag, data, prefix = ""):
- data[prefix + "tck"] = jtag.format(1, 0, 0)
- data[prefix + "tms"] = jtag.format(0, 1, 0)
- data[prefix + "tdi"] = jtag.format(0, 0, 1)
- data[prefix + "tdo"] = jtag.format(0, 0, 0, 1, 0)
- jtag.clock(0, 0)
- data[prefix + "clock"] = jtag.flush()
- jtag.shift_bits([1])
- data[prefix + "highclock"] = jtag.flush()
- jtag.tap_reset()
- data[prefix + "tap_reset"] = jtag.flush()
- jtag.select_ir()
- jtag.enter_shift()
- data[prefix + "shift_ir"] = jtag.flush()
- jtag.enter_shift()
- data[prefix + "shift_dr"] = jtag.flush()
- jtag.leave_shift()
- data[prefix + "leave_shift"] = jtag.flush()
- def gen_spartan6(jtag, data, prefix = ""):
- jtag.shift_bits([0, 1, 0, 0, 0, 0])
- data[prefix + "user1"] = jtag.flush()
- jtag.shift_bits([0, 0, 0, 1, 0, 0])
- data[prefix + "usercode"] = jtag.flush()
- jtag.shift_bits([1, 0, 1, 0, 0, 0])
- data[prefix + "cfg_in"] = jtag.flush()
- jtag.shift_bits([1, 1, 0, 1, 0, 0])
- data[prefix + "jprogram"] = jtag.flush()
- jtag.shift_bits([0, 0, 1, 1, 0, 0])
- data[prefix + "jstart"] = jtag.flush()
- jtag.shift_bits([1, 0, 1, 1, 0, 0])
- data[prefix + "jshutdown"] = jtag.flush()
- pass
- def gen_fpgaminer_jtagcomm(jtag, data, prefix = ""):
- jtag.shift_bits([0, 1, 1, 1, 0, 0])
- data[prefix + "getnonce"] = jtag.flush()
- pass
- if __name__ == "__main__":
- if len(sys.argv) != 2:
- print("usage: %s <board>" % sys.argv[0])
- sys.exit(255)
- board = sys.argv[1]
- data = {}
- if board == "mmq":
- data["Bus 0"] = {}
- jtag = JTAG(FTDIJTAG(2, 3, 0, 1))
- gen_jtag_common(jtag, data["Bus 0"])
- gen_spartan6(jtag, data["Bus 0"], "s6_")
- gen_fpgaminer_jtagcomm(jtag, data["Bus 0"], "fm_")
- elif board == "x6500":
- data["Bus 0"] = {}
- jtag = JTAG(FTDIJTAG(7, 6, 5, 4, 0x0c))
- gen_jtag_common(jtag, data["Bus 0"])
- gen_spartan6(jtag, data["Bus 0"], "s6_")
- gen_fpgaminer_jtagcomm(jtag, data["Bus 0"], "fm_")
- data["Bus 1"] = {}
- jtag = JTAG(FTDIJTAG(3, 2, 1, 0, 0xc0))
- gen_jtag_common(jtag, data["Bus 1"])
- gen_spartan6(jtag, data["Bus 1"], "s6_")
- gen_fpgaminer_jtagcomm(jtag, data["Bus 1"], "fm_")
- print("jtagscript = {}")
- for name1 in data:
- if isinstance(data[name1], dict):
- print("jtagscript[\"%s\"] = {}" % name1)
- for name2 in data[name1]:
- print("jtagscript[\"%s\"][\"%s\"] = unhexlify(b\"%s\")" % (name1, name2, hexlify(data[name1][name2]).decode("ascii")))
- else: print("jtagscript[\"%s\"] = unhexlify(b\"%s\")" % (name1, hexlify(data[name1]).decode("ascii")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement