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