/* $OpenBSD: umidivar.h,v 1.13 2012/03/30 08:18:19 ratchov Exp $ */ /* $NetBSD: umidivar.h,v 1.5 2002/09/12 21:00:42 augustss Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Takuya SHIOZAKI (tshiozak@netbsd.org). * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #define UMIDI_PACKET_SIZE 4 struct umidi_packet { unsigned status; unsigned index; unsigned char buf[UMIDI_PACKET_SIZE]; /* common/voice packet */ }; /* * hierarchie * * <-- parent child --> * * umidi(sc) -> endpoint -> jack <- (dynamically assignable) - mididev * ^ | ^ | * +-----+ +-----+ */ /* midi device */ struct umidi_mididev { struct umidi_softc *sc; struct device *mdev; /* */ struct umidi_jack *in_jack; struct umidi_jack *out_jack; /* */ int opened; int flags; }; /* Jack Information */ struct umidi_jack { struct umidi_endpoint *endpoint; /* */ int cable_number; struct umidi_packet packet; void *arg; int binded; int opened; SIMPLEQ_ENTRY(umidi_jack) intrq_entry; #ifdef DIAGNOSTIC unsigned intr; #endif union { struct { void (*intr)(void *); } out; struct { void (*intr)(void *, int); } in; } u; }; #define UMIDI_MAX_EPJACKS 16 /* endpoint data */ struct umidi_endpoint { struct umidi_softc *sc; /* */ int addr; usbd_pipe_handle pipe; usbd_xfer_handle xfer; unsigned char *buffer; unsigned packetsize; int num_open; int num_jacks; struct umidi_jack *jacks[UMIDI_MAX_EPJACKS]; unsigned used; unsigned busy; unsigned pending; SIMPLEQ_HEAD(, umidi_jack) intrq; }; /* software context */ struct umidi_softc { struct device sc_dev; usbd_device_handle sc_udev; usbd_interface_handle sc_iface; struct umidi_quirk *sc_quirk; int sc_dying; int sc_out_num_jacks; struct umidi_jack *sc_out_jacks; int sc_in_num_jacks; struct umidi_jack *sc_in_jacks; struct umidi_jack *sc_jacks; int sc_num_mididevs; struct umidi_mididev *sc_mididevs; int sc_out_num_endpoints; struct umidi_endpoint *sc_out_ep; int sc_in_num_endpoints; struct umidi_endpoint *sc_in_ep; struct umidi_endpoint *sc_endpoints; };