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