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 sdram1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
146 buspins
.append("SDRDQM%d" % i
)
148 buspins
.append("SDRAD%d" % i
)
150 buspins
.append("SDRDQ%d" % i
)
152 buspins
.append("SDRCS%d#" % i
)
154 buspins
.append("SDRDQ%d" % i
)
156 buspins
.append("SDRBA%d" % i
)
157 buspins
+= ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
159 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
161 def sdram2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
164 buspins
.append("SDRCS%d#" % i
)
165 for i
in range(8,32):
166 buspins
.append("SDRDQ%d" % i
)
167 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
)
169 def mcu8080(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
172 buspins
.append("MCUD%d" % i
)
174 buspins
.append("MCUAD%d" % (i
+8))
176 buspins
.append("MCUCS%d" % i
)
178 buspins
.append("MCUNRB%d" % i
)
179 buspins
+= ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
181 return pins(buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
183 def _pinbank(bankspec
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
185 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
186 gpiopins
.append("%s%s%d" % (prefix
, bank
, i
))
187 return pins(gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
189 def eint(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
191 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
192 gpiopins
.append("EINT%d" % (i
))
193 return pins(gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
)
195 def pwm(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
196 return pins(['PWM', ], bankspec
, suffix
, offs
, bank
, mux
, spec
)
198 def gpio(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
199 return _pinbank(bankspec
, "GPIO", suffix
, offs
, bank
, gpiooffs
,
200 gpionum
, mux
=0, spec
=None)
203 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
204 print "| --- | ----------- | ----------- | ----------- | ----------- |"
209 res
= '| %3d |' % pin
211 if not pdata
.has_key(mux
):
214 name
, bank
= pdata
[mux
]
215 res
+= " %s %-9s |" % (bank
, name
)
221 if not f
.startswith('FB_'):
225 return f2
[0], int(f2
[1])
228 while f
and not f
[0].isdigit():
231 return a
, int(f
) if f
else None
241 def find_fn(fname
, names
):
243 if fname
.startswith(n
):
246 def display_fns(bankspec
, pins
, function_names
):
247 fn_names
= function_names
.keys()
249 for (pin
, pdata
) in pins
.items():
250 for mux
in range(1,4): # skip GPIO for now
251 if not pdata
.has_key(mux
):
253 name
, bank
= pdata
[mux
]
254 if not fns
.has_key(name
):
256 fns
[name
].append((pin
-bankspec
[bank
], mux
, bank
))
262 fnbase
= find_fn(fname
, fn_names
)
264 if fnbase
!= current_fn
:
265 if current_fn
is not None:
267 print "## %s" % fnbase
269 print function_names
[fnbase
]
272 print "* %-9s :" % fname
,
273 for (pin
, mux
, bank
) in fns
[fname
]:
274 print "%s%d/%d" % (bank
, pin
, mux
),
279 def check_functions(title
, bankspec
, fns
, pins
, required
, eint
, pwm
,
282 pins
= deepcopy(pins
)
283 if descriptions
is None:
286 print "# Pinmap for %s" % title
290 for name
in required
:
293 if descriptions
and descriptions
.has_key(name
):
294 print descriptions
[name
]
297 name
= name
.split(':')
299 findbank
= name
[0][0]
300 findmux
= int(name
[0][1:])
306 name
= name
.split('/')
317 if not fname
.startswith(name
):
319 for pin
, mux
, bank
in fns
[fname
]:
320 if findbank
is not None:
325 pin_
= pin
+ bankspec
[bank
]
326 if pins
.has_key(pin_
):
327 pinfound
[pin_
] = (fname
, pin_
, bank
, pin
, mux
)
329 pinidx
= pinfound
.keys()
333 fname
, pin_
, bank
, pin
, mux
= pinfound
[pin_
]
337 if len(found
) > count
:
340 print "* %s %d %s%d/%d" % (fname
, pin_
, bank
, pin
, mux
)
346 for name
in descriptions
.keys():
347 if not name
.startswith('GPIO'):
362 if descriptions
and descriptions
.has_key(fname
):
363 desc
= ': %s' % descriptions
[fname
]
366 pin_
= pin
+ bankspec
[bank
]
367 if not pins
.has_key(pin_
):
371 print "* %-8s %d %s%-2d %s" % (fname
, pin_
, bank
, pin
, desc
)
375 display_group("EINT", eint
, fns
, pins
, descriptions
)
377 display_group("PWM", pwm
, fns
, pins
, descriptions
)
379 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
381 if descriptions
and descriptions
.has_key('GPIO'):
382 print descriptions
['GPIO']
389 def display_group(title
, todisplay
, fns
, pins
, descriptions
):
390 print "## %s" % title
394 for fname
in todisplay
:
396 if descriptions
and descriptions
.has_key(fname
):
397 desc
= ': %s' % descriptions
[fname
]
398 fname
= fname
.split(':')
400 findbank
= fname
[0][0]
401 findmux
= int(fname
[0][1:])
407 for (pin
, mux
, bank
) in fns
[fname
]:
408 if findbank
is not None:
415 pin_
= pin
+ bankspec
[bank
]
416 if not pins
.has_key(pin_
):
420 print "* %s %d %s%d/%d %s" % (fname
, pin_
, bank
, pin
, mux
, desc
)
423 def pinmerge(pins
, fn
):
424 for (pinidx
, v
) in fn
.items():
425 if not pins
.has_key(pinidx
):
428 pins
[pinidx
].update(v
)
430 def display_fixed(fixed
, offs
):
435 for pin
, k
in enumerate(fkeys
):
440 for name
in fixed
[k
]:
444 if prevname
[:2] == name
[:2] and linecount
!= 0:
450 print "* %d: %d %s" % (pin_
, pin
, name
),
458 if __name__
== '__main__':
470 pkeys
= pinbanks
.keys()
478 pinmerge(pinouts
, gpio(bankspec
, "", ('A', 0), "A", 0, 16, 0))
479 pinmerge(pinouts
, spi(bankspec
, "0", ('A', 0), "A", 1))
480 pinmerge(pinouts
, spi(bankspec
, "1", ('A', 4), "A", 1))
481 pinmerge(pinouts
, uart(bankspec
, "0", ('A', 8), "A", 1))
482 pinmerge(pinouts
, uart(bankspec
, "1", ('A', 10), "A", 1))
483 pinmerge(pinouts
, i2c(bankspec
, "0", ('A', 12), "A", 1))
484 pinmerge(pinouts
, i2c(bankspec
, "1", ('A', 14), "A", 1))
486 pinmerge(pinouts
, pwm(bankspec
, str(i
), ('A', i
), "A", mux
=2))
489 pinmerge(pinouts
, gpio(bankspec
, "", ('B', 0), "B", 0, 16, 0))
490 pinmerge(pinouts
, spi(bankspec
, "2", ('B', 0), "B", 1))
491 pinmerge(pinouts
, uart(bankspec
, "2", ('B', 4), "B", 1))
492 pinmerge(pinouts
, uart(bankspec
, "3", ('B', 6), "B", 1))
493 pinmerge(pinouts
, uart(bankspec
, "4", ('B', 8), "B", 1))
494 pinmerge(pinouts
, i2c(bankspec
, "2", ('B', 10), "B", 1))
495 pinmerge(pinouts
, i2c(bankspec
, "3", ('B', 12), "B", 1))
496 pinmerge(pinouts
, uart(bankspec
, "5", ('B', 14), "B", 1))
498 pinmerge(pinouts
, pwm(bankspec
, str(i
+16), ('B', i
), "B", mux
=2))
501 pinmerge(pinouts
, gpio(bankspec
, "", ('C', 0), "C", 0, 16, 0))
502 pinmerge(pinouts
, spi(bankspec
, "1", ('C', 0), "C", 1))
503 pinmerge(pinouts
, spi(bankspec
, "2", ('C', 4), "C", 1))
504 pinmerge(pinouts
, uart(bankspec
, "2", ('C', 8), "C", 1))
505 pinmerge(pinouts
, uart(bankspec
, "3", ('C', 10), "C", 1))
506 pinmerge(pinouts
, i2c(bankspec
, "1", ('C', 12), "C", 1))
507 pinmerge(pinouts
, i2c(bankspec
, "3", ('C', 14), "C", 1))
510 pinmerge(pinouts
, ulpi(bankspec
, "0", ('D', 0), "D", 1))
511 pinmerge(pinouts
, spi(bankspec
, "0", ('D', 12), "D", 1))
514 pinmerge(pinouts
, sdmmc(bankspec
, "0", ('E', 0), "E", 1))
515 pinmerge(pinouts
, jtag(bankspec
, "0", ('E', 6), "E", 1))
516 pinmerge(pinouts
, uart(bankspec
, "0", ('E', 10), "E", 1))
517 pinmerge(pinouts
, i2c(bankspec
, "0", ('E', 12), "E", 1))
518 pinmerge(pinouts
, uart(bankspec
, "1", ('E', 14), "E", 1))
522 'FB_TS': ('FB_ALE', 2, "F"),
523 'FB_CS2': ('FB_BWE2', 2, "F"),
524 'FB_A0': ('FB_BWE2', 3, "F"),
525 'FB_CS3': ('FB_BWE3', 2, "F"),
526 'FB_A1': ('FB_BWE3', 3, "F"),
527 'FB_TBST': ('FB_OE', 2, "F"),
528 'FB_TSIZ0': ('FB_BWE0', 2, "F"),
529 'FB_TSIZ1': ('FB_BWE1', 2, "F"),
531 pinmerge(pinouts
, flexbus1(bankspec
, "", ('F', 0), "F", 1))
532 pinmerge(pinouts
, flexbus2(bankspec
, "", ('F', 30), "F", 1, limit
=8))
536 pinmerge(pinouts
, rgmii(bankspec
, "", ('G', 0), "G", 1))
538 print "# Pinouts (PinMux)"
540 print "auto-generated by [[pinouts.py]]"
547 print "# Pinouts (Fixed function)"
555 'CLK24M_IN', 'CLK24M_OUT',
556 'CLK32K_IN', 'CLK32K_OUT',
557 'PLLTEST', 'PLLREGIO', 'PLLVP25',
558 'PLLDV', 'PLLVREG', 'PLLGND',
562 ['VDD0_CPU', 'VDD1_CPU', 'VDD2_CPU', 'VDD3_CPU', 'VDD4_CPU', 'VDD5_CPU',
563 'GND0_CPU', 'GND1_CPU', 'GND2_CPU', 'GND3_CPU', 'GND4_CPU', 'GND5_CPU',
567 ['VDD0_DLL', 'VDD1_DLL', 'VDD2_DLL',
568 'GND0_DLL', 'GND1_DLL', 'GND2_DLL',
572 ['VDD0_INT', 'VDD1_INT', 'VDD2_INT', 'VDD3_INT', 'VDD4_INT',
573 'VDD5_INT', 'VDD6_INT', 'VDD7_INT', 'VDD8_INT', 'VDD9_INT',
574 'GND0_INT', 'GND1_INT', 'GND2_INT', 'GND3_INT', 'GND4_INT',
575 'GND5_INT', 'GND6_INT', 'GND7_INT', 'GND8_INT', 'GND9_INT',
579 ['VDD_GPIOA', 'VDD_GPIOB', 'VDD_GPIOC',
580 'VDD_GPIOD', 'VDD_GPIOE', 'VDD_GPIOF',
582 'GND_GPIOA', 'GND_GPIOB', 'GND_GPIOC',
583 'GND_GPIOD', 'GND_GPIOE', 'GND_GPIOF',
589 display_fixed(fixedpins
, len(pinouts
))
591 print "# Functions (PinMux)"
593 print "auto-generated by [[pinouts.py]]"
596 function_names
= {'EINT': 'External Interrupt',
597 'FB': 'MC68k FlexBus',
600 'JTAG1': 'JTAG (same as JTAG2, JTAG_SEL=LOW)',
601 'JTAG2': 'JTAG (same as JTAG1, JTAG_SEL=HIGH)',
602 'LCD': '24-pin RGB/TTL LCD',
603 'RG': 'RGMII Ethernet',
604 'MMC': 'eMMC 1/2/4/8 pin',
605 'PWM': 'PWM (pulse-width modulation)',
610 'SPI0': 'SPI (Serial Peripheral Interface) 0',
611 'SPI1': 'SPI (Serial Peripheral Interface) 1',
612 'SPI2': 'SPI (Serial Peripheral Interface) 2',
613 'SPI3': 'Quad SPI (Serial Peripheral Interface) 3',
618 'UART0': 'UART (TX/RX) 0',
619 'UART1': 'UART (TX/RX) 1',
620 'UART2': 'UART (TX/RX) 2',
621 'UART3': 'UART (TX/RX) 3',
622 'UART4': 'UART (TX/RX) 4',
623 'UART5': 'UART (TX/RX) 5',
624 'ULPI0': 'ULPI (USB Low Pin-count) 0',
625 'ULPI1': 'ULPI (USB Low Pin-count) 1',
626 'ULPI2': 'ULPI (USB Low Pin-count) 2',
627 'ULPI3': 'ULPI (USB Low Pin-count) 3',
630 fns
= display_fns(bankspec
, pinouts
, function_names
)
633 # Scenarios below can be spec'd out as either "find first interface"
634 # by name/number e.g. SPI1, or as "find in bank/mux" which must be
635 # spec'd as "BM:Name" where B is bank (A-F), M is Mux (0-3)
636 # EINT and PWM are grouped together, specially, but may still be spec'd
637 # using "BM:Name". Pins are removed in-order as listed from
638 # lists (interfaces, EINTs, PWMs) from available pins.
642 robotics
= ['FB', 'RG', 'ULPI0/8',
645 'D1:SPI0', 'E1:TWI0']
648 robotics_pwm
.append('PWM_%d' % i
)
649 robotics_eint
= ['EINT24', 'EINT25', 'EINT26', 'EINT27',
650 'EINT20', 'EINT21', 'EINT22', 'EINT23']
653 unused_pins
= check_functions("Robotics", bankspec
, fns
, pinouts
,
654 robotics
, robotics_eint
, robotics_pwm
)
656 print "# Reference Datasheets"
658 print "datasheets and pinout links"
660 print "* <http://datasheets.chipdb.org/AMD/8018x/80186/amd-80186.pdf>"
661 print "* <http://hands.com/~lkcl/eoma/shenzen/frida/FRD144A2701.pdf>"
662 print "* <http://pinouts.ru/Memory/sdcard_pinout.shtml>"
663 print "* p8 <http://www.onfi.org/~/media/onfi/specs/onfi_2_0_gold.pdf?la=en>"
664 print "* <https://www.heyrick.co.uk/blog/files/datasheets/dm9000aep.pdf>"
665 print "* <http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4393.pdf>"
666 print "* <https://www.nxp.com/docs/en/data-sheet/MCF54418.pdf>"
667 print "* ULPI OTG PHY, ST <http://www.st.com/en/interfaces-and-transceivers/stulpi01a.html>"
668 print "* ULPI OTG PHY, TI TUSB1210 <http://ti.com/product/TUSB1210/>"