3 from copy
import deepcopy
5 def pins(pingroup
, bankspec
, suffix
, offs
, bank
, mux
, spec
=None, limit
=None):
9 for name
in pingroup
[:limit
]:
11 name_
= "%s_%s" % (name
, suffix
)
14 if spec
and spec
.has_key(name
):
16 pin
= {mux
: (name_
, bank
)}
17 offs_bank
, offs_
= offs
20 idx_
+= bankspec
[bank
]
25 name_
= "%s_%s" % (name
, suffix
)
30 if not spec
.has_key(name
):
32 idx_
, mux_
, bank_
= spec
[name
]
34 #idx_ += bankspec[bank_]
35 pin
= {mux_
: (name_
, bank_
)}
42 def i2s(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
43 i2spins
= ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
45 i2spins
.append("IISDO%d" % i
)
46 return pins(i2spins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
)
48 def emmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
49 emmcpins
= ['MMCCMD', 'MMCCLK']
51 emmcpins
.append("MMCD%d" % i
)
52 return pins(emmcpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
54 def sdmmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None,
55 start
=None, limit
=None):
56 sdmmcpins
= ['CMD', 'CLK']
58 sdmmcpins
.append("D%d" % i
)
59 sdmmcpins
= sdmmcpins
[start
:limit
]
60 sdmmcpins
= namesuffix('SD', suffix
, sdmmcpins
)
61 return pins(sdmmcpins
, bankspec
, '', offs
, bank
, mux
, spec
)
63 def spi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
64 spipins
= namesuffix('SPI', suffix
,
65 ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS'])
66 return pins(spipins
, bankspec
, '', offs
, bank
, mux
, spec
)
68 def quadspi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
69 spipins
= namesuffix('SPI', suffix
,
70 ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3'])
71 return pins(spipins
, bankspec
, '', offs
, bank
, mux
, spec
, limit
)
73 def i2c(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
74 spipins
= namesuffix('TWI', suffix
,
76 return pins(spipins
, bankspec
, '', offs
, bank
, mux
, spec
)
78 def jtag(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
79 uartpins
= namesuffix('JTAG', suffix
, ['MS', 'DI', 'DO', 'CK'])
80 return pins(uartpins
, bankspec
, '', offs
, bank
, mux
, spec
)
82 def uart(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
83 uartpins
= namesuffix('UART', suffix
, ['TX', 'RX'])
84 return pins(uartpins
, bankspec
, '', offs
, bank
, mux
, spec
)
86 def namesuffix(name
, suffix
, namelist
):
89 names
.append("%s%s_%s" % (name
, suffix
, n
))
92 def ulpi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
93 ulpipins
= namesuffix('ULPI', suffix
, ['CK', 'DIR', 'STP', 'NXT'])
95 ulpipins
.append('ULPI%s_D%d' % (suffix
, i
))
96 return pins(ulpipins
, bankspec
, "", offs
, bank
, mux
, spec
)
98 def uartfull(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
99 uartpins
= namesuffix('UART', suffix
, ['TX', 'RX', 'CTS', 'RTS'])
100 return pins(uartpins
, bankspec
, '', offs
, bank
, mux
, spec
)
102 def rgbttl(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
103 ttlpins
= ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
105 ttlpins
.append("LCD%d" % i
)
106 return pins(ttlpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
108 def rgmii(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
111 buspins
.append("RG_ERXD%d" % i
)
113 buspins
.append("RG_ETXD%d" % i
)
115 buspins
.append("RG_FB_CS%d" % i
)
116 buspins
+= ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV',
117 'RG_EMDC', 'RG_EMDIO',
118 'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS',
119 'RG_ECOL', 'RG_ETXERR']
120 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
122 def flexbus1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
125 buspins
.append("FB_AD%d" % i
)
127 buspins
.append("FB_CS%d" % i
)
128 buspins
+= ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK',
129 'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST',
130 'FB_TSIZ0', 'FB_TSIZ1']
132 buspins
.append("FB_BWE%d" % i
)
134 buspins
.append("FB_CS%d" % i
)
135 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
)
137 def flexbus2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
139 for i
in range(8,32):
140 buspins
.append("FB_AD%d" % i
)
141 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
)
143 def mcu8080(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
146 buspins
.append("MCUD%d" % i
)
148 buspins
.append("MCUAD%d" % (i
+8))
150 buspins
.append("MCUCS%d" % i
)
152 buspins
.append("MCUNRB%d" % i
)
153 buspins
+= ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
155 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
157 def _pinbank(bankspec
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
159 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
160 gpiopins
.append("%s%s%d" % (prefix
, bank
, i
))
161 return pins(gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
163 def eint(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
165 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
166 gpiopins
.append("EINT%d" % (i
))
167 return pins(gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
169 def pwm(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
170 return pins(['PWM', ], bankspec
, suffix
, offs
, bank
, mux
, spec
)
172 def gpio(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
173 return _pinbank(bankspec
, "GPIO", suffix
, offs
, bank
, gpiooffs
,
174 gpionum
, mux
=0, spec
=None)
177 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
178 print "| --- | ----------- | ----------- | ----------- | ----------- |"
183 res
= '| %3d |' % pin
185 if not pdata
.has_key(mux
):
188 name
, bank
= pdata
[mux
]
189 res
+= " %s %-9s |" % (bank
, name
)
195 if not f
.startswith('FB_'):
199 return f2
[0], int(f2
[1])
202 while f
and not f
[0].isdigit():
205 return a
, int(f
) if f
else None
215 def find_fn(fname
, names
):
217 if fname
.startswith(n
):
220 def display_fns(bankspec
, pins
, function_names
):
221 fn_names
= function_names
.keys()
223 for (pin
, pdata
) in pins
.items():
224 for mux
in range(1,4): # skip GPIO for now
225 if not pdata
.has_key(mux
):
227 name
, bank
= pdata
[mux
]
228 if not fns
.has_key(name
):
230 fns
[name
].append((pin
-bankspec
[bank
], mux
, bank
))
236 fnbase
= find_fn(fname
, fn_names
)
238 if fnbase
!= current_fn
:
239 if current_fn
is not None:
241 print "## %s" % fnbase
243 print function_names
[fnbase
]
246 print "* %-9s :" % fname
,
247 for (pin
, mux
, bank
) in fns
[fname
]:
248 print "%s%d/%d" % (bank
, pin
, mux
),
253 def check_functions(title
, bankspec
, fns
, pins
, required
, eint
, pwm
,
256 pins
= deepcopy(pins
)
257 if descriptions
is None:
260 print "# Pinmap for %s" % title
264 for name
in required
:
267 if descriptions
and descriptions
.has_key(name
):
268 print descriptions
[name
]
271 name
= name
.split(':')
273 findbank
= name
[0][0]
274 findmux
= int(name
[0][1:])
280 name
= name
.split('/')
291 if not fname
.startswith(name
):
293 for pin
, mux
, bank
in fns
[fname
]:
294 if findbank
is not None:
299 pin_
= pin
+ bankspec
[bank
]
300 if pins
.has_key(pin_
):
301 pinfound
[pin_
] = (fname
, pin_
, bank
, pin
, mux
)
303 pinidx
= pinfound
.keys()
307 fname
, pin_
, bank
, pin
, mux
= pinfound
[pin_
]
311 if len(found
) > count
:
314 print "* %s %d %s%d/%d" % (fname
, pin_
, bank
, pin
, mux
)
320 for name
in descriptions
.keys():
321 if not name
.startswith('GPIO'):
336 if descriptions
and descriptions
.has_key(fname
):
337 desc
= ': %s' % descriptions
[fname
]
340 pin_
= pin
+ bankspec
[bank
]
341 if not pins
.has_key(pin_
):
345 print "* %-8s %d %s%-2d %s" % (fname
, pin_
, bank
, pin
, desc
)
349 display_group("EINT", eint
, fns
, pins
, descriptions
)
351 display_group("PWM", pwm
, fns
, pins
, descriptions
)
353 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
355 if descriptions
and descriptions
.has_key('GPIO'):
356 print descriptions
['GPIO']
363 def display_group(title
, todisplay
, fns
, pins
, descriptions
):
364 print "## %s" % title
368 for fname
in todisplay
:
370 if descriptions
and descriptions
.has_key(fname
):
371 desc
= ': %s' % descriptions
[fname
]
372 fname
= fname
.split(':')
374 findbank
= fname
[0][0]
375 findmux
= int(fname
[0][1:])
381 for (pin
, mux
, bank
) in fns
[fname
]:
382 if findbank
is not None:
389 pin_
= pin
+ bankspec
[bank
]
390 if not pins
.has_key(pin_
):
394 print "* %s %d %s%d/%d %s" % (fname
, pin_
, bank
, pin
, mux
, desc
)
397 def pinmerge(pins
, fn
):
398 for (pinidx
, v
) in fn
.items():
399 if not pins
.has_key(pinidx
):
402 pins
[pinidx
].update(v
)
404 def display_fixed(fixed
, offs
):
409 for pin
, k
in enumerate(fkeys
):
414 for name
in fixed
[k
]:
418 if prevname
[:2] == name
[:2] and linecount
!= 0:
424 print "* %d: %d %s" % (pin_
, pin
, name
),
432 if __name__
== '__main__':
442 pkeys
= pinbanks
.keys()
450 pinmerge(pinouts
, gpio(bankspec
, "", ('A', 0), "A", 0, 16, 0))
451 pinmerge(pinouts
, spi(bankspec
, "0", ('A', 0), "A", 1))
452 pinmerge(pinouts
, spi(bankspec
, "1", ('A', 4), "A", 1))
453 pinmerge(pinouts
, uart(bankspec
, "0", ('A', 8), "A", 1))
454 pinmerge(pinouts
, uart(bankspec
, "1", ('A', 10), "A", 1))
455 pinmerge(pinouts
, i2c(bankspec
, "0", ('A', 12), "A", 1))
456 pinmerge(pinouts
, i2c(bankspec
, "1", ('A', 14), "A", 1))
458 pinmerge(pinouts
, pwm(bankspec
, str(i
), ('A', i
), "A", mux
=2))
461 pinmerge(pinouts
, gpio(bankspec
, "", ('B', 0), "B", 0, 16, 0))
462 pinmerge(pinouts
, spi(bankspec
, "2", ('B', 0), "B", 1))
463 pinmerge(pinouts
, uart(bankspec
, "2", ('B', 4), "B", 1))
464 pinmerge(pinouts
, uart(bankspec
, "3", ('B', 6), "B", 1))
465 pinmerge(pinouts
, uart(bankspec
, "4", ('B', 8), "B", 1))
466 pinmerge(pinouts
, i2c(bankspec
, "2", ('B', 10), "B", 1))
467 pinmerge(pinouts
, i2c(bankspec
, "3", ('B', 12), "B", 1))
468 pinmerge(pinouts
, uart(bankspec
, "5", ('B', 14), "B", 1))
470 pinmerge(pinouts
, pwm(bankspec
, str(i
+16), ('B', i
), "B", mux
=2))
473 pinmerge(pinouts
, ulpi(bankspec
, "0", ('C', 0), "C", 1))
474 pinmerge(pinouts
, spi(bankspec
, "0", ('C', 12), "C", 1))
477 pinmerge(pinouts
, sdmmc(bankspec
, "0", ('D', 0), "D", 1))
478 pinmerge(pinouts
, jtag(bankspec
, "0", ('D', 6), "D", 1))
479 pinmerge(pinouts
, uart(bankspec
, "0", ('D', 10), "D", 1))
480 pinmerge(pinouts
, i2c(bankspec
, "0", ('D', 12), "D", 1))
481 pinmerge(pinouts
, uart(bankspec
, "1", ('D', 14), "D", 1))
485 'FB_TS': ('FB_ALE', 2, "D"),
486 'FB_CS2': ('FB_BWE2', 2, "D"),
487 'FB_A0': ('FB_BWE2', 3, "D"),
488 'FB_CS3': ('FB_BWE3', 2, "D"),
489 'FB_A1': ('FB_BWE3', 3, "D"),
490 'FB_TBST': ('FB_OE', 2, "D"),
491 'FB_TSIZ0': ('FB_BWE0', 2, "D"),
492 'FB_TSIZ1': ('FB_BWE1', 2, "D"),
494 pinmerge(pinouts
, flexbus1(bankspec
, "", ('E', 0), "E", 1))
495 pinmerge(pinouts
, flexbus2(bankspec
, "", ('E', 30), "E", 1, limit
=8))
497 print "# Pinouts (PinMux)"
499 print "auto-generated by [[pinouts.py]]"
506 print "# Pinouts (Fixed function)"
514 'CLK24M_IN', 'CLK24M_OUT',
515 'CLK32K_IN', 'CLK32K_OUT',
516 'PLLTEST', 'PLLREGIO', 'PLLVP25',
517 'PLLDV', 'PLLVREG', 'PLLGND',
521 ['VDD0_CPU', 'VDD1_CPU', 'VDD2_CPU', 'VDD3_CPU', 'VDD4_CPU', 'VDD5_CPU',
522 'GND0_CPU', 'GND1_CPU', 'GND2_CPU', 'GND3_CPU', 'GND4_CPU', 'GND5_CPU',
526 ['VDD0_DLL', 'VDD1_DLL', 'VDD2_DLL',
527 'GND0_DLL', 'GND1_DLL', 'GND2_DLL',
531 ['VDD0_INT', 'VDD1_INT', 'VDD2_INT', 'VDD3_INT', 'VDD4_INT',
532 'VDD5_INT', 'VDD6_INT', 'VDD7_INT', 'VDD8_INT', 'VDD9_INT',
533 'GND0_INT', 'GND1_INT', 'GND2_INT', 'GND3_INT', 'GND4_INT',
534 'GND5_INT', 'GND6_INT', 'GND7_INT', 'GND8_INT', 'GND9_INT',
538 ['VDD_GPIOA', 'VDD_GPIOB', 'VDD_GPIOC', 'VDD_GPIOD', 'VDD_GPIOE',
539 'GND_GPIOA', 'GND_GPIOB', 'GND_GPIOC', 'GND_GPIOD', 'GND_GPIOE',
544 display_fixed(fixedpins
, len(pinouts
))
546 print "# Functions (PinMux)"
548 print "auto-generated by [[pinouts.py]]"
551 function_names
= {'EINT': 'External Interrupt',
552 'FB': 'MC68k FlexBus',
555 'JTAG1': 'JTAG (same as JTAG2, JTAG_SEL=LOW)',
556 'JTAG2': 'JTAG (same as JTAG1, JTAG_SEL=HIGH)',
557 'LCD': '24-pin RGB/TTL LCD',
558 'RG': 'RGMII Ethernet',
559 'MMC': 'eMMC 1/2/4/8 pin',
560 'PWM': 'PWM (pulse-width modulation)',
565 'SPI0': 'SPI (Serial Peripheral Interface) 0',
566 'SPI1': 'SPI (Serial Peripheral Interface) 1',
567 'SPI2': 'SPI (Serial Peripheral Interface) 2',
568 'SPI3': 'Quad SPI (Serial Peripheral Interface) 3',
573 'UART0': 'UART (TX/RX) 0',
574 'UART1': 'UART (TX/RX) 1',
575 'UART2': 'UART (TX/RX) 2',
576 'UART3': 'UART (TX/RX) 3',
577 'UART4': 'UART (TX/RX) 4',
578 'UART5': 'UART (TX/RX) 5',
579 'ULPI0': 'ULPI (USB Low Pin-count) 0',
580 'ULPI1': 'ULPI (USB Low Pin-count) 1',
581 'ULPI2': 'ULPI (USB Low Pin-count) 2',
582 'ULPI3': 'ULPI (USB Low Pin-count) 3',
585 fns
= display_fns(bankspec
, pinouts
, function_names
)
588 # Scenarios below can be spec'd out as either "find first interface"
589 # by name/number e.g. SPI1, or as "find in bank/mux" which must be
590 # spec'd as "BM:Name" where B is bank (A-F), M is Mux (0-3)
591 # EINT and PWM are grouped together, specially, but may still be spec'd
592 # using "BM:Name". Pins are removed in-order as listed from
593 # lists (interfaces, EINTs, PWMs) from available pins.
597 robotics
= ['FB', 'ULPI0/8',
600 'C1:SPI0', 'D1:TWI0']
603 robotics_pwm
.append('PWM_%d' % i
)
604 robotics_eint
= ['EINT24', 'EINT25', 'EINT26', 'EINT27',
605 'EINT20', 'EINT21', 'EINT22', 'EINT23']
608 unused_pins
= check_functions("Robotics", bankspec
, fns
, pinouts
,
609 robotics
, robotics_eint
, robotics_pwm
)
611 print "# Reference Datasheets"
613 print "datasheets and pinout links"
615 print "* <http://datasheets.chipdb.org/AMD/8018x/80186/amd-80186.pdf>"
616 print "* <http://hands.com/~lkcl/eoma/shenzen/frida/FRD144A2701.pdf>"
617 print "* <http://pinouts.ru/Memory/sdcard_pinout.shtml>"
618 print "* p8 <http://www.onfi.org/~/media/onfi/specs/onfi_2_0_gold.pdf?la=en>"
619 print "* <https://www.heyrick.co.uk/blog/files/datasheets/dm9000aep.pdf>"
620 print "* <http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4393.pdf>"
621 print "* <https://www.nxp.com/docs/en/data-sheet/MCF54418.pdf>"
622 print "* ULPI OTG PHY, ST <http://www.st.com/en/interfaces-and-transceivers/stulpi01a.html>"
623 print "* ULPI OTG PHY, TI TUSB1210 <http://ti.com/product/TUSB1210/>"