1 1.22 isaki /* $NetBSD: umidi_quirks.c,v 1.22 2019/05/08 13:40:19 isaki 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.22 isaki __KERNEL_RCSID(0, "$NetBSD: umidi_quirks.c,v 1.22 2019/05/08 13:40:19 isaki Exp $"); 34 1.21 skrll 35 1.21 skrll #ifdef _KERNEL_OPT 36 1.21 skrll #include "opt_usb.h" 37 1.21 skrll #endif 38 1.1 tshiozak 39 1.1 tshiozak #include <sys/param.h> 40 1.1 tshiozak #include <sys/systm.h> 41 1.1 tshiozak #include <sys/kernel.h> 42 1.22 isaki #include <sys/audioio.h> 43 1.1 tshiozak #include <sys/device.h> 44 1.1 tshiozak #include <sys/ioctl.h> 45 1.1 tshiozak #include <sys/conf.h> 46 1.1 tshiozak #include <sys/file.h> 47 1.1 tshiozak #include <sys/select.h> 48 1.1 tshiozak #include <sys/proc.h> 49 1.1 tshiozak #include <sys/vnode.h> 50 1.1 tshiozak #include <sys/poll.h> 51 1.1 tshiozak 52 1.1 tshiozak #include <dev/usb/usb.h> 53 1.1 tshiozak #include <dev/usb/usbdi.h> 54 1.1 tshiozak #include <dev/usb/usbdi_util.h> 55 1.1 tshiozak 56 1.1 tshiozak #include <dev/usb/usbdevs.h> 57 1.1 tshiozak #include <dev/usb/uaudioreg.h> 58 1.1 tshiozak #include <dev/usb/umidi_quirks.h> 59 1.1 tshiozak 60 1.1 tshiozak /* 61 1.1 tshiozak * quirk codes for UMIDI 62 1.1 tshiozak */ 63 1.1 tshiozak 64 1.1 tshiozak #ifdef UMIDIQUIRK_DEBUG 65 1.1 tshiozak #define DPRINTF(x) if (umidiquirkdebug) printf x 66 1.1 tshiozak #define DPRINTFN(n,x) if (umidiquirkdebug >= (n)) printf x 67 1.1 tshiozak int umidiquirkdebug = 1; 68 1.1 tshiozak #else 69 1.1 tshiozak #define DPRINTF(x) 70 1.1 tshiozak #define DPRINTFN(n,x) 71 1.1 tshiozak #endif 72 1.1 tshiozak 73 1.1 tshiozak 74 1.1 tshiozak /* 75 1.1 tshiozak * YAMAHA UX-256 76 1.1 tshiozak * --- this is a typical yamaha device, but has a broken descriptor :-< 77 1.1 tshiozak */ 78 1.1 tshiozak 79 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = { 80 1.1 tshiozak /* out */ 81 1.1 tshiozak { 0, 16 }, 82 1.1 tshiozak /* in */ 83 1.1 tshiozak { 1, 8 } 84 1.1 tshiozak }; 85 1.16 gmcgarry UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1); 86 1.1 tshiozak 87 1.1 tshiozak UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = { 88 1.1 tshiozak UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE), 89 1.1 tshiozak #if 0 90 1.1 tshiozak UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE), 91 1.1 tshiozak #endif 92 1.1 tshiozak UMQ_TERMINATOR 93 1.1 tshiozak }; 94 1.1 tshiozak 95 1.1 tshiozak 96 1.1 tshiozak /* 97 1.1 tshiozak * YAMAHA generic 98 1.1 tshiozak */ 99 1.1 tshiozak UMQ_DEF(YAMAHA, ANYPRODUCT, ANYIFACE) = { 100 1.1 tshiozak UMQ_YAMAHA_REG(YAMAHA, ANYPRODUCT, ANYIFACE), 101 1.1 tshiozak UMQ_TERMINATOR 102 1.1 tshiozak }; 103 1.1 tshiozak 104 1.1 tshiozak 105 1.1 tshiozak /* 106 1.1 tshiozak * ROLAND UM-1 107 1.1 tshiozak */ 108 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = { 109 1.1 tshiozak /* out */ 110 1.1 tshiozak { 0, 1 }, 111 1.1 tshiozak /* in */ 112 1.1 tshiozak { 1, 1 } 113 1.1 tshiozak }; 114 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1); 115 1.1 tshiozak 116 1.1 tshiozak UMQ_DEF(ROLAND, ROLAND_UM1, 2) = { 117 1.1 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2), 118 1.1 tshiozak UMQ_TERMINATOR 119 1.1 tshiozak }; 120 1.1 tshiozak 121 1.4 tshiozak /* 122 1.4 tshiozak * ROLAND SC-8850 123 1.4 tshiozak */ 124 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = { 125 1.4 tshiozak /* out */ 126 1.4 tshiozak { 0, 6 }, 127 1.4 tshiozak /* in */ 128 1.4 tshiozak { 1, 6 } 129 1.4 tshiozak }; 130 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1); 131 1.4 tshiozak 132 1.4 tshiozak UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = { 133 1.4 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2), 134 1.4 tshiozak UMQ_TERMINATOR 135 1.4 tshiozak }; 136 1.4 tshiozak 137 1.4 tshiozak /* 138 1.4 tshiozak * ROLAND SD-90 139 1.4 tshiozak */ 140 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = { 141 1.4 tshiozak /* out */ 142 1.4 tshiozak { 0, 4 }, 143 1.4 tshiozak /* in */ 144 1.4 tshiozak { 1, 4 } 145 1.4 tshiozak }; 146 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1); 147 1.4 tshiozak 148 1.4 tshiozak UMQ_DEF(ROLAND, ROLAND_SD90, 2) = { 149 1.4 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2), 150 1.4 tshiozak UMQ_TERMINATOR 151 1.4 tshiozak }; 152 1.4 tshiozak 153 1.1 tshiozak 154 1.2 tshiozak /* 155 1.2 tshiozak * ROLAND UM-880 (native mode) 156 1.2 tshiozak */ 157 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = { 158 1.2 tshiozak /* out */ 159 1.2 tshiozak { 0, 9 }, 160 1.2 tshiozak /* in */ 161 1.2 tshiozak { 1, 9 } 162 1.2 tshiozak }; 163 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1); 164 1.2 tshiozak 165 1.2 tshiozak UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = { 166 1.2 tshiozak UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0), 167 1.2 tshiozak UMQ_TERMINATOR 168 1.2 tshiozak }; 169 1.2 tshiozak 170 1.5 jdolecek /* 171 1.5 jdolecek * ROLAND UA-100 172 1.5 jdolecek */ 173 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = { 174 1.5 jdolecek /* out */ 175 1.5 jdolecek { 0, 3 }, 176 1.5 jdolecek /* in */ 177 1.5 jdolecek { 1, 3 } 178 1.5 jdolecek }; 179 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1); 180 1.5 jdolecek 181 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UA100, 2) = { 182 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2), 183 1.5 jdolecek UMQ_TERMINATOR 184 1.5 jdolecek }; 185 1.5 jdolecek 186 1.5 jdolecek /* 187 1.5 jdolecek * ROLAND UM-4 188 1.5 jdolecek */ 189 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = { 190 1.5 jdolecek /* out */ 191 1.5 jdolecek { 0, 4 }, 192 1.5 jdolecek /* in */ 193 1.5 jdolecek { 1, 4 } 194 1.5 jdolecek }; 195 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1); 196 1.5 jdolecek 197 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM4, 2) = { 198 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2), 199 1.5 jdolecek UMQ_TERMINATOR 200 1.5 jdolecek }; 201 1.5 jdolecek 202 1.5 jdolecek /* 203 1.5 jdolecek * ROLAND U-8 204 1.5 jdolecek */ 205 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = { 206 1.5 jdolecek /* out */ 207 1.5 jdolecek { 0, 2 }, 208 1.5 jdolecek /* in */ 209 1.5 jdolecek { 1, 2 } 210 1.5 jdolecek }; 211 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1); 212 1.5 jdolecek 213 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_U8, 2) = { 214 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2), 215 1.5 jdolecek UMQ_TERMINATOR 216 1.5 jdolecek }; 217 1.5 jdolecek 218 1.5 jdolecek /* 219 1.5 jdolecek * ROLAND UM-2 220 1.5 jdolecek */ 221 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = { 222 1.5 jdolecek /* out */ 223 1.5 jdolecek { 0, 2 }, 224 1.5 jdolecek /* in */ 225 1.5 jdolecek { 1, 2 } 226 1.5 jdolecek }; 227 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1); 228 1.5 jdolecek 229 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM2, 2) = { 230 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2), 231 1.5 jdolecek UMQ_TERMINATOR 232 1.5 jdolecek }; 233 1.5 jdolecek 234 1.5 jdolecek /* 235 1.5 jdolecek * ROLAND SC-8820 236 1.5 jdolecek */ 237 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = { 238 1.5 jdolecek /* out */ 239 1.5 jdolecek { 0, 5 }, /* cables 0, 1, 4 only */ 240 1.5 jdolecek /* in */ 241 1.5 jdolecek { 1, 5 } /* do. */ 242 1.5 jdolecek }; 243 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1); 244 1.5 jdolecek 245 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = { 246 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2), 247 1.5 jdolecek UMQ_TERMINATOR 248 1.5 jdolecek }; 249 1.5 jdolecek 250 1.5 jdolecek /* 251 1.5 jdolecek * ROLAND PC-300 252 1.5 jdolecek */ 253 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = { 254 1.5 jdolecek /* out */ 255 1.5 jdolecek { 0, 1 }, 256 1.5 jdolecek /* in */ 257 1.5 jdolecek { 1, 1 } 258 1.5 jdolecek }; 259 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1); 260 1.5 jdolecek 261 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_PC300, 2) = { 262 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2), 263 1.5 jdolecek UMQ_TERMINATOR 264 1.5 jdolecek }; 265 1.5 jdolecek 266 1.5 jdolecek /* 267 1.5 jdolecek * ROLAND SK-500 268 1.5 jdolecek */ 269 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = { 270 1.5 jdolecek /* out */ 271 1.5 jdolecek { 0, 5 }, /* cables 0, 1, 4 only */ 272 1.5 jdolecek /* in */ 273 1.5 jdolecek { 1, 5 } /* do. */ 274 1.5 jdolecek }; 275 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1); 276 1.5 jdolecek 277 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SK500, 2) = { 278 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2), 279 1.5 jdolecek UMQ_TERMINATOR 280 1.5 jdolecek }; 281 1.5 jdolecek 282 1.5 jdolecek /* 283 1.5 jdolecek * ROLAND SC-D70 284 1.5 jdolecek */ 285 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = { 286 1.5 jdolecek /* out */ 287 1.5 jdolecek { 0, 3 }, 288 1.5 jdolecek /* in */ 289 1.5 jdolecek { 1, 3 } 290 1.5 jdolecek }; 291 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1); 292 1.5 jdolecek 293 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = { 294 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2), 295 1.5 jdolecek UMQ_TERMINATOR 296 1.5 jdolecek }; 297 1.5 jdolecek 298 1.5 jdolecek /* 299 1.5 jdolecek * ROLAND XV-5050 300 1.5 jdolecek */ 301 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1) = { 302 1.5 jdolecek /* out */ 303 1.5 jdolecek { 0, 1 }, 304 1.5 jdolecek /* in */ 305 1.5 jdolecek { 1, 1 } 306 1.5 jdolecek }; 307 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_XV5050, 0, 1, 1); 308 1.5 jdolecek 309 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_XV5050, 0) = { 310 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_XV5050, 0), 311 1.5 jdolecek UMQ_TERMINATOR 312 1.5 jdolecek }; 313 1.5 jdolecek 314 1.5 jdolecek /* 315 1.5 jdolecek * ROLAND UM-550 316 1.5 jdolecek */ 317 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = { 318 1.5 jdolecek /* out */ 319 1.5 jdolecek { 0, 6 }, 320 1.5 jdolecek /* in */ 321 1.5 jdolecek { 1, 6 } 322 1.5 jdolecek }; 323 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1); 324 1.5 jdolecek 325 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UM550, 0) = { 326 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0), 327 1.5 jdolecek UMQ_TERMINATOR 328 1.5 jdolecek }; 329 1.5 jdolecek 330 1.5 jdolecek /* 331 1.5 jdolecek * ROLAND SD-20 332 1.5 jdolecek */ 333 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = { 334 1.5 jdolecek /* out */ 335 1.5 jdolecek { 0, 2 }, 336 1.5 jdolecek /* in */ 337 1.5 jdolecek { 1, 3 } 338 1.5 jdolecek }; 339 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1); 340 1.5 jdolecek 341 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SD20, 0) = { 342 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0), 343 1.5 jdolecek UMQ_TERMINATOR 344 1.5 jdolecek }; 345 1.5 jdolecek 346 1.5 jdolecek /* 347 1.5 jdolecek * ROLAND SD-80 348 1.5 jdolecek */ 349 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = { 350 1.5 jdolecek /* out */ 351 1.5 jdolecek { 0, 4 }, 352 1.5 jdolecek /* in */ 353 1.5 jdolecek { 1, 4 } 354 1.5 jdolecek }; 355 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1); 356 1.5 jdolecek 357 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_SD80, 0) = { 358 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0), 359 1.5 jdolecek UMQ_TERMINATOR 360 1.5 jdolecek }; 361 1.5 jdolecek 362 1.5 jdolecek /* 363 1.5 jdolecek * ROLAND UA-700 364 1.5 jdolecek */ 365 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = { 366 1.5 jdolecek /* out */ 367 1.5 jdolecek { 0, 2 }, 368 1.5 jdolecek /* in */ 369 1.5 jdolecek { 1, 2 } 370 1.5 jdolecek }; 371 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1); 372 1.5 jdolecek 373 1.5 jdolecek UMQ_DEF(ROLAND, ROLAND_UA700, 3) = { 374 1.5 jdolecek UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3), 375 1.5 jdolecek UMQ_TERMINATOR 376 1.5 jdolecek }; 377 1.5 jdolecek 378 1.8 augustss /* 379 1.8 augustss * ROLAND UA-1000 380 1.8 augustss */ 381 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1) = { 382 1.8 augustss /* out */ 383 1.8 augustss { 0, 2 }, 384 1.8 augustss /* in */ 385 1.8 augustss { 1, 2 } 386 1.8 augustss }; 387 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA1000, 3, 1, 1); 388 1.8 augustss 389 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA1000, 3) = { 390 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA1000, 3), 391 1.8 augustss UMQ_TERMINATOR 392 1.8 augustss }; 393 1.8 augustss 394 1.8 augustss /* 395 1.8 augustss * ROLAND UA-101 396 1.8 augustss */ 397 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101, 2, 1, 1) = { 398 1.8 augustss /* out */ 399 1.8 augustss { 0, 2 }, 400 1.8 augustss /* in */ 401 1.8 augustss { 1, 2 } 402 1.8 augustss }; 403 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101, 2, 1, 1); 404 1.2 tshiozak 405 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA101, 2) = { 406 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101, 2), 407 1.8 augustss UMQ_TERMINATOR 408 1.8 augustss }; 409 1.8 augustss 410 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1) = { 411 1.8 augustss /* out */ 412 1.8 augustss { 0, 2 }, 413 1.8 augustss /* in */ 414 1.8 augustss { 1, 2 } 415 1.8 augustss }; 416 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA101F, 2, 1, 1); 417 1.8 augustss 418 1.8 augustss UMQ_DEF(ROLAND, ROLAND_UA101F, 2) = { 419 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA101F, 2), 420 1.8 augustss UMQ_TERMINATOR 421 1.8 augustss }; 422 1.8 augustss 423 1.8 augustss /* 424 1.8 augustss * ROLAND Fantom-X 425 1.8 augustss */ 426 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1) = { 427 1.8 augustss /* out */ 428 1.8 augustss { 0, 1 }, 429 1.8 augustss /* in */ 430 1.8 augustss { 1, 1 } 431 1.8 augustss }; 432 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_FANTOMX, 0, 1, 1); 433 1.8 augustss 434 1.8 augustss UMQ_DEF(ROLAND, ROLAND_FANTOMX, 0) = { 435 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_FANTOMX, 0), 436 1.8 augustss UMQ_TERMINATOR 437 1.8 augustss }; 438 1.8 augustss 439 1.8 augustss /* 440 1.8 augustss * ROLAND PCR 441 1.8 augustss */ 442 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_PCR, 0, 1, 1) = { 443 1.8 augustss /* out */ 444 1.8 augustss { 0, 3 }, 445 1.8 augustss /* in */ 446 1.8 augustss { 1, 3 } 447 1.8 augustss }; 448 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PCR, 0, 1, 1); 449 1.8 augustss 450 1.8 augustss UMQ_DEF(ROLAND, ROLAND_PCR, 0) = { 451 1.8 augustss UMQ_FIXED_EP_REG(ROLAND, ROLAND_PCR, 0), 452 1.8 augustss UMQ_TERMINATOR 453 1.8 augustss }; 454 1.1 tshiozak 455 1.1 tshiozak /* 456 1.10 christos * ROLAND UM-3EX 457 1.10 christos */ 458 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UM3, 0, 1, 1) = { 459 1.10 christos /* out */ 460 1.10 christos { 0, 3 }, 461 1.10 christos /* in */ 462 1.10 christos { 1, 3 } 463 1.10 christos }; 464 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM3, 0, 1, 1); 465 1.10 christos 466 1.10 christos UMQ_DEF(ROLAND, ROLAND_UM3, 0) = { 467 1.10 christos UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM3, 0), 468 1.10 christos UMQ_TERMINATOR 469 1.10 christos }; 470 1.10 christos 471 1.10 christos /* 472 1.13 xtraeme * ROLAND UA-25 473 1.13 xtraeme */ 474 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA25, 2, 1, 1) = { 475 1.13 xtraeme /* out */ 476 1.13 xtraeme { 0, 1 }, 477 1.13 xtraeme /* in */ 478 1.13 xtraeme { 1, 1 } 479 1.13 xtraeme }; 480 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA25, 2, 1, 1); 481 1.13 xtraeme 482 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_UA25, 2) = { 483 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA25, 2), 484 1.13 xtraeme UMQ_TERMINATOR 485 1.13 xtraeme }; 486 1.13 xtraeme 487 1.13 xtraeme /* 488 1.13 xtraeme * ROLAND UA-4FX 489 1.13 xtraeme */ 490 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1) = { 491 1.13 xtraeme /* out */ 492 1.13 xtraeme { 0, 1 }, 493 1.13 xtraeme /* in */ 494 1.13 xtraeme { 1, 1 } 495 1.13 xtraeme }; 496 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA4FX, 2, 1, 1); 497 1.13 xtraeme 498 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_UA4FX, 2) = { 499 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA4FX, 2), 500 1.13 xtraeme UMQ_TERMINATOR 501 1.13 xtraeme }; 502 1.13 xtraeme 503 1.13 xtraeme /* 504 1.13 xtraeme * ROLAND SonicCell 505 1.13 xtraeme */ 506 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1) = { 507 1.13 xtraeme /* out */ 508 1.13 xtraeme { 0, 1 }, 509 1.13 xtraeme /* in */ 510 1.13 xtraeme { 1, 1 } 511 1.13 xtraeme }; 512 1.16 gmcgarry UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SONICCELL, 2, 1, 1); 513 1.13 xtraeme 514 1.13 xtraeme UMQ_DEF(ROLAND, ROLAND_SONICCELL, 2) = { 515 1.13 xtraeme UMQ_FIXED_EP_REG(ROLAND, ROLAND_SONICCELL, 2), 516 1.13 xtraeme UMQ_TERMINATOR 517 1.13 xtraeme }; 518 1.13 xtraeme 519 1.13 xtraeme /* 520 1.17 plunky * ROLAND UM-ONE 521 1.17 plunky */ 522 1.17 plunky UMQ_FIXED_EP_DATA_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1) = { 523 1.17 plunky /* out */ 524 1.17 plunky { 0, 1 }, 525 1.17 plunky /* in */ 526 1.17 plunky { 1, 1 } 527 1.17 plunky }; 528 1.17 plunky UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1); 529 1.17 plunky 530 1.17 plunky UMQ_DEF(ROLAND, ROLAND_UMONE, ANYIFACE) = { 531 1.17 plunky UMQ_FIXED_EP_REG(ROLAND, ROLAND_UMONE, ANYIFACE), 532 1.17 plunky UMQ_TERMINATOR 533 1.17 plunky }; 534 1.17 plunky 535 1.17 plunky /* 536 1.11 chap * Midiman Midisport 2x4. This has 2 physical MIDI IN jacks that are read 537 1.11 chap * on endpoint 0x81 (descriptor index 0). It has 4 physical MIDI OUT jacks 538 1.11 chap * that can be written on endpoints 2 or 4 (at descriptor index 2 or 4, 539 1.11 chap * coincidentally) interchangeably: either endpoint will accept a Cable Number 540 1.11 chap * field of 0 to 3, and data for a given CN will be routed to the same 541 1.11 chap * physical output regardless of the endpoint used for the transfer. But 542 1.11 chap * there's a catch: flow-control feedback only goes to endpoint 2 for 543 1.11 chap * CN 0 and 2, and only to endpoint 4 for CN 1 and 3. If you send output at 544 1.11 chap * high rates for CN 0 or 2 over endpoint 4, or for CN 1 or 3 over endpoint 2, 545 1.11 chap * the USB transfers complete as fast as possible, giving you an apparent data 546 1.11 chap * rate much higher than MIDI's 3125 cps (easy to measure using dd to blast a 547 1.11 chap * bunch of midi data to the rmidi device). Of course that isn't a way to make 548 1.11 chap * MIDI faster, just a way to overrun the device buffer and spray bits on the 549 1.11 chap * floor. So this device needs the fixed endpoint quirk, the fixed cable number 550 1.11 chap * quirk (to make sure CNs 0 and 2 are put on the first endpoint and 1 and 3 551 1.11 chap * on the other), and then the fixed mididev-assignment quirk (to match jacks 552 1.11 chap * to mididevs so the rmidi devices match the order of the blinkenlights). 553 1.11 chap */ 554 1.16 gmcgarry UMQ_FIXED_EP_DATA_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1) = { 555 1.11 chap /* out: ep# jacks */ 556 1.11 chap { 2, 2 }, 557 1.11 chap { 4, 2 }, 558 1.11 chap /* in: ep# jacks */ 559 1.11 chap { 0, 2 } 560 1.11 chap }; 561 1.16 gmcgarry UMQ_FIXED_EP_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE, 2, 1); 562 1.16 gmcgarry UMQ_FIXED_CN_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = { 563 1.16 gmcgarry 0, 2, 1, 3, 0, 1 564 1.16 gmcgarry }; 565 1.16 gmcgarry UMQ_FIXED_MD_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = { 566 1.16 gmcgarry 0, 0, 2, 1, 1, -1, 3, -1 567 1.16 gmcgarry }; 568 1.11 chap UMQ_DEF(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE) = { 569 1.11 chap UMQ_FIXED_EP_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE), 570 1.16 gmcgarry UMQ_FIXED_CN_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE), 571 1.16 gmcgarry UMQ_FIXED_MD_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE), 572 1.11 chap UMQ_TYPE(MIDIMAN_GARBLE), 573 1.11 chap UMQ_TERMINATOR 574 1.11 chap }; 575 1.11 chap 576 1.11 chap /* 577 1.1 tshiozak * quirk list 578 1.1 tshiozak */ 579 1.16 gmcgarry static struct umidi_quirk umidi_quirklist[] = { 580 1.1 tshiozak UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE), 581 1.1 tshiozak UMQ_REG(YAMAHA, ANYPRODUCT, ANYIFACE), 582 1.1 tshiozak UMQ_REG(ROLAND, ROLAND_UM1, 2), 583 1.4 tshiozak UMQ_REG(ROLAND, ROLAND_SC8850, 2), 584 1.4 tshiozak UMQ_REG(ROLAND, ROLAND_SD90, 2), 585 1.2 tshiozak UMQ_REG(ROLAND, ROLAND_UM880N, 0), 586 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UA100, 2), 587 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM4, 2), 588 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_U8, 2), 589 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM2, 2), 590 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SC8820, 2), 591 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_PC300, 2), 592 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SK500, 2), 593 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SCD70, 2), 594 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_XV5050, 0), 595 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UM550, 0), 596 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SD20, 0), 597 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_SD80, 0), 598 1.5 jdolecek UMQ_REG(ROLAND, ROLAND_UA700, 3), 599 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA1000, 3), 600 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA101, 2), 601 1.8 augustss UMQ_REG(ROLAND, ROLAND_UA101F, 2), 602 1.8 augustss UMQ_REG(ROLAND, ROLAND_FANTOMX, 0), 603 1.8 augustss UMQ_REG(ROLAND, ROLAND_PCR, 0), 604 1.10 christos UMQ_REG(ROLAND, ROLAND_UM3, 0), 605 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_UA25, 2), 606 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_UA4FX, 2), 607 1.13 xtraeme UMQ_REG(ROLAND, ROLAND_SONICCELL, 2), 608 1.17 plunky UMQ_REG(ROLAND, ROLAND_UMONE, ANYIFACE), 609 1.11 chap UMQ_REG(MIDIMAN, MIDIMAN_MIDISPORT2X4, ANYIFACE), 610 1.12 christos { .vendor = 0 }, 611 1.1 tshiozak }; 612 1.1 tshiozak 613 1.1 tshiozak 614 1.1 tshiozak /* 615 1.1 tshiozak * quirk utilities 616 1.1 tshiozak */ 617 1.1 tshiozak 618 1.16 gmcgarry const struct umidi_quirk * 619 1.1 tshiozak umidi_search_quirk(int vendor, int product, int ifaceno) 620 1.1 tshiozak { 621 1.1 tshiozak struct umidi_quirk *p; 622 1.16 gmcgarry const struct umq_data *q; 623 1.1 tshiozak 624 1.1 tshiozak DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n", 625 1.1 tshiozak vendor, product, ifaceno)); 626 1.1 tshiozak 627 1.1 tshiozak for (p=&umidi_quirklist[0]; p->vendor; p++) { 628 1.1 tshiozak DPRINTFN(10, ("\tv=%d, p=%d, i=%d", 629 1.1 tshiozak p->vendor, p->product, p->iface)); 630 1.1 tshiozak if ((p->vendor==vendor || p->vendor==ANYVENDOR) && 631 1.1 tshiozak (p->product==product || p->product==ANYPRODUCT) && 632 1.1 tshiozak (p->iface==ifaceno || p->iface==ANYIFACE)) { 633 1.1 tshiozak DPRINTFN(10, (" found\n")); 634 1.1 tshiozak if (!p->type_mask) 635 1.1 tshiozak /* make quirk mask */ 636 1.1 tshiozak for (q=p->quirks; q->type; q++) 637 1.1 tshiozak p->type_mask |= 1<<(q->type-1); 638 1.1 tshiozak return p; 639 1.8 augustss } 640 1.1 tshiozak DPRINTFN(10, ("\n")); 641 1.1 tshiozak } 642 1.1 tshiozak 643 1.1 tshiozak return NULL; 644 1.1 tshiozak } 645 1.1 tshiozak 646 1.7 christos static const char *quirk_name[] = { 647 1.1 tshiozak "NULL", 648 1.1 tshiozak "Fixed Endpoint", 649 1.1 tshiozak "Yamaha Specific", 650 1.11 chap "Midiman Packet Garbling", 651 1.11 chap "Cable Numbers per Endpoint", 652 1.11 chap "Cable Numbers Global", 653 1.11 chap "Cable Numbers Fixed", 654 1.11 chap "Unit Mapping Fixed", 655 1.1 tshiozak }; 656 1.1 tshiozak 657 1.1 tshiozak void 658 1.16 gmcgarry umidi_print_quirk(const struct umidi_quirk *q) 659 1.1 tshiozak { 660 1.16 gmcgarry const struct umq_data *qd; 661 1.1 tshiozak if (q) { 662 1.1 tshiozak printf("("); 663 1.1 tshiozak for (qd=q->quirks; qd->type; qd++) 664 1.1 tshiozak printf("%s%s", quirk_name[qd->type], 665 1.1 tshiozak (qd+1)->type?", ":")\n"); 666 1.1 tshiozak } else { 667 1.1 tshiozak printf("(genuine USB-MIDI)\n"); 668 1.1 tshiozak } 669 1.1 tshiozak } 670 1.1 tshiozak 671 1.16 gmcgarry const void * 672 1.20 skrll umidi_get_quirk_data_from_type(const struct umidi_quirk *q, uint32_t type) 673 1.1 tshiozak { 674 1.16 gmcgarry const struct umq_data *qd; 675 1.1 tshiozak if (q) { 676 1.1 tshiozak for (qd=q->quirks; qd->type; qd++) 677 1.1 tshiozak if (qd->type == type) 678 1.1 tshiozak return qd->data; 679 1.1 tshiozak } 680 1.1 tshiozak return NULL; 681 1.1 tshiozak } 682