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