8291465a50c7e25f85cd81326e8d2887c801d73b
[litex.git] / litex / gen / migen / build / xilinx / programmer.py
1 import os
2 import sys
3 import subprocess
4
5 from migen.build.generic_programmer import GenericProgrammer
6 from migen.build.xilinx import common
7
8
9 def _run_urjtag(cmds):
10 with subprocess.Popen("jtag", stdin=subprocess.PIPE) as process:
11 process.stdin.write(cmds.encode("ASCII"))
12 process.communicate()
13
14
15 class UrJTAG(GenericProgrammer):
16 needs_bitreverse = True
17
18 def __init__(self, cable, flash_proxy_basename=None):
19 GenericProgrammer.__init__(self, flash_proxy_basename)
20 self.cable = cable
21
22 def load_bitstream(self, bitstream_file):
23 cmds = """cable {cable}
24 detect
25 pld load {bitstream}
26 quit
27 """.format(bitstream=bitstream_file, cable=self.cable)
28 _run_urjtag(cmds)
29
30 def flash(self, address, data_file):
31 flash_proxy = self.find_flash_proxy()
32 cmds = """cable {cable}
33 detect
34 pld load "{flash_proxy}"
35 initbus fjmem opcode=000010
36 frequency 6000000
37 detectflash 0
38 endian big
39 flashmem "{address}" "{data_file}" noverify
40 """.format(flash_proxy=flash_proxy, address=address, data_file=data_file,
41 cable=self.cable)
42 _run_urjtag(cmds)
43
44
45 class XC3SProg(GenericProgrammer):
46 needs_bitreverse = False
47
48 def __init__(self, cable, flash_proxy_basename=None):
49 GenericProgrammer.__init__(self, flash_proxy_basename)
50 self.cable = cable
51
52 def load_bitstream(self, bitstream_file):
53 subprocess.call(["xc3sprog", "-v", "-c", self.cable, bitstream_file])
54
55 def flash(self, address, data_file):
56 flash_proxy = self.find_flash_proxy()
57 subprocess.call(["xc3sprog", "-v", "-c", self.cable, "-I"+flash_proxy, "{}:w:0x{:x}:BIN".format(data_file, address)])
58
59
60
61 class FpgaProg(GenericProgrammer):
62 needs_bitreverse = False
63
64 def __init__(self, flash_proxy_basename=None):
65 GenericProgrammer.__init__(self, flash_proxy_basename)
66
67 def load_bitstream(self, bitstream_file):
68 subprocess.call(["fpgaprog", "-v", "-f", bitstream_file])
69
70 def flash(self, address, data_file):
71 if address != 0:
72 raise ValueError("fpga prog needs a main bitstream at address 0")
73 flash_proxy = self.find_flash_proxy()
74 subprocess.call(["fpgaprog", "-v", "-sa", "-r", "-b", flash_proxy,
75 "-f", data_file])
76
77
78 def _run_impact(cmds):
79 with subprocess.Popen("impact -batch", stdin=subprocess.PIPE, shell=True) as process:
80 process.stdin.write(cmds.encode("ASCII"))
81 process.communicate()
82 return process.returncode
83
84
85 def _create_xsvf(bitstream_file, xsvf_file):
86 assert os.path.exists(bitstream_file), bitstream_file
87 assert not os.path.exists(xsvf_file), xsvf_file
88 assert 0 == _run_impact("""
89 setPreference -pref KeepSVF:True
90 setMode -bs
91 setCable -port xsvf -file {xsvf}
92 addDevice -p 1 -file {bitstream}
93 program -p 1
94 quit
95 """.format(bitstream=bitstream_file, xsvf=xsvf_file))
96
97
98 class iMPACT(GenericProgrammer):
99 needs_bitreverse = False
100
101 def load_bitstream(self, bitstream_file):
102 cmds = """setMode -bs
103 setCable -p auto
104 addDevice -p 1 -file {bitstream}
105 program -p 1
106 quit
107 """.format(bitstream=bitstream_file)
108 _run_impact(cmds)
109
110
111 def _run_vivado(path, ver, cmds):
112 if sys.platform == "win32" or sys.platform == "cygwin":
113 vivado_cmd = "vivado -mode tcl"
114 else:
115 settings = common.settings(path, ver)
116 vivado_cmd = "bash -c \"source " + settings + "&& vivado -mode tcl\""
117 with subprocess.Popen(vivado_cmd, stdin=subprocess.PIPE, shell=True) as process:
118 process.stdin.write(cmds.encode("ASCII"))
119 process.communicate()
120
121
122 class VivadoProgrammer(GenericProgrammer):
123 needs_bitreverse = False
124 def __init__(self, vivado_path="/opt/Xilinx/Vivado", vivado_ver=None,
125 flash_part="n25q256-3.3v-spi-x1_x2_x4"):
126 GenericProgrammer.__init__(self)
127 self.vivado_path = vivado_path
128 self.vivado_ver = vivado_ver
129 self.flash_part = flash_part
130
131 def load_bitstream(self, bitstream_file):
132 cmds = """open_hw
133 connect_hw_server
134 open_hw_target [lindex [get_hw_targets -of_objects [get_hw_servers localhost]] 0]
135
136 set_property PROBES.FILE {{}} [lindex [get_hw_devices] 0]
137 set_property PROGRAM.FILE {{{bitstream}}} [lindex [get_hw_devices] 0]
138
139 program_hw_devices [lindex [get_hw_devices] 0]
140 refresh_hw_device [lindex [get_hw_devices] 0]
141
142 quit
143 """.format(bitstream=bitstream_file)
144 _run_vivado(self.vivado_path, self.vivado_ver, cmds)
145
146 # XXX works to flash bitstream, adapt it to flash bios
147 def flash(self, address, data_file):
148 cmds = """open_hw
149 connect_hw_server
150 open_hw_target [lindex [get_hw_targets -of_objects [get_hw_servers localhost]] 0]
151 create_hw_cfgmem -hw_device [lindex [get_hw_devices] 0] -mem_dev [lindex [get_cfgmem_parts {{{flash_part}}}] 0]
152
153 set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
154 set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
155 set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
156 set_property PROGRAM.VERIFY 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
157 refresh_hw_device [lindex [get_hw_devices] 0]
158
159 set_property PROGRAM.ADDRESS_RANGE {{use_file}} [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
160 set_property PROGRAM.FILES [list "{data}" ] [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0]]
161 set_property PROGRAM.UNUSED_PIN_TERMINATION {{pull-none}} [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
162 set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
163 set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
164 set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
165 set_property PROGRAM.VERIFY 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
166
167 startgroup
168 if {{![string equal [get_property PROGRAM.HW_CFGMEM_TYPE [lindex [get_hw_devices] 0]] [get_property MEM_TYPE [get_property CFGMEM_PART [get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]]]] }} {{ create_hw_bitstream -hw_device [lindex [get_hw_devices] 0] [get_property PROGRAM.HW_CFGMEM_BITFILE [ lindex [get_hw_devices] 0]]; program_hw_devices [lindex [get_hw_devices] 0]; }};
169 program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
170 endgroup
171
172 quit
173 """.format(data=data_file, flash_part=self.flash_part)
174 _run_vivado(self.vivado_path, self.vivado_ver, cmds)
175
176
177 class Adept(GenericProgrammer):
178 """Using the Adept tool with an onboard Digilent "USB JTAG" cable.
179
180 You need to install Adept Utilities V2 from
181 http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,66,828&Prod=ADEPT2
182 """
183
184 needs_bitreverse = False
185
186 def __init__(self, board, index, flash_proxy_basename=None):
187 GenericProgrammer.__init__(self, flash_proxy_basename)
188 self.board = board
189 self.index = index
190
191 def load_bitstream(self, bitstream_file):
192 subprocess.call([
193 "djtgcfg",
194 "--verbose",
195 "prog", "-d", self.board,
196 "-i", str(self.index),
197 "-f", bitstream_file,
198 ])
199
200 def flash(self, address, data_file):
201 raise ValueError("Flashing unsupported with DigilentAdept tools")