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