umidi_quirks.c revision 1.18.14.1 1 1.18.14.1 martin /* $NetBSD: umidi_quirks.c,v 1.18.14.1 2015/01/11 14:13:25 martin Exp $ */
2 1.1 tshiozak
3 1.1 tshiozak /*
4 1.1 tshiozak * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 1.1 tshiozak * All rights reserved.
6 1.1 tshiozak *
7 1.1 tshiozak * This code is derived from software contributed to The NetBSD Foundation
8 1.6 keihan * by Takuya SHIOZAKI (tshiozak (at) NetBSD.org).
9 1.1 tshiozak *
10 1.1 tshiozak * Redistribution and use in source and binary forms, with or without
11 1.1 tshiozak * modification, are permitted provided that the following conditions
12 1.1 tshiozak * are met:
13 1.1 tshiozak * 1. Redistributions of source code must retain the above copyright
14 1.1 tshiozak * notice, this list of conditions and the following disclaimer.
15 1.1 tshiozak * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 tshiozak * notice, this list of conditions and the following disclaimer in the
17 1.1 tshiozak * documentation and/or other materials provided with the distribution.
18 1.1 tshiozak *
19 1.1 tshiozak * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 tshiozak * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 tshiozak * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 tshiozak * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 tshiozak * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 tshiozak * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 tshiozak * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 tshiozak * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 tshiozak * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 tshiozak * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 tshiozak * POSSIBILITY OF SUCH DAMAGE.
30 1.1 tshiozak */
31 1.1 tshiozak
32 1.3 lukem #include <sys/cdefs.h>
33 1.18.14.1 martin __KERNEL_RCSID(0, "$NetBSD: umidi_quirks.c,v 1.18.14.1 2015/01/11 14:13:25 martin Exp $");
34 1.1 tshiozak
35 1.1 tshiozak #include <sys/param.h>
36 1.1 tshiozak #include <sys/systm.h>
37 1.1 tshiozak #include <sys/kernel.h>
38 1.1 tshiozak #include <sys/malloc.h>
39 1.1 tshiozak #include <sys/device.h>
40 1.1 tshiozak #include <sys/ioctl.h>
41 1.1 tshiozak #include <sys/conf.h>
42 1.1 tshiozak #include <sys/file.h>
43 1.1 tshiozak #include <sys/select.h>
44 1.1 tshiozak #include <sys/proc.h>
45 1.1 tshiozak #include <sys/vnode.h>
46 1.1 tshiozak #include <sys/poll.h>
47 1.1 tshiozak
48 1.1 tshiozak #include <dev/usb/usb.h>
49 1.1 tshiozak #include <dev/usb/usbdi.h>
50 1.1 tshiozak #include <dev/usb/usbdi_util.h>
51 1.1 tshiozak
52 1.18 jdc #include <dev/auconv.h>
53 1.1 tshiozak #include <dev/usb/usbdevs.h>
54 1.1 tshiozak #include <dev/usb/uaudioreg.h>
55 1.1 tshiozak #include <dev/usb/umidi_quirks.h>
56 1.1 tshiozak
57 1.1 tshiozak /*
58 1.1 tshiozak * quirk codes for UMIDI
59 1.1 tshiozak */
60 1.1 tshiozak
61 1.1 tshiozak #ifdef UMIDIQUIRK_DEBUG
62 1.1 tshiozak #define DPRINTF(x) if (umidiquirkdebug) printf x
63 1.1 tshiozak #define DPRINTFN(n,x) if (umidiquirkdebug >= (n)) printf x
64 1.1 tshiozak int umidiquirkdebug = 1;
65 1.1 tshiozak #else
66 1.1 tshiozak #define DPRINTF(x)
67 1.1 tshiozak #define DPRINTFN(n,x)
68 1.1 tshiozak #endif
69 1.1 tshiozak
70 1.1 tshiozak
71 1.1 tshiozak /*
72 1.1 tshiozak * YAMAHA UX-256
73 1.1 tshiozak * --- this is a typical yamaha device, but has a broken descriptor :-<
74 1.1 tshiozak */
75 1.1 tshiozak
76 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = {
77 1.1 tshiozak /* out */
78 1.1 tshiozak { 0, 16 },
79 1.1 tshiozak /* in */
80 1.1 tshiozak { 1, 8 }
81 1.1 tshiozak };
82 1.16 gmcgarry UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1);
83 1.1 tshiozak
84 1.1 tshiozak UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = {
85 1.1 tshiozak UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
86 1.1 tshiozak #if 0
87 1.1 tshiozak UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
88 1.1 tshiozak #endif
89 1.1 tshiozak UMQ_TERMINATOR
90 1.1 tshiozak };
91 1.1 tshiozak
92 1.1 tshiozak
93 1.1 tshiozak /*
94 1.1 tshiozak * YAMAHA generic
95 1.1 tshiozak */
96 1.1 tshiozak UMQ_DEF(YAMAHA, ANYPRODUCT, ANYIFACE) = {
97 1.1 tshiozak UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
98 1.1 tshiozak UMQ_TERMINATOR
99 1.1 tshiozak };
100 1.1 tshiozak
101 1.1 tshiozak
102 1.1 tshiozak /*
103 1.1 tshiozak * ROLAND UM-1
104 1.1 tshiozak */
105 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = {
106 1.1 tshiozak /* out */
107 1.1 tshiozak { 0, 1 },
108 1.1 tshiozak /* in */
109 1.1 tshiozak { 1, 1 }
110 1.1 tshiozak };
111 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1);
112 1.1 tshiozak
113 1.1 tshiozak UMQ_DEF(ROLAND, ROLAND_UM1, 2) = {
114 1.1 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2),
115 1.1 tshiozak UMQ_TERMINATOR
116 1.1 tshiozak };
117 1.1 tshiozak
118 1.4 tshiozak /*
119 1.4 tshiozak * ROLAND SC-8850
120 1.4 tshiozak */
121 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = {
122 1.4 tshiozak /* out */
123 1.4 tshiozak { 0, 6 },
124 1.4 tshiozak /* in */
125 1.4 tshiozak { 1, 6 }
126 1.4 tshiozak };
127 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1);
128 1.4 tshiozak
129 1.4 tshiozak UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = {
130 1.4 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2),
131 1.4 tshiozak UMQ_TERMINATOR
132 1.4 tshiozak };
133 1.4 tshiozak
134 1.4 tshiozak /*
135 1.4 tshiozak * ROLAND SD-90
136 1.4 tshiozak */
137 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = {
138 1.4 tshiozak /* out */
139 1.4 tshiozak { 0, 4 },
140 1.4 tshiozak /* in */
141 1.4 tshiozak { 1, 4 }
142 1.4 tshiozak };
143 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1);
144 1.4 tshiozak
145 1.4 tshiozak UMQ_DEF(ROLAND, ROLAND_SD90, 2) = {
146 1.4 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2),
147 1.4 tshiozak UMQ_TERMINATOR
148 1.4 tshiozak };
149 1.4 tshiozak
150 1.1 tshiozak
151 1.2 tshiozak /*
152 1.2 tshiozak * ROLAND UM-880 (native mode)
153 1.2 tshiozak */
154 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = {
155 1.2 tshiozak /* out */
156 1.2 tshiozak { 0, 9 },
157 1.2 tshiozak /* in */
158 1.2 tshiozak { 1, 9 }
159 1.2 tshiozak };
160 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1);
161 1.2 tshiozak
162 1.2 tshiozak UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = {
163 1.2 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0),
164 1.2 tshiozak UMQ_TERMINATOR
165 1.2 tshiozak };
166 1.2 tshiozak
167 1.5 jdolecek /*
168 1.5 jdolecek * ROLAND UA-100
169 1.5 jdolecek */
170 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = {
171 1.5 jdolecek /* out */
172 1.5 jdolecek { 0, 3 },
173 1.5 jdolecek /* in */
174 1.5 jdolecek { 1, 3 }
175 1.5 jdolecek };
176 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1);
177 1.5 jdolecek
178 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UA100, 2) = {
179 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2),
180 1.5 jdolecek UMQ_TERMINATOR
181 1.5 jdolecek };
182 1.5 jdolecek
183 1.5 jdolecek /*
184 1.5 jdolecek * ROLAND UM-4
185 1.5 jdolecek */
186 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = {
187 1.5 jdolecek /* out */
188 1.5 jdolecek { 0, 4 },
189 1.5 jdolecek /* in */
190 1.5 jdolecek { 1, 4 }
191 1.5 jdolecek };
192 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1);
193 1.5 jdolecek
194 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM4, 2) = {
195 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2),
196 1.5 jdolecek UMQ_TERMINATOR
197 1.5 jdolecek };
198 1.5 jdolecek
199 1.5 jdolecek /*
200 1.5 jdolecek * ROLAND U-8
201 1.5 jdolecek */
202 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = {
203 1.5 jdolecek /* out */
204 1.5 jdolecek { 0, 2 },
205 1.5 jdolecek /* in */
206 1.5 jdolecek { 1, 2 }
207 1.5 jdolecek };
208 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1);
209 1.5 jdolecek
210 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_U8, 2) = {
211 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2),
212 1.5 jdolecek UMQ_TERMINATOR
213 1.5 jdolecek };
214 1.5 jdolecek
215 1.5 jdolecek /*
216 1.5 jdolecek * ROLAND UM-2
217 1.5 jdolecek */
218 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = {
219 1.5 jdolecek /* out */
220 1.5 jdolecek { 0, 2 },
221 1.5 jdolecek /* in */
222 1.5 jdolecek { 1, 2 }
223 1.5 jdolecek };
224 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1);
225 1.5 jdolecek
226 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM2, 2) = {
227 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2),
228 1.5 jdolecek UMQ_TERMINATOR
229 1.5 jdolecek };
230 1.5 jdolecek
231 1.5 jdolecek /*
232 1.5 jdolecek * ROLAND SC-8820
233 1.5 jdolecek */
234 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = {
235 1.5 jdolecek /* out */
236 1.5 jdolecek { 0, 5 }, /* cables 0, 1, 4 only */
237 1.5 jdolecek /* in */
238 1.5 jdolecek { 1, 5 } /* do. */
239 1.5 jdolecek };
240 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1);
241 1.5 jdolecek
242 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = {
243 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2),
244 1.5 jdolecek UMQ_TERMINATOR
245 1.5 jdolecek };
246 1.5 jdolecek
247 1.5 jdolecek /*
248 1.5 jdolecek * ROLAND PC-300
249 1.5 jdolecek */
250 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = {
251 1.5 jdolecek /* out */
252 1.5 jdolecek { 0, 1 },
253 1.5 jdolecek /* in */
254 1.5 jdolecek { 1, 1 }
255 1.5 jdolecek };
256 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1);
257 1.5 jdolecek
258 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_PC300, 2) = {
259 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2),
260 1.5 jdolecek UMQ_TERMINATOR
261 1.5 jdolecek };
262 1.5 jdolecek
263 1.5 jdolecek /*
264 1.5 jdolecek * ROLAND SK-500
265 1.5 jdolecek */
266 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = {
267 1.5 jdolecek /* out */
268 1.5 jdolecek { 0, 5 }, /* cables 0, 1, 4 only */
269 1.5 jdolecek /* in */
270 1.5 jdolecek { 1, 5 } /* do. */
271 1.5 jdolecek };
272 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1);
273 1.5 jdolecek
274 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SK500, 2) = {
275 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2),
276 1.5 jdolecek UMQ_TERMINATOR
277 1.5 jdolecek };
278 1.5 jdolecek
279 1.5 jdolecek /*
280 1.5 jdolecek * ROLAND SC-D70
281 1.5 jdolecek */
282 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = {
283 1.5 jdolecek /* out */
284 1.5 jdolecek { 0, 3 },
285 1.5 jdolecek /* in */
286 1.5 jdolecek { 1, 3 }
287 1.5 jdolecek };
288 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1);
289 1.5 jdolecek
290 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = {
291 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2),
292 1.5 jdolecek UMQ_TERMINATOR
293 1.5 jdolecek };
294 1.5 jdolecek
295 1.5 jdolecek /*
296 1.5 jdolecek * ROLAND XV-5050
297 1.5 jdolecek */
298 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1) = {
299 1.5 jdolecek /* out */
300 1.5 jdolecek { 0, 1 },
301 1.5 jdolecek /* in */
302 1.5 jdolecek { 1, 1 }
303 1.5 jdolecek };
304 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1);
305 1.5 jdolecek
306 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_XV5050, 0) = {
307 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_XV5050, 0),
308 1.5 jdolecek UMQ_TERMINATOR
309 1.5 jdolecek };
310 1.5 jdolecek
311 1.5 jdolecek /*
312 1.5 jdolecek * ROLAND UM-550
313 1.5 jdolecek */
314 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = {
315 1.5 jdolecek /* out */
316 1.5 jdolecek { 0, 6 },
317 1.5 jdolecek /* in */
318 1.5 jdolecek { 1, 6 }
319 1.5 jdolecek };
320 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1);
321 1.5 jdolecek
322 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM550, 0) = {
323 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0),
324 1.5 jdolecek UMQ_TERMINATOR
325 1.5 jdolecek };
326 1.5 jdolecek
327 1.5 jdolecek /*
328 1.5 jdolecek * ROLAND SD-20
329 1.5 jdolecek */
330 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = {
331 1.5 jdolecek /* out */
332 1.5 jdolecek { 0, 2 },
333 1.5 jdolecek /* in */
334 1.5 jdolecek { 1, 3 }
335 1.5 jdolecek };
336 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1);
337 1.5 jdolecek
338 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SD20, 0) = {
339 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0),
340 1.5 jdolecek UMQ_TERMINATOR
341 1.5 jdolecek };
342 1.5 jdolecek
343 1.5 jdolecek /*
344 1.5 jdolecek * ROLAND SD-80
345 1.5 jdolecek */
346 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = {
347 1.5 jdolecek /* out */
348 1.5 jdolecek { 0, 4 },
349 1.5 jdolecek /* in */
350 1.5 jdolecek { 1, 4 }
351 1.5 jdolecek };
352 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1);
353 1.5 jdolecek
354 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SD80, 0) = {
355 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0),
356 1.5 jdolecek UMQ_TERMINATOR
357 1.5 jdolecek };
358 1.5 jdolecek
359 1.5 jdolecek /*
360 1.5 jdolecek * ROLAND UA-700
361 1.5 jdolecek */
362 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = {
363 1.5 jdolecek /* out */
364 1.5 jdolecek { 0, 2 },
365 1.5 jdolecek /* in */
366 1.5 jdolecek { 1, 2 }
367 1.5 jdolecek };
368 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1);
369 1.5 jdolecek
370 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UA700, 3) = {
371 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3),
372 1.5 jdolecek UMQ_TERMINATOR
373 1.5 jdolecek };
374 1.5 jdolecek
375 1.8 augustss /*
376 1.8 augustss * ROLAND UA-1000
377 1.8 augustss */
378 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1) = {
379 1.8 augustss /* out */
380 1.8 augustss { 0, 2 },
381 1.8 augustss /* in */
382 1.8 augustss { 1, 2 }
383 1.8 augustss };
384 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1);
385 1.8 augustss
386 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA1000, 3) = {
387 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA1000, 3),
388 1.8 augustss UMQ_TERMINATOR
389 1.8 augustss };
390 1.8 augustss
391 1.8 augustss /*
392 1.8 augustss * ROLAND UA-101
393 1.8 augustss */
394 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101, 2, 1, 1) = {
395 1.8 augustss /* out */
396 1.8 augustss { 0, 2 },
397 1.8 augustss /* in */
398 1.8 augustss { 1, 2 }
399 1.8 augustss };
400 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101, 2, 1, 1);
401 1.2 tshiozak
402 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA101, 2) = {
403 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101, 2),
404 1.8 augustss UMQ_TERMINATOR
405 1.8 augustss };
406 1.8 augustss
407 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1) = {
408 1.8 augustss /* out */
409 1.8 augustss { 0, 2 },
410 1.8 augustss /* in */
411 1.8 augustss { 1, 2 }
412 1.8 augustss };
413 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1);
414 1.8 augustss
415 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA101F, 2) = {
416 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101F, 2),
417 1.8 augustss UMQ_TERMINATOR
418 1.8 augustss };
419 1.8 augustss
420 1.8 augustss /*
421 1.8 augustss * ROLAND Fantom-X
422 1.8 augustss */
423 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1) = {
424 1.8 augustss /* out */
425 1.8 augustss { 0, 1 },
426 1.8 augustss /* in */
427 1.8 augustss { 1, 1 }
428 1.8 augustss };
429 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1);
430 1.8 augustss
431 1.8 augustss UMQ_DEF(ROLAND, ROLAND_FANTOMX, 0) = {
432 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_FANTOMX, 0),
433 1.8 augustss UMQ_TERMINATOR
434 1.8 augustss };
435 1.8 augustss
436 1.8 augustss /*
437 1.8 augustss * ROLAND PCR
438 1.8 augustss */
439 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PCR, 0, 1, 1) = {
440 1.8 augustss /* out */
441 1.8 augustss { 0, 3 },
442 1.8 augustss /* in */
443 1.8 augustss { 1, 3 }
444 1.8 augustss };
445 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PCR, 0, 1, 1);
446 1.8 augustss
447 1.8 augustss UMQ_DEF(ROLAND, ROLAND_PCR, 0) = {
448 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_PCR, 0),
449 1.8 augustss UMQ_TERMINATOR
450 1.8 augustss };
451 1.1 tshiozak
452 1.1 tshiozak /*
453 1.10 christos * ROLAND UM-3EX
454 1.10 christos */
455 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM3, 0, 1, 1) = {
456 1.10 christos /* out */
457 1.10 christos { 0, 3 },
458 1.10 christos /* in */
459 1.10 christos { 1, 3 }
460 1.10 christos };
461 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM3, 0, 1, 1);
462 1.10 christos
463 1.10 christos UMQ_DEF(ROLAND, ROLAND_UM3, 0) = {
464 1.10 christos UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM3, 0),
465 1.10 christos UMQ_TERMINATOR
466 1.10 christos };
467 1.10 christos
468 1.10 christos /*
469 1.13 xtraeme * ROLAND UA-25
470 1.13 xtraeme */
471 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA25, 2, 1, 1) = {
472 1.13 xtraeme /* out */
473 1.13 xtraeme { 0, 1 },
474 1.13 xtraeme /* in */
475 1.13 xtraeme { 1, 1 }
476 1.13 xtraeme };
477 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA25, 2, 1, 1);
478 1.13 xtraeme
479 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_UA25, 2) = {
480 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA25, 2),
481 1.13 xtraeme UMQ_TERMINATOR
482 1.13 xtraeme };
483 1.13 xtraeme
484 1.13 xtraeme /*
485 1.13 xtraeme * ROLAND UA-4FX
486 1.13 xtraeme */
487 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1) = {
488 1.13 xtraeme /* out */
489 1.13 xtraeme { 0, 1 },
490 1.13 xtraeme /* in */
491 1.13 xtraeme { 1, 1 }
492 1.13 xtraeme };
493 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1);
494 1.13 xtraeme
495 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_UA4FX, 2) = {
496 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA4FX, 2),
497 1.13 xtraeme UMQ_TERMINATOR
498 1.13 xtraeme };
499 1.13 xtraeme
500 1.13 xtraeme /*
501 1.13 xtraeme * ROLAND SonicCell
502 1.13 xtraeme */
503 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1) = {
504 1.13 xtraeme /* out */
505 1.13 xtraeme { 0, 1 },
506 1.13 xtraeme /* in */
507 1.13 xtraeme { 1, 1 }
508 1.13 xtraeme };
509 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1);
510 1.13 xtraeme
511 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_SONICCELL, 2) = {
512 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_SONICCELL, 2),
513 1.13 xtraeme UMQ_TERMINATOR
514 1.13 xtraeme };
515 1.13 xtraeme
516 1.13 xtraeme /*
517 1.17 plunky * ROLAND UM-ONE
518 1.17 plunky */
519 1.17 plunky UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1) = {
520 1.17 plunky /* out */
521 1.17 plunky { 0, 1 },
522 1.17 plunky /* in */
523 1.17 plunky { 1, 1 }
524 1.17 plunky };
525 1.17 plunky UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1);
526 1.17 plunky
527 1.17 plunky UMQ_DEF(ROLAND, ROLAND_UMONE, ANYIFACE) = {
528 1.17 plunky UMQ_FIXED_EP_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
529 1.17 plunky UMQ_TERMINATOR
530 1.17 plunky };
531 1.17 plunky
532 1.17 plunky /*
533 1.11 chap * Midiman Midisport 2x4. This has 2 physical MIDI IN jacks that are read
534 1.11 chap * on endpoint 0x81 (descriptor index 0). It has 4 physical MIDI OUT jacks
535 1.11 chap * that can be written on endpoints 2 or 4 (at descriptor index 2 or 4,
536 1.11 chap * coincidentally) interchangeably: either endpoint will accept a Cable Number
537 1.11 chap * field of 0 to 3, and data for a given CN will be routed to the same
538 1.11 chap * physical output regardless of the endpoint used for the transfer. But
539 1.11 chap * there's a catch: flow-control feedback only goes to endpoint 2 for
540 1.11 chap * CN 0 and 2, and only to endpoint 4 for CN 1 and 3. If you send output at
541 1.11 chap * high rates for CN 0 or 2 over endpoint 4, or for CN 1 or 3 over endpoint 2,
542 1.11 chap * the USB transfers complete as fast as possible, giving you an apparent data
543 1.11 chap * rate much higher than MIDI's 3125 cps (easy to measure using dd to blast a
544 1.11 chap * bunch of midi data to the rmidi device). Of course that isn't a way to make
545 1.11 chap * MIDI faster, just a way to overrun the device buffer and spray bits on the
546 1.11 chap * floor. So this device needs the fixed endpoint quirk, the fixed cable number
547 1.11 chap * quirk (to make sure CNs 0 and 2 are put on the first endpoint and 1 and 3
548 1.11 chap * on the other), and then the fixed mididev-assignment quirk (to match jacks
549 1.11 chap * to mididevs so the rmidi devices match the order of the blinkenlights).
550 1.11 chap */
551 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1) = {
552 1.11 chap /* out: ep# jacks */
553 1.11 chap { 2, 2 },
554 1.11 chap { 4, 2 },
555 1.11 chap /* in: ep# jacks */
556 1.11 chap { 0, 2 }
557 1.11 chap };
558 1.16 gmcgarry UMQ_FIXED_EP_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1);
559 1.16 gmcgarry UMQ_FIXED_CN_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
560 1.16 gmcgarry 0, 2, 1, 3, 0, 1
561 1.16 gmcgarry };
562 1.16 gmcgarry UMQ_FIXED_MD_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
563 1.16 gmcgarry 0, 0, 2, 1, 1, -1, 3, -1
564 1.16 gmcgarry };
565 1.11 chap UMQ_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = {
566 1.11 chap UMQ_FIXED_EP_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
567 1.16 gmcgarry UMQ_FIXED_CN_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
568 1.16 gmcgarry UMQ_FIXED_MD_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
569 1.11 chap UMQ_TYPE(MIDIMAN_GARBLE),
570 1.11 chap UMQ_TERMINATOR
571 1.11 chap };
572 1.11 chap
573 1.11 chap /*
574 1.1 tshiozak * quirk list
575 1.1 tshiozak */
576 1.16 gmcgarry static struct umidi_quirk umidi_quirklist[] = {
577 1.1 tshiozak UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
578 1.1 tshiozak UMQ_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
579 1.1 tshiozak UMQ_REG(ROLAND, ROLAND_UM1, 2),
580 1.4 tshiozak UMQ_REG(ROLAND, ROLAND_SC8850, 2),
581 1.4 tshiozak UMQ_REG(ROLAND, ROLAND_SD90, 2),
582 1.2 tshiozak UMQ_REG(ROLAND, ROLAND_UM880N, 0),
583 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UA100, 2),
584 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM4, 2),
585 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_U8, 2),
586 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM2, 2),
587 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SC8820, 2),
588 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_PC300, 2),
589 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SK500, 2),
590 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SCD70, 2),
591 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_XV5050, 0),
592 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM550, 0),
593 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SD20, 0),
594 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SD80, 0),
595 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UA700, 3),
596 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA1000, 3),
597 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA101, 2),
598 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA101F, 2),
599 1.8 augustss UMQ_REG(ROLAND, ROLAND_FANTOMX, 0),
600 1.8 augustss UMQ_REG(ROLAND, ROLAND_PCR, 0),
601 1.10 christos UMQ_REG(ROLAND, ROLAND_UM3, 0),
602 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_UA25, 2),
603 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_UA4FX, 2),
604 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_SONICCELL, 2),
605 1.17 plunky UMQ_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
606 1.11 chap UMQ_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE),
607 1.12 christos { .vendor = 0 },
608 1.1 tshiozak };
609 1.1 tshiozak
610 1.1 tshiozak
611 1.1 tshiozak /*
612 1.1 tshiozak * quirk utilities
613 1.1 tshiozak */
614 1.1 tshiozak
615 1.16 gmcgarry const struct umidi_quirk *
616 1.1 tshiozak umidi_search_quirk(int vendor, int product, int ifaceno)
617 1.1 tshiozak {
618 1.1 tshiozak struct umidi_quirk *p;
619 1.16 gmcgarry const struct umq_data *q;
620 1.1 tshiozak
621 1.1 tshiozak DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n",
622 1.1 tshiozak vendor, product, ifaceno));
623 1.1 tshiozak
624 1.1 tshiozak for (p=&umidi_quirklist[0]; p->vendor; p++) {
625 1.1 tshiozak DPRINTFN(10, ("\tv=%d, p=%d, i=%d",
626 1.1 tshiozak p->vendor, p->product, p->iface));
627 1.1 tshiozak if ((p->vendor==vendor || p->vendor==ANYVENDOR) &&
628 1.1 tshiozak (p->product==product || p->product==ANYPRODUCT) &&
629 1.1 tshiozak (p->iface==ifaceno || p->iface==ANYIFACE)) {
630 1.1 tshiozak DPRINTFN(10, (" found\n"));
631 1.1 tshiozak if (!p->type_mask)
632 1.1 tshiozak /* make quirk mask */
633 1.1 tshiozak for (q=p->quirks; q->type; q++)
634 1.1 tshiozak p->type_mask |= 1<<(q->type-1);
635 1.1 tshiozak return p;
636 1.8 augustss }
637 1.1 tshiozak DPRINTFN(10, ("\n"));
638 1.1 tshiozak }
639 1.1 tshiozak
640 1.1 tshiozak return NULL;
641 1.1 tshiozak }
642 1.1 tshiozak
643 1.7 christos static const char *quirk_name[] = {
644 1.1 tshiozak "NULL",
645 1.1 tshiozak "Fixed Endpoint",
646 1.1 tshiozak "Yamaha Specific",
647 1.11 chap "Midiman Packet Garbling",
648 1.11 chap "Cable Numbers per Endpoint",
649 1.11 chap "Cable Numbers Global",
650 1.11 chap "Cable Numbers Fixed",
651 1.11 chap "Unit Mapping Fixed",
652 1.1 tshiozak };
653 1.1 tshiozak
654 1.1 tshiozak void
655 1.16 gmcgarry umidi_print_quirk(const struct umidi_quirk *q)
656 1.1 tshiozak {
657 1.16 gmcgarry const struct umq_data *qd;
658 1.1 tshiozak if (q) {
659 1.1 tshiozak printf("(");
660 1.1 tshiozak for (qd=q->quirks; qd->type; qd++)
661 1.1 tshiozak printf("%s%s", quirk_name[qd->type],
662 1.1 tshiozak (qd+1)->type?", ":")\n");
663 1.1 tshiozak } else {
664 1.1 tshiozak printf("(genuine USB-MIDI)\n");
665 1.1 tshiozak }
666 1.1 tshiozak }
667 1.1 tshiozak
668 1.16 gmcgarry const void *
669 1.16 gmcgarry umidi_get_quirk_data_from_type(const struct umidi_quirk *q, u_int32_t type)
670 1.1 tshiozak {
671 1.16 gmcgarry const struct umq_data *qd;
672 1.1 tshiozak if (q) {
673 1.1 tshiozak for (qd=q->quirks; qd->type; qd++)
674 1.1 tshiozak if (qd->type == type)
675 1.1 tshiozak return qd->data;
676 1.1 tshiozak }
677 1.1 tshiozak return NULL;
678 1.1 tshiozak }
679