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