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