3 from copy
import deepcopy
11 return self
.pins
.has_key(k
)
13 def add_spec(self
, k
, v
):
16 def update(self
, pinidx
, v
):
17 if not self
.pins
.has_key(pinidx
):
20 self
.pins
[pinidx
].update(v
)
23 return self
.pins
.keys()
26 return self
.pins
.items()
34 def __delitem__(self
, k
):
40 def __init__(self
, fname
, pingroup
, bankspec
, suffix
, offs
, bank
, mux
,
41 spec
=None, limit
=None, origsuffix
=None):
43 # function type can be in, out or inout, represented by - + *
44 # strip function type out of each pin name
46 for i
in range(len(pingroup
)):
51 if fntype
not in '+-*':
54 fntype
= {'-': 'in', '+': 'out', '*': 'inout'}[fntype
]
55 self
.fntype
[pname
] = fntype
59 self
.pingroup
= pingroup
60 self
.bankspec
= bankspec
62 self
.origsuffix
= origsuffix
or suffix
66 # create consistent name suffixes
67 pingroup
= namesuffix(fname
, suffix
, pingroup
)
73 for name
in pingroup
[:limit
]:
75 name_
= "%s_%s" % (name
, suffix
)
78 if spec
and spec
.has_key(name
):
80 pin
= {mux
: (name_
, bank
)}
81 offs_bank
, offs_
= offs
84 idx_
+= bankspec
[bank
]
89 name_
= "%s_%s" % (name
, suffix
)
94 if not spec
.has_key(name
):
96 idx_
, mux_
, bank_
= spec
[name
]
98 pin
= {mux_
: (name_
, bank_
)}
100 res
[idx_
].update(pin
)
107 def i2s(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
108 i2spins
= ['MCK+', 'BCK+', 'LRCK+', 'DI-']
110 i2spins
.append("DO%d+" % i
)
111 return Pins('IIS', i2spins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
114 def emmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
115 emmcpins
= ['CMD+', 'CLK+']
117 emmcpins
.append("D%d*" % i
)
118 return Pins('MMC', emmcpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
121 def sdmmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None,
122 start
=None, limit
=None):
123 sdmmcpins
= ['CMD+', 'CLK+']
125 sdmmcpins
.append("D%d*" % i
)
126 sdmmcpins
= sdmmcpins
[start
:limit
]
127 return Pins('SD', sdmmcpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
130 def spi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
131 spipins
= ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
132 return Pins('SPI', spipins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
135 def quadspi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
136 spipins
= ['CK*', 'NSS*', 'IO0*', 'IO1*', 'IO2*', 'IO3*']
137 return Pins('QSPI', spipins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
140 def i2c(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
141 spipins
= ['SDA*', 'SCL*']
142 return Pins('TWI', spipins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
145 def jtag(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
146 jtagpins
= ['MS+', 'DI-', 'DO+', 'CK+']
147 return Pins('JTAG', jtagpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
150 def uart(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
151 uartpins
= ['TX+', 'RX-']
152 return Pins('UART', uartpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
155 def namesuffix(name
, suffix
, namelist
):
159 names
.append("%s%s_%s" % (name
, suffix
, n
))
161 names
.append("%s_%s" % (name
, suffix
))
164 def ulpi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
165 ulpipins
= ['CK+', 'DIR+', 'STP+', 'NXT+']
167 ulpipins
.append('D%d*' % i
)
168 return Pins('ULPI', ulpipins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
171 def uartfull(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
172 uartpins
= ['TX+', 'RX-', 'CTS-', 'RTS+']
173 return Pins('UARTQ', uartpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
176 def rgbttl(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
177 ttlpins
= ['CK+', 'DE+', 'HS+', 'VS+']
179 ttlpins
.append("D%d+" % i
)
180 return Pins('LCD', ttlpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
183 def rgmii(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
186 buspins
.append("ERXD%d-" % i
)
188 buspins
.append("ETXD%d+" % i
)
189 buspins
+= ['ERXCK-', 'ERXERR-', 'ERXDV-',
191 'ETXEN+', 'ETXCK+', 'ECRS-',
193 return Pins('RG', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
196 def flexbus1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
199 buspins
.append("AD%d*" % i
)
201 buspins
.append("CS%d+" % i
)
202 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK+',
203 'A0', 'A1', 'TS', 'TBST',
206 buspins
.append("BWE%d" % i
)
208 buspins
.append("CS%d+" % i
)
209 return Pins('FB', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
212 def flexbus2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
214 for i
in range(8,32):
215 buspins
.append("AD%d*" % i
)
216 return Pins('FB', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
219 def sdram1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
222 buspins
.append("SDRDQM%d*" % i
)
224 buspins
.append("SDRAD%d+" % i
)
226 buspins
.append("SDRDQ%d+" % i
)
228 buspins
.append("SDRCS%d#+" % i
)
230 buspins
.append("SDRDQ%d+" % i
)
232 buspins
.append("SDRBA%d+" % i
)
233 buspins
+= ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
235 return Pins('SDR', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
238 def sdram2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
241 buspins
.append("SDRCS%d#+" % i
)
242 for i
in range(8,32):
243 buspins
.append("SDRDQ%d*" % i
)
244 return Pins('SDR', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
247 def mcu8080(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
250 buspins
.append("MCUD%d*" % i
)
252 buspins
.append("MCUAD%d+" % (i
+8))
254 buspins
.append("MCUCS%d+" % i
)
256 buspins
.append("MCUNRB%d+" % i
)
257 buspins
+= ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
259 return Pins('MCU', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
262 def _pinbank(bankspec
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1,
265 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
266 gpiopins
.append("%s%d*" % (bank
, i
))
267 return Pins('GPIO', gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
270 def eint(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
272 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
273 gpiopins
.append("%d*" % (i
))
274 return Pins('EINT', gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
277 def pwm(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
278 return Pins('PWM', ['+', ], bankspec
, suffix
, offs
, bank
, mux
, spec
,
281 def gpio(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
282 return _pinbank(bankspec
, "GPIO", suffix
, offs
, bank
, gpiooffs
,
283 gpionum
, mux
=0, spec
=None)
286 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
287 print "| --- | ----------- | ----------- | ----------- | ----------- |"
291 pdata
= pins
.get(pin
)
292 res
= '| %3d |' % pin
294 if not pdata
.has_key(mux
):
297 name
, bank
= pdata
[mux
]
298 res
+= " %s %-9s |" % (bank
, name
)
304 if not f
.startswith('FB_'):
308 return f2
[0], int(f2
[1])
311 while f
and not f
[0].isdigit():
314 return a
, int(f
) if f
else None
324 def find_fn(fname
, names
):
326 if fname
.startswith(n
):
329 def display_fns(bankspec
, pins
, function_names
):
330 fn_names
= function_names
.keys()
332 for (pin
, pdata
) in pins
.items():
333 for mux
in range(1,4): # skip GPIO for now
334 if not pdata
.has_key(mux
):
336 name
, bank
= pdata
[mux
]
337 assert name
!= None, str(bank
)
338 if not fns
.has_key(name
):
340 fns
[name
].append((pin
-bankspec
[bank
], mux
, bank
))
346 fnbase
= find_fn(fname
, fn_names
)
347 #print "name", fname, fnbase
348 if fnbase
!= current_fn
:
349 if current_fn
is not None:
351 print "## %s" % fnbase
353 print function_names
[fnbase
]
356 print "* %-9s :" % fname
,
357 for (pin
, mux
, bank
) in fns
[fname
]:
358 print "%s%d/%d" % (bank
, pin
, mux
),
363 def check_functions(title
, bankspec
, fns
, pins
, required
, eint
, pwm
,
366 pins
= deepcopy(pins
)
367 if descriptions
is None:
370 print "# Pinmap for %s" % title
374 for name
in required
:
377 if descriptions
and descriptions
.has_key(name
):
378 print descriptions
[name
]
381 name
= name
.split(':')
383 findbank
= name
[0][0]
384 findmux
= int(name
[0][1:])
390 name
= name
.split('/')
401 if not fname
.startswith(name
):
403 for pin
, mux
, bank
in fns
[fname
]:
404 if findbank
is not None:
409 pin_
= pin
+ bankspec
[bank
]
410 if pins
.has_key(pin_
):
411 pinfound
[pin_
] = (fname
, pin_
, bank
, pin
, mux
)
413 pinidx
= pinfound
.keys()
417 fname
, pin_
, bank
, pin
, mux
= pinfound
[pin_
]
421 if len(found
) > count
:
424 print "* %s %d %s%d/%d" % (fname
, pin_
, bank
, pin
, mux
)
430 for name
in descriptions
.keys():
431 if not name
.startswith('GPIO'):
446 if descriptions
and descriptions
.has_key(fname
):
447 desc
= ': %s' % descriptions
[fname
]
450 pin_
= pin
+ bankspec
[bank
]
451 if not pins
.has_key(pin_
):
455 print "* %-8s %d %s%-2d %s" % (fname
, pin_
, bank
, pin
, desc
)
459 display_group(bankspec
, "EINT", eint
, fns
, pins
, descriptions
)
461 display_group(bankspec
, "PWM", pwm
, fns
, pins
, descriptions
)
463 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
465 if descriptions
and descriptions
.has_key('GPIO'):
466 print descriptions
['GPIO']
473 def display_group(bankspec
, title
, todisplay
, fns
, pins
, descriptions
):
474 print "## %s" % title
478 for fname
in todisplay
:
480 if descriptions
and descriptions
.has_key(fname
):
481 desc
= ': %s' % descriptions
[fname
]
482 fname
= fname
.split(':')
484 findbank
= fname
[0][0]
485 findmux
= int(fname
[0][1:])
491 for (pin
, mux
, bank
) in fns
[fname
]:
492 if findbank
is not None:
499 pin_
= pin
+ bankspec
[bank
]
500 if not pins
.has_key(pin_
):
504 print "* %s %d %s%d/%d %s" % (fname
, pin_
, bank
, pin
, mux
, desc
)
507 def pinmerge(pins
, fn
):
508 # hack, store the function specs in the pins dict
510 suffix
= fn
.origsuffix
513 if not hasattr(pins
, 'fnspec'):
517 assert not pins
.has_key('EINT')
518 if not pins
.fnspec
.has_key(fname
):
519 pins
.add_spec(fname
, {})
520 print "fname bank suffix", fname
, bank
, suffix
521 if suffix
or fname
== 'EINT' or fname
== 'PWM':
522 specname
= fname
+ suffix
524 specname
= fname
+ bank
525 pins
.fnspec
[fname
][specname
] = fn
529 for (pinidx
, v
) in fn
.pins
.items():
530 print "pinidx", pinidx
531 pins
.update(pinidx
, v
)
533 def display_fixed(fixed
, offs
):
538 for pin
, k
in enumerate(fkeys
):
543 for name
in fixed
[k
]:
547 if prevname
[:2] == name
[:2] and linecount
!= 0:
553 print "* %d: %d %s" % (pin_
, pin
, name
),