add sdram preliminary functions
[libreriscv.git] / shakti / i_class / pinouts.py
1 #!/usr/bin/env python
2
3 from copy import deepcopy
4
5 def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None):
6 res = {}
7 names = {}
8 idx = 0
9 for name in pingroup[:limit]:
10 if suffix:
11 name_ = "%s_%s" % (name, suffix)
12 else:
13 name_ = name
14 if spec and spec.has_key(name):
15 continue
16 pin = {mux: (name_, bank)}
17 offs_bank, offs_ = offs
18 idx_ = offs_ + idx
19 idx += 1
20 idx_ += bankspec[bank]
21 res[idx_] = pin
22 names[name] = idx_
23 for name in pingroup:
24 if suffix:
25 name_ = "%s_%s" % (name, suffix)
26 else:
27 name_ = name
28 if not spec:
29 continue
30 if not spec.has_key(name):
31 continue
32 idx_, mux_, bank_ = spec[name]
33 idx_ = names[idx_]
34 #idx_ += bankspec[bank_]
35 pin = {mux_: (name_, bank_)}
36 if res.has_key(idx_):
37 res[idx_].update(pin)
38 else:
39 res[idx_] = pin
40 return res
41
42 def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
43 i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
44 for i in range(4):
45 i2spins.append("IISDO%d" % i)
46 return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit)
47
48 def emmc(bankspec, suffix, offs, bank, mux=1, spec=None):
49 emmcpins = ['MMCCMD', 'MMCCLK']
50 for i in range(8):
51 emmcpins.append("MMCD%d" % i)
52 return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec)
53
54 def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None,
55 start=None, limit=None):
56 sdmmcpins = ['CMD', 'CLK']
57 for i in range(4):
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)
62
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)
67
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)
72
73 def i2c(bankspec, suffix, offs, bank, mux=1, spec=None):
74 spipins = namesuffix('TWI', suffix,
75 ['SDA', 'SCL'])
76 return pins(spipins, bankspec, '', offs, bank, mux, spec)
77
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)
81
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)
85
86 def namesuffix(name, suffix, namelist):
87 names = []
88 for n in namelist:
89 names.append("%s%s_%s" % (name, suffix, n))
90 return names
91
92 def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None):
93 ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT'])
94 for i in range(8):
95 ulpipins.append('ULPI%s_D%d' % (suffix, i))
96 return pins(ulpipins, bankspec, "", offs, bank, mux, spec)
97
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)
101
102 def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None):
103 ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
104 for i in range(24):
105 ttlpins.append("LCD%d" % i)
106 return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec)
107
108 def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None):
109 buspins = []
110 for i in range(4):
111 buspins.append("RG_ERXD%d" % i)
112 for i in range(4):
113 buspins.append("RG_ETXD%d" % i)
114 for i in range(2):
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)
121
122 def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
123 buspins = []
124 for i in range(8):
125 buspins.append("FB_AD%d" % i)
126 for i in range(2):
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']
131 for i in range(4):
132 buspins.append("FB_BWE%d" % i)
133 for i in range(2,6):
134 buspins.append("FB_CS%d" % i)
135 return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
136
137 def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
138 buspins = []
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)
142
143 def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None):
144 buspins = []
145 for i in range(16):
146 buspins.append("SDRDQM%d" % i)
147 for i in range(12):
148 buspins.append("SDRAD%d" % i)
149 for i in range(8):
150 buspins.append("SDRDQ%d" % i)
151 for i in range(3):
152 buspins.append("SDRCS%d#" % i)
153 for i in range(2):
154 buspins.append("SDRDQ%d" % i)
155 for i in range(2):
156 buspins.append("SDRBA%d" % i)
157 buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
158 'SDRRST']
159 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
160
161 def sdram2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
162 buspins = []
163 for i in range(3,6):
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)
168
169 def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
170 buspins = []
171 for i in range(8):
172 buspins.append("MCUD%d" % i)
173 for i in range(8):
174 buspins.append("MCUAD%d" % (i+8))
175 for i in range(6):
176 buspins.append("MCUCS%d" % i)
177 for i in range(2):
178 buspins.append("MCUNRB%d" % i)
179 buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
180 'MCURST']
181 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
182
183 def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
184 gpiopins = []
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)
188
189 def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
190 gpiopins = []
191 for i in range(gpiooffs, gpiooffs+gpionum):
192 gpiopins.append("EINT%d" % (i))
193 return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
194
195 def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
196 return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec)
197
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)
201
202 def display(pins):
203 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
204 print "| --- | ----------- | ----------- | ----------- | ----------- |"
205 pinidx = pins.keys()
206 pinidx.sort()
207 for pin in pinidx:
208 pdata = pins[pin]
209 res = '| %3d |' % pin
210 for mux in range(4):
211 if not pdata.has_key(mux):
212 res += " |"
213 continue
214 name, bank = pdata[mux]
215 res += " %s %-9s |" % (bank, name)
216 print res
217
218 def fnsplit(f):
219 a = ''
220 n = 0
221 if not f.startswith('FB_'):
222 f2 = f.split('_')
223 if len(f2) == 2:
224 if f2[1].isdigit():
225 return f2[0], int(f2[1])
226 return f2[0], f2[1]
227 #print f
228 while f and not f[0].isdigit():
229 a += f[0]
230 f = f[1:]
231 return a, int(f) if f else None
232
233 def fnsort(f1, f2):
234 a1, n1 = fnsplit(f1)
235 a2, n2 = fnsplit(f2)
236 x = cmp(a1, a2)
237 if x != 0:
238 return x
239 return cmp(n1, n2)
240
241 def find_fn(fname, names):
242 for n in names:
243 if fname.startswith(n):
244 return n
245
246 def display_fns(bankspec, pins, function_names):
247 fn_names = function_names.keys()
248 fns = {}
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):
252 continue
253 name, bank = pdata[mux]
254 if not fns.has_key(name):
255 fns[name] = []
256 fns[name].append((pin-bankspec[bank], mux, bank))
257
258 fnidx = fns.keys()
259 fnidx.sort(fnsort)
260 current_fn = None
261 for fname in fnidx:
262 fnbase = find_fn(fname, fn_names)
263 #print "name", fname
264 if fnbase != current_fn:
265 if current_fn is not None:
266 print
267 print "## %s" % fnbase
268 print
269 print function_names[fnbase]
270 print
271 current_fn = fnbase
272 print "* %-9s :" % fname,
273 for (pin, mux, bank) in fns[fname]:
274 print "%s%d/%d" % (bank, pin, mux),
275 print
276
277 return fns
278
279 def check_functions(title, bankspec, fns, pins, required, eint, pwm,
280 descriptions=None):
281 fns = deepcopy(fns)
282 pins = deepcopy(pins)
283 if descriptions is None:
284 descriptions = {}
285
286 print "# Pinmap for %s" % title
287 print
288
289
290 for name in required:
291 print "## %s" % name
292 print
293 if descriptions and descriptions.has_key(name):
294 print descriptions[name]
295 print
296
297 name = name.split(':')
298 if len(name) == 2:
299 findbank = name[0][0]
300 findmux = int(name[0][1:])
301 name = name[1]
302 else:
303 name = name[0]
304 findbank = None
305 findmux = None
306 name = name.split('/')
307 if len(name) == 2:
308 count = int(name[1])
309 else:
310 count = 100000
311 name = name[0]
312 found = set()
313 fnidx = fns.keys()
314 #fnidx.sort(fnsort)
315 pinfound = {}
316 for fname in fnidx:
317 if not fname.startswith(name):
318 continue
319 for pin, mux, bank in fns[fname]:
320 if findbank is not None:
321 if findbank != bank:
322 continue
323 if findmux != mux:
324 continue
325 pin_ = pin + bankspec[bank]
326 if pins.has_key(pin_):
327 pinfound[pin_] = (fname, pin_, bank, pin, mux)
328
329 pinidx = pinfound.keys()
330 pinidx.sort()
331
332 for pin_ in pinidx:
333 fname, pin_, bank, pin, mux = pinfound[pin_]
334 if fname in found:
335 continue
336 found.add(fname)
337 if len(found) > count:
338 continue
339 del pins[pin_]
340 print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux)
341
342 print
343
344 # gpios
345 gpios = []
346 for name in descriptions.keys():
347 if not name.startswith('GPIO'):
348 continue
349 if name == 'GPIO':
350 continue
351 gpios.append(name)
352 gpios.sort()
353
354 if gpios:
355 print "## GPIO"
356 print
357
358 for fname in gpios:
359 if fname in found:
360 continue
361 desc = ''
362 if descriptions and descriptions.has_key(fname):
363 desc = ': %s' % descriptions[fname]
364 bank = fname[4]
365 pin = int(fname[5:])
366 pin_ = pin + bankspec[bank]
367 if not pins.has_key(pin_):
368 continue
369 del pins[pin_]
370 found.add(fname)
371 print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc)
372 print
373
374 if eint:
375 display_group("EINT", eint, fns, pins, descriptions)
376 if pwm:
377 display_group("PWM", pwm, fns, pins, descriptions)
378
379 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
380 print
381 if descriptions and descriptions.has_key('GPIO'):
382 print descriptions['GPIO']
383 print
384 display(pins)
385 print
386
387 return pins # unused
388
389 def display_group(title, todisplay, fns, pins, descriptions):
390 print "## %s" % title
391 print
392
393 found = set()
394 for fname in todisplay:
395 desc = ''
396 if descriptions and descriptions.has_key(fname):
397 desc = ': %s' % descriptions[fname]
398 fname = fname.split(':')
399 if len(fname) == 2:
400 findbank = fname[0][0]
401 findmux = int(fname[0][1:])
402 fname = fname[1]
403 else:
404 fname = fname[0]
405 findbank = None
406 findmux = None
407 for (pin, mux, bank) in fns[fname]:
408 if findbank is not None:
409 if findbank != bank:
410 continue
411 if findmux != mux:
412 continue
413 if fname in found:
414 continue
415 pin_ = pin + bankspec[bank]
416 if not pins.has_key(pin_):
417 continue
418 del pins[pin_]
419 found.add(fname)
420 print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc)
421 print
422
423 def pinmerge(pins, fn):
424 for (pinidx, v) in fn.items():
425 if not pins.has_key(pinidx):
426 pins[pinidx] = v
427 continue
428 pins[pinidx].update(v)
429
430 def display_fixed(fixed, offs):
431
432 fkeys = fixed.keys()
433 fkeys.sort()
434 pin_ = offs
435 for pin, k in enumerate(fkeys):
436 print "## %s" % k
437 print
438 prevname = ''
439 linecount = 0
440 for name in fixed[k]:
441 if linecount == 4:
442 linecount = 0
443 print
444 if prevname[:2] == name[:2] and linecount != 0:
445 print name,
446 linecount += 1
447 else:
448 if linecount != 0:
449 print
450 print "* %d: %d %s" % (pin_, pin, name),
451 linecount = 1
452 prevname = name
453 pin_ += 1
454 if linecount != 0:
455 print
456 print
457
458 if __name__ == '__main__':
459 pinouts = {}
460
461 pinbanks = {'A': 16,
462 'B': 16,
463 'C': 16,
464 'D': 16,
465 'E': 16,
466 'F': 48,
467 'G': 24,
468 }
469 bankspec = {}
470 pkeys = pinbanks.keys()
471 pkeys.sort()
472 offs = 0
473 for kn in pkeys:
474 bankspec[kn] = offs
475 offs += pinbanks[kn]
476
477 # Bank A, 0-15
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))
485 for i in range(16):
486 pinmerge(pinouts, pwm(bankspec, str(i), ('A', i), "A", mux=2))
487
488 # Bank B, 16-31
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))
497 for i in range(16):
498 pinmerge(pinouts, pwm(bankspec, str(i+16), ('B', i), "B", mux=2))
499
500 # Bank C, 32-47
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))
508
509 # Bank D, 48-63
510 pinmerge(pinouts, ulpi(bankspec, "0", ('D', 0), "D", 1))
511 pinmerge(pinouts, spi(bankspec, "0", ('D', 12), "D", 1))
512
513 # Bank E, 64-80
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))
519
520 # Bank F, 80-127
521 flexspec = {
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"),
530 }
531 pinmerge(pinouts, flexbus1(bankspec, "", ('F', 0), "F", 1))
532 pinmerge(pinouts, flexbus2(bankspec, "", ('F', 30), "F", 1, limit=8))
533
534 # Bank G, 128-151
535
536 pinmerge(pinouts, rgmii(bankspec, "", ('G', 0), "G", 1))
537
538 print "# Pinouts (PinMux)"
539 print
540 print "auto-generated by [[pinouts.py]]"
541 print
542 print "[[!toc ]]"
543 print
544 display(pinouts)
545 print
546
547 print "# Pinouts (Fixed function)"
548 print
549
550 fixedpins = {
551 'CTRL_SYS':
552 [
553 'TEST', 'BOOT_SEL',
554 'NMI#', 'RESET#',
555 'CLK24M_IN', 'CLK24M_OUT',
556 'CLK32K_IN', 'CLK32K_OUT',
557 'PLLTEST', 'PLLREGIO', 'PLLVP25',
558 'PLLDV', 'PLLVREG', 'PLLGND',
559 ],
560
561 'POWER_CPU':
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',
564 ],
565
566 'POWER_DLL':
567 ['VDD0_DLL', 'VDD1_DLL', 'VDD2_DLL',
568 'GND0_DLL', 'GND1_DLL', 'GND2_DLL',
569 ],
570
571 'POWER_INT':
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',
576 ],
577
578 'POWER_GPIO':
579 ['VDD_GPIOA', 'VDD_GPIOB', 'VDD_GPIOC',
580 'VDD_GPIOD', 'VDD_GPIOE', 'VDD_GPIOF',
581 'VDD_GPIOG',
582 'GND_GPIOA', 'GND_GPIOB', 'GND_GPIOC',
583 'GND_GPIOD', 'GND_GPIOE', 'GND_GPIOF',
584 'GND_GPIOG',
585 ]
586
587 }
588
589 display_fixed(fixedpins, len(pinouts))
590
591 print "# Functions (PinMux)"
592 print
593 print "auto-generated by [[pinouts.py]]"
594 print
595
596 function_names = {'EINT': 'External Interrupt',
597 'FB': 'MC68k FlexBus',
598 'IIS': 'I2S Audio',
599 'JTAG0': 'JTAG',
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)',
606 'SD0': 'SD/MMC 0',
607 'SD1': 'SD/MMC 1',
608 'SD2': 'SD/MMC 2',
609 'SD3': 'SD/MMC 3',
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',
614 'TWI0': 'I2C 0',
615 'TWI1': 'I2C 1',
616 'TWI2': 'I2C 2',
617 'TWI3': 'I2C 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',
628 }
629
630 fns = display_fns(bankspec, pinouts, function_names)
631 print
632
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.
639
640 # Robotics scenario.
641
642 robotics = ['FB', 'RG', 'ULPI0/8',
643 'SD0',
644 'JTAG0', 'E1:UART0',
645 'D1:SPI0', 'E1:TWI0']
646 robotics_pwm = []
647 for i in range(32):
648 robotics_pwm.append('PWM_%d' % i)
649 robotics_eint = ['EINT24', 'EINT25', 'EINT26', 'EINT27',
650 'EINT20', 'EINT21', 'EINT22', 'EINT23']
651 robotics_eint = []
652
653 unused_pins = check_functions("Robotics", bankspec, fns, pinouts,
654 robotics, robotics_eint, robotics_pwm)
655
656 print "# Reference Datasheets"
657 print
658 print "datasheets and pinout links"
659 print
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/>"
669