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