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
))
16 class Pinouts(object):
17 def __init__(self
, bankspec
):
18 self
.bankspec
= bankspec
22 def __contains__(self
, k
):
28 def add_spec(self
, k
, v
):
31 def update(self
, pinidx
, v
):
32 if pinidx
not in self
.pins
:
36 assert k
not in self
.pins
[pinidx
], \
37 "pin %d position %d already taken\n%s\n%s" % \
38 (pinidx
, k
, str(v
), self
.pins
[pinidx
])
39 self
.pins
[pinidx
].update(v
)
42 return self
.pins
.keys()
45 return self
.pins
.items()
53 def __delitem__(self
, k
):
56 def __getitem__(self
, k
):
59 def i2s(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
60 i2spins
= ['MCK+', 'BCK+', 'LRCK+', 'DI-', 'DO+']
62 # i2spins.append("DO%d+" % i)
63 pins
= Pins('IIS', i2spins
, self
.bankspec
,
64 suffix
, offs
, bank
, mux
,
65 spec
, limit
, origsuffix
=suffix
)
68 def emmc(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
69 emmcpins
= ['CMD+', 'CLK+']
71 emmcpins
.append("D%d*" % i
)
72 pins
= Pins('MMC', emmcpins
, self
.bankspec
,
73 suffix
, offs
, bank
, mux
,
74 spec
, origsuffix
=suffix
)
77 def sdmmc(self
, suffix
, offs
, bank
, mux
=1, spec
=None,
78 start
=None, limit
=None):
79 sdmmcpins
= ['CMD+', 'CLK+']
81 sdmmcpins
.append("D%d*" % i
)
82 sdmmcpins
= sdmmcpins
[start
:limit
]
83 pins
= Pins('SD', sdmmcpins
, self
.bankspec
,
84 suffix
, offs
, bank
, mux
,
85 spec
, origsuffix
=suffix
)
88 def spi(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
89 spipins
= ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
90 pins
= Pins('SPI', spipins
, self
.bankspec
,
91 suffix
, offs
, bank
, mux
,
92 spec
, origsuffix
=suffix
)
95 def quadspi(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
96 spipins
= ['CK*', 'NSS*', 'IO0*', 'IO1*', 'IO2*', 'IO3*']
97 pins
= Pins('QSPI', spipins
, self
.bankspec
,
98 suffix
, offs
, bank
, mux
,
99 spec
, limit
, origsuffix
=suffix
)
102 def i2c(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
103 spipins
= ['SDA*', 'SCL*']
104 pins
= Pins('TWI', spipins
, self
.bankspec
,
105 suffix
, offs
, bank
, mux
,
106 spec
, origsuffix
=suffix
)
109 def jtag(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
110 jtagpins
= ['MS+', 'DI-', 'DO+', 'CK+']
111 pins
= Pins('JTAG', jtagpins
, self
.bankspec
,
112 suffix
, offs
, bank
, mux
,
113 spec
, origsuffix
=suffix
)
116 def uart(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
117 uartpins
= ['TX+', 'RX-']
118 pins
= Pins('UART', uartpins
, self
.bankspec
,
119 suffix
, offs
, bank
, mux
,
120 spec
, origsuffix
=suffix
)
123 def ulpi(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
124 ulpipins
= ['CK+', 'DIR+', 'STP+', 'NXT+']
126 ulpipins
.append('D%d*' % i
)
127 pins
= Pins('ULPI', ulpipins
, self
.bankspec
,
128 suffix
, offs
, bank
, mux
,
129 spec
, origsuffix
=suffix
)
132 def uartfull(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
133 uartpins
= ['TX+', 'RX-', 'CTS-', 'RTS+']
134 pins
= Pins('UARTQ', uartpins
, self
.bankspec
,
135 suffix
, offs
, bank
, mux
,
136 spec
, origsuffix
=suffix
)
139 def rgbttl(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
140 ttlpins
= ['CK+', 'DE+', 'HS+', 'VS+']
142 ttlpins
.append("D%d+" % i
)
143 pins
= Pins('LCD', ttlpins
, self
.bankspec
,
144 suffix
, offs
, bank
, mux
,
145 spec
, origsuffix
=suffix
)
148 def rgmii(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
151 buspins
.append("ERXD%d-" % i
)
153 buspins
.append("ETXD%d+" % i
)
154 buspins
+= ['ERXCK-', 'ERXERR-', 'ERXDV-',
156 'ETXEN+', 'ETXCK+', 'ECRS-',
158 pins
= Pins('RG', buspins
, self
.bankspec
,
159 suffix
, offs
, bank
, mux
,
160 spec
, origsuffix
=suffix
)
163 def flexbus1(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
166 buspins
.append("AD%d*" % i
)
168 buspins
.append("CS%d+" % i
)
169 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK+',
170 'A0', 'A1', 'TS', 'TBST',
173 buspins
.append("BWE%d" % i
)
174 for i
in range(2, 6):
175 buspins
.append("CS%d+" % i
)
176 pins
= Pins('FB', buspins
, self
.bankspec
,
177 suffix
, offs
, bank
, mux
,
178 spec
, limit
, origsuffix
=suffix
)
181 def flexbus2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
183 for i
in range(8, 32):
184 buspins
.append("AD%d*" % i
)
185 pins
= Pins('FB', buspins
, self
.bankspec
,
186 suffix
, offs
, bank
, mux
,
187 spec
, limit
, origsuffix
=suffix
)
190 def sdram1(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
193 buspins
.append("SDRDQM%d*" % i
)
195 buspins
.append("SDRAD%d+" % i
)
197 buspins
.append("SDRDQ%d+" % i
)
199 buspins
.append("SDRCS%d#+" % i
)
201 buspins
.append("SDRDQ%d+" % i
)
203 buspins
.append("SDRBA%d+" % i
)
204 buspins
+= ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
206 pins
= Pins('SDR', buspins
, self
.bankspec
,
207 suffix
, offs
, bank
, mux
,
208 spec
, origsuffix
=suffix
)
211 def sdram2(self
, suffix
, offs
, bank
, mux
=1, spec
=None, limit
=None):
213 for i
in range(3, 6):
214 buspins
.append("SDRCS%d#+" % i
)
215 for i
in range(8, 32):
216 buspins
.append("SDRDQ%d*" % i
)
217 pins
= Pins('SDR', buspins
, self
.bankspec
,
218 suffix
, offs
, bank
, mux
,
219 spec
, limit
, origsuffix
=suffix
)
222 def mcu8080(self
, suffix
, offs
, bank
, mux
=1, spec
=None):
225 buspins
.append("MCUD%d*" % i
)
227 buspins
.append("MCUAD%d+" % (i
+ 8))
229 buspins
.append("MCUCS%d+" % i
)
231 buspins
.append("MCUNRB%d+" % i
)
232 buspins
+= ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
234 pins
= Pins('MCU', buspins
, self
.bankspec
,
235 suffix
, offs
, bank
, mux
,
236 spec
, origsuffix
=suffix
)
239 def _pinbank(self
, prefix
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1,
242 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
243 gpiopins
.append("%s%d*" % (bank
, i
))
244 pins
= Pins(prefix
, gpiopins
, self
.bankspec
,
245 suffix
, offs
, bank
, mux
,
246 spec
, origsuffix
=suffix
)
249 def eint(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
251 for i
in range(gpiooffs
, gpiooffs
+ gpionum
):
252 gpiopins
.append("%d*" % (i
))
253 pins
= Pins('EINT', gpiopins
, self
.bankspec
,
254 suffix
, offs
, bank
, mux
,
255 spec
, origsuffix
=suffix
)
258 def pwm(self
, suffix
, offs
, bank
, pwmoffs
, pwmnum
=1, mux
=1, spec
=None):
260 for i
in range(pwmoffs
, pwmoffs
+ pwmnum
):
261 pwmpins
.append("%d+" % (i
))
262 pins
= Pins('PWM', pwmpins
, self
.bankspec
,
263 suffix
, offs
, bank
, mux
,
264 spec
, origsuffix
=suffix
)
267 def gpio(self
, suffix
, offs
, bank
, gpiooffs
, gpionum
=1, mux
=1, spec
=None):
268 self
._pinbank
("GPIO%s" % bank
, suffix
, offs
, bank
, gpiooffs
,
269 gpionum
, mux
=0, spec
=None)
271 def pinmerge(self
, fn
):
272 # hack, store the function specs in the pins dict
274 suffix
= fn
.origsuffix
277 if not hasattr(self
, 'fnspec'):
281 assert 'EINT' not in self
282 if fname
not in self
.fnspec
:
283 self
.add_spec(fname
, {})
284 if suffix
or fname
== 'EINT' or fname
== 'PWM':
285 specname
= fname
+ suffix
288 #print "fname bank specname suffix ", fname, bank, specname, repr(
290 if specname
in self
.fnspec
[fname
]:
291 # ok so some declarations may bring in different
292 # names at different stages (EINT, PWM, flexbus1/2)
293 # so we have to merge the names in. main thing is
295 tomerge
= self
.fnspec
[fname
][specname
]
296 for p
in fn
.pingroup
:
297 if p
not in tomerge
.pingroup
:
298 tomerge
.pingroup
.append(p
)
299 tomerge
.pins
.update(fn
.pins
)
300 tomerge
.fntype
.update(fn
.fntype
)
302 self
.fnspec
[fname
][specname
] = deepcopy(fn
)
305 for (pinidx
, v
) in fn
.pins
.items():
306 self
.update(pinidx
, v
)
311 def __init__(self
, fname
, pingroup
, bankspec
, suffix
, offs
, bank
, mux
,
312 spec
=None, limit
=None, origsuffix
=None):
314 # function type can be in, out or inout, represented by - + *
315 # strip function type out of each pin name
317 for i
in range(len(pingroup
)):
322 if fntype
not in '+-*':
325 fntype
= {'-': 'in', '+': 'out', '*': 'inout'}[fntype
]
326 self
.fntype
[pname
] = fntype
330 self
.pingroup
= pingroup
331 self
.bankspec
= bankspec
333 self
.origsuffix
= origsuffix
or suffix
337 # create consistent name suffixes
338 pingroup
= namesuffix(fname
, suffix
, pingroup
)
344 for name
in pingroup
[:limit
]:
346 name_
= "%s_%s" % (name
, suffix
)
349 if spec
and name
in spec
:
351 pin
= {mux
: (name_
, bank
)}
352 offs_bank
, offs_
= offs
355 idx_
+= bankspec
[bank
]
358 for name
in pingroup
:
360 name_
= "%s_%s" % (name
, suffix
)
367 idx_
, mux_
, bank_
= spec
[name
]
369 pin
= {mux_
: (name_
, bank_
)}
371 res
[idx_
].update(pin
)