3 from copy
import deepcopy
5 def namesuffix(name
, suffix
, namelist
):
9 names
.append("%s%s_%s" % (name
, suffix
, n
))
11 names
.append("%s_%s" % (name
, suffix
))
15 class Pinouts(object):
16 def __init__(self
, bankspec
):
17 self
.bankspec
= bankspec
21 def __contains__(self
, k
):
27 def add_spec(self
, k
, v
):
30 def update(self
, pinidx
, v
):
31 if pinidx
not in self
.pins
:
34 self
.pins
[pinidx
].update(v
)
37 return self
.pins
.keys()
40 return self
.pins
.items()
48 def __delitem__(self
, k
):
51 def __getitem__(self
, k
):
55 def i2s(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
56 i2spins
= ['MCK+', 'BCK+', 'LRCK+', 'DI-', 'DO+']
58 # i2spins.append("DO%d+" % i)
59 pins
= Pins('IIS', i2spins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
64 def emmc(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
65 emmcpins
= ['CMD+', 'CLK+']
67 emmcpins
.append("D%d*" % i
)
68 pins
= Pins('MMC', emmcpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
73 def sdmmc(self
, suffix
, offs
, bank
, mux
=1, spec
=None,
74 start
=None, limit
=None):
75 sdmmcpins
= ['CMD+', 'CLK+']
77 sdmmcpins
.append("D%d*" % i
)
78 sdmmcpins
= sdmmcpins
[start
:limit
]
79 pins
= Pins('SD', sdmmcpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
84 def spi(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
85 spipins
= ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
86 pins
= Pins('SPI', spipins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
91 def quadspi(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
92 spipins
= ['CK*', 'NSS*', 'IO0*', 'IO1*', 'IO2*', 'IO3*']
107 def i2c(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
108 spipins
= ['SDA*', 'SCL*']
109 pins
= Pins('TWI', spipins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
114 def jtag(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
115 jtagpins
= ['MS+', 'DI-', 'DO+', 'CK+']
116 pins
= Pins('JTAG', jtagpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
121 def uart(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
122 uartpins
= ['TX+', 'RX-']
123 pins
= Pins('UART', uartpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
129 def ulpi(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
130 ulpipins
= ['CK+', 'DIR+', 'STP+', 'NXT+']
132 ulpipins
.append('D%d*' % i
)
133 pins
= Pins('ULPI', ulpipins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
138 def uartfull(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
139 uartpins
= ['TX+', 'RX-', 'CTS-', 'RTS+']
140 pins
= Pins('UARTQ', uartpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
145 def rgbttl(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
146 ttlpins
= ['CK+', 'DE+', 'HS+', 'VS+']
148 ttlpins
.append("D%d+" % i
)
149 pins
= Pins('LCD', ttlpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
154 def rgmii(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
157 buspins
.append("ERXD%d-" % i
)
159 buspins
.append("ETXD%d+" % i
)
160 buspins
+= ['ERXCK-', 'ERXERR-', 'ERXDV-',
162 'ETXEN+', 'ETXCK+', 'ECRS-',
164 pins
= Pins('RG', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
169 def flexbus1(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
172 buspins
.append("AD%d*" % i
)
174 buspins
.append("CS%d+" % i
)
175 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK+',
176 'A0', 'A1', 'TS', 'TBST',
179 buspins
.append("BWE%d" % i
)
180 for i
in range(2, 6):
181 buspins
.append("CS%d+" % i
)
182 pins
= Pins('FB', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
187 def flexbus2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
189 for i
in range(8, 32):
190 buspins
.append("AD%d*" % i
)
191 pins
= Pins('FB', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
, limit
,
196 def sdram1(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
199 buspins
.append("SDRDQM%d*" % i
)
201 buspins
.append("SDRAD%d+" % i
)
203 buspins
.append("SDRDQ%d+" % i
)
205 buspins
.append("SDRCS%d#+" % i
)
207 buspins
.append("SDRDQ%d+" % i
)
209 buspins
.append("SDRBA%d+" % i
)
210 buspins
+= ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
212 pins
= Pins('SDR', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
216 def sdram2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
218 for i
in range(3, 6):
219 buspins
.append("SDRCS%d#+" % i
)
220 for i
in range(8, 32):
221 buspins
.append("SDRDQ%d*" % i
)
222 pins
= Pins('SDR', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
227 def mcu8080(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
230 buspins
.append("MCUD%d*" % i
)
232 buspins
.append("MCUAD%d+" % (i
+ 8))
234 buspins
.append("MCUCS%d+" % i
)
236 buspins
.append("MCUNRB%d+" % i
)
237 buspins
+= ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
239 pins
= Pins('MCU', buspins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
243 def _pinbank(self
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1,
246 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
247 gpiopins
.append("%s%d*" % (bank
, i
))
248 pins
= Pins(prefix
, gpiopins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
252 def eint(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
254 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
255 gpiopins
.append("%d*" % (i
))
256 pins
= Pins('EINT', gpiopins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
260 def pwm(self
, suffix
, offs
, bank
, pwmoffs
, pwmnum
=1, mux
=1, spec
=None):
262 for i
in range(pwmoffs
, pwmoffs
+ pwmnum
):
263 pwmpins
.append("%d+" % (i
))
264 pins
= Pins('PWM', pwmpins
, self
.bankspec
, suffix
, offs
, bank
, mux
, spec
,
269 def gpio(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
270 self
._pinbank
("GPIO%s" % bank
, suffix
, offs
, bank
, gpiooffs
,
271 gpionum
, mux
=0, spec
=None)
274 def pinmerge(self
, fn
):
275 # hack, store the function specs in the pins dict
277 suffix
= fn
.origsuffix
280 if not hasattr(self
, 'fnspec'):
284 assert 'EINT' not in self
285 if fname
not in self
.fnspec
:
286 self
.add_spec(fname
, {})
287 if suffix
or fname
== 'EINT' or fname
== 'PWM':
288 specname
= fname
+ suffix
291 print "fname bank specname suffix ", fname
, bank
, specname
, repr(suffix
)
292 if specname
in self
.fnspec
[fname
]:
293 # ok so some declarations may bring in different
294 # names at different stages (EINT, PWM, flexbus1/2)
295 # so we have to merge the names in. main thing is
297 tomerge
= self
.fnspec
[fname
][specname
]
298 for p
in fn
.pingroup
:
299 if p
not in tomerge
.pingroup
:
300 tomerge
.pingroup
.append(p
)
301 tomerge
.pins
.update(fn
.pins
)
302 tomerge
.fntype
.update(fn
.fntype
)
304 self
.fnspec
[fname
][specname
] = deepcopy(fn
)
307 for (pinidx
, v
) in fn
.pins
.items():
308 self
.update(pinidx
, v
)
313 def __init__(self
, fname
, pingroup
, bankspec
, suffix
, offs
, bank
, mux
,
314 spec
=None, limit
=None, origsuffix
=None):
316 # function type can be in, out or inout, represented by - + *
317 # strip function type out of each pin name
319 for i
in range(len(pingroup
)):
324 if fntype
not in '+-*':
327 fntype
= {'-': 'in', '+': 'out', '*': 'inout'}[fntype
]
328 self
.fntype
[pname
] = fntype
332 self
.pingroup
= pingroup
333 self
.bankspec
= bankspec
335 self
.origsuffix
= origsuffix
or suffix
339 # create consistent name suffixes
340 pingroup
= namesuffix(fname
, suffix
, pingroup
)
346 for name
in pingroup
[:limit
]:
348 name_
= "%s_%s" % (name
, suffix
)
351 if spec
and name
in spec
:
353 pin
= {mux
: (name_
, bank
)}
354 offs_bank
, offs_
= offs
357 idx_
+= bankspec
[bank
]
360 for name
in pingroup
:
362 name_
= "%s_%s" % (name
, suffix
)
369 idx_
, mux_
, bank_
= spec
[name
]
371 pin
= {mux_
: (name_
, bank_
)}
373 res
[idx_
].update(pin
)