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