a1ad0225f90c606d5bc4a916e14e46f1bcb61c72
[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 mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
144 buspins = []
145 for i in range(8):
146 buspins.append("MCUD%d" % i)
147 for i in range(8):
148 buspins.append("MCUAD%d" % (i+8))
149 for i in range(6):
150 buspins.append("MCUCS%d" % i)
151 for i in range(2):
152 buspins.append("MCUNRB%d" % i)
153 buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
154 'MCURST']
155 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
156
157 def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
158 gpiopins = []
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)
162
163 def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
164 gpiopins = []
165 for i in range(gpiooffs, gpiooffs+gpionum):
166 gpiopins.append("EINT%d" % (i))
167 return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
168
169 def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
170 return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec)
171
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)
175
176 def display(pins):
177 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
178 print "| --- | ----------- | ----------- | ----------- | ----------- |"
179 pinidx = pins.keys()
180 pinidx.sort()
181 for pin in pinidx:
182 pdata = pins[pin]
183 res = '| %3d |' % pin
184 for mux in range(4):
185 if not pdata.has_key(mux):
186 res += " |"
187 continue
188 name, bank = pdata[mux]
189 res += " %s %-9s |" % (bank, name)
190 print res
191
192 def fnsplit(f):
193 a = ''
194 n = 0
195 if not f.startswith('FB_'):
196 f2 = f.split('_')
197 if len(f2) == 2:
198 if f2[1].isdigit():
199 return f2[0], int(f2[1])
200 return f2[0], f2[1]
201 #print f
202 while f and not f[0].isdigit():
203 a += f[0]
204 f = f[1:]
205 return a, int(f) if f else None
206
207 def fnsort(f1, f2):
208 a1, n1 = fnsplit(f1)
209 a2, n2 = fnsplit(f2)
210 x = cmp(a1, a2)
211 if x != 0:
212 return x
213 return cmp(n1, n2)
214
215 def find_fn(fname, names):
216 for n in names:
217 if fname.startswith(n):
218 return n
219
220 def display_fns(bankspec, pins, function_names):
221 fn_names = function_names.keys()
222 fns = {}
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):
226 continue
227 name, bank = pdata[mux]
228 if not fns.has_key(name):
229 fns[name] = []
230 fns[name].append((pin-bankspec[bank], mux, bank))
231
232 fnidx = fns.keys()
233 fnidx.sort(fnsort)
234 current_fn = None
235 for fname in fnidx:
236 fnbase = find_fn(fname, fn_names)
237 #print "name", fname
238 if fnbase != current_fn:
239 if current_fn is not None:
240 print
241 print "## %s" % fnbase
242 print
243 print function_names[fnbase]
244 print
245 current_fn = fnbase
246 print "* %-9s :" % fname,
247 for (pin, mux, bank) in fns[fname]:
248 print "%s%d/%d" % (bank, pin, mux),
249 print
250
251 return fns
252
253 def check_functions(title, bankspec, fns, pins, required, eint, pwm,
254 descriptions=None):
255 fns = deepcopy(fns)
256 pins = deepcopy(pins)
257 if descriptions is None:
258 descriptions = {}
259
260 print "# Pinmap for %s" % title
261 print
262
263
264 for name in required:
265 print "## %s" % name
266 print
267 if descriptions and descriptions.has_key(name):
268 print descriptions[name]
269 print
270
271 name = name.split(':')
272 if len(name) == 2:
273 findbank = name[0][0]
274 findmux = int(name[0][1:])
275 name = name[1]
276 else:
277 name = name[0]
278 findbank = None
279 findmux = None
280 name = name.split('/')
281 if len(name) == 2:
282 count = int(name[1])
283 else:
284 count = 100000
285 name = name[0]
286 found = set()
287 fnidx = fns.keys()
288 #fnidx.sort(fnsort)
289 pinfound = {}
290 for fname in fnidx:
291 if not fname.startswith(name):
292 continue
293 for pin, mux, bank in fns[fname]:
294 if findbank is not None:
295 if findbank != bank:
296 continue
297 if findmux != mux:
298 continue
299 pin_ = pin + bankspec[bank]
300 if pins.has_key(pin_):
301 pinfound[pin_] = (fname, pin_, bank, pin, mux)
302
303 pinidx = pinfound.keys()
304 pinidx.sort()
305
306 for pin_ in pinidx:
307 fname, pin_, bank, pin, mux = pinfound[pin_]
308 if fname in found:
309 continue
310 found.add(fname)
311 if len(found) > count:
312 continue
313 del pins[pin_]
314 print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux)
315
316 print
317
318 # gpios
319 gpios = []
320 for name in descriptions.keys():
321 if not name.startswith('GPIO'):
322 continue
323 if name == 'GPIO':
324 continue
325 gpios.append(name)
326 gpios.sort()
327
328 if gpios:
329 print "## GPIO"
330 print
331
332 for fname in gpios:
333 if fname in found:
334 continue
335 desc = ''
336 if descriptions and descriptions.has_key(fname):
337 desc = ': %s' % descriptions[fname]
338 bank = fname[4]
339 pin = int(fname[5:])
340 pin_ = pin + bankspec[bank]
341 if not pins.has_key(pin_):
342 continue
343 del pins[pin_]
344 found.add(fname)
345 print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc)
346 print
347
348 if eint:
349 display_group("EINT", eint, fns, pins, descriptions)
350 if pwm:
351 display_group("PWM", pwm, fns, pins, descriptions)
352
353 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
354 print
355 if descriptions and descriptions.has_key('GPIO'):
356 print descriptions['GPIO']
357 print
358 display(pins)
359 print
360
361 return pins # unused
362
363 def display_group(title, todisplay, fns, pins, descriptions):
364 print "## %s" % title
365 print
366
367 found = set()
368 for fname in todisplay:
369 desc = ''
370 if descriptions and descriptions.has_key(fname):
371 desc = ': %s' % descriptions[fname]
372 fname = fname.split(':')
373 if len(fname) == 2:
374 findbank = fname[0][0]
375 findmux = int(fname[0][1:])
376 fname = fname[1]
377 else:
378 fname = fname[0]
379 findbank = None
380 findmux = None
381 for (pin, mux, bank) in fns[fname]:
382 if findbank is not None:
383 if findbank != bank:
384 continue
385 if findmux != mux:
386 continue
387 if fname in found:
388 continue
389 pin_ = pin + bankspec[bank]
390 if not pins.has_key(pin_):
391 continue
392 del pins[pin_]
393 found.add(fname)
394 print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc)
395 print
396
397 def pinmerge(pins, fn):
398 for (pinidx, v) in fn.items():
399 if not pins.has_key(pinidx):
400 pins[pinidx] = v
401 continue
402 pins[pinidx].update(v)
403
404 def display_fixed(fixed, offs):
405
406 fkeys = fixed.keys()
407 fkeys.sort()
408 pin_ = offs
409 for pin, k in enumerate(fkeys):
410 print "## %s" % k
411 print
412 prevname = ''
413 linecount = 0
414 for name in fixed[k]:
415 if linecount == 4:
416 linecount = 0
417 print
418 if prevname[:2] == name[:2] and linecount != 0:
419 print name,
420 linecount += 1
421 else:
422 if linecount != 0:
423 print
424 print "* %d: %d %s" % (pin_, pin, name),
425 linecount = 1
426 prevname = name
427 pin_ += 1
428 if linecount != 0:
429 print
430 print
431
432 if __name__ == '__main__':
433 pinouts = {}
434
435 pinbanks = {'A': 16,
436 'B': 16,
437 'C': 16,
438 'D': 16,
439 'E': 16,
440 'F': 48,
441 }
442 bankspec = {}
443 pkeys = pinbanks.keys()
444 pkeys.sort()
445 offs = 0
446 for kn in pkeys:
447 bankspec[kn] = offs
448 offs += pinbanks[kn]
449
450 # Bank A, 0-15
451 pinmerge(pinouts, gpio(bankspec, "", ('A', 0), "A", 0, 16, 0))
452 pinmerge(pinouts, spi(bankspec, "0", ('A', 0), "A", 1))
453 pinmerge(pinouts, spi(bankspec, "1", ('A', 4), "A", 1))
454 pinmerge(pinouts, uart(bankspec, "0", ('A', 8), "A", 1))
455 pinmerge(pinouts, uart(bankspec, "1", ('A', 10), "A", 1))
456 pinmerge(pinouts, i2c(bankspec, "0", ('A', 12), "A", 1))
457 pinmerge(pinouts, i2c(bankspec, "1", ('A', 14), "A", 1))
458 for i in range(16):
459 pinmerge(pinouts, pwm(bankspec, str(i), ('A', i), "A", mux=2))
460
461 # Bank B, 16-31
462 pinmerge(pinouts, gpio(bankspec, "", ('B', 0), "B", 0, 16, 0))
463 pinmerge(pinouts, spi(bankspec, "2", ('B', 0), "B", 1))
464 pinmerge(pinouts, uart(bankspec, "2", ('B', 4), "B", 1))
465 pinmerge(pinouts, uart(bankspec, "3", ('B', 6), "B", 1))
466 pinmerge(pinouts, uart(bankspec, "4", ('B', 8), "B", 1))
467 pinmerge(pinouts, i2c(bankspec, "2", ('B', 10), "B", 1))
468 pinmerge(pinouts, i2c(bankspec, "3", ('B', 12), "B", 1))
469 pinmerge(pinouts, uart(bankspec, "5", ('B', 14), "B", 1))
470 for i in range(16):
471 pinmerge(pinouts, pwm(bankspec, str(i+16), ('B', i), "B", mux=2))
472
473 # Bank C, 32-47
474 pinmerge(pinouts, gpio(bankspec, "", ('C', 0), "C", 0, 16, 0))
475 pinmerge(pinouts, spi(bankspec, "1", ('C', 0), "C", 1))
476 pinmerge(pinouts, spi(bankspec, "2", ('C', 4), "C", 1))
477 pinmerge(pinouts, uart(bankspec, "2", ('C', 8), "C", 1))
478 pinmerge(pinouts, uart(bankspec, "3", ('C', 10), "C", 1))
479 pinmerge(pinouts, i2c(bankspec, "1", ('C', 12), "C", 1))
480 pinmerge(pinouts, i2c(bankspec, "3", ('C', 14), "C", 1))
481
482 # Bank C, 48-63
483 pinmerge(pinouts, ulpi(bankspec, "0", ('D', 0), "D", 1))
484 pinmerge(pinouts, spi(bankspec, "0", ('D', 12), "D", 1))
485
486 # Bank D, 64-80
487 pinmerge(pinouts, sdmmc(bankspec, "0", ('E', 0), "E", 1))
488 pinmerge(pinouts, jtag(bankspec, "0", ('E', 6), "E", 1))
489 pinmerge(pinouts, uart(bankspec, "0", ('E', 10), "E", 1))
490 pinmerge(pinouts, i2c(bankspec, "0", ('E', 12), "E", 1))
491 pinmerge(pinouts, uart(bankspec, "1", ('E', 14), "E", 1))
492
493 # Bank F, 80-127
494 flexspec = {
495 'FB_TS': ('FB_ALE', 2, "F"),
496 'FB_CS2': ('FB_BWE2', 2, "F"),
497 'FB_A0': ('FB_BWE2', 3, "F"),
498 'FB_CS3': ('FB_BWE3', 2, "F"),
499 'FB_A1': ('FB_BWE3', 3, "F"),
500 'FB_TBST': ('FB_OE', 2, "F"),
501 'FB_TSIZ0': ('FB_BWE0', 2, "F"),
502 'FB_TSIZ1': ('FB_BWE1', 2, "F"),
503 }
504 pinmerge(pinouts, flexbus1(bankspec, "", ('F', 0), "F", 1))
505 pinmerge(pinouts, flexbus2(bankspec, "", ('F', 30), "F", 1, limit=8))
506
507 print "# Pinouts (PinMux)"
508 print
509 print "auto-generated by [[pinouts.py]]"
510 print
511 print "[[!toc ]]"
512 print
513 display(pinouts)
514 print
515
516 print "# Pinouts (Fixed function)"
517 print
518
519 fixedpins = {
520 'CTRL_SYS':
521 [
522 'TEST', 'BOOT_SEL',
523 'NMI#', 'RESET#',
524 'CLK24M_IN', 'CLK24M_OUT',
525 'CLK32K_IN', 'CLK32K_OUT',
526 'PLLTEST', 'PLLREGIO', 'PLLVP25',
527 'PLLDV', 'PLLVREG', 'PLLGND',
528 ],
529
530 'POWER_CPU':
531 ['VDD0_CPU', 'VDD1_CPU', 'VDD2_CPU', 'VDD3_CPU', 'VDD4_CPU', 'VDD5_CPU',
532 'GND0_CPU', 'GND1_CPU', 'GND2_CPU', 'GND3_CPU', 'GND4_CPU', 'GND5_CPU',
533 ],
534
535 'POWER_DLL':
536 ['VDD0_DLL', 'VDD1_DLL', 'VDD2_DLL',
537 'GND0_DLL', 'GND1_DLL', 'GND2_DLL',
538 ],
539
540 'POWER_INT':
541 ['VDD0_INT', 'VDD1_INT', 'VDD2_INT', 'VDD3_INT', 'VDD4_INT',
542 'VDD5_INT', 'VDD6_INT', 'VDD7_INT', 'VDD8_INT', 'VDD9_INT',
543 'GND0_INT', 'GND1_INT', 'GND2_INT', 'GND3_INT', 'GND4_INT',
544 'GND5_INT', 'GND6_INT', 'GND7_INT', 'GND8_INT', 'GND9_INT',
545 ],
546
547 'POWER_GPIO':
548 ['VDD_GPIOA', 'VDD_GPIOB', 'VDD_GPIOC',
549 'VDD_GPIOD', 'VDD_GPIOE', 'VDD_GPIOD',
550 'GND_GPIOA', 'GND_GPIOB', 'GND_GPIOC',
551 'GND_GPIOD', 'GND_GPIOE', 'GND_GPIOF',
552 ]
553
554 }
555
556 display_fixed(fixedpins, len(pinouts))
557
558 print "# Functions (PinMux)"
559 print
560 print "auto-generated by [[pinouts.py]]"
561 print
562
563 function_names = {'EINT': 'External Interrupt',
564 'FB': 'MC68k FlexBus',
565 'IIS': 'I2S Audio',
566 'JTAG0': 'JTAG',
567 'JTAG1': 'JTAG (same as JTAG2, JTAG_SEL=LOW)',
568 'JTAG2': 'JTAG (same as JTAG1, JTAG_SEL=HIGH)',
569 'LCD': '24-pin RGB/TTL LCD',
570 'RG': 'RGMII Ethernet',
571 'MMC': 'eMMC 1/2/4/8 pin',
572 'PWM': 'PWM (pulse-width modulation)',
573 'SD0': 'SD/MMC 0',
574 'SD1': 'SD/MMC 1',
575 'SD2': 'SD/MMC 2',
576 'SD3': 'SD/MMC 3',
577 'SPI0': 'SPI (Serial Peripheral Interface) 0',
578 'SPI1': 'SPI (Serial Peripheral Interface) 1',
579 'SPI2': 'SPI (Serial Peripheral Interface) 2',
580 'SPI3': 'Quad SPI (Serial Peripheral Interface) 3',
581 'TWI0': 'I2C 0',
582 'TWI1': 'I2C 1',
583 'TWI2': 'I2C 2',
584 'TWI3': 'I2C 3',
585 'UART0': 'UART (TX/RX) 0',
586 'UART1': 'UART (TX/RX) 1',
587 'UART2': 'UART (TX/RX) 2',
588 'UART3': 'UART (TX/RX) 3',
589 'UART4': 'UART (TX/RX) 4',
590 'UART5': 'UART (TX/RX) 5',
591 'ULPI0': 'ULPI (USB Low Pin-count) 0',
592 'ULPI1': 'ULPI (USB Low Pin-count) 1',
593 'ULPI2': 'ULPI (USB Low Pin-count) 2',
594 'ULPI3': 'ULPI (USB Low Pin-count) 3',
595 }
596
597 fns = display_fns(bankspec, pinouts, function_names)
598 print
599
600 # Scenarios below can be spec'd out as either "find first interface"
601 # by name/number e.g. SPI1, or as "find in bank/mux" which must be
602 # spec'd as "BM:Name" where B is bank (A-F), M is Mux (0-3)
603 # EINT and PWM are grouped together, specially, but may still be spec'd
604 # using "BM:Name". Pins are removed in-order as listed from
605 # lists (interfaces, EINTs, PWMs) from available pins.
606
607 # Robotics scenario.
608
609 robotics = ['FB', 'ULPI0/8',
610 'SD0',
611 'JTAG0', 'E1:UART0',
612 'D1:SPI0', 'E1:TWI0']
613 robotics_pwm = []
614 for i in range(32):
615 robotics_pwm.append('PWM_%d' % i)
616 robotics_eint = ['EINT24', 'EINT25', 'EINT26', 'EINT27',
617 'EINT20', 'EINT21', 'EINT22', 'EINT23']
618 robotics_eint = []
619
620 unused_pins = check_functions("Robotics", bankspec, fns, pinouts,
621 robotics, robotics_eint, robotics_pwm)
622
623 print "# Reference Datasheets"
624 print
625 print "datasheets and pinout links"
626 print
627 print "* <http://datasheets.chipdb.org/AMD/8018x/80186/amd-80186.pdf>"
628 print "* <http://hands.com/~lkcl/eoma/shenzen/frida/FRD144A2701.pdf>"
629 print "* <http://pinouts.ru/Memory/sdcard_pinout.shtml>"
630 print "* p8 <http://www.onfi.org/~/media/onfi/specs/onfi_2_0_gold.pdf?la=en>"
631 print "* <https://www.heyrick.co.uk/blog/files/datasheets/dm9000aep.pdf>"
632 print "* <http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4393.pdf>"
633 print "* <https://www.nxp.com/docs/en/data-sheet/MCF54418.pdf>"
634 print "* ULPI OTG PHY, ST <http://www.st.com/en/interfaces-and-transceivers/stulpi01a.html>"
635 print "* ULPI OTG PHY, TI TUSB1210 <http://ti.com/product/TUSB1210/>"
636