From: Luke Kenneth Casson Leighton Date: Fri, 9 Mar 2018 05:25:26 +0000 (+0000) Subject: split out interfaces to separate module X-Git-Tag: convert-csv-opcode-to-binary~5792 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5e7afe20a262c91c24dee5631dfae30cdaecd1f;p=libreriscv.git split out interfaces to separate module --- diff --git a/shakti/i_class/interfaces.py b/shakti/i_class/interfaces.py new file mode 100644 index 000000000..ee185934c --- /dev/null +++ b/shakti/i_class/interfaces.py @@ -0,0 +1,457 @@ +#!/usr/bin/env python + +from copy import deepcopy + +def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None): + res = {} + names = {} + idx = 0 + for name in pingroup[:limit]: + if suffix: + name_ = "%s_%s" % (name, suffix) + else: + name_ = name + if spec and spec.has_key(name): + continue + pin = {mux: (name_, bank)} + offs_bank, offs_ = offs + idx_ = offs_ + idx + idx += 1 + idx_ += bankspec[bank] + res[idx_] = pin + names[name] = idx_ + for name in pingroup: + if suffix: + name_ = "%s_%s" % (name, suffix) + else: + name_ = name + if not spec: + continue + if not spec.has_key(name): + continue + idx_, mux_, bank_ = spec[name] + idx_ = names[idx_] + #idx_ += bankspec[bank_] + pin = {mux_: (name_, bank_)} + if res.has_key(idx_): + res[idx_].update(pin) + else: + res[idx_] = pin + return res + +def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): + i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI'] + for i in range(4): + i2spins.append("IISDO%d" % i) + return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit) + +def emmc(bankspec, suffix, offs, bank, mux=1, spec=None): + emmcpins = ['MMCCMD', 'MMCCLK'] + for i in range(8): + emmcpins.append("MMCD%d" % i) + return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec) + +def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None, + start=None, limit=None): + sdmmcpins = ['CMD', 'CLK'] + for i in range(4): + sdmmcpins.append("D%d" % i) + sdmmcpins = sdmmcpins[start:limit] + sdmmcpins = namesuffix('SD', suffix, sdmmcpins) + return pins(sdmmcpins, bankspec, '', offs, bank, mux, spec) + +def spi(bankspec, suffix, offs, bank, mux=1, spec=None): + spipins = namesuffix('SPI', suffix, + ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS']) + return pins(spipins, bankspec, '', offs, bank, mux, spec) + +def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): + spipins = namesuffix('SPI', suffix, + ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3']) + return pins(spipins, bankspec, '', offs, bank, mux, spec, limit) + +def i2c(bankspec, suffix, offs, bank, mux=1, spec=None): + spipins = namesuffix('TWI', suffix, + ['SDA', 'SCL']) + return pins(spipins, bankspec, '', offs, bank, mux, spec) + +def jtag(bankspec, suffix, offs, bank, mux=1, spec=None): + uartpins = namesuffix('JTAG', suffix, ['MS', 'DI', 'DO', 'CK']) + return pins(uartpins, bankspec, '', offs, bank, mux, spec) + +def uart(bankspec, suffix, offs, bank, mux=1, spec=None): + uartpins = namesuffix('UART', suffix, ['TX', 'RX']) + return pins(uartpins, bankspec, '', offs, bank, mux, spec) + +def namesuffix(name, suffix, namelist): + names = [] + for n in namelist: + names.append("%s%s_%s" % (name, suffix, n)) + return names + +def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None): + ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT']) + for i in range(8): + ulpipins.append('ULPI%s_D%d' % (suffix, i)) + return pins(ulpipins, bankspec, "", offs, bank, mux, spec) + +def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None): + uartpins = namesuffix('UART', suffix, ['TX', 'RX', 'CTS', 'RTS']) + return pins(uartpins, bankspec, '', offs, bank, mux, spec) + +def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None): + ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS'] + for i in range(24): + ttlpins.append("LCD%d" % i) + return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec) + +def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None): + buspins = [] + for i in range(4): + buspins.append("RG_ERXD%d" % i) + for i in range(4): + buspins.append("RG_ETXD%d" % i) + for i in range(2): + buspins.append("RG_FB_CS%d" % i) + buspins += ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV', + 'RG_EMDC', 'RG_EMDIO', + 'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS', + 'RG_ECOL', 'RG_ETXERR'] + return pins(buspins, bankspec, suffix, offs, bank, mux, spec) + +def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): + buspins = [] + for i in range(8): + buspins.append("FB_AD%d" % i) + for i in range(2): + buspins.append("FB_CS%d" % i) + buspins += ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK', + 'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST', + 'FB_TSIZ0', 'FB_TSIZ1'] + for i in range(4): + buspins.append("FB_BWE%d" % i) + for i in range(2,6): + buspins.append("FB_CS%d" % i) + return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) + +def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): + buspins = [] + for i in range(8,32): + buspins.append("FB_AD%d" % i) + return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) + +def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None): + buspins = [] + for i in range(16): + buspins.append("SDRDQM%d" % i) + for i in range(12): + buspins.append("SDRAD%d" % i) + for i in range(8): + buspins.append("SDRDQ%d" % i) + for i in range(3): + buspins.append("SDRCS%d#" % i) + for i in range(2): + buspins.append("SDRDQ%d" % i) + for i in range(2): + buspins.append("SDRBA%d" % i) + buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#', + 'SDRRST'] + return pins(buspins, bankspec, suffix, offs, bank, mux, spec) + +def sdram2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): + buspins = [] + for i in range(3,6): + buspins.append("SDRCS%d#" % i) + for i in range(8,32): + buspins.append("SDRDQ%d" % i) + return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) + +def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None): + buspins = [] + for i in range(8): + buspins.append("MCUD%d" % i) + for i in range(8): + buspins.append("MCUAD%d" % (i+8)) + for i in range(6): + buspins.append("MCUCS%d" % i) + for i in range(2): + buspins.append("MCUNRB%d" % i) + buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE', + 'MCURST'] + return pins(buspins, bankspec, suffix, offs, bank, mux, spec) + +def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): + gpiopins = [] + for i in range(gpiooffs, gpiooffs+gpionum): + gpiopins.append("%s%s%d" % (prefix, bank, i)) + return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec) + +def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): + gpiopins = [] + for i in range(gpiooffs, gpiooffs+gpionum): + gpiopins.append("EINT%d" % (i)) + return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec) + +def pwm(bankspec, suffix, offs, bank, mux=1, spec=None): + return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec) + +def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): + return _pinbank(bankspec, "GPIO", suffix, offs, bank, gpiooffs, + gpionum, mux=0, spec=None) + +def display(pins): + print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |" + print "| --- | ----------- | ----------- | ----------- | ----------- |" + pinidx = pins.keys() + pinidx.sort() + for pin in pinidx: + pdata = pins[pin] + res = '| %3d |' % pin + for mux in range(4): + if not pdata.has_key(mux): + res += " |" + continue + name, bank = pdata[mux] + res += " %s %-9s |" % (bank, name) + print res + +def fnsplit(f): + a = '' + n = 0 + if not f.startswith('FB_'): + f2 = f.split('_') + if len(f2) == 2: + if f2[1].isdigit(): + return f2[0], int(f2[1]) + return f2[0], f2[1] + #print f + while f and not f[0].isdigit(): + a += f[0] + f = f[1:] + return a, int(f) if f else None + +def fnsort(f1, f2): + a1, n1 = fnsplit(f1) + a2, n2 = fnsplit(f2) + x = cmp(a1, a2) + if x != 0: + return x + return cmp(n1, n2) + +def find_fn(fname, names): + for n in names: + if fname.startswith(n): + return n + +def display_fns(bankspec, pins, function_names): + fn_names = function_names.keys() + fns = {} + for (pin, pdata) in pins.items(): + for mux in range(1,4): # skip GPIO for now + if not pdata.has_key(mux): + continue + name, bank = pdata[mux] + if not fns.has_key(name): + fns[name] = [] + fns[name].append((pin-bankspec[bank], mux, bank)) + + fnidx = fns.keys() + fnidx.sort(fnsort) + current_fn = None + for fname in fnidx: + fnbase = find_fn(fname, fn_names) + #print "name", fname + if fnbase != current_fn: + if current_fn is not None: + print + print "## %s" % fnbase + print + print function_names[fnbase] + print + current_fn = fnbase + print "* %-9s :" % fname, + for (pin, mux, bank) in fns[fname]: + print "%s%d/%d" % (bank, pin, mux), + print + + return fns + +def check_functions(title, bankspec, fns, pins, required, eint, pwm, + descriptions=None): + fns = deepcopy(fns) + pins = deepcopy(pins) + if descriptions is None: + descriptions = {} + + print "# Pinmap for %s" % title + print + + + for name in required: + print "## %s" % name + print + if descriptions and descriptions.has_key(name): + print descriptions[name] + print + + name = name.split(':') + if len(name) == 2: + findbank = name[0][0] + findmux = int(name[0][1:]) + name = name[1] + else: + name = name[0] + findbank = None + findmux = None + name = name.split('/') + if len(name) == 2: + count = int(name[1]) + else: + count = 100000 + name = name[0] + found = set() + fnidx = fns.keys() + #fnidx.sort(fnsort) + pinfound = {} + for fname in fnidx: + if not fname.startswith(name): + continue + for pin, mux, bank in fns[fname]: + if findbank is not None: + if findbank != bank: + continue + if findmux != mux: + continue + pin_ = pin + bankspec[bank] + if pins.has_key(pin_): + pinfound[pin_] = (fname, pin_, bank, pin, mux) + + pinidx = pinfound.keys() + pinidx.sort() + + for pin_ in pinidx: + fname, pin_, bank, pin, mux = pinfound[pin_] + if fname in found: + continue + found.add(fname) + if len(found) > count: + continue + del pins[pin_] + print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux) + + print + + # gpios + gpios = [] + for name in descriptions.keys(): + if not name.startswith('GPIO'): + continue + if name == 'GPIO': + continue + gpios.append(name) + gpios.sort() + + if gpios: + print "## GPIO" + print + + for fname in gpios: + if fname in found: + continue + desc = '' + if descriptions and descriptions.has_key(fname): + desc = ': %s' % descriptions[fname] + bank = fname[4] + pin = int(fname[5:]) + pin_ = pin + bankspec[bank] + if not pins.has_key(pin_): + continue + del pins[pin_] + found.add(fname) + print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc) + print + + if eint: + display_group(bankspec, "EINT", eint, fns, pins, descriptions) + if pwm: + display_group(bankspec, "PWM", pwm, fns, pins, descriptions) + + print "## Unused Pinouts (spare as GPIO) for '%s'" % title + print + if descriptions and descriptions.has_key('GPIO'): + print descriptions['GPIO'] + print + display(pins) + print + + return pins # unused + +def display_group(bankspec, title, todisplay, fns, pins, descriptions): + print "## %s" % title + print + + found = set() + for fname in todisplay: + desc = '' + if descriptions and descriptions.has_key(fname): + desc = ': %s' % descriptions[fname] + fname = fname.split(':') + if len(fname) == 2: + findbank = fname[0][0] + findmux = int(fname[0][1:]) + fname = fname[1] + else: + fname = fname[0] + findbank = None + findmux = None + for (pin, mux, bank) in fns[fname]: + if findbank is not None: + if findbank != bank: + continue + if findmux != mux: + continue + if fname in found: + continue + pin_ = pin + bankspec[bank] + if not pins.has_key(pin_): + continue + del pins[pin_] + found.add(fname) + print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc) + print + +def pinmerge(pins, fn): + for (pinidx, v) in fn.items(): + if not pins.has_key(pinidx): + pins[pinidx] = v + continue + pins[pinidx].update(v) + +def display_fixed(fixed, offs): + + fkeys = fixed.keys() + fkeys.sort() + pin_ = offs + for pin, k in enumerate(fkeys): + print "## %s" % k + print + prevname = '' + linecount = 0 + for name in fixed[k]: + if linecount == 4: + linecount = 0 + print + if prevname[:2] == name[:2] and linecount != 0: + print name, + linecount += 1 + else: + if linecount != 0: + print + print "* %d: %d %s" % (pin_, pin, name), + linecount = 1 + prevname = name + pin_ += 1 + if linecount != 0: + print + print + diff --git a/shakti/i_class/pinouts.py b/shakti/i_class/pinouts.py index b9cf7eeb0..df8f865ea 100644 --- a/shakti/i_class/pinouts.py +++ b/shakti/i_class/pinouts.py @@ -1,459 +1,11 @@ #!/usr/bin/env python -from copy import deepcopy - -def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None): - res = {} - names = {} - idx = 0 - for name in pingroup[:limit]: - if suffix: - name_ = "%s_%s" % (name, suffix) - else: - name_ = name - if spec and spec.has_key(name): - continue - pin = {mux: (name_, bank)} - offs_bank, offs_ = offs - idx_ = offs_ + idx - idx += 1 - idx_ += bankspec[bank] - res[idx_] = pin - names[name] = idx_ - for name in pingroup: - if suffix: - name_ = "%s_%s" % (name, suffix) - else: - name_ = name - if not spec: - continue - if not spec.has_key(name): - continue - idx_, mux_, bank_ = spec[name] - idx_ = names[idx_] - #idx_ += bankspec[bank_] - pin = {mux_: (name_, bank_)} - if res.has_key(idx_): - res[idx_].update(pin) - else: - res[idx_] = pin - return res - -def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): - i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI'] - for i in range(4): - i2spins.append("IISDO%d" % i) - return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit) - -def emmc(bankspec, suffix, offs, bank, mux=1, spec=None): - emmcpins = ['MMCCMD', 'MMCCLK'] - for i in range(8): - emmcpins.append("MMCD%d" % i) - return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec) - -def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None, - start=None, limit=None): - sdmmcpins = ['CMD', 'CLK'] - for i in range(4): - sdmmcpins.append("D%d" % i) - sdmmcpins = sdmmcpins[start:limit] - sdmmcpins = namesuffix('SD', suffix, sdmmcpins) - return pins(sdmmcpins, bankspec, '', offs, bank, mux, spec) - -def spi(bankspec, suffix, offs, bank, mux=1, spec=None): - spipins = namesuffix('SPI', suffix, - ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS']) - return pins(spipins, bankspec, '', offs, bank, mux, spec) - -def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): - spipins = namesuffix('SPI', suffix, - ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3']) - return pins(spipins, bankspec, '', offs, bank, mux, spec, limit) - -def i2c(bankspec, suffix, offs, bank, mux=1, spec=None): - spipins = namesuffix('TWI', suffix, - ['SDA', 'SCL']) - return pins(spipins, bankspec, '', offs, bank, mux, spec) - -def jtag(bankspec, suffix, offs, bank, mux=1, spec=None): - uartpins = namesuffix('JTAG', suffix, ['MS', 'DI', 'DO', 'CK']) - return pins(uartpins, bankspec, '', offs, bank, mux, spec) - -def uart(bankspec, suffix, offs, bank, mux=1, spec=None): - uartpins = namesuffix('UART', suffix, ['TX', 'RX']) - return pins(uartpins, bankspec, '', offs, bank, mux, spec) - -def namesuffix(name, suffix, namelist): - names = [] - for n in namelist: - names.append("%s%s_%s" % (name, suffix, n)) - return names - -def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None): - ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT']) - for i in range(8): - ulpipins.append('ULPI%s_D%d' % (suffix, i)) - return pins(ulpipins, bankspec, "", offs, bank, mux, spec) - -def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None): - uartpins = namesuffix('UART', suffix, ['TX', 'RX', 'CTS', 'RTS']) - return pins(uartpins, bankspec, '', offs, bank, mux, spec) - -def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None): - ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS'] - for i in range(24): - ttlpins.append("LCD%d" % i) - return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec) - -def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None): - buspins = [] - for i in range(4): - buspins.append("RG_ERXD%d" % i) - for i in range(4): - buspins.append("RG_ETXD%d" % i) - for i in range(2): - buspins.append("RG_FB_CS%d" % i) - buspins += ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV', - 'RG_EMDC', 'RG_EMDIO', - 'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS', - 'RG_ECOL', 'RG_ETXERR'] - return pins(buspins, bankspec, suffix, offs, bank, mux, spec) - -def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): - buspins = [] - for i in range(8): - buspins.append("FB_AD%d" % i) - for i in range(2): - buspins.append("FB_CS%d" % i) - buspins += ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK', - 'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST', - 'FB_TSIZ0', 'FB_TSIZ1'] - for i in range(4): - buspins.append("FB_BWE%d" % i) - for i in range(2,6): - buspins.append("FB_CS%d" % i) - return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) - -def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): - buspins = [] - for i in range(8,32): - buspins.append("FB_AD%d" % i) - return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) - -def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None): - buspins = [] - for i in range(16): - buspins.append("SDRDQM%d" % i) - for i in range(12): - buspins.append("SDRAD%d" % i) - for i in range(8): - buspins.append("SDRDQ%d" % i) - for i in range(3): - buspins.append("SDRCS%d#" % i) - for i in range(2): - buspins.append("SDRDQ%d" % i) - for i in range(2): - buspins.append("SDRBA%d" % i) - buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#', - 'SDRRST'] - return pins(buspins, bankspec, suffix, offs, bank, mux, spec) - -def sdram2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None): - buspins = [] - for i in range(3,6): - buspins.append("SDRCS%d#" % i) - for i in range(8,32): - buspins.append("SDRDQ%d" % i) - return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit) - -def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None): - buspins = [] - for i in range(8): - buspins.append("MCUD%d" % i) - for i in range(8): - buspins.append("MCUAD%d" % (i+8)) - for i in range(6): - buspins.append("MCUCS%d" % i) - for i in range(2): - buspins.append("MCUNRB%d" % i) - buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE', - 'MCURST'] - return pins(buspins, bankspec, suffix, offs, bank, mux, spec) - -def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): - gpiopins = [] - for i in range(gpiooffs, gpiooffs+gpionum): - gpiopins.append("%s%s%d" % (prefix, bank, i)) - return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec) - -def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): - gpiopins = [] - for i in range(gpiooffs, gpiooffs+gpionum): - gpiopins.append("EINT%d" % (i)) - return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec) - -def pwm(bankspec, suffix, offs, bank, mux=1, spec=None): - return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec) - -def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None): - return _pinbank(bankspec, "GPIO", suffix, offs, bank, gpiooffs, - gpionum, mux=0, spec=None) - -def display(pins): - print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |" - print "| --- | ----------- | ----------- | ----------- | ----------- |" - pinidx = pins.keys() - pinidx.sort() - for pin in pinidx: - pdata = pins[pin] - res = '| %3d |' % pin - for mux in range(4): - if not pdata.has_key(mux): - res += " |" - continue - name, bank = pdata[mux] - res += " %s %-9s |" % (bank, name) - print res - -def fnsplit(f): - a = '' - n = 0 - if not f.startswith('FB_'): - f2 = f.split('_') - if len(f2) == 2: - if f2[1].isdigit(): - return f2[0], int(f2[1]) - return f2[0], f2[1] - #print f - while f and not f[0].isdigit(): - a += f[0] - f = f[1:] - return a, int(f) if f else None - -def fnsort(f1, f2): - a1, n1 = fnsplit(f1) - a2, n2 = fnsplit(f2) - x = cmp(a1, a2) - if x != 0: - return x - return cmp(n1, n2) - -def find_fn(fname, names): - for n in names: - if fname.startswith(n): - return n - -def display_fns(bankspec, pins, function_names): - fn_names = function_names.keys() - fns = {} - for (pin, pdata) in pins.items(): - for mux in range(1,4): # skip GPIO for now - if not pdata.has_key(mux): - continue - name, bank = pdata[mux] - if not fns.has_key(name): - fns[name] = [] - fns[name].append((pin-bankspec[bank], mux, bank)) - - fnidx = fns.keys() - fnidx.sort(fnsort) - current_fn = None - for fname in fnidx: - fnbase = find_fn(fname, fn_names) - #print "name", fname - if fnbase != current_fn: - if current_fn is not None: - print - print "## %s" % fnbase - print - print function_names[fnbase] - print - current_fn = fnbase - print "* %-9s :" % fname, - for (pin, mux, bank) in fns[fname]: - print "%s%d/%d" % (bank, pin, mux), - print - - return fns - -def check_functions(title, bankspec, fns, pins, required, eint, pwm, - descriptions=None): - fns = deepcopy(fns) - pins = deepcopy(pins) - if descriptions is None: - descriptions = {} - - print "# Pinmap for %s" % title - print - - - for name in required: - print "## %s" % name - print - if descriptions and descriptions.has_key(name): - print descriptions[name] - print - - name = name.split(':') - if len(name) == 2: - findbank = name[0][0] - findmux = int(name[0][1:]) - name = name[1] - else: - name = name[0] - findbank = None - findmux = None - name = name.split('/') - if len(name) == 2: - count = int(name[1]) - else: - count = 100000 - name = name[0] - found = set() - fnidx = fns.keys() - #fnidx.sort(fnsort) - pinfound = {} - for fname in fnidx: - if not fname.startswith(name): - continue - for pin, mux, bank in fns[fname]: - if findbank is not None: - if findbank != bank: - continue - if findmux != mux: - continue - pin_ = pin + bankspec[bank] - if pins.has_key(pin_): - pinfound[pin_] = (fname, pin_, bank, pin, mux) - - pinidx = pinfound.keys() - pinidx.sort() - - for pin_ in pinidx: - fname, pin_, bank, pin, mux = pinfound[pin_] - if fname in found: - continue - found.add(fname) - if len(found) > count: - continue - del pins[pin_] - print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux) - - print - - # gpios - gpios = [] - for name in descriptions.keys(): - if not name.startswith('GPIO'): - continue - if name == 'GPIO': - continue - gpios.append(name) - gpios.sort() - - if gpios: - print "## GPIO" - print - - for fname in gpios: - if fname in found: - continue - desc = '' - if descriptions and descriptions.has_key(fname): - desc = ': %s' % descriptions[fname] - bank = fname[4] - pin = int(fname[5:]) - pin_ = pin + bankspec[bank] - if not pins.has_key(pin_): - continue - del pins[pin_] - found.add(fname) - print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc) - print - - if eint: - display_group("EINT", eint, fns, pins, descriptions) - if pwm: - display_group("PWM", pwm, fns, pins, descriptions) - - print "## Unused Pinouts (spare as GPIO) for '%s'" % title - print - if descriptions and descriptions.has_key('GPIO'): - print descriptions['GPIO'] - print - display(pins) - print - - return pins # unused - -def display_group(title, todisplay, fns, pins, descriptions): - print "## %s" % title - print - - found = set() - for fname in todisplay: - desc = '' - if descriptions and descriptions.has_key(fname): - desc = ': %s' % descriptions[fname] - fname = fname.split(':') - if len(fname) == 2: - findbank = fname[0][0] - findmux = int(fname[0][1:]) - fname = fname[1] - else: - fname = fname[0] - findbank = None - findmux = None - for (pin, mux, bank) in fns[fname]: - if findbank is not None: - if findbank != bank: - continue - if findmux != mux: - continue - if fname in found: - continue - pin_ = pin + bankspec[bank] - if not pins.has_key(pin_): - continue - del pins[pin_] - found.add(fname) - print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc) - print - -def pinmerge(pins, fn): - for (pinidx, v) in fn.items(): - if not pins.has_key(pinidx): - pins[pinidx] = v - continue - pins[pinidx].update(v) - -def display_fixed(fixed, offs): - - fkeys = fixed.keys() - fkeys.sort() - pin_ = offs - for pin, k in enumerate(fkeys): - print "## %s" % k - print - prevname = '' - linecount = 0 - for name in fixed[k]: - if linecount == 4: - linecount = 0 - print - if prevname[:2] == name[:2] and linecount != 0: - print name, - linecount += 1 - else: - if linecount != 0: - print - print "* %d: %d %s" % (pin_, pin, name), - linecount = 1 - prevname = name - pin_ += 1 - if linecount != 0: - print - print +from interfaces import pins, i2s, emmc, sdmmc, spi, quadspi, i2c +from interfaces import jtag, uart, ulpi, uartfull, rgbttl, rgmii +from interfaces import flexbus1, flexbus2, sdram1, sdram2, mcu8080 +from interfaces import eint, pwm, gpio +from interfaces import display, display_fns, check_functions +from interfaces import pinmerge, display_fixed if __name__ == '__main__': pinouts = {}