Advertisement
Guest User

Untitled

a guest
Jun 6th, 2013
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.41 KB | None | 0 0
  1. # Modular Python Bitcoin Miner
  2. # Copyright (C) 2012 Michael Sparmann (TheSeven)
  3. #
  4. #     This program is free software; you can redistribute it and/or
  5. #     modify it under the terms of the GNU General Public License
  6. #     as published by the Free Software Foundation; either version 2
  7. #     of the License, or (at your option) any later version.
  8. #
  9. #     This program is distributed in the hope that it will be useful,
  10. #     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. #     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. #     GNU General Public License for more details.
  13. #
  14. #     You should have received a copy of the GNU General Public License
  15. #     along with this program; if not, write to the Free Software
  16. #     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. #
  18. # Please consider donating to 1PLAPWDejJPJnY2ppYCgtw5ko8G5Q4hPzh if you
  19. # want to support further development of the Modular Python Bitcoin Miner.
  20.  
  21.  
  22.  
  23. ##############################################
  24. # JTAG Transaction Bitbanging Data Generator #
  25. ##############################################
  26.  
  27.  
  28.  
  29. import sys
  30. import struct
  31. from binascii import hexlify
  32.  
  33.  
  34.  
  35. class FTDIJTAG(object):
  36.  
  37.   def __init__(self, tck, tms, tdi, tdo, overlay = 0):
  38.     self.tck = tck
  39.     self.tms = tms
  40.     self.tdi = tdi
  41.     self.tdo = tdo
  42.     self.overlay = overlay
  43.     self.data = b""
  44.    
  45.    
  46.   def format(self, tck, tms, tdi, tdo = 0, overlay = None):
  47.     if overlay is None: overlay = self.overlay
  48.     return struct.pack("B", (tck << self.tck) | (tms << self.tms) | (tdi << self.tdi) | (tdo << self.tdo) | overlay)
  49.  
  50.  
  51.   def clock(self, tms, tdi):
  52.     self.data += self.format(0, tms, tdi) + self.format(1, tms, tdi)
  53.    
  54.    
  55.   def flush(self):
  56.     data = self.data
  57.     self.data = b""
  58.     return data
  59.  
  60.  
  61. class JTAG(object):
  62.  
  63.   def __init__(self, interface):
  64.     self.interface = interface
  65.    
  66.    
  67.   def format(self, *args, **kwargs):
  68.     return self.interface.format(*args, **kwargs)
  69.  
  70.  
  71.   def clock(self, tms, tdi):
  72.     self.interface.clock(tms, tdi)
  73.    
  74.    
  75.   def flush(self):
  76.     return self.interface.flush()
  77.  
  78.  
  79.   def tap_reset(self):
  80.     self.clock(1, 0)
  81.     self.clock(1, 0)
  82.     self.clock(1, 0)
  83.     self.clock(1, 0)
  84.     self.clock(1, 0)
  85.     self.clock(0, 0)
  86.  
  87.  
  88.   def select_ir(self):
  89.     self.clock(1, 0)
  90.  
  91.  
  92.   def enter_shift(self):
  93.     self.clock(1, 0)
  94.     self.clock(0, 0)
  95.     self.clock(0, 0)
  96.  
  97.  
  98.   def leave_shift(self):
  99.     self.clock(1, 0)
  100.  
  101.  
  102.   def shift_bits(self, bits):
  103.     for bit in bits: self.clock(0, bit)
  104.    
  105.    
  106.   def shift_multiple(self, num, bit = 0):
  107.     self.shift_bits([bit] * num)
  108.  
  109.  
  110.   def shift_value(self, bits, value):
  111.     data = []
  112.     for bit in range(bits):
  113.       data.append(data & 1)
  114.       data = data >> 1
  115.     self.shift_bits(data)
  116.    
  117.    
  118.    
  119. def gen_jtag_common(jtag, data, prefix = ""):
  120.   data[prefix + "tck"] = jtag.format(1, 0, 0)
  121.   data[prefix + "tms"] = jtag.format(0, 1, 0)
  122.   data[prefix + "tdi"] = jtag.format(0, 0, 1)
  123.   data[prefix + "tdo"] = jtag.format(0, 0, 0, 1, 0)
  124.   jtag.clock(0, 0)
  125.   data[prefix + "clock"] = jtag.flush()
  126.   jtag.shift_bits([1])
  127.   data[prefix + "highclock"] = jtag.flush()
  128.   jtag.tap_reset()
  129.   data[prefix + "tap_reset"] = jtag.flush()
  130.   jtag.select_ir()
  131.   jtag.enter_shift()
  132.   data[prefix + "shift_ir"] = jtag.flush()
  133.   jtag.enter_shift()
  134.   data[prefix + "shift_dr"] = jtag.flush()
  135.   jtag.leave_shift()
  136.   data[prefix + "leave_shift"] = jtag.flush()
  137.    
  138.  
  139. def gen_spartan6(jtag, data, prefix = ""):
  140.   jtag.shift_bits([0, 1, 0, 0, 0, 0])
  141.   data[prefix + "user1"] = jtag.flush()
  142.   jtag.shift_bits([0, 0, 0, 1, 0, 0])
  143.   data[prefix + "usercode"] = jtag.flush()
  144.   jtag.shift_bits([1, 0, 1, 0, 0, 0])
  145.   data[prefix + "cfg_in"] = jtag.flush()
  146.   jtag.shift_bits([1, 1, 0, 1, 0, 0])
  147.   data[prefix + "jprogram"] = jtag.flush()
  148.   jtag.shift_bits([0, 0, 1, 1, 0, 0])
  149.   data[prefix + "jstart"] = jtag.flush()
  150.   jtag.shift_bits([1, 0, 1, 1, 0, 0])
  151.   data[prefix + "jshutdown"] = jtag.flush()
  152.   pass
  153.  
  154.  
  155. def gen_fpgaminer_jtagcomm(jtag, data, prefix = ""):
  156.   jtag.shift_bits([0, 1, 1, 1, 0, 0])
  157.   data[prefix + "getnonce"] = jtag.flush()
  158.   pass
  159.  
  160.  
  161.    
  162. if __name__ == "__main__":
  163.   if len(sys.argv) != 2:
  164.     print("usage: %s <board>" % sys.argv[0])
  165.     sys.exit(255)
  166.   board = sys.argv[1]
  167.  
  168.   data = {}
  169.  
  170.   if board == "mmq":
  171.     data["Bus 0"] = {}
  172.     jtag = JTAG(FTDIJTAG(2, 3, 0, 1))
  173.     gen_jtag_common(jtag, data["Bus 0"])
  174.     gen_spartan6(jtag, data["Bus 0"], "s6_")
  175.     gen_fpgaminer_jtagcomm(jtag, data["Bus 0"], "fm_")
  176.    
  177.   elif board == "x6500":
  178.     data["Bus 0"] = {}
  179.     jtag = JTAG(FTDIJTAG(7, 6, 5, 4, 0x0c))
  180.     gen_jtag_common(jtag, data["Bus 0"])
  181.     gen_spartan6(jtag, data["Bus 0"], "s6_")
  182.     gen_fpgaminer_jtagcomm(jtag, data["Bus 0"], "fm_")
  183.     data["Bus 1"] = {}
  184.     jtag = JTAG(FTDIJTAG(3, 2, 1, 0, 0xc0))
  185.     gen_jtag_common(jtag, data["Bus 1"])
  186.     gen_spartan6(jtag, data["Bus 1"], "s6_")
  187.     gen_fpgaminer_jtagcomm(jtag, data["Bus 1"], "fm_")
  188.  
  189.   print("jtagscript = {}")
  190.   for name1 in data:
  191.     if isinstance(data[name1], dict):
  192.       print("jtagscript[\"%s\"] = {}" % name1)
  193.       for name2 in data[name1]:
  194.         print("jtagscript[\"%s\"][\"%s\"] = unhexlify(b\"%s\")" % (name1, name2, hexlify(data[name1][name2]).decode("ascii")))
  195.     else: print("jtagscript[\"%s\"] = unhexlify(b\"%s\")" % (name1, hexlify(data[name1]).decode("ascii")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement