[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
eap testers required
- To: tech_(_at_)_openbsd_(_dot_)_org
- Subject: eap testers required
- From: Jonathan Gray <jsg_(_at_)_goblin_(_dot_)_cx>
- Date: Wed, 8 Dec 2004 15:16:50 +1100
- Mail-followup-to: tech_(_at_)_openbsd_(_dot_)_org
This diff introduces changes required to use MIDI with eap(4) from
NetBSD. I would like it to be widely tested to ensure there are
no issues. I'm interested in reports from all eap users not
just those who would like to use MIDI.
Index: sys/arch/i386/conf/GENERIC
===================================================================
RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v
retrieving revision 1.378
diff -u -r1.378 GENERIC
--- sys/arch/i386/conf/GENERIC 2004/09/16 10:37:21 1.378
+++ sys/arch/i386/conf/GENERIC 2004/09/26 16:58:03
@@ -499,6 +499,7 @@
midi* at ym?
midi* at mpu?
midi* at autri?
+midi* at eap?
# The spkr driver provides a simple tone interface to the built in speaker.
#spkr0 at pcppi? # PC speaker
Index: sys/dev/pci/eap.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/eap.c,v
retrieving revision 1.21
diff -u -r1.21 eap.c
--- sys/dev/pci/eap.c 2004/03/18 01:24:41 1.21
+++ sys/dev/pci/eap.c 2004/09/26 16:58:05
@@ -55,9 +55,12 @@
* ftp://download.intel.com/ial/scalableplatforms/audio/ac97r21.pdf
*/
+#include "midi.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/fcntl.h>
#include <sys/malloc.h>
#include <sys/device.h>
#include <sys/proc.h>
@@ -67,6 +70,7 @@
#include <sys/audioio.h>
#include <dev/audio_if.h>
+#include <dev/midi_if.h>
#include <dev/mulaw.h>
#include <dev/auconv.h>
#include <dev/ic/ac97.h>
@@ -128,6 +132,13 @@
char sc_rrun;
#endif
+#if NMIDI > 0
+ void (*sc_iintr)(void *, int); /* midi input ready handler */
+ void (*sc_ointr)(void *); /* midi output ready handler */
+ void *sc_arg;
+ struct device *sc_mididev;
+#endif
+
u_short sc_port[AK_NPORTS]; /* mirror of the hardware setting */
u_int sc_record_source; /* recording source mask */
u_int sc_output_source; /* output source mask */
@@ -144,8 +155,10 @@
int eap_allocmem(struct eap_softc *, size_t, size_t, struct eap_dma *);
int eap_freemem(struct eap_softc *, struct eap_dma *);
+#define EWRITE1(sc, r, x) bus_space_write_1((sc)->iot, (sc)->ioh, (r), (x))
#define EWRITE2(sc, r, x) bus_space_write_2((sc)->iot, (sc)->ioh, (r), (x))
#define EWRITE4(sc, r, x) bus_space_write_4((sc)->iot, (sc)->ioh, (r), (x))
+#define EREAD1(sc, r) bus_space_read_1((sc)->iot, (sc)->ioh, (r))
#define EREAD2(sc, r) bus_space_read_2((sc)->iot, (sc)->ioh, (r))
#define EREAD4(sc, r) bus_space_read_4((sc)->iot, (sc)->ioh, (r))
@@ -190,6 +203,13 @@
void eap1371_reset_codec(void *sc);
int eap1371_get_portnum_by_name(struct eap_softc *, char *, char *,
char *);
+#if NMIDI > 0
+void eap_midi_close(void *);
+void eap_midi_getinfo(void *, struct midi_info *);
+int eap_midi_open(void *, int, void (*)(void *, int),
+ void (*)(void *), void *);
+int eap_midi_output(void *, int);
+#endif
struct audio_hw_if eap1370_hw_if = {
eap_open,
@@ -249,6 +269,16 @@
eap_trigger_input,
};
+#if NMIDI > 0
+struct midi_hw_if eap_midi_hw_if = {
+ eap_midi_open,
+ eap_midi_close,
+ eap_midi_output,
+ eap_midi_getinfo,
+ 0, /* ioctl */
+};
+#endif
+
struct audio_device eap_device = {
"Ensoniq AudioPCI",
"",
@@ -690,6 +720,9 @@
}
audio_attach_mi(eap_hw_if, sc, &sc->sc_dev);
+#if NMIDI > 0
+ sc->sc_mididev = midi_attach_mi(&eap_midi_hw_if, sc, &sc->sc_dev);
+#endif
}
int
@@ -765,6 +798,18 @@
if (sc->sc_pintr)
sc->sc_pintr(sc->sc_parg);
}
+#if NMIDI > 0
+ if ((intr & EAP_I_UART) && sc->sc_iintr != NULL) {
+ u_int32_t data;
+
+ if (EREAD1(sc, EAP_UART_STATUS) & EAP_US_RXINT) {
+ while (EREAD1(sc, EAP_UART_STATUS) & EAP_US_RXRDY) {
+ data = EREAD1(sc, EAP_UART_DATA);
+ sc->sc_iintr(sc->sc_arg, data);
+ }
+ }
+ }
+#endif
return (1);
}
@@ -1641,3 +1686,68 @@
return (sc->flags);
}
+#if NMIDI > 0
+int
+eap_midi_open(void *addr, int flags,
+ void (*iintr)(void *, int),
+ void (*ointr)(void *),
+ void *arg)
+{
+ struct eap_softc *sc = addr;
+ u_int32_t uctrl;
+
+ sc->sc_iintr = iintr;
+ sc->sc_ointr = ointr;
+ sc->sc_arg = arg;
+
+ EWRITE4(sc, EAP_ICSC, EREAD4(sc, EAP_ICSC) | EAP_UART_EN);
+ uctrl = 0;
+ if (flags & FREAD)
+ uctrl |= EAP_UC_RXINTEN;
+#if 0
+ /* I don't understand ../midi.c well enough to use output interrupts */
+ if (flags & FWRITE)
+ uctrl |= EAP_UC_TXINTEN; */
+#endif
+ EWRITE1(sc, EAP_UART_CONTROL, uctrl);
+
+ return (0);
+}
+
+void
+eap_midi_close(void *addr)
+{
+ struct eap_softc *sc = addr;
+
+ tsleep(sc, PWAIT, "eapclm", hz/10); /* give uart a chance to drain */
+ EWRITE1(sc, EAP_UART_CONTROL, 0);
+ EWRITE4(sc, EAP_ICSC, EREAD4(sc, EAP_ICSC) & ~EAP_UART_EN);
+
+ sc->sc_iintr = 0;
+ sc->sc_ointr = 0;
+}
+
+int
+eap_midi_output(void *addr, int d)
+{
+ struct eap_softc *sc = addr;
+ int x;
+
+ for (x = 0; x != MIDI_BUSY_WAIT; x++) {
+ if (EREAD1(sc, EAP_UART_STATUS) & EAP_US_TXRDY) {
+ EWRITE1(sc, EAP_UART_DATA, d);
+ return (0);
+ }
+ delay(MIDI_BUSY_DELAY);
+ }
+ return (EIO);
+}
+
+void
+eap_midi_getinfo(void *addr, struct midi_info *mi)
+{
+ mi->name = "AudioPCI MIDI UART";
+ mi->props = MIDI_PROP_CAN_INPUT;
+}
+
+#endif
Index: sys/dev/pci/files.pci
===================================================================
RCS file: /cvs/src/sys/dev/pci/files.pci,v
retrieving revision 1.159
diff -u -r1.159 files.pci
--- sys/dev/pci/files.pci 2004/09/16 09:14:02 1.159
+++ sys/dev/pci/files.pci 2004/09/26 16:58:07
@@ -82,7 +82,7 @@
file dev/pci/iop_pci.c iop_pci
# Ensoniq AudioPCI S5016, 1371
-device eap: audio, auconv, mulaw, ac97
+device eap: audio, auconv, mulaw, ac97, midibus
attach eap at pci
file dev/pci/eap.c eap
Index: share/man/man4/eap.4
===================================================================
RCS file: /cvs/src/share/man/man4/eap.4,v
retrieving revision 1.11
diff -u -r1.11 eap.4
--- share/man/man4/eap.4 2004/03/21 19:50:44 1.11
+++ share/man/man4/eap.4 2004/09/26 16:58:07
@@ -41,6 +41,7 @@
.Sh SYNOPSIS
.Cd "eap* at pci? dev ? function ?"
.Cd "audio* at eap?"
+.Cd "midi* at eap?"
.Sh DESCRIPTION
The
.Nm
@@ -53,6 +54,7 @@
.Xr ac97 4 ,
.Xr audio 4 ,
.Xr intro 4 ,
+.Xr midi 4 ,
.Xr pci 4
.Sh HISTORY
The
@@ -60,4 +62,4 @@
device driver appeared in
.Ox 2.6 .
.Sh BUGS
-The "FM" DAC and MIDI port are not supported.
+The "FM" DAC is not supported.
Index: share/man/man4/midi.4
===================================================================
RCS file: /cvs/src/share/man/man4/midi.4,v
retrieving revision 1.17
diff -u -r1.17 midi.4
--- share/man/man4/midi.4 2004/03/21 19:47:59 1.17
+++ share/man/man4/midi.4 2004/09/26 16:58:07
@@ -40,6 +40,7 @@
.Nd device-independent MIDI driver layer
.Sh SYNOPSIS
.Cd "midi* at autri?"
+.Cd "midi* at eap?"
.Cd "midi* at mpu?"
.Cd "midi* at opl?"
.Cd "midi* at pcppi?"
@@ -105,6 +106,7 @@
.Xr ossaudio 3 ,
.Xr audio 4 ,
.Xr autri 4 ,
+.Xr eap 4 ,
.Xr mpu 4 ,
.Xr opl 4 ,
.Xr pcppi 4 ,
Visit your host, monkey.org