from litex.soc.interconnect import wishbone as wb
from litex.soc.cores.cpu import CPU
-from soc.debug.jtag import Pins, dummy_pinset # TODO move to suitable location
+from soc.config.pinouts import get_pinspecs
+from soc.debug.jtag import Pins
from c4m.nmigen.jtag.tap import IOType
from libresoc.ls180 import io
from litex.build.generic_platform import ConstraintManager
-CPU_VARIANTS = ["standard", "standard32", "standardjtag", "ls180"]
+CPU_VARIANTS = ["standard", "standard32", "standardjtag",
+ "standardjtagtestgpio", "ls180",
+ "standardjtagnoirq"]
def make_wb_bus(prefix, obj, simple=False):
def make_jtag_ioconn(res, pin, cpupads, iopads):
(fn, pin, iotype, pin_name, scan_idx) = pin
#serial_tx__core__o, serial_rx__pad__i,
+ # special-case sdram_clock
+ if pin == 'clock' and fn == 'sdr':
+ cpu = cpupads['sdram_clock']
+ io = iopads['sdram_clock']
+ else:
+ cpu = cpupads[fn]
+ io = iopads[fn]
print ("cpupads", cpupads)
print ("iopads", iopads)
print ("pin", fn, pin, iotype, pin_name)
- cpu = cpupads[fn]
- io = iopads[fn]
print ("cpu fn", cpu)
print ("io fn", io)
- sigs = []
-
name = "%s_%s" % (fn, pin)
+ print ("name", name)
+ sigs = []
if iotype in (IOType.In, IOType.Out):
- cpup = getattr(cpu, pin)
- iop = getattr(io, pin)
+ ps = pin.split("_")
+ if pin == 'clock' and fn == 'sdr':
+ cpup = cpu
+ iop = io
+ elif len(ps) == 2 and ps[-1].isdigit():
+ pin, idx = ps
+ idx = int(idx)
+ cpup = getattr(cpu, pin)[idx]
+ iop = getattr(io, pin)[idx]
+ elif pin.isdigit():
+ idx = int(pin)
+ cpup = cpu[idx]
+ iop = io[idx]
+ else:
+ cpup = getattr(cpu, pin)
+ iop = getattr(io, pin)
if iotype == IOType.Out:
# output from the pad is routed through C4M JTAG and so
elif iotype == IOType.InTriOut:
if fn == 'gpio': # sigh decode GPIO special-case
- idx = int(pin[4:])
+ idx = int(pin[1:])
else:
idx = 0
cpup, iop = get_field(cpu, "i")[idx], get_field(io, "i")[idx]
self.platform = platform
self.variant = variant
self.reset = Signal()
- self.interrupt = Signal(16)
+ irq_en = "noirq" not in variant
+
+ if irq_en:
+ self.interrupt = Signal(16)
if variant == "standard32":
self.data_width = 32
jtag_en = ('jtag' in variant) or variant == 'ls180'
- if variant != "ls180":
+ if "testgpio" in variant:
self.simple_gpio = gpio = wb.Interface(data_width=32, adr_width=30)
if jtag_en:
self.jtag_wb = jtag_wb = wb.Interface(data_width=64, adr_width=29)
o_memerr_o = Signal(), # not connected
o_pc_o = Signal(64), # not connected
- # interrupts
- i_int_level_i = self.interrupt,
-
)
+ if irq_en:
+ # interrupts
+ self.cpu_params['i_int_level_i'] = self.interrupt
+
if jtag_en:
self.cpu_params.update(dict(
# JTAG Debug bus
self.clk_sel = Signal(3)
self.cpu_params['i_clk_sel_i'] = self.clk_sel
self.cpu_params['o_pll_48_o'] = self.pll_48_o
-
+
# add wishbone buses to cpu params
self.cpu_params.update(make_wb_bus("ibus", ibus))
self.cpu_params.update(make_wb_bus("dbus", dbus))
self.cpu_params.update(make_wb_slave("ics_wb", ics))
self.cpu_params.update(make_wb_slave("icp_wb", icp))
- if variant != "ls180":
+ if "testgpio" in variant:
self.cpu_params.update(make_wb_slave("gpio_wb", gpio))
if jtag_en:
self.cpu_params.update(make_wb_bus("jtag_wb", jtag_wb, simple=True))
self.pad_cm = ConstraintManager(self.padresources, [])
self.cpupads = {}
iopads = {}
- for (periph, num) in [('uart', 0), ('gpio', 0), ('i2c', 0)]:
- self.cpupads[periph] = platform.request(periph, num)
- iopads[periph] = self.pad_cm.request(periph, num)
-
- p = Pins(dummy_pinset())
+ litexmap = {}
+ subset = {'uart', 'mtwi', 'eint', 'gpio', 'mspi0', 'mspi1',
+ 'pwm', 'sd0', 'sdr'}
+ for periph in subset:
+ origperiph = periph
+ num = None
+ if periph[-1].isdigit():
+ periph, num = periph[:-1], int(periph[-1])
+ print ("periph request", periph, num)
+ if periph == 'mspi':
+ if num == 0:
+ periph, num = 'spimaster', None
+ else:
+ periph, num = 'spisdcard', None
+ elif periph == 'sdr':
+ periph = 'sdram'
+ elif periph == 'mtwi':
+ periph = 'i2c'
+ elif periph == 'sd':
+ periph, num = 'sdcard', None
+ litexmap[origperiph] = (periph, num)
+ self.cpupads[origperiph] = platform.request(periph, num)
+ iopads[origperiph] = self.pad_cm.request(periph, num)
+ if periph == 'sdram':
+ # special-case sdram clock
+ ck = platform.request("sdram_clock")
+ self.cpupads['sdram_clock'] = ck
+ ck = self.pad_cm.request("sdram_clock")
+ iopads['sdram_clock'] = ck
+
+ pinset = get_pinspecs(subset=subset)
+ p = Pins(pinset)
for pin in list(p):
make_jtag_ioconn(self.cpu_params, pin, self.cpupads, iopads)