5 def __init__(self
, platform_name
, flash_proxy_dir
):
6 self
.platform_name
= platform_name
7 self
.flash_proxy_dir
= flash_proxy_dir
9 def find_flash_proxy(self
, name
):
10 if self
.flash_proxy_dir
is not None:
11 search_dirs
= [self
.flash_proxy_dir
]
13 search_dirs
= ["~/.mlabs", "/usr/local/share/mlabs", "/usr/share/mlabs"]
15 fulldir
= os
.path
.abspath(os
.path
.expanduser(d
))
16 fullname
= os
.path
.join(fulldir
, name
)
17 if os
.path
.exists(fullname
):
19 raise OSError("Failed to find flash proxy bitstream")
21 def _run_urjtag(cmds
):
22 with subprocess
.Popen("jtag", stdin
=subprocess
.PIPE
) as process
:
23 process
.stdin
.write(cmds
.encode("ASCII"))
26 class UrJTAG(Programmer
):
27 needs_bitreverse
= True
29 def load_bitstream(self
, bitstream_file
):
30 cmds
= """cable milkymist
34 """.format(bitstream
=bitstream_file
)
37 def flash(self
, address
, data_file
):
38 flash_proxy
= self
.find_flash_proxy("fjmem-" + self
.platform_name
+ ".bit")
39 cmds
= """cable milkymist
41 pld load "{flash_proxy}"
42 initbus fjmem opcode=000010
46 flashmem "{address}" "{data_file}" noverify
47 """.format(flash_proxy
=flash_proxy
, address
=address
, data_file
=data_file
)
50 class XC3SProg(Programmer
):
51 needs_bitreverse
= False
53 def load_bitstream(self
, bitstream_file
):
54 subprocess
.call(["xc3sprog", "-c", "papilio", bitstream_file
])
56 def flash(self
, address
, data_file
):
57 flash_proxy
= self
.find_flash_proxy("bscan_spi_lx9_papilio.bit")
58 subprocess
.call(["xc3sprog", "-c", "papilio", "-I"+flash_proxy
, "{}:w:0x{:x}:BIN".format(data_file
, address
)])
60 def create_programmer(platform_name
, *args
, **kwargs
):
64 "papilio_pro": XC3SProg
65 }[platform_name
](platform_name
, *args
, **kwargs
)