#include <sys/param.h>
#include <sys/systm.h>
#include <dev/usb/usbdevs.h>
#include <dev/usb/umidi_quirks.h>
#ifdef UMIDIQUIRK_DEBUG
#define DPRINTF(x) if (umidiquirkdebug) printf x
#define DPRINTFN(n,x) if (umidiquirkdebug >= (n)) printf x
int umidiquirkdebug = 1;
#else
#define DPRINTF(x)
#define DPRINTFN(n,x)
#endif
UMQ_FIXED_EP_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE, 1, 1) = {
{ 0, 16 },
{ 1, 8 }
};
UMQ_DEF(YAMAHA, YAMAHA_UX256, ANYIFACE) = {
UMQ_FIXED_EP_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM1, 2, 1, 1) = {
{ 0, 1 },
{ 1, 1 }
};
UMQ_DEF(ROLAND, ROLAND_UM1, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM1, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8850, 2, 1, 1) = {
{ 0, 6 },
{ 1, 6 }
};
UMQ_DEF(ROLAND, ROLAND_SC8850, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8850, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD90, 2, 1, 1) = {
{ 0, 4 },
{ 1, 4 }
};
UMQ_DEF(ROLAND, ROLAND_SD90, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD90, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM880N, 0, 1, 1) = {
{ 0, 9 },
{ 1, 9 }
};
UMQ_DEF(ROLAND, ROLAND_UM880N, 0) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM880N, 0),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA100, 2, 1, 1) = {
{ 0, 3 },
{ 1, 3 }
};
UMQ_DEF(ROLAND, ROLAND_UA100, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA100, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM4, 2, 1, 1) = {
{ 0, 4 },
{ 1, 4 }
};
UMQ_DEF(ROLAND, ROLAND_UM4, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM4, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_U8, 2, 1, 1) = {
{ 0, 2 },
{ 1, 2 }
};
UMQ_DEF(ROLAND, ROLAND_U8, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_U8, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM2, 2, 1, 1) = {
{ 0, 2 },
{ 1, 2 }
};
UMQ_DEF(ROLAND, ROLAND_UM2, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM2, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SC8820, 2, 1, 1) = {
{ 0, 5 },
{ 1, 5 }
};
UMQ_DEF(ROLAND, ROLAND_SC8820, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SC8820, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_PC300, 2, 1, 1) = {
{ 0, 1 },
{ 1, 1 }
};
UMQ_DEF(ROLAND, ROLAND_PC300, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_PC300, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SK500, 2, 1, 1) = {
{ 0, 5 },
{ 1, 5 }
};
UMQ_DEF(ROLAND, ROLAND_SK500, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SK500, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SCD70, 2, 1, 1) = {
{ 0, 3 },
{ 1, 3 }
};
UMQ_DEF(ROLAND, ROLAND_SCD70, 2) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SCD70, 2),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UM550, 0, 1, 1) = {
{ 0, 6 },
{ 1, 6 }
};
UMQ_DEF(ROLAND, ROLAND_UM550, 0) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UM550, 0),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD20, 0, 1, 1) = {
{ 0, 2 },
{ 1, 3 }
};
UMQ_DEF(ROLAND, ROLAND_SD20, 0) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD20, 0),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_SD80, 0, 1, 1) = {
{ 0, 4 },
{ 1, 4 }
};
UMQ_DEF(ROLAND, ROLAND_SD80, 0) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_SD80, 0),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UA700, 3, 1, 1) = {
{ 0, 2 },
{ 1, 2 }
};
UMQ_DEF(ROLAND, ROLAND_UA700, 3) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UA700, 3),
UMQ_TERMINATOR
};
UMQ_FIXED_EP_DEF(ROLAND, ROLAND_UMONE, ANYIFACE, 1, 1) = {
{ 0, 1 },
{ 1, 1 }
};
UMQ_DEF(ROLAND, ROLAND_UMONE, ANYIFACE) = {
UMQ_FIXED_EP_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
UMQ_TERMINATOR
};
struct umidi_quirk umidi_quirklist[] = {
UMQ_REG(YAMAHA, YAMAHA_UX256, ANYIFACE),
UMQ_REG(ROLAND, ROLAND_UM1, 2),
UMQ_REG(ROLAND, ROLAND_SC8850, 2),
UMQ_REG(ROLAND, ROLAND_SD90, 2),
UMQ_REG(ROLAND, ROLAND_UM880N, 0),
UMQ_REG(ROLAND, ROLAND_UA100, 2),
UMQ_REG(ROLAND, ROLAND_UM4, 2),
UMQ_REG(ROLAND, ROLAND_U8, 2),
UMQ_REG(ROLAND, ROLAND_UM2, 2),
UMQ_REG(ROLAND, ROLAND_SC8820, 2),
UMQ_REG(ROLAND, ROLAND_PC300, 2),
UMQ_REG(ROLAND, ROLAND_SK500, 2),
UMQ_REG(ROLAND, ROLAND_SCD70, 2),
UMQ_REG(ROLAND, ROLAND_UM550, 0),
UMQ_REG(ROLAND, ROLAND_SD20, 0),
UMQ_REG(ROLAND, ROLAND_SD80, 0),
UMQ_REG(ROLAND, ROLAND_UA700, 3),
UMQ_REG(ROLAND, ROLAND_UMONE, ANYIFACE),
UMQ_TERMINATOR
};
struct umidi_quirk *
umidi_search_quirk(int vendor, int product, int ifaceno)
{
struct umidi_quirk *p;
struct umq_data *q;
DPRINTF(("umidi_search_quirk: v=%d, p=%d, i=%d\n",
vendor, product, ifaceno));
for (p=&umidi_quirklist[0]; p->vendor; p++) {
DPRINTFN(10, ("\tv=%d, p=%d, i=%d",
p->vendor, p->product, p->iface));
if ((p->vendor==vendor || p->vendor==ANYVENDOR) &&
(p->product==product || p->product==ANYPRODUCT) &&
(p->iface==ifaceno || p->iface==ANYIFACE)) {
DPRINTFN(10, (" found\n"));
if (!p->type_mask)
for (q=p->quirks; q->type; q++)
p->type_mask |= 1<<(q->type-1);
return p;
}
DPRINTFN(10, ("\n"));
}
return NULL;
}
static char *quirk_name[] = {
"NULL",
"Fixed Endpoint",
"Yamaha Specific",
};
void
umidi_print_quirk(struct umidi_quirk *q)
{
struct umq_data *qd;
if (q) {
printf("(");
for (qd=q->quirks; qd->type; qd++)
printf("%s%s", quirk_name[qd->type],
(qd+1)->type?", ":")\n");
} else {
printf("(genuine USB-MIDI)\n");
}
}
void *
umidi_get_quirk_data_from_type(struct umidi_quirk *q, u_int32_t type)
{
struct umq_data *qd;
if (q) {
for (qd=q->quirks; qd->type; qd++)
if (qd->type == type)
return qd->data;
}
return NULL;
}