103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
import os
|
|
|
|
from migen.build.generic_programmer import GenericProgrammer
|
|
from migen.build.xilinx.programmer import _create_xsvf
|
|
|
|
try:
|
|
import fl
|
|
except ImportError:
|
|
import fpgalink3 as fl
|
|
|
|
fl.flInitialise(0)
|
|
|
|
|
|
class FPGALink(GenericProgrammer):
|
|
"""Using the fpgalink library from makestuff
|
|
|
|
You will need fpgalink library installed from
|
|
https://github.com/makestuff/libfpgalink
|
|
"""
|
|
|
|
needs_bitreverse = False
|
|
|
|
def __init__(self, initial_vidpid=None, pin_cfg="D0D2D3D4",
|
|
fpgalink_vidpid="1D50:602B:0002", flash_proxy_basename=None):
|
|
"""
|
|
Parameters
|
|
----------
|
|
initial_vidpid : string
|
|
The USB vendor and product id of the device before fpgalink
|
|
firmware is loaded onto the device.
|
|
|
|
Format is vid:pid as 4 digit hex numbers.
|
|
|
|
pin_cfg : string
|
|
FPGALink pin configuration string describing how the JTAG interface
|
|
is hooked up to the programmer.
|
|
|
|
fpgalink_vidpid : string
|
|
The USB vendor, product and device id of the device after the
|
|
fpgalink firmware is loaded onto the device.
|
|
|
|
Format is vid:pid:did as 4 digit hex numbers.
|
|
Defaults to 1D50:602B:0002 which is the makestuff FPGALink device.
|
|
"""
|
|
GenericProgrammer.__init__(self, flash_proxy_basename)
|
|
self.initial_vidpid = initial_vidpid
|
|
self.fpgalink_vidpid = fpgalink_vidpid
|
|
self.pin_cfg = pin_cfg
|
|
|
|
def open_device(self):
|
|
ivp = self.initial_vidpid
|
|
vp = self.fpgalink_vidpid
|
|
|
|
print("Attempting to open connection to FPGALink device", vp, "...")
|
|
try:
|
|
handle = fl.flOpen(self.fpgalink_vidpid)
|
|
except fl.FLException as ex:
|
|
if not ivp:
|
|
raise FLException(
|
|
"Could not open FPGALink device at {0} and"
|
|
" no initial VID:PID was supplied".format(vp))
|
|
|
|
print("Loading firmware into %s..." % ivp)
|
|
fl.flLoadStandardFirmware(ivp, vp)
|
|
|
|
print("Awaiting renumeration...")
|
|
if not fl.flAwaitDevice(vp, 600):
|
|
raise fl.FLException(
|
|
"FPGALink device did not renumerate properly"
|
|
" as {0}".format(vp))
|
|
|
|
print("Attempting to open connection to FPGALink device", vp,
|
|
"again...")
|
|
handle = fl.flOpen(vp)
|
|
|
|
# Only Nero capable hardware support doing programming.
|
|
assert fl.flIsNeroCapable(handle)
|
|
print("Cable connection opened.")
|
|
return handle
|
|
|
|
def load_bitstream(self, bitstream_file):
|
|
n = 27
|
|
|
|
xsvf_file = os.path.splitext(bitstream_file)[0]+'.xsvf'
|
|
print("\nGenerating xsvf formatted bitstream")
|
|
print("="*n)
|
|
if os.path.exists(xsvf_file):
|
|
os.unlink(xsvf_file)
|
|
_create_xsvf(bitstream_file, xsvf_file)
|
|
print("\n"+"="*n+"\n")
|
|
|
|
print("Programming %s to device." % xsvf_file)
|
|
print("="*n)
|
|
handle = self.open_device()
|
|
print("Programming device...")
|
|
fl.flProgram(handle, "J:"+self.pin_cfg, progFile=xsvf_file)
|
|
print("Programming successful!")
|
|
print("="*n+"\n")
|
|
fl.flClose(handle)
|
|
|
|
def flash(self, address, data_file):
|
|
raise NotImplementedError("Not supported yet.")
|