--- /dev/null
+#!/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
+
#!/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 = {}