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