ls180 pinouts
[pinmux.git] / src / spec / ifaceprint.py
1 #!/usr/bin/env python
2
3 from copy import deepcopy
4
5
6 def display(of, pins, banksel=None, muxwidth=4):
7 of.write("""\
8 | Pin | Mux0 | Mux1 | Mux2 | Mux3 |
9 | --- | ----------- | ----------- | ----------- | ----------- |
10 """)
11 pinidx = sorted(pins.keys())
12 for pin in pinidx:
13 pdata = pins.get(pin)
14 if banksel:
15 skip = False
16 for mux in range(muxwidth):
17 if mux not in pdata:
18 continue
19 name, bank = pdata[mux]
20 if banksel != bank:
21 skip = True
22 if skip:
23 continue
24 res = '| %3d |' % pin
25 for mux in range(muxwidth):
26 if mux not in pdata:
27 res += " |"
28 continue
29 name, bank = pdata[mux]
30 res += " %s %-9s |" % (bank, name)
31 of.write("%s\n" % res)
32
33
34 def fnsplit(f):
35 a = ''
36 n = 0
37 if not f.startswith('FB_'):
38 f2 = f.split('_')
39 if len(f2) == 2:
40 if f2[1].isdigit():
41 return f2[0], int(f2[1])
42 return f2[0], f2[1]
43 #print f
44 while f and not f[0].isdigit():
45 a += f[0]
46 f = f[1:]
47 return a, int(f) if f else None
48
49
50 def fnsort(f1, f2):
51 a1, n1 = fnsplit(f1)
52 a2, n2 = fnsplit(f2)
53 x = cmp(a1, a2)
54 if x != 0:
55 return x
56 return cmp(n1, n2)
57
58
59 def find_fn(fname, names):
60 for n in names:
61 if fname.startswith(n):
62 return n
63
64
65 def display_fns(of, bankspec, pins, function_names):
66 fn_names = function_names.keys()
67 fns = {}
68 for (pin, pdata) in pins.items():
69 for mux in range(1, 4): # skip GPIO for now
70 if mux not in pdata:
71 continue
72 name, bank = pdata[mux]
73 assert name is not None, str(bank)
74 if name not in fns:
75 fns[name] = []
76 fns[name].append((pin - bankspec[bank], mux, bank))
77
78 fnidx = list(fns.keys())
79 fnidx.sort(key=fnsplit)
80 current_fn = None
81 for fname in fnidx:
82 fnbase = find_fn(fname, fn_names)
83 assert fnbase in function_names, "fn %s not in descriptions %s" % \
84 (fname, str(function_names.keys()))
85 #print "name", fname, fnbase
86 if fnbase != current_fn:
87 if current_fn is not None:
88 of.write('\n')
89 of.write("## %s\n\n%s\n\n" % (fnbase, function_names[fnbase]))
90 current_fn = fnbase
91 of.write("* %-9s :" % fname)
92 for (pin, mux, bank) in fns[fname]:
93 of.write(" %s%d/%d" % (bank, pin, mux))
94 of.write('\n')
95
96 return fns
97
98
99 def check_functions(of, title, bankspec, fns, pins, required, eint, pwm,
100 descriptions=None):
101 fns = deepcopy(fns)
102 pins = deepcopy(pins)
103 if descriptions is None:
104 descriptions = {}
105 fnidx = fns.keys()
106
107 #print dir(fns)
108 #print dir(pins)
109
110 of.write("# Pinmap for %s\n\n" % title)
111
112 print "fn_idx", fnidx
113 print "fnspec", pins.fnspec.keys()
114 print "required", required
115 for name in required:
116 of.write("## %s\n\n" % name)
117 if descriptions and name in descriptions:
118 of.write("%s\n\n" % descriptions[name])
119
120 name = name.split(':')
121 if len(name) == 2:
122 findbank = name[0][0]
123 findmux = int(name[0][1:])
124 name = name[1]
125 else:
126 name = name[0]
127 findbank = None
128 findmux = None
129 name = name.split('/')
130 if len(name) == 2:
131 count = int(name[1])
132 else:
133 count = 100000
134 name = name[0]
135 #print name
136 found = set()
137 pinfound = {}
138 located = set()
139 for fname in fnidx:
140 if not fname.startswith(name):
141 continue
142 for k in pins.fnspec.keys():
143 if fname.startswith(k):
144 fk = list(pins.fnspec[k].keys())
145 fn = pins.fnspec[k]
146 fn = fn[fk[0]]
147 #print fname, fn, dir(fn)
148 if count == 100000:
149 count = len(fn.pingroup)
150 for pin, mux, bank in fns[fname]:
151 if findbank is not None:
152 if findbank != bank:
153 continue
154 if findmux != mux:
155 continue
156 pin_ = pin + bankspec[bank]
157 if pin_ in pins:
158 pinfound[pin_] = (fname, pin_, bank, pin, mux)
159
160 pinidx = sorted(pinfound.keys())
161
162 fname = None
163 removedcount = 0
164 print ("pinidx", pinidx)
165 for pin_ in pinidx:
166 fname, pin_, bank, pin, mux = pinfound[pin_]
167 if fname in found:
168 continue
169 found.add(fname)
170 if len(found) > count:
171 continue
172 del pins[pin_]
173 removedcount += 1
174 of.write("* %s %d %s%d/%d\n" % (fname, pin_, bank, pin, mux))
175
176 print fns
177 if removedcount != count:
178 if fname is None:
179 print "no match between required and available pins"
180 else:
181 print ("not all found", name, removedcount, count, title, found,
182 fns[fname])
183 print ("pins found", pinfound)
184
185 # fnidx.sort(fnsort)
186 of.write('\n')
187
188 # gpios
189 gpios = []
190 for name in descriptions.keys():
191 if not name.startswith('GPIO'):
192 continue
193 if name == 'GPIO':
194 continue
195 gpios.append(name)
196 gpios.sort()
197
198 if gpios:
199 of.write("## GPIO\n\n")
200
201 for fname in gpios:
202 if fname in found:
203 continue
204 desc = ''
205 if descriptions and fname in descriptions:
206 desc = ': %s' % descriptions[fname]
207 bank = fname[4]
208 pin = int(fname[7:])
209 pin_ = pin + bankspec[bank]
210 if pin_ not in pins:
211 continue
212 del pins[pin_]
213 found.add(fname)
214 of.write("* %-8s %d %s%-2d %s\n" % (fname, pin_, bank, pin, desc))
215 of.write('\n')
216
217 if eint:
218 display_group(of, bankspec, "EINT", eint, fns, pins, descriptions)
219 if pwm:
220 display_group(of, bankspec, "PWM", pwm, fns, pins, descriptions)
221
222 of.write("## Unused Pinouts (spare as GPIO) for '%s'\n\n" % title)
223 if descriptions and 'GPIO' in descriptions:
224 of.write("%s\n\n" % descriptions['GPIO'])
225 display(of, pins)
226 of.write('\n')
227
228 return pins # unused
229
230
231 def display_group(of, bankspec, title, todisplay, fns, pins, descriptions):
232 of.write("## %s\n\n" % title)
233
234 found = set()
235 for fname in todisplay:
236 desc = ''
237 if descriptions and fname in descriptions:
238 desc = ': %s' % descriptions[fname]
239 fname = fname.split(':')
240 if len(fname) == 2:
241 findbank = fname[0][0]
242 findmux = int(fname[0][1:])
243 fname = fname[1]
244 else:
245 fname = fname[0]
246 findbank = None
247 findmux = None
248 for (pin, mux, bank) in fns[fname]:
249 if findbank is not None:
250 if findbank != bank:
251 continue
252 if findmux != mux:
253 continue
254 if fname in found:
255 continue
256 pin_ = pin + bankspec[bank]
257 if pin_ not in pins:
258 continue
259 del pins[pin_]
260 found.add(fname)
261 of.write("* %s %d %s%d/%d %s\n" %
262 (fname, pin_, bank, pin, mux, desc))
263 of.write('\n')
264
265
266 def display_fixed(of, fixed, offs):
267
268 fkeys = sorted(fixed.keys())
269 pin_ = offs
270 res = []
271 for pin, k in enumerate(fkeys):
272 of.write("## %s\n\n" % k)
273 prevname = ''
274 linecount = 0
275 for name in fixed[k]:
276 if linecount == 4:
277 linecount = 0
278 of.write('\n')
279 if prevname[:2] == name[:2] and linecount != 0:
280 of.write(" %s" % name)
281 linecount += 1
282 else:
283 if linecount != 0:
284 of.write('\n')
285 of.write("* %d: %d %s" % (pin_, pin, name))
286 linecount = 1
287 res.append((pin_, name))
288
289 prevname = name
290 pin_ += 1
291 if linecount != 0:
292 of.write('\n')
293 of.write('\n')
294
295 return res