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 self
.pingroup
= pingroup
44 self
.bankspec
= bankspec
46 self
.origsuffix
= origsuffix
or suffix
53 for name
in pingroup
[:limit
]:
55 name_
= "%s_%s" % (name
, suffix
)
58 if spec
and spec
.has_key(name
):
60 pin
= {mux
: (name_
, bank
)}
61 offs_bank
, offs_
= offs
64 idx_
+= bankspec
[bank
]
69 name_
= "%s_%s" % (name
, suffix
)
74 if not spec
.has_key(name
):
76 idx_
, mux_
, bank_
= spec
[name
]
78 #idx_ += bankspec[bank_]
79 pin
= {mux_
: (name_
, bank_
)}
88 def i2s(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
89 i2spins
= ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
91 i2spins
.append("IISDO%d" % i
)
92 return Pins('IIS', i2spins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
95 def emmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
96 emmcpins
= ['MMCCMD', 'MMCCLK']
98 emmcpins
.append("MMCD%d" % i
)
99 return Pins('MMC', emmcpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
102 def sdmmc(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None,
103 start
=None, limit
=None):
104 sdmmcpins
= ['CMD', 'CLK']
106 sdmmcpins
.append("D%d" % i
)
107 sdmmcpins
= sdmmcpins
[start
:limit
]
108 sdmmcpins
= namesuffix('SD', suffix
, sdmmcpins
)
109 return Pins('SD', sdmmcpins
, bankspec
, '', offs
, bank
, mux
, spec
,
112 def spi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
113 spipins
= namesuffix('SPI', suffix
,
114 ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS'])
115 return Pins('SPI', spipins
, bankspec
, '', offs
, bank
, mux
, spec
,
118 def quadspi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
119 spipins
= namesuffix('QSPI', suffix
,
120 ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3'])
121 return Pins('QSPI', spipins
, bankspec
, '', offs
, bank
, mux
, spec
, limit
,
124 def i2c(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
125 spipins
= namesuffix('TWI', suffix
,
127 return Pins('TWI', spipins
, bankspec
, '', offs
, bank
, mux
, spec
,
130 def jtag(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
131 uartpins
= namesuffix('JTAG', suffix
, ['MS', 'DI', 'DO', 'CK'])
132 return Pins('JTAG', uartpins
, bankspec
, '', offs
, bank
, mux
, spec
,
135 def uart(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
136 uartpins
= namesuffix('UART', suffix
, ['TX', 'RX'])
137 return Pins('UART', uartpins
, bankspec
, '', offs
, bank
, mux
, spec
,
140 def namesuffix(name
, suffix
, namelist
):
143 names
.append("%s%s_%s" % (name
, suffix
, n
))
146 def ulpi(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
147 ulpipins
= namesuffix('ULPI', suffix
, ['CK', 'DIR', 'STP', 'NXT'])
149 ulpipins
.append('ULPI%s_D%d' % (suffix
, i
))
150 return Pins('ULPI', ulpipins
, bankspec
, "", offs
, bank
, mux
, spec
,
153 def uartfull(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
154 uartpins
= namesuffix('UART', suffix
, ['TX', 'RX', 'CTS', 'RTS'])
155 return Pins('UART', uartpins
, bankspec
, '', offs
, bank
, mux
, spec
,
158 def rgbttl(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
159 ttlpins
= ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
161 ttlpins
.append("LCD%d" % i
)
162 return Pins('LCD', ttlpins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
165 def rgmii(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
168 buspins
.append("ERXD%d" % i
)
170 buspins
.append("ETXD%d" % i
)
171 buspins
+= ['ERXCK', 'ERXERR', 'ERXDV',
173 'ETXEN', 'ETXCK', 'ECRS',
175 buspins
= namesuffix('RG', suffix
, buspins
)
176 return Pins('RG', buspins
, bankspec
, '', offs
, bank
, mux
, spec
,
179 def flexbus1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
182 buspins
.append("AD%d" % i
)
184 buspins
.append("CS%d" % i
)
185 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK',
186 'A0', 'A1', 'TS', 'TBST',
189 buspins
.append("BWE%d" % i
)
191 buspins
.append("CS%d" % i
)
192 buspins
= namesuffix('FB', suffix
, buspins
)
193 return Pins('FB', buspins
, bankspec
, "", offs
, bank
, mux
, spec
, limit
,
196 def flexbus2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
198 for i
in range(8,32):
199 buspins
.append("AD%d" % i
)
200 buspins
= namesuffix('FB', suffix
, buspins
)
201 return Pins('FB', buspins
, bankspec
, '', offs
, bank
, mux
, spec
, limit
,
204 def sdram1(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
207 buspins
.append("SDRDQM%d" % i
)
209 buspins
.append("SDRAD%d" % i
)
211 buspins
.append("SDRDQ%d" % i
)
213 buspins
.append("SDRCS%d#" % i
)
215 buspins
.append("SDRDQ%d" % i
)
217 buspins
.append("SDRBA%d" % i
)
218 buspins
+= ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
220 return Pins('SDR', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
223 def sdram2(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
226 buspins
.append("SDRCS%d#" % i
)
227 for i
in range(8,32):
228 buspins
.append("SDRDQ%d" % i
)
229 return Pins('SDR', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
232 def mcu8080(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
235 buspins
.append("MCUD%d" % i
)
237 buspins
.append("MCUAD%d" % (i
+8))
239 buspins
.append("MCUCS%d" % i
)
241 buspins
.append("MCUNRB%d" % i
)
242 buspins
+= ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
244 return Pins('MCU', buspins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
247 def _pinbank(bankspec
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1,
250 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
251 gpiopins
.append("%s%s%d" % (prefix
, bank
, i
))
252 return Pins('GPIO', gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
255 def eint(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
257 for i
in range(gpiooffs
, gpiooffs
+gpionum
):
258 gpiopins
.append("EINT%d" % (i
))
259 return Pins('EINT', gpiopins
, bankspec
, suffix
, offs
, bank
, mux
, spec
,
262 def pwm(bankspec
, suffix
, offs
, bank
, mux
=1, spec
=None):
263 return Pins('PWM', ['PWM', ], bankspec
, suffix
, offs
, bank
, mux
, spec
,
266 def gpio(bankspec
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
267 return _pinbank(bankspec
, "GPIO", suffix
, offs
, bank
, gpiooffs
,
268 gpionum
, mux
=0, spec
=None)
271 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
272 print "| --- | ----------- | ----------- | ----------- | ----------- |"
276 pdata
= pins
.get(pin
)
277 res
= '| %3d |' % pin
279 if not pdata
.has_key(mux
):
282 name
, bank
= pdata
[mux
]
283 res
+= " %s %-9s |" % (bank
, name
)
289 if not f
.startswith('FB_'):
293 return f2
[0], int(f2
[1])
296 while f
and not f
[0].isdigit():
299 return a
, int(f
) if f
else None
309 def find_fn(fname
, names
):
311 if fname
.startswith(n
):
314 def display_fns(bankspec
, pins
, function_names
):
315 fn_names
= function_names
.keys()
317 for (pin
, pdata
) in pins
.items():
318 for mux
in range(1,4): # skip GPIO for now
319 if not pdata
.has_key(mux
):
321 name
, bank
= pdata
[mux
]
322 if not fns
.has_key(name
):
324 fns
[name
].append((pin
-bankspec
[bank
], mux
, bank
))
330 fnbase
= find_fn(fname
, fn_names
)
332 if fnbase
!= current_fn
:
333 if current_fn
is not None:
335 print "## %s" % fnbase
337 print function_names
[fnbase
]
340 print "* %-9s :" % fname
,
341 for (pin
, mux
, bank
) in fns
[fname
]:
342 print "%s%d/%d" % (bank
, pin
, mux
),
347 def check_functions(title
, bankspec
, fns
, pins
, required
, eint
, pwm
,
350 pins
= deepcopy(pins
)
351 if descriptions
is None:
354 print "# Pinmap for %s" % title
358 for name
in required
:
361 if descriptions
and descriptions
.has_key(name
):
362 print descriptions
[name
]
365 name
= name
.split(':')
367 findbank
= name
[0][0]
368 findmux
= int(name
[0][1:])
374 name
= name
.split('/')
385 if not fname
.startswith(name
):
387 for pin
, mux
, bank
in fns
[fname
]:
388 if findbank
is not None:
393 pin_
= pin
+ bankspec
[bank
]
394 if pins
.has_key(pin_
):
395 pinfound
[pin_
] = (fname
, pin_
, bank
, pin
, mux
)
397 pinidx
= pinfound
.keys()
401 fname
, pin_
, bank
, pin
, mux
= pinfound
[pin_
]
405 if len(found
) > count
:
408 print "* %s %d %s%d/%d" % (fname
, pin_
, bank
, pin
, mux
)
414 for name
in descriptions
.keys():
415 if not name
.startswith('GPIO'):
430 if descriptions
and descriptions
.has_key(fname
):
431 desc
= ': %s' % descriptions
[fname
]
434 pin_
= pin
+ bankspec
[bank
]
435 if not pins
.has_key(pin_
):
439 print "* %-8s %d %s%-2d %s" % (fname
, pin_
, bank
, pin
, desc
)
443 display_group(bankspec
, "EINT", eint
, fns
, pins
, descriptions
)
445 display_group(bankspec
, "PWM", pwm
, fns
, pins
, descriptions
)
447 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
449 if descriptions
and descriptions
.has_key('GPIO'):
450 print descriptions
['GPIO']
457 def display_group(bankspec
, title
, todisplay
, fns
, pins
, descriptions
):
458 print "## %s" % title
462 for fname
in todisplay
:
464 if descriptions
and descriptions
.has_key(fname
):
465 desc
= ': %s' % descriptions
[fname
]
466 fname
= fname
.split(':')
468 findbank
= fname
[0][0]
469 findmux
= int(fname
[0][1:])
475 for (pin
, mux
, bank
) in fns
[fname
]:
476 if findbank
is not None:
483 pin_
= pin
+ bankspec
[bank
]
484 if not pins
.has_key(pin_
):
488 print "* %s %d %s%d/%d %s" % (fname
, pin_
, bank
, pin
, mux
, desc
)
491 def pinmerge(pins
, fn
):
492 # hack, store the function specs in the pins dict
494 suffix
= fn
.origsuffix
497 if not hasattr(pins
, 'fnspec'):
501 assert not pins
.has_key('EINT')
502 if not pins
.fnspec
.has_key(fname
):
503 pins
.add_spec(fname
, {})
504 print "fname bank suffix", fname
, bank
, suffix
505 if suffix
or fname
== 'EINT' or fname
== 'PWM':
506 specname
= fname
+ suffix
508 specname
= fname
+ bank
509 pins
.fnspec
[fname
][specname
] = fn
513 for (pinidx
, v
) in fn
.pins
.items():
514 print "pinidx", pinidx
515 pins
.update(pinidx
, v
)
517 def display_fixed(fixed
, offs
):
522 for pin
, k
in enumerate(fkeys
):
527 for name
in fixed
[k
]:
531 if prevname
[:2] == name
[:2] and linecount
!= 0:
537 print "* %d: %d %s" % (pin_
, pin
, name
),