1 /* $NetBSD: umidi_quirks.h,v 1.6 2006/09/03 21:28:03 christos 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 40 /* 41 * quirk code for UMIDI 42 */ 43 44 #ifndef _DEV_USB_UMIDI_QUIRKS_H_ 45 #define _DEV_USB_UMIDI_QUIRKS_H_ 46 47 struct umq_data { 48 int type; 49 #define UMQ_TYPE_NONE 0 50 #define UMQ_TYPE_FIXED_EP 1 51 #define UMQ_TYPE_YAMAHA 2 52 #define UMQ_TYPE_MIDIMAN_GARBLE 3 53 #define UMQ_TYPE_CN_SEQ_PER_EP 4 /* should be default behavior, but isn't */ 54 #define UMQ_TYPE_CN_SEQ_GLOBAL 5 /* shouldn't be default behavior, but is */ 55 #define UMQ_TYPE_CN_FIXED 6 /* should be a joke, but isn't funny */ 56 #define UMQ_TYPE_MD_FIXED 7 /* in case CN_FIXED gives a weird order */ 57 void *data; 58 }; 59 60 struct umidi_quirk { 61 int vendor; 62 int product; 63 int iface; 64 struct umq_data *quirks; 65 u_int32_t type_mask; 66 }; 67 #define UMQ_ISTYPE(q, type) \ 68 ((q)->sc_quirk && ((q)->sc_quirk->type_mask & (1<<((type)-1)))) 69 70 #define UMQ_TERMINATOR { .type = UMQ_TYPE_NONE, }, 71 #define UMQ_DEF(v, p, i) \ 72 static struct umq_data umq_##v##_##p##_##i[] 73 #define UMQ_REG(v, p, i) \ 74 { USB_VENDOR_##v, USB_PRODUCT_##p, i, \ 75 umq_##v##_##p##_##i, 0 } 76 #define ANYIFACE -1 77 #define ANYVENDOR -1 78 #define USB_VENDOR_ANYVENDOR ANYVENDOR 79 #define ANYPRODUCT -1 80 #define USB_PRODUCT_ANYPRODUCT ANYPRODUCT 81 82 /* 83 * quirk - fixed port. By the way, the ep field contains not the 84 * endpoint address, but the index of the endpoint descriptor. 85 */ 86 87 struct umq_fixed_ep_endpoint { 88 int ep; 89 int num_jacks; 90 }; 91 struct umq_fixed_ep_desc { 92 int num_out_ep; 93 int num_in_ep; 94 struct umq_fixed_ep_endpoint *out_ep; 95 struct umq_fixed_ep_endpoint *in_ep; 96 }; 97 98 #define UMQ_FIXED_EP_DEF(v, p, i, noep, niep) \ 99 static struct umq_fixed_ep_endpoint \ 100 umq_##v##_##p##_##i##_fixed_ep_endpoints[noep+niep]; \ 101 static struct umq_fixed_ep_desc \ 102 umq_##v##_##p##_##i##_fixed_ep_desc = { \ 103 noep, niep, \ 104 &umq_##v##_##p##_##i##_fixed_ep_endpoints[0], \ 105 &umq_##v##_##p##_##i##_fixed_ep_endpoints[noep], \ 106 }; \ 107 static struct umq_fixed_ep_endpoint \ 108 umq_##v##_##p##_##i##_fixed_ep_endpoints[noep+niep] 109 110 #define UMQ_FIXED_EP_REG(v, p, i) \ 111 { UMQ_TYPE_FIXED_EP, (void *)&umq_##v##_##p##_##i##_fixed_ep_desc } 112 113 /* 114 * quirk - fixed cable numbers. Supply as many values as there are jacks, 115 * in the same jack order implied by the FIXED_EP_DEF. Each value becomes 116 * the cable number of the corresponding jack. 117 */ 118 #if __STDC_VERSION__ >= 199901L 119 #define UMQ_CN_FIXED_REG(...) \ 120 { .type=UMQ_TYPE_CN_FIXED, .data=(unsigned char[]){__VA_ARGS__} } 121 #else /* assume gcc 2.95.3 */ 122 #define UMQ_CN_FIXED_REG(cns...) \ 123 { .type=UMQ_TYPE_CN_FIXED, .data=(unsigned char[]){cns} } 124 #endif 125 126 /* 127 * quirk - fixed mididev assignment. Supply pairs of numbers out, in, as 128 * many pairs as mididevs (that is, max(num_out_jack,num_in_jack)). The 129 * pairs, in order, correspond to the mididevs that will be created; in 130 * each pair, out is the index of the out_jack to bind and in is the 131 * index of the in_jack, both in the order implied by the FIXED_EP_DEF. 132 * Either out or in can be -1 to bind no out jack or in jack, respectively, 133 * to the corresponding mididev. 134 */ 135 #if __STDC_VERSION__ >= 199901L 136 #define UMQ_MD_FIXED_REG(...) \ 137 { .type=UMQ_TYPE_MD_FIXED, .data=(unsigned char[]){__VA_ARGS__} } 138 #else /* assume gcc 2.95.3 */ 139 #define UMQ_MD_FIXED_REG(mds...) \ 140 { .type=UMQ_TYPE_MD_FIXED, .data=(unsigned char[]){mds} } 141 #endif 142 143 /* 144 * generic boolean quirk, no data 145 */ 146 #define UMQ_TYPE(t) \ 147 { UMQ_TYPE_##t, NULL } 148 149 /* 150 * quirk - yamaha style midi I/F 151 */ 152 #define UMQ_YAMAHA_REG(v, p, i) \ 153 UMQ_TYPE(YAMAHA) 154 155 156 /* extern struct umidi_quirk umidi_quirklist[]; */ 157 struct umidi_quirk *umidi_search_quirk(int, int, int); 158 void umidi_print_quirk(struct umidi_quirk *); 159 void *umidi_get_quirk_data_from_type(struct umidi_quirk *, u_int32_t); 160 161 #endif 162