3 from copy
import deepcopy
6 def namesuffix(name
, suffix
, namelist
):
10 names
.append("%s%s_%s" % (name
, suffix
, n
))
12 names
.append("%s_%s" % (name
, suffix
))
17 def __init__(self
, pinouts
, fname
, pinfn
, bankspec
):
18 self
.pinouts
= pinouts
19 self
.bankspec
= bankspec
23 def __call__(self
, suffix
, offs
, bank
, mux
,
24 spec
=None, start
=None, limit
=None, origsuffix
=None):
25 pingroup
= self
.pinfn(suffix
, bank
)
26 pingroup
= pingroup
[start
:limit
]
27 pins
= Pins(self
.fname
, pingroup
, self
.bankspec
,
28 suffix
, offs
, bank
, mux
,
29 spec
, origsuffix
=suffix
)
30 self
.pinouts
.pinmerge(pins
)
33 # define functions here
35 def i2s(suffix
, bank
):
36 return ['MCK+', 'BCK+', 'LRCK+', 'DI-', 'DO+']
38 def emmc(suffix
, bank
):
39 emmcpins
= ['CMD+', 'CLK+']
41 emmcpins
.append("D%d*" % i
)
44 def sdmmc(suffix
, bank
):
45 sdmmcpins
= ['CMD+', 'CLK+']
47 sdmmcpins
.append("D%d*" % i
)
50 def spi(suffix
, bank
):
51 return ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
53 def quadspi(suffix
, bank
):
54 return ['CK*', 'NSS*', 'IO0*', 'IO1*', 'IO2*', 'IO3*']
56 def i2c(suffix
, bank
):
57 return ['SDA*', 'SCL*']
59 def jtag(suffix
, bank
):
60 return ['MS+', 'DI-', 'DO+', 'CK+']
62 def uart(suffix
, bank
):
65 def ulpi(suffix
, bank
):
66 ulpipins
= ['CK+', 'DIR+', 'STP+', 'NXT+']
68 ulpipins
.append('D%d*' % i
)
71 def uartfull(suffix
, bank
):
72 return ['TX+', 'RX-', 'CTS-', 'RTS+']
74 def rgbttl(suffix
, bank
):
75 ttlpins
= ['CK+', 'DE+', 'HS+', 'VS+']
77 ttlpins
.append("D%d+" % i
)
80 def rgmii(suffix
, bank
):
83 buspins
.append("ERXD%d-" % i
)
85 buspins
.append("ETXD%d+" % i
)
86 buspins
+= ['ERXCK-', 'ERXERR-', 'ERXDV-',
88 'ETXEN+', 'ETXCK+', 'ECRS-',
93 # list functions by name here
95 pinspec
= {'IIS': i2s
,
111 class Pinouts(object):
112 def __init__(self
, bankspec
):
113 self
.bankspec
= bankspec
116 for fname
, pinfn
in pinspec
.items():
117 if isinstance(pinfn
, tuple):
120 name
= pinfn
.__name
__
121 setattr(self
, name
, PinGen(self
, fname
, pinfn
, self
.bankspec
))
123 def __contains__(self
, k
):
124 return k
in self
.pins
126 def has_key(self
, k
):
127 return k
in self
.pins
129 def add_spec(self
, k
, v
):
132 def update(self
, pinidx
, v
):
133 if pinidx
not in self
.pins
:
134 self
.pins
[pinidx
] = v
137 assert k
not in self
.pins
[pinidx
], \
138 "pin %d position %d already taken\n%s\n%s" % \
139 (pinidx
, k
, str(v
), self
.pins
[pinidx
])
140 self
.pins
[pinidx
].update(v
)
143 return self
.pins
.keys()
146 return self
.pins
.items()
152 return len(self
.pins
)
154 def __delitem__(self
, k
):
157 def __getitem__(self
, k
):
160 def flexbus1(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
163 buspins
.append("AD%d*" % i
)
165 buspins
.append("CS%d+" % i
)
166 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK+',
167 'A0', 'A1', 'TS', 'TBST',
170 buspins
.append("BWE%d" % i
)
171 for i
in range(2, 6):
172 buspins
.append("CS%d+" % i
)
173 pins
= Pins('FB', buspins
, self
.bankspec
,
174 suffix
, offs
, bank
, mux
,
175 spec
, limit
, origsuffix
=suffix
)
178 def flexbus2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
180 for i
in range(8, 32):
181 buspins
.append("AD%d*" % i
)
182 pins
= Pins('FB', buspins
, self
.bankspec
,
183 suffix
, offs
, bank
, mux
,
184 spec
, limit
, origsuffix
=suffix
)
187 def sdram1(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
190 buspins
.append("SDRDQM%d*" % i
)
192 buspins
.append("SDRAD%d+" % i
)
194 buspins
.append("SDRDQ%d+" % i
)
196 buspins
.append("SDRCS%d#+" % i
)
198 buspins
.append("SDRDQ%d+" % i
)
200 buspins
.append("SDRBA%d+" % i
)
201 buspins
+= ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
203 pins
= Pins('SDR', buspins
, self
.bankspec
,
204 suffix
, offs
, bank
, mux
,
205 spec
, origsuffix
=suffix
)
208 def sdram2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
210 for i
in range(3, 6):
211 buspins
.append("SDRCS%d#+" % i
)
212 for i
in range(8, 32):
213 buspins
.append("SDRDQ%d*" % i
)
214 pins
= Pins('SDR', buspins
, self
.bankspec
,
215 suffix
, offs
, bank
, mux
,
216 spec
, limit
, origsuffix
=suffix
)
219 def mcu8080(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
222 buspins
.append("MCUD%d*" % i
)
224 buspins
.append("MCUAD%d+" % (i
+ 8))
226 buspins
.append("MCUCS%d+" % i
)
228 buspins
.append("MCUNRB%d+" % i
)
229 buspins
+= ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
231 pins
= Pins('MCU', buspins
, self
.bankspec
,
232 suffix
, offs
, bank
, mux
,
233 spec
, origsuffix
=suffix
)
236 def eint(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
238 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
239 gpiopins
.append("%d*" % (i
))
240 pins
= Pins('EINT', gpiopins
, self
.bankspec
,
241 suffix
, offs
, bank
, mux
,
242 spec
, origsuffix
=suffix
)
245 def pwm(self
, suffix
, offs
, bank
, pwmoffs
, pwmnum
=1, mux
=1, spec
=None):
247 for i
in range(pwmoffs
, pwmoffs
+ pwmnum
):
248 pwmpins
.append("%d+" % (i
))
249 pins
= Pins('PWM', pwmpins
, self
.bankspec
,
250 suffix
, offs
, bank
, mux
,
251 spec
, origsuffix
=suffix
)
254 def gpio(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
255 prefix
= "GPIO%s" % bank
257 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
258 gpiopins
.append("%s%d*" % (bank
, i
))
259 pins
= Pins(prefix
, gpiopins
, self
.bankspec
,
260 suffix
, offs
, bank
, mux
,
261 spec
, origsuffix
=suffix
)
264 def pinmerge(self
, fn
):
265 # hack, store the function specs in the pins dict
267 suffix
= fn
.origsuffix
270 if not hasattr(self
, 'fnspec'):
274 assert 'EINT' not in self
275 if fname
not in self
.fnspec
:
276 self
.add_spec(fname
, {})
277 if suffix
or fname
== 'EINT' or fname
== 'PWM':
278 specname
= fname
+ suffix
281 #print "fname bank specname suffix ", fname, bank, specname, repr(
283 if specname
in self
.fnspec
[fname
]:
284 # ok so some declarations may bring in different
285 # names at different stages (EINT, PWM, flexbus1/2)
286 # so we have to merge the names in. main thing is
288 tomerge
= self
.fnspec
[fname
][specname
]
289 for p
in fn
.pingroup
:
290 if p
not in tomerge
.pingroup
:
291 tomerge
.pingroup
.append(p
)
292 tomerge
.pins
.update(fn
.pins
)
293 tomerge
.fntype
.update(fn
.fntype
)
295 self
.fnspec
[fname
][specname
] = deepcopy(fn
)
298 for (pinidx
, v
) in fn
.pins
.items():
299 self
.update(pinidx
, v
)
304 def __init__(self
, fname
, pingroup
, bankspec
, suffix
, offs
, bank
, mux
,
305 spec
=None, limit
=None, origsuffix
=None):
307 # function type can be in, out or inout, represented by - + *
308 # strip function type out of each pin name
310 for i
in range(len(pingroup
)):
315 if fntype
not in '+-*':
318 fntype
= {'-': 'in', '+': 'out', '*': 'inout'}[fntype
]
319 self
.fntype
[pname
] = fntype
323 self
.pingroup
= pingroup
324 self
.bankspec
= bankspec
326 self
.origsuffix
= origsuffix
or suffix
330 # create consistent name suffixes
331 pingroup
= namesuffix(fname
, suffix
, pingroup
)
337 for name
in pingroup
[:limit
]:
339 name_
= "%s_%s" % (name
, suffix
)
342 if spec
and name
in spec
:
344 pin
= {mux
: (name_
, bank
)}
345 offs_bank
, offs_
= offs
348 idx_
+= bankspec
[bank
]
351 for name
in pingroup
:
353 name_
= "%s_%s" % (name
, suffix
)
360 idx_
, mux_
, bank_
= spec
[name
]
362 pin
= {mux_
: (name_
, bank_
)}
364 res
[idx_
].update(pin
)