This source file includes following definitions.
- umidi_search_quirk
- umidi_print_quirk
- umidi_get_quirk_data_from_type
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/malloc.h>
44 #include <sys/device.h>
45 #include <sys/ioctl.h>
46 #include <sys/conf.h>
47 #include <sys/file.h>
48 #include <sys/selinfo.h>
49 #include <sys/proc.h>
50 #include <sys/vnode.h>
51 #include <sys/poll.h>
52
53 #include <dev/usb/usb.h>
54 #include <dev/usb/usbdi.h>
55 #include <dev/usb/usbdi_util.h>
56
57 #include <dev/usb/usbdevs.h>
58 #include <dev/usb/uaudioreg.h>
59 #include <dev/usb/umidireg.h>
60 #include <dev/usb/umidivar.h>
61 #include <dev/usb/umidi_quirks.h>
62
63
64
65
66
67 #ifdef UMIDIQUIRK_DEBUG
68 #define DPRINTF(x) if (umidiquirkdebug) printf x
69 #define DPRINTFN(n,x) if (umidiquirkdebug >= (n)) printf x
70 int umidiquirkdebug = 1;
71 #else
72 #define DPRINTF(x)
73 #define DPRINTFN(n,x)
74 #endif
75
76
77
78
79
80
81
82 UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = {
83
84 { 0, 16 },
85
86 { 1, 8 }
87 };
88
89 UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = {
90 UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
91 #if 0
92 UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
93 #endif
94 UMQ_TERMINATOR
95 };
96
97
98
99
100
101 UMQ_DEF(YAMAHA, ANYPRODUCT, ANYIFACE) = {
102 UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
103 UMQ_TERMINATOR
104 };
105
106
107
108
109
110 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = {
111
112 { 0, 1 },
113
114 { 1, 1 }
115 };
116
117 UMQ_DEF(ROLAND, ROLAND_UM1, 2) = {
118 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2),
119 UMQ_TERMINATOR
120 };
121
122
123
124
125 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = {
126
127 { 0, 6 },
128
129 { 1, 6 }
130 };
131
132 UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = {
133 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2),
134 UMQ_TERMINATOR
135 };
136
137
138
139
140 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = {
141
142 { 0, 4 },
143
144 { 1, 4 }
145 };
146
147 UMQ_DEF(ROLAND, ROLAND_SD90, 2) = {
148 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2),
149 UMQ_TERMINATOR
150 };
151
152
153
154
155
156 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = {
157
158 { 0, 9 },
159
160 { 1, 9 }
161 };
162
163 UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = {
164 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0),
165 UMQ_TERMINATOR
166 };
167
168
169
170
171 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = {
172
173 { 0, 3 },
174
175 { 1, 3 }
176 };
177
178 UMQ_DEF(ROLAND, ROLAND_UA100, 2) = {
179 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2),
180 UMQ_TERMINATOR
181 };
182
183
184
185
186 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = {
187
188 { 0, 4 },
189
190 { 1, 4 }
191 };
192
193 UMQ_DEF(ROLAND, ROLAND_UM4, 2) = {
194 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2),
195 UMQ_TERMINATOR
196 };
197
198
199
200
201 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = {
202
203 { 0, 2 },
204
205 { 1, 2 }
206 };
207
208 UMQ_DEF(ROLAND, ROLAND_U8, 2) = {
209 UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2),
210 UMQ_TERMINATOR
211 };
212
213
214
215
216 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = {
217
218 { 0, 2 },
219
220 { 1, 2 }
221 };
222
223 UMQ_DEF(ROLAND, ROLAND_UM2, 2) = {
224 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2),
225 UMQ_TERMINATOR
226 };
227
228
229
230
231 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = {
232
233 { 0, 5 },
234
235 { 1, 5 }
236 };
237
238 UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = {
239 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2),
240 UMQ_TERMINATOR
241 };
242
243
244
245
246 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = {
247
248 { 0, 1 },
249
250 { 1, 1 }
251 };
252
253 UMQ_DEF(ROLAND, ROLAND_PC300, 2) = {
254 UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2),
255 UMQ_TERMINATOR
256 };
257
258
259
260
261 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = {
262
263 { 0, 5 },
264
265 { 1, 5 }
266 };
267
268 UMQ_DEF(ROLAND, ROLAND_SK500, 2) = {
269 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2),
270 UMQ_TERMINATOR
271 };
272
273
274
275
276 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = {
277
278 { 0, 3 },
279
280 { 1, 3 }
281 };
282
283 UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = {
284 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2),
285 UMQ_TERMINATOR
286 };
287
288
289
290
291 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = {
292
293 { 0, 6 },
294
295 { 1, 6 }
296 };
297
298 UMQ_DEF(ROLAND, ROLAND_UM550, 0) = {
299 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0),
300 UMQ_TERMINATOR
301 };
302
303
304
305
306 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = {
307
308 { 0, 2 },
309
310 { 1, 3 }
311 };
312
313 UMQ_DEF(ROLAND, ROLAND_SD20, 0) = {
314 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0),
315 UMQ_TERMINATOR
316 };
317
318
319
320
321 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = {
322
323 { 0, 4 },
324
325 { 1, 4 }
326 };
327
328 UMQ_DEF(ROLAND, ROLAND_SD80, 0) = {
329 UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0),
330 UMQ_TERMINATOR
331 };
332
333
334
335
336 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = {
337
338 { 0, 2 },
339
340 { 1, 2 }
341 };
342
343 UMQ_DEF(ROLAND, ROLAND_UA700, 3) = {
344 UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3),
345 UMQ_TERMINATOR
346 };
347
348
349
350
351
352 struct umidi_quirk umidi_quirklist[] = {
353 UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
354 UMQ_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
355 UMQ_REG(ROLAND, ROLAND_UM1, 2),
356 UMQ_REG(ROLAND, ROLAND_SC8850, 2),
357 UMQ_REG(ROLAND, ROLAND_SD90, 2),
358 UMQ_REG(ROLAND, ROLAND_UM880N, 0),
359 UMQ_REG(ROLAND, ROLAND_UA100, 2),
360 UMQ_REG(ROLAND, ROLAND_UM4, 2),
361 UMQ_REG(ROLAND, ROLAND_U8, 2),
362 UMQ_REG(ROLAND, ROLAND_UM2, 2),
363 UMQ_REG(ROLAND, ROLAND_SC8820, 2),
364 UMQ_REG(ROLAND, ROLAND_PC300, 2),
365 UMQ_REG(ROLAND, ROLAND_SK500, 2),
366 UMQ_REG(ROLAND, ROLAND_SCD70, 2),
367 UMQ_REG(ROLAND, ROLAND_UM550, 0),
368 UMQ_REG(ROLAND, ROLAND_SD20, 0),
369 UMQ_REG(ROLAND, ROLAND_SD80, 0),
370 UMQ_REG(ROLAND, ROLAND_UA700, 3),
371 UMQ_TERMINATOR
372 };
373
374
375
376
377
378
379 struct umidi_quirk *
380 umidi_search_quirk(int vendor, int product, int ifaceno)
381 {
382 struct umidi_quirk *p;
383 struct umq_data *q;
384
385 DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n",
386 vendor, product, ifaceno));
387
388 for (p=&umidi_quirklist[0]; p->vendor; p++) {
389 DPRINTFN(10, ("\tv=%d, p=%d, i=%d",
390 p->vendor, p->product, p->iface));
391 if ((p->vendor==vendor || p->vendor==ANYVENDOR) &&
392 (p->product==product || p->product==ANYPRODUCT) &&
393 (p->iface==ifaceno || p->iface==ANYIFACE)) {
394 DPRINTFN(10, (" found\n"));
395 if (!p->type_mask)
396
397 for (q=p->quirks; q->type; q++)
398 p->type_mask |= 1<<(q->type-1);
399 return p;
400 }
401 DPRINTFN(10, ("\n"));
402 }
403
404 return NULL;
405 }
406
407 static char *quirk_name[] = {
408 "NULL",
409 "Fixed Endpoint",
410 "Yamaha Specific",
411 };
412
413 void
414 umidi_print_quirk(struct umidi_quirk *q)
415 {
416 struct umq_data *qd;
417 if (q) {
418 printf("(");
419 for (qd=q->quirks; qd->type; qd++)
420 printf("%s%s", quirk_name[qd->type],
421 (qd+1)->type?", ":")\n");
422 } else {
423 printf("(genuine USB-MIDI)\n");
424 }
425 }
426
427 void *
428 umidi_get_quirk_data_from_type(struct umidi_quirk *q, u_int32_t type)
429 {
430 struct umq_data *qd;
431 if (q) {
432 for (qd=q->quirks; qd->type; qd++)
433 if (qd->type == type)
434 return qd->data;
435 }
436 return NULL;
437 }