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