[BACK]Return to umidi_quirks.c CVS log [TXT][DIR] Up to [local] / sys / dev / usb

Annotation of sys/dev/usb/umidi_quirks.c, Revision 1.1.1.1

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

CVSweb