Home | History | Annotate | Line # | Download | only in usb
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