added minerva and chips4makers jtag
[libreriscv.git] / shakti / i_class / interfaces.py
1 #!/usr/bin/env python
2
3 from copy import deepcopy
4
5 def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None):
6 res = {}
7 names = {}
8 idx = 0
9 for name in pingroup[:limit]:
10 if suffix:
11 name_ = "%s_%s" % (name, suffix)
12 else:
13 name_ = name
14 if spec and spec.has_key(name):
15 continue
16 pin = {mux: (name_, bank)}
17 offs_bank, offs_ = offs
18 idx_ = offs_ + idx
19 idx += 1
20 idx_ += bankspec[bank]
21 res[idx_] = pin
22 names[name] = idx_
23 for name in pingroup:
24 if suffix:
25 name_ = "%s_%s" % (name, suffix)
26 else:
27 name_ = name
28 if not spec:
29 continue
30 if not spec.has_key(name):
31 continue
32 idx_, mux_, bank_ = spec[name]
33 idx_ = names[idx_]
34 #idx_ += bankspec[bank_]
35 pin = {mux_: (name_, bank_)}
36 if res.has_key(idx_):
37 res[idx_].update(pin)
38 else:
39 res[idx_] = pin
40 return res
41
42 def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
43 i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
44 for i in range(4):
45 i2spins.append("IISDO%d" % i)
46 return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit)
47
48 def emmc(bankspec, suffix, offs, bank, mux=1, spec=None):
49 emmcpins = ['MMCCMD', 'MMCCLK']
50 for i in range(8):
51 emmcpins.append("MMCD%d" % i)
52 return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec)
53
54 def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None,
55 start=None, limit=None):
56 sdmmcpins = ['CMD', 'CLK']
57 for i in range(4):
58 sdmmcpins.append("D%d" % i)
59 sdmmcpins = sdmmcpins[start:limit]
60 sdmmcpins = namesuffix('SD', suffix, sdmmcpins)
61 return pins(sdmmcpins, bankspec, '', offs, bank, mux, spec)
62
63 def spi(bankspec, suffix, offs, bank, mux=1, spec=None):
64 spipins = namesuffix('SPI', suffix,
65 ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS'])
66 return pins(spipins, bankspec, '', offs, bank, mux, spec)
67
68 def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
69 spipins = namesuffix('SPI', suffix,
70 ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3'])
71 return pins(spipins, bankspec, '', offs, bank, mux, spec, limit)
72
73 def i2c(bankspec, suffix, offs, bank, mux=1, spec=None):
74 spipins = namesuffix('TWI', suffix,
75 ['SDA', 'SCL'])
76 return pins(spipins, bankspec, '', offs, bank, mux, spec)
77
78 def jtag(bankspec, suffix, offs, bank, mux=1, spec=None):
79 uartpins = namesuffix('JTAG', suffix, ['MS', 'DI', 'DO', 'CK'])
80 return pins(uartpins, bankspec, '', offs, bank, mux, spec)
81
82 def uart(bankspec, suffix, offs, bank, mux=1, spec=None):
83 uartpins = namesuffix('UART', suffix, ['TX', 'RX'])
84 return pins(uartpins, bankspec, '', offs, bank, mux, spec)
85
86 def namesuffix(name, suffix, namelist):
87 names = []
88 for n in namelist:
89 names.append("%s%s_%s" % (name, suffix, n))
90 return names
91
92 def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None):
93 ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT'])
94 for i in range(8):
95 ulpipins.append('ULPI%s_D%d' % (suffix, i))
96 return pins(ulpipins, bankspec, "", offs, bank, mux, spec)
97
98 def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None):
99 uartpins = namesuffix('UART', suffix, ['TX', 'RX', 'CTS', 'RTS'])
100 return pins(uartpins, bankspec, '', offs, bank, mux, spec)
101
102 def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None):
103 ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
104 for i in range(24):
105 ttlpins.append("LCD%d" % i)
106 return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec)
107
108 def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None):
109 buspins = []
110 for i in range(4):
111 buspins.append("RG_ERXD%d" % i)
112 for i in range(4):
113 buspins.append("RG_ETXD%d" % i)
114 for i in range(2):
115 buspins.append("RG_FB_CS%d" % i)
116 buspins += ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV',
117 'RG_EMDC', 'RG_EMDIO',
118 'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS',
119 'RG_ECOL', 'RG_ETXERR']
120 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
121
122 def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
123 buspins = []
124 for i in range(8):
125 buspins.append("FB_AD%d" % i)
126 for i in range(2):
127 buspins.append("FB_CS%d" % i)
128 buspins += ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK',
129 'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST',
130 'FB_TSIZ0', 'FB_TSIZ1']
131 for i in range(4):
132 buspins.append("FB_BWE%d" % i)
133 for i in range(2,6):
134 buspins.append("FB_CS%d" % i)
135 return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
136
137 def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
138 buspins = []
139 for i in range(8,32):
140 buspins.append("FB_AD%d" % i)
141 return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
142
143 def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None):
144 buspins = []
145 for i in range(16):
146 buspins.append("SDRDQM%d" % i)
147 for i in range(12):
148 buspins.append("SDRAD%d" % i)
149 for i in range(8):
150 buspins.append("SDRDQ%d" % i)
151 for i in range(3):
152 buspins.append("SDRCS%d#" % i)
153 for i in range(2):
154 buspins.append("SDRDQ%d" % i)
155 for i in range(2):
156 buspins.append("SDRBA%d" % i)
157 buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
158 'SDRRST']
159 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
160
161 def sdram2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
162 buspins = []
163 for i in range(3,6):
164 buspins.append("SDRCS%d#" % i)
165 for i in range(8,32):
166 buspins.append("SDRDQ%d" % i)
167 return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
168
169 def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
170 buspins = []
171 for i in range(8):
172 buspins.append("MCUD%d" % i)
173 for i in range(8):
174 buspins.append("MCUAD%d" % (i+8))
175 for i in range(6):
176 buspins.append("MCUCS%d" % i)
177 for i in range(2):
178 buspins.append("MCUNRB%d" % i)
179 buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
180 'MCURST']
181 return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
182
183 def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
184 gpiopins = []
185 for i in range(gpiooffs, gpiooffs+gpionum):
186 gpiopins.append("%s%s%d" % (prefix, bank, i))
187 return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
188
189 def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
190 gpiopins = []
191 for i in range(gpiooffs, gpiooffs+gpionum):
192 gpiopins.append("EINT%d" % (i))
193 return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
194
195 def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
196 return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec)
197
198 def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
199 return _pinbank(bankspec, "GPIO", suffix, offs, bank, gpiooffs,
200 gpionum, mux=0, spec=None)
201
202 def display(pins):
203 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
204 print "| --- | ----------- | ----------- | ----------- | ----------- |"
205 pinidx = pins.keys()
206 pinidx.sort()
207 for pin in pinidx:
208 pdata = pins[pin]
209 res = '| %3d |' % pin
210 for mux in range(4):
211 if not pdata.has_key(mux):
212 res += " |"
213 continue
214 name, bank = pdata[mux]
215 res += " %s %-9s |" % (bank, name)
216 print res
217
218 def fnsplit(f):
219 a = ''
220 n = 0
221 if not f.startswith('FB_'):
222 f2 = f.split('_')
223 if len(f2) == 2:
224 if f2[1].isdigit():
225 return f2[0], int(f2[1])
226 return f2[0], f2[1]
227 #print f
228 while f and not f[0].isdigit():
229 a += f[0]
230 f = f[1:]
231 return a, int(f) if f else None
232
233 def fnsort(f1, f2):
234 a1, n1 = fnsplit(f1)
235 a2, n2 = fnsplit(f2)
236 x = cmp(a1, a2)
237 if x != 0:
238 return x
239 return cmp(n1, n2)
240
241 def find_fn(fname, names):
242 for n in names:
243 if fname.startswith(n):
244 return n
245
246 def display_fns(bankspec, pins, function_names):
247 fn_names = function_names.keys()
248 fns = {}
249 for (pin, pdata) in pins.items():
250 for mux in range(1,4): # skip GPIO for now
251 if not pdata.has_key(mux):
252 continue
253 name, bank = pdata[mux]
254 if not fns.has_key(name):
255 fns[name] = []
256 fns[name].append((pin-bankspec[bank], mux, bank))
257
258 fnidx = fns.keys()
259 fnidx.sort(fnsort)
260 current_fn = None
261 for fname in fnidx:
262 fnbase = find_fn(fname, fn_names)
263 #print "name", fname
264 if fnbase != current_fn:
265 if current_fn is not None:
266 print
267 print "## %s" % fnbase
268 print
269 print function_names[fnbase]
270 print
271 current_fn = fnbase
272 print "* %-9s :" % fname,
273 for (pin, mux, bank) in fns[fname]:
274 print "%s%d/%d" % (bank, pin, mux),
275 print
276
277 return fns
278
279 def check_functions(title, bankspec, fns, pins, required, eint, pwm,
280 descriptions=None):
281 fns = deepcopy(fns)
282 pins = deepcopy(pins)
283 if descriptions is None:
284 descriptions = {}
285
286 print "# Pinmap for %s" % title
287 print
288
289
290 for name in required:
291 print "## %s" % name
292 print
293 if descriptions and descriptions.has_key(name):
294 print descriptions[name]
295 print
296
297 name = name.split(':')
298 if len(name) == 2:
299 findbank = name[0][0]
300 findmux = int(name[0][1:])
301 name = name[1]
302 else:
303 name = name[0]
304 findbank = None
305 findmux = None
306 name = name.split('/')
307 if len(name) == 2:
308 count = int(name[1])
309 else:
310 count = 100000
311 name = name[0]
312 found = set()
313 fnidx = fns.keys()
314 #fnidx.sort(fnsort)
315 pinfound = {}
316 for fname in fnidx:
317 if not fname.startswith(name):
318 continue
319 for pin, mux, bank in fns[fname]:
320 if findbank is not None:
321 if findbank != bank:
322 continue
323 if findmux != mux:
324 continue
325 pin_ = pin + bankspec[bank]
326 if pins.has_key(pin_):
327 pinfound[pin_] = (fname, pin_, bank, pin, mux)
328
329 pinidx = pinfound.keys()
330 pinidx.sort()
331
332 for pin_ in pinidx:
333 fname, pin_, bank, pin, mux = pinfound[pin_]
334 if fname in found:
335 continue
336 found.add(fname)
337 if len(found) > count:
338 continue
339 del pins[pin_]
340 print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux)
341
342 print
343
344 # gpios
345 gpios = []
346 for name in descriptions.keys():
347 if not name.startswith('GPIO'):
348 continue
349 if name == 'GPIO':
350 continue
351 gpios.append(name)
352 gpios.sort()
353
354 if gpios:
355 print "## GPIO"
356 print
357
358 for fname in gpios:
359 if fname in found:
360 continue
361 desc = ''
362 if descriptions and descriptions.has_key(fname):
363 desc = ': %s' % descriptions[fname]
364 bank = fname[4]
365 pin = int(fname[5:])
366 pin_ = pin + bankspec[bank]
367 if not pins.has_key(pin_):
368 continue
369 del pins[pin_]
370 found.add(fname)
371 print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc)
372 print
373
374 if eint:
375 display_group(bankspec, "EINT", eint, fns, pins, descriptions)
376 if pwm:
377 display_group(bankspec, "PWM", pwm, fns, pins, descriptions)
378
379 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
380 print
381 if descriptions and descriptions.has_key('GPIO'):
382 print descriptions['GPIO']
383 print
384 display(pins)
385 print
386
387 return pins # unused
388
389 def display_group(bankspec, title, todisplay, fns, pins, descriptions):
390 print "## %s" % title
391 print
392
393 found = set()
394 for fname in todisplay:
395 desc = ''
396 if descriptions and descriptions.has_key(fname):
397 desc = ': %s' % descriptions[fname]
398 fname = fname.split(':')
399 if len(fname) == 2:
400 findbank = fname[0][0]
401 findmux = int(fname[0][1:])
402 fname = fname[1]
403 else:
404 fname = fname[0]
405 findbank = None
406 findmux = None
407 for (pin, mux, bank) in fns[fname]:
408 if findbank is not None:
409 if findbank != bank:
410 continue
411 if findmux != mux:
412 continue
413 if fname in found:
414 continue
415 pin_ = pin + bankspec[bank]
416 if not pins.has_key(pin_):
417 continue
418 del pins[pin_]
419 found.add(fname)
420 print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc)
421 print
422
423 def pinmerge(pins, fn):
424 for (pinidx, v) in fn.items():
425 if not pins.has_key(pinidx):
426 pins[pinidx] = v
427 continue
428 pins[pinidx].update(v)
429
430 def display_fixed(fixed, offs):
431
432 fkeys = fixed.keys()
433 fkeys.sort()
434 pin_ = offs
435 for pin, k in enumerate(fkeys):
436 print "## %s" % k
437 print
438 prevname = ''
439 linecount = 0
440 for name in fixed[k]:
441 if linecount == 4:
442 linecount = 0
443 print
444 if prevname[:2] == name[:2] and linecount != 0:
445 print name,
446 linecount += 1
447 else:
448 if linecount != 0:
449 print
450 print "* %d: %d %s" % (pin_, pin, name),
451 linecount = 1
452 prevname = name
453 pin_ += 1
454 if linecount != 0:
455 print
456 print
457