add descriptions and scenario
[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(0, 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 #fblower = fnbase.lower()
84 assert fnbase in function_names, "fn %s not in descriptions %s" % \
85 (fname, str(function_names.keys()))
86 #print "name", fname, fnbase
87 if fnbase != current_fn:
88 if current_fn is not None:
89 of.write('\n')
90 of.write("## %s\n\n%s\n\n" % (fnbase, function_names[fnbase]))
91 current_fn = fnbase
92 of.write("* %-9s :" % fname)
93 for (pin, mux, bank) in fns[fname]:
94 of.write(" %s%d/%d" % (bank, pin, mux))
95 of.write('\n')
96
97 return fns
98
99
100 def check_functions(of, title, bankspec, fns, pins, required, eint, pwm,
101 descriptions=None):
102 fns = deepcopy(fns)
103 pins = deepcopy(pins)
104 if descriptions is None:
105 descriptions = {}
106 fnidx = fns.keys()
107
108 #print dir(fns)
109 #print dir(pins)
110
111 of.write("# Pinmap for %s\n\n" % title)
112
113 print "fn_idx", fnidx
114 print "fns", fns
115 print "fnspec", pins.fnspec.keys()
116 print "required", required
117 for name in required:
118 of.write("## %s\n\n" % name)
119 if descriptions and name in descriptions:
120 of.write("%s\n\n" % descriptions[name])
121
122 name = name.split(':')
123 if len(name) == 2:
124 findbank = name[0][0]
125 findmux = int(name[0][1:])
126 name = name[1]
127 else:
128 name = name[0]
129 findbank = None
130 findmux = None
131 name = name.split('/')
132 if len(name) == 2:
133 count = int(name[1])
134 else:
135 count = 100000
136 name = name[0]
137 #print name
138 found = set()
139 pinfound = {}
140 located = set()
141 for fname in fnidx:
142 if not fname.startswith(name):
143 continue
144 for k in pins.fnspec.keys():
145 if fname.startswith(k):
146 fk = list(pins.fnspec[k].keys())
147 fn = pins.fnspec[k]
148 fn = fn[fk[0]]
149 #print fname, fn, dir(fn)
150 if count == 100000:
151 count = len(fn.pingroup)
152 for pin, mux, bank in fns[fname]:
153 if findbank is not None:
154 if findbank != bank:
155 continue
156 if findmux != mux:
157 continue
158 pin_ = pin + bankspec[bank]
159 if pin_ in pins:
160 pinfound[pin_] = (fname, pin_, bank, pin, mux)
161
162 pinidx = sorted(pinfound.keys())
163
164 fname = None
165 removedcount = 0
166 print ("pinidx", pinidx)
167 for pin_ in pinidx:
168 fname, pin_, bank, pin, mux = pinfound[pin_]
169 if fname in found:
170 continue
171 found.add(fname)
172 if len(found) > count:
173 continue
174 del pins[pin_]
175 removedcount += 1
176 of.write("* %s %d %s%d/%d\n" % (fname, pin_, bank, pin, mux))
177
178 print fns
179 if removedcount != count:
180 if fname is None:
181 print "no match between required and available pins"
182 else:
183 print ("not all found", name, removedcount, count, title, found,
184 fns[fname])
185 print ("pins found", pinfound)
186
187 # fnidx.sort(fnsort)
188 of.write('\n')
189
190 # gpios
191 gpios = []
192 for name in descriptions.keys():
193 if not name.startswith('GPIO'):
194 continue
195 if name == 'GPIO':
196 continue
197 gpios.append(name)
198 gpios.sort()
199
200 if gpios:
201 of.write("## GPIO\n\n")
202
203 for fname in gpios:
204 if fname in found:
205 continue
206 desc = ''
207 if descriptions and fname in descriptions:
208 desc = ': %s' % descriptions[fname]
209 bank = fname[4]
210 pin = int(fname[7:])
211 pin_ = pin + bankspec[bank]
212 if pin_ not in pins:
213 continue
214 del pins[pin_]
215 found.add(fname)
216 of.write("* %-8s %d %s%-2d %s\n" % (fname, pin_, bank, pin, desc))
217 of.write('\n')
218
219 if eint:
220 display_group(of, bankspec, "EINT", eint, fns, pins, descriptions)
221 if pwm:
222 display_group(of, bankspec, "PWM", pwm, fns, pins, descriptions)
223
224 of.write("## Unused Pinouts (spare as GPIO) for '%s'\n\n" % title)
225 if descriptions and 'GPIO' in descriptions:
226 of.write("%s\n\n" % descriptions['GPIO'])
227 display(of, pins)
228 of.write('\n')
229
230 return pins # unused
231
232
233 def display_group(of, bankspec, title, todisplay, fns, pins, descriptions):
234 of.write("## %s\n\n" % title)
235
236 found = set()
237 for fname in todisplay:
238 desc = ''
239 if descriptions and fname in descriptions:
240 desc = ': %s' % descriptions[fname]
241 fname = fname.split(':')
242 if len(fname) == 2:
243 findbank = fname[0][0]
244 findmux = int(fname[0][1:])
245 fname = fname[1]
246 else:
247 fname = fname[0]
248 findbank = None
249 findmux = None
250 for (pin, mux, bank) in fns[fname]:
251 if findbank is not None:
252 if findbank != bank:
253 continue
254 if findmux != mux:
255 continue
256 if fname in found:
257 continue
258 pin_ = pin + bankspec[bank]
259 if pin_ not in pins:
260 continue
261 del pins[pin_]
262 found.add(fname)
263 of.write("* %s %d %s%d/%d %s\n" %
264 (fname, pin_, bank, pin, mux, desc))
265 of.write('\n')
266
267
268 def display_fixed(of, fixed, offs):
269
270 fkeys = sorted(fixed.keys())
271 pin_ = offs
272 res = []
273 for pin, k in enumerate(fkeys):
274 of.write("## %s\n\n" % k)
275 prevname = ''
276 linecount = 0
277 for name in fixed[k]:
278 if linecount == 4:
279 linecount = 0
280 of.write('\n')
281 if prevname[:2] == name[:2] and linecount != 0:
282 of.write(" %s" % name)
283 linecount += 1
284 else:
285 if linecount != 0:
286 of.write('\n')
287 of.write("* %d: %d %s" % (pin_, pin, name))
288 linecount = 1
289 res.append((pin_, name))
290
291 prevname = name
292 pin_ += 1
293 if linecount != 0:
294 of.write('\n')
295 of.write('\n')
296
297 return res