The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/usb/umidi_quirks.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: umidi_quirks.c,v 1.6 2003/12/04 13:57:31 keihan Exp $  */
    2 
    3 /*
    4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Takuya SHIOZAKI (tshiozak@NetBSD.org).
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. All advertising materials mentioning features or use of this software
   19  *    must display the following acknowledgement:
   20  *        This product includes software developed by the NetBSD
   21  *        Foundation, Inc. and its contributors.
   22  * 4. Neither the name of The NetBSD Foundation nor the names of its
   23  *    contributors may be used to endorse or promote products derived
   24  *    from this software without specific prior written permission.
   25  *
   26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   36  * POSSIBILITY OF SUCH DAMAGE.
   37  */
   38 
   39 #include <sys/cdefs.h>
   40 __KERNEL_RCSID(0, "$NetBSD: umidi_quirks.c,v 1.6 2003/12/04 13:57:31 keihan Exp $");
   41 
   42 #include <sys/param.h>
   43 #include <sys/systm.h>
   44 #include <sys/kernel.h>
   45 #include <sys/malloc.h>
   46 #include <sys/device.h>
   47 #include <sys/ioctl.h>
   48 #include <sys/conf.h>
   49 #include <sys/file.h>
   50 #include <sys/select.h>
   51 #include <sys/proc.h>
   52 #include <sys/vnode.h>
   53 #include <sys/poll.h>
   54 #include <sys/lock.h>
   55 
   56 #include <dev/usb/usb.h>
   57 #include <dev/usb/usbdi.h>
   58 #include <dev/usb/usbdi_util.h>
   59 
   60 #include <dev/usb/usbdevs.h>
   61 #include <dev/usb/uaudioreg.h>
   62 #include <dev/usb/umidireg.h>
   63 #include <dev/usb/umidivar.h>
   64 #include <dev/usb/umidi_quirks.h>
   65 
   66 /*
   67  * quirk codes for UMIDI
   68  */
   69 
   70 #ifdef UMIDIQUIRK_DEBUG
   71 #define DPRINTF(x)      if (umidiquirkdebug) printf x
   72 #define DPRINTFN(n,x)   if (umidiquirkdebug >= (n)) printf x
   73 int     umidiquirkdebug = 1;
   74 #else
   75 #define DPRINTF(x)
   76 #define DPRINTFN(n,x)
   77 #endif
   78 
   79 
   80 /*
   81  * YAMAHA UX-256
   82  *  --- this is a typical yamaha device, but has a broken descriptor :-<
   83  */
   84 
   85 UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = {
   86         /* out */
   87         { 0, 16 },
   88         /* in */
   89         { 1, 8 }
   90 };
   91 
   92 UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = {
   93         UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
   94 #if 0
   95         UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
   96 #endif
   97         UMQ_TERMINATOR
   98 };
   99 
  100 
  101 /*
  102  * YAMAHA generic
  103  */
  104 UMQ_DEF(YAMAHA, ANYPRODUCT, ANYIFACE) = {
  105         UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
  106         UMQ_TERMINATOR
  107 };
  108 
  109 
  110 /*
  111  * ROLAND UM-1
  112  */
  113 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = {
  114         /* out */
  115         { 0, 1 },
  116         /* in */
  117         { 1, 1 }
  118 };
  119 
  120 UMQ_DEF(ROLAND, ROLAND_UM1, 2) = {
  121         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2),
  122         UMQ_TERMINATOR
  123 };
  124 
  125 /*
  126  * ROLAND SC-8850
  127  */
  128 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = {
  129         /* out */
  130         { 0, 6 },
  131         /* in */
  132         { 1, 6 }
  133 };
  134 
  135 UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = {
  136         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2),
  137         UMQ_TERMINATOR
  138 };
  139 
  140 /*
  141  * ROLAND SD-90
  142  */
  143 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = {
  144         /* out */
  145         { 0, 4 },
  146         /* in */
  147         { 1, 4 }
  148 };
  149 
  150 UMQ_DEF(ROLAND, ROLAND_SD90, 2) = {
  151         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2),
  152         UMQ_TERMINATOR
  153 };
  154 
  155 
  156 /*
  157  * ROLAND UM-880 (native mode)
  158  */
  159 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = {
  160         /* out */
  161         { 0, 9 },
  162         /* in */
  163         { 1, 9 }
  164 };
  165 
  166 UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = {
  167         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0),
  168         UMQ_TERMINATOR
  169 };
  170 
  171 /*
  172  * ROLAND UA-100
  173  */
  174 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = {
  175         /* out */
  176         { 0, 3 },
  177         /* in */
  178         { 1, 3 }
  179 };
  180 
  181 UMQ_DEF(ROLAND, ROLAND_UA100, 2) = {
  182         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2),
  183         UMQ_TERMINATOR
  184 };
  185 
  186 /*
  187  * ROLAND UM-4
  188  */
  189 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = {
  190         /* out */
  191         { 0, 4 },
  192         /* in */
  193         { 1, 4 }
  194 };
  195 
  196 UMQ_DEF(ROLAND, ROLAND_UM4, 2) = {
  197         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2),
  198         UMQ_TERMINATOR
  199 };
  200 
  201 /*
  202  * ROLAND U-8
  203  */
  204 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = {
  205         /* out */
  206         { 0, 2 },
  207         /* in */
  208         { 1, 2 }
  209 };
  210 
  211 UMQ_DEF(ROLAND, ROLAND_U8, 2) = {
  212         UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2),
  213         UMQ_TERMINATOR
  214 };
  215 
  216 /*
  217  * ROLAND UM-2
  218  */
  219 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = {
  220         /* out */
  221         { 0, 2 },
  222         /* in */
  223         { 1, 2 }
  224 };
  225 
  226 UMQ_DEF(ROLAND, ROLAND_UM2, 2) = {
  227         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2),
  228         UMQ_TERMINATOR
  229 };
  230 
  231 /*
  232  * ROLAND SC-8820
  233  */
  234 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = {
  235         /* out */
  236         { 0, 5 }, /* cables 0, 1, 4 only */
  237         /* in */
  238         { 1, 5 } /* do. */
  239 };
  240 
  241 UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = {
  242         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2),
  243         UMQ_TERMINATOR
  244 };
  245 
  246 /*
  247  * ROLAND PC-300
  248  */
  249 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = {
  250         /* out */
  251         { 0, 1 },
  252         /* in */
  253         { 1, 1 }
  254 };
  255 
  256 UMQ_DEF(ROLAND, ROLAND_PC300, 2) = {
  257         UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2),
  258         UMQ_TERMINATOR
  259 };
  260 
  261 /*
  262  * ROLAND SK-500
  263  */
  264 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = {
  265         /* out */
  266         { 0, 5 }, /* cables 0, 1, 4 only */
  267         /* in */
  268         { 1, 5 } /* do. */
  269 };
  270 
  271 UMQ_DEF(ROLAND, ROLAND_SK500, 2) = {
  272         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2),
  273         UMQ_TERMINATOR
  274 };
  275 
  276 /*
  277  * ROLAND SC-D70
  278  */
  279 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = {
  280         /* out */
  281         { 0, 3 },
  282         /* in */
  283         { 1, 3 }
  284 };
  285 
  286 UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = {
  287         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2),
  288         UMQ_TERMINATOR
  289 };
  290 
  291 /*
  292  * ROLAND XV-5050
  293  */
  294 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1) = {
  295         /* out */
  296         { 0, 1 },
  297         /* in */
  298         { 1, 1 }
  299 };
  300 
  301 UMQ_DEF(ROLAND, ROLAND_XV5050, 0) = {
  302         UMQ_FIXED_EP_REG(ROLAND, ROLAND_XV5050, 0),
  303         UMQ_TERMINATOR
  304 };
  305 
  306 /*
  307  * ROLAND UM-550
  308  */
  309 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = {
  310         /* out */
  311         { 0, 6 },
  312         /* in */
  313         { 1, 6 }
  314 };
  315 
  316 UMQ_DEF(ROLAND, ROLAND_UM550, 0) = {
  317         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0),
  318         UMQ_TERMINATOR
  319 };
  320 
  321 /*
  322  * ROLAND SD-20
  323  */
  324 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = {
  325         /* out */
  326         { 0, 2 },
  327         /* in */
  328         { 1, 3 }
  329 };
  330 
  331 UMQ_DEF(ROLAND, ROLAND_SD20, 0) = {
  332         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0),
  333         UMQ_TERMINATOR
  334 };
  335 
  336 /*
  337  * ROLAND SD-80
  338  */
  339 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = {
  340         /* out */
  341         { 0, 4 },
  342         /* in */
  343         { 1, 4 }
  344 };
  345 
  346 UMQ_DEF(ROLAND, ROLAND_SD80, 0) = {
  347         UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0),
  348         UMQ_TERMINATOR
  349 };
  350 
  351 /*
  352  * ROLAND UA-700
  353  */
  354 UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = {
  355         /* out */
  356         { 0, 2 },
  357         /* in */
  358         { 1, 2 }
  359 };
  360 
  361 UMQ_DEF(ROLAND, ROLAND_UA700, 3) = {
  362         UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3),
  363         UMQ_TERMINATOR
  364 };
  365 
  366 
  367 
  368 /*
  369  * quirk list
  370  */
  371 struct umidi_quirk umidi_quirklist[] = {
  372         UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
  373         UMQ_REG(YAMAHA, ANYPRODUCT, ANYIFACE),
  374         UMQ_REG(ROLAND, ROLAND_UM1, 2),
  375         UMQ_REG(ROLAND, ROLAND_SC8850, 2),
  376         UMQ_REG(ROLAND, ROLAND_SD90, 2),
  377         UMQ_REG(ROLAND, ROLAND_UM880N, 0),
  378         UMQ_REG(ROLAND, ROLAND_UA100, 2),
  379         UMQ_REG(ROLAND, ROLAND_UM4, 2),
  380         UMQ_REG(ROLAND, ROLAND_U8, 2),
  381         UMQ_REG(ROLAND, ROLAND_UM2, 2),
  382         UMQ_REG(ROLAND, ROLAND_SC8820, 2),
  383         UMQ_REG(ROLAND, ROLAND_PC300, 2),
  384         UMQ_REG(ROLAND, ROLAND_SK500, 2),
  385         UMQ_REG(ROLAND, ROLAND_SCD70, 2),
  386         UMQ_REG(ROLAND, ROLAND_XV5050, 0),
  387         UMQ_REG(ROLAND, ROLAND_UM550, 0),
  388         UMQ_REG(ROLAND, ROLAND_SD20, 0),
  389         UMQ_REG(ROLAND, ROLAND_SD80, 0),
  390         UMQ_REG(ROLAND, ROLAND_UA700, 3),
  391         UMQ_TERMINATOR
  392 };
  393 
  394 
  395 /*
  396  * quirk utilities
  397  */
  398 
  399 struct umidi_quirk *
  400 umidi_search_quirk(int vendor, int product, int ifaceno)
  401 {
  402         struct umidi_quirk *p;
  403         struct umq_data *q;
  404 
  405         DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n",
  406                  vendor, product, ifaceno));
  407 
  408         for (p=&umidi_quirklist[0]; p->vendor; p++) {
  409                 DPRINTFN(10, ("\tv=%d, p=%d, i=%d",
  410                               p->vendor, p->product, p->iface));
  411                 if ((p->vendor==vendor || p->vendor==ANYVENDOR) &&
  412                     (p->product==product || p->product==ANYPRODUCT) &&
  413                     (p->iface==ifaceno || p->iface==ANYIFACE)) {
  414                         DPRINTFN(10, (" found\n"));
  415                         if (!p->type_mask)
  416                                 /* make quirk mask */
  417                                 for (q=p->quirks; q->type; q++)
  418                                         p->type_mask |= 1<<(q->type-1);
  419                         return p;
  420                 }
  421                 DPRINTFN(10, ("\n"));
  422         }
  423 
  424         return NULL;
  425 }
  426 
  427 static char *quirk_name[] = {
  428         "NULL",
  429         "Fixed Endpoint",
  430         "Yamaha Specific",
  431 };
  432 
  433 void
  434 umidi_print_quirk(struct umidi_quirk *q)
  435 {
  436         struct umq_data *qd;
  437         if (q) {
  438                 printf("(");
  439                 for (qd=q->quirks; qd->type; qd++)
  440                         printf("%s%s", quirk_name[qd->type],
  441                                (qd+1)->type?", ":")\n");
  442         } else {
  443                 printf("(genuine USB-MIDI)\n");
  444         }
  445 }
  446 
  447 void *
  448 umidi_get_quirk_data_from_type(struct umidi_quirk *q, u_int32_t type)
  449 {
  450         struct umq_data *qd;
  451         if (q) {
  452                 for (qd=q->quirks; qd->type; qd++)
  453                         if (qd->type == type)
  454                                 return qd->data;
  455         }
  456         return NULL;
  457 }

Cache object: af88cc9d30158c190229eced2c05ff46


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.