mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-14 10:09:48 +00:00
- Updated to Luigi's 2-15-98 code. The code in 2.2 is the same except for
select/poll and DEVFS changes, which are limited to an include/define in sound.h and the actual select/poll implementation in sound.c [ This commit is blind, but the code is similar enough that there will hopefully be no problems. ]
This commit is contained in:
parent
17c85b4825
commit
0e6400c7f0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=33505
@ -6,7 +6,7 @@
|
||||
*
|
||||
* AD1848, CS4248, CS423x, OPTi931, Yamaha SA2 and many others.
|
||||
*
|
||||
* Copyright Luigi Rizzo, 1997
|
||||
* Copyright Luigi Rizzo, 1997,1998
|
||||
* Copyright by Hannu Savolainen 1994, 1995
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -1392,7 +1392,7 @@ cs423x_attach(u_long csn, u_long vend_id, char *name,
|
||||
return ;
|
||||
}
|
||||
snddev_last_probed = &tmp_d;
|
||||
if (d.flags) { /*** use sb-compatible codec ***/
|
||||
if (d.flags & DV_PNP_SBCODEC) { /*** use sb-compatible codec ***/
|
||||
dev->id_alive = 16 ; /* number of io ports ? */
|
||||
tmp_d = sb_op_desc ;
|
||||
if (vend_id==0x2000a865 || vend_id==0x3000a865 || vend_id==0x8140d315) {
|
||||
@ -1511,7 +1511,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
enable_pnp_card();
|
||||
|
||||
snddev_last_probed = &tmp_d;
|
||||
tmp_d = d.flags ? sb_op_desc : mss_op_desc ;
|
||||
tmp_d = d.flags & DV_PNP_SBCODEC ? sb_op_desc : mss_op_desc ;
|
||||
|
||||
strcpy(tmp_d.name, name);
|
||||
|
||||
@ -1533,7 +1533,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
opti_write(p, 4, 0xd6 /* fifo empty, OPL3, audio enable, SB3.2 */ );
|
||||
ad_write (&tmp_d, 10, 2); /* enable interrupts */
|
||||
|
||||
if (d.flags) { /* sb-compatible codec */
|
||||
if (d.flags & DV_PNP_SBCODEC) { /* sb-compatible codec */
|
||||
/*
|
||||
* the 931 is not a real SB, it has important pieces of
|
||||
* hardware controlled by both the WSS and the SB port...
|
||||
|
@ -208,6 +208,8 @@ sb_dsp_open(dev_t dev, int flags, int mode, struct proc * p)
|
||||
d->flags |= SND_F_NBIO ;
|
||||
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
ask_init(d);
|
||||
|
||||
return 0;
|
||||
@ -420,6 +422,9 @@ sb_callback(snddev_info *d, int reason)
|
||||
sb_cmd3(d->io_base, c1 , l - 1) ;
|
||||
} else if (d->bd_flags & BD_F_ESS) {
|
||||
/* XXX this code is still incomplete */
|
||||
sb_cmd2(d->io_base, 0xb8, rd ? 4 : 0xe ) ; /* auto dma */
|
||||
sb_cmd2(d->io_base, 0xa8, d->flags & SND_F_STEREO ? 1 : 2) ;
|
||||
sb_cmd2(d->io_base, 0xb9, 2) ; /* demand dma */
|
||||
} else { /* SBPro -- stereo not supported */
|
||||
u_char c ;
|
||||
if (!rd)
|
||||
@ -429,6 +434,10 @@ sb_callback(snddev_info *d, int reason)
|
||||
c = (rd) ? 0x98 : 0x90 ;
|
||||
else
|
||||
c = (rd) ? 0x2c : 0x1c ;
|
||||
if (d->flags & SND_F_STEREO)
|
||||
sb_setmixer(d->io_base, 0xe, 2 );
|
||||
else
|
||||
sb_setmixer(d->io_base, 0xe, 0 );
|
||||
/*
|
||||
* some ESS extensions -- they can do 16 bits
|
||||
*/
|
||||
@ -450,6 +459,8 @@ sb_callback(snddev_info *d, int reason)
|
||||
cmd = DSP_CMD_DMAPAUSE_16 ;
|
||||
if (d->bd_flags & BD_F_HISPEED) {
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
d->flags |= SND_F_INIT ;
|
||||
} else {
|
||||
sb_cmd(d->io_base, cmd); /* pause dma. */
|
||||
@ -481,7 +492,7 @@ sb_reset_dsp(int io_base)
|
||||
{
|
||||
int loopc;
|
||||
|
||||
outb(io_base + SBDSP_RST, 1);
|
||||
outb(io_base + SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
outb(io_base + SBDSP_RST, 0);
|
||||
for (loopc = 0; loopc<100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++)
|
||||
@ -795,7 +806,9 @@ dsp_speed(snddev_info *d)
|
||||
* simultaneously using midi.
|
||||
* At the moment we do not support either...
|
||||
*/
|
||||
#if 0
|
||||
d->flags &= ~SND_F_STEREO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* here enforce speed limitations.
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* AD1848, CS4248, CS423x, OPTi931, Yamaha SA2 and many others.
|
||||
*
|
||||
* Copyright Luigi Rizzo, 1997
|
||||
* Copyright Luigi Rizzo, 1997,1998
|
||||
* Copyright by Hannu Savolainen 1994, 1995
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -1392,7 +1392,7 @@ cs423x_attach(u_long csn, u_long vend_id, char *name,
|
||||
return ;
|
||||
}
|
||||
snddev_last_probed = &tmp_d;
|
||||
if (d.flags) { /*** use sb-compatible codec ***/
|
||||
if (d.flags & DV_PNP_SBCODEC) { /*** use sb-compatible codec ***/
|
||||
dev->id_alive = 16 ; /* number of io ports ? */
|
||||
tmp_d = sb_op_desc ;
|
||||
if (vend_id==0x2000a865 || vend_id==0x3000a865 || vend_id==0x8140d315) {
|
||||
@ -1511,7 +1511,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
enable_pnp_card();
|
||||
|
||||
snddev_last_probed = &tmp_d;
|
||||
tmp_d = d.flags ? sb_op_desc : mss_op_desc ;
|
||||
tmp_d = d.flags & DV_PNP_SBCODEC ? sb_op_desc : mss_op_desc ;
|
||||
|
||||
strcpy(tmp_d.name, name);
|
||||
|
||||
@ -1533,7 +1533,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
opti_write(p, 4, 0xd6 /* fifo empty, OPL3, audio enable, SB3.2 */ );
|
||||
ad_write (&tmp_d, 10, 2); /* enable interrupts */
|
||||
|
||||
if (d.flags) { /* sb-compatible codec */
|
||||
if (d.flags & DV_PNP_SBCODEC) { /* sb-compatible codec */
|
||||
/*
|
||||
* the 931 is not a real SB, it has important pieces of
|
||||
* hardware controlled by both the WSS and the SB port...
|
||||
|
@ -208,6 +208,8 @@ sb_dsp_open(dev_t dev, int flags, int mode, struct proc * p)
|
||||
d->flags |= SND_F_NBIO ;
|
||||
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
ask_init(d);
|
||||
|
||||
return 0;
|
||||
@ -420,6 +422,9 @@ sb_callback(snddev_info *d, int reason)
|
||||
sb_cmd3(d->io_base, c1 , l - 1) ;
|
||||
} else if (d->bd_flags & BD_F_ESS) {
|
||||
/* XXX this code is still incomplete */
|
||||
sb_cmd2(d->io_base, 0xb8, rd ? 4 : 0xe ) ; /* auto dma */
|
||||
sb_cmd2(d->io_base, 0xa8, d->flags & SND_F_STEREO ? 1 : 2) ;
|
||||
sb_cmd2(d->io_base, 0xb9, 2) ; /* demand dma */
|
||||
} else { /* SBPro -- stereo not supported */
|
||||
u_char c ;
|
||||
if (!rd)
|
||||
@ -429,6 +434,10 @@ sb_callback(snddev_info *d, int reason)
|
||||
c = (rd) ? 0x98 : 0x90 ;
|
||||
else
|
||||
c = (rd) ? 0x2c : 0x1c ;
|
||||
if (d->flags & SND_F_STEREO)
|
||||
sb_setmixer(d->io_base, 0xe, 2 );
|
||||
else
|
||||
sb_setmixer(d->io_base, 0xe, 0 );
|
||||
/*
|
||||
* some ESS extensions -- they can do 16 bits
|
||||
*/
|
||||
@ -450,6 +459,8 @@ sb_callback(snddev_info *d, int reason)
|
||||
cmd = DSP_CMD_DMAPAUSE_16 ;
|
||||
if (d->bd_flags & BD_F_HISPEED) {
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
d->flags |= SND_F_INIT ;
|
||||
} else {
|
||||
sb_cmd(d->io_base, cmd); /* pause dma. */
|
||||
@ -481,7 +492,7 @@ sb_reset_dsp(int io_base)
|
||||
{
|
||||
int loopc;
|
||||
|
||||
outb(io_base + SBDSP_RST, 1);
|
||||
outb(io_base + SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
outb(io_base + SBDSP_RST, 0);
|
||||
for (loopc = 0; loopc<100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++)
|
||||
@ -795,7 +806,9 @@ dsp_speed(snddev_info *d)
|
||||
* simultaneously using midi.
|
||||
* At the moment we do not support either...
|
||||
*/
|
||||
#if 0
|
||||
d->flags &= ~SND_F_STEREO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* here enforce speed limitations.
|
||||
|
@ -208,6 +208,8 @@ sb_dsp_open(dev_t dev, int flags, int mode, struct proc * p)
|
||||
d->flags |= SND_F_NBIO ;
|
||||
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
ask_init(d);
|
||||
|
||||
return 0;
|
||||
@ -420,6 +422,9 @@ sb_callback(snddev_info *d, int reason)
|
||||
sb_cmd3(d->io_base, c1 , l - 1) ;
|
||||
} else if (d->bd_flags & BD_F_ESS) {
|
||||
/* XXX this code is still incomplete */
|
||||
sb_cmd2(d->io_base, 0xb8, rd ? 4 : 0xe ) ; /* auto dma */
|
||||
sb_cmd2(d->io_base, 0xa8, d->flags & SND_F_STEREO ? 1 : 2) ;
|
||||
sb_cmd2(d->io_base, 0xb9, 2) ; /* demand dma */
|
||||
} else { /* SBPro -- stereo not supported */
|
||||
u_char c ;
|
||||
if (!rd)
|
||||
@ -429,6 +434,10 @@ sb_callback(snddev_info *d, int reason)
|
||||
c = (rd) ? 0x98 : 0x90 ;
|
||||
else
|
||||
c = (rd) ? 0x2c : 0x1c ;
|
||||
if (d->flags & SND_F_STEREO)
|
||||
sb_setmixer(d->io_base, 0xe, 2 );
|
||||
else
|
||||
sb_setmixer(d->io_base, 0xe, 0 );
|
||||
/*
|
||||
* some ESS extensions -- they can do 16 bits
|
||||
*/
|
||||
@ -450,6 +459,8 @@ sb_callback(snddev_info *d, int reason)
|
||||
cmd = DSP_CMD_DMAPAUSE_16 ;
|
||||
if (d->bd_flags & BD_F_HISPEED) {
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
d->flags |= SND_F_INIT ;
|
||||
} else {
|
||||
sb_cmd(d->io_base, cmd); /* pause dma. */
|
||||
@ -481,7 +492,7 @@ sb_reset_dsp(int io_base)
|
||||
{
|
||||
int loopc;
|
||||
|
||||
outb(io_base + SBDSP_RST, 1);
|
||||
outb(io_base + SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
outb(io_base + SBDSP_RST, 0);
|
||||
for (loopc = 0; loopc<100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++)
|
||||
@ -795,7 +806,9 @@ dsp_speed(snddev_info *d)
|
||||
* simultaneously using midi.
|
||||
* At the moment we do not support either...
|
||||
*/
|
||||
#if 0
|
||||
d->flags &= ~SND_F_STEREO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* here enforce speed limitations.
|
||||
|
@ -208,6 +208,8 @@ sb_dsp_open(dev_t dev, int flags, int mode, struct proc * p)
|
||||
d->flags |= SND_F_NBIO ;
|
||||
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
ask_init(d);
|
||||
|
||||
return 0;
|
||||
@ -420,6 +422,9 @@ sb_callback(snddev_info *d, int reason)
|
||||
sb_cmd3(d->io_base, c1 , l - 1) ;
|
||||
} else if (d->bd_flags & BD_F_ESS) {
|
||||
/* XXX this code is still incomplete */
|
||||
sb_cmd2(d->io_base, 0xb8, rd ? 4 : 0xe ) ; /* auto dma */
|
||||
sb_cmd2(d->io_base, 0xa8, d->flags & SND_F_STEREO ? 1 : 2) ;
|
||||
sb_cmd2(d->io_base, 0xb9, 2) ; /* demand dma */
|
||||
} else { /* SBPro -- stereo not supported */
|
||||
u_char c ;
|
||||
if (!rd)
|
||||
@ -429,6 +434,10 @@ sb_callback(snddev_info *d, int reason)
|
||||
c = (rd) ? 0x98 : 0x90 ;
|
||||
else
|
||||
c = (rd) ? 0x2c : 0x1c ;
|
||||
if (d->flags & SND_F_STEREO)
|
||||
sb_setmixer(d->io_base, 0xe, 2 );
|
||||
else
|
||||
sb_setmixer(d->io_base, 0xe, 0 );
|
||||
/*
|
||||
* some ESS extensions -- they can do 16 bits
|
||||
*/
|
||||
@ -450,6 +459,8 @@ sb_callback(snddev_info *d, int reason)
|
||||
cmd = DSP_CMD_DMAPAUSE_16 ;
|
||||
if (d->bd_flags & BD_F_HISPEED) {
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
d->flags |= SND_F_INIT ;
|
||||
} else {
|
||||
sb_cmd(d->io_base, cmd); /* pause dma. */
|
||||
@ -481,7 +492,7 @@ sb_reset_dsp(int io_base)
|
||||
{
|
||||
int loopc;
|
||||
|
||||
outb(io_base + SBDSP_RST, 1);
|
||||
outb(io_base + SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
outb(io_base + SBDSP_RST, 0);
|
||||
for (loopc = 0; loopc<100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++)
|
||||
@ -795,7 +806,9 @@ dsp_speed(snddev_info *d)
|
||||
* simultaneously using midi.
|
||||
* At the moment we do not support either...
|
||||
*/
|
||||
#if 0
|
||||
d->flags &= ~SND_F_STEREO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* here enforce speed limitations.
|
||||
|
@ -156,7 +156,7 @@ ESS688
|
||||
|
||||
http://www.esstech.com
|
||||
|
||||
pnp 1 1 os enable irq0 7 drq0 1 port1 0x220
|
||||
pnp 1 1 os enable irq0 7 drq0 1 port0 0x220
|
||||
|
||||
There used to be documentation for the 1868 on the ESS site
|
||||
(files ds1868b1.pdf and ds1868b2.pdf) but I am unable to find
|
||||
|
@ -20,21 +20,6 @@ set of ioctl(), to support some functions which were not easy to
|
||||
express with the existing software interface (e.g. full duplex on
|
||||
the SB16). To make an effective use of the new functionalities you
|
||||
need to recompile applications by replacing the audio module(s).
|
||||
Such modified driver modules are present in the misc/ directory
|
||||
for several applications.
|
||||
|
||||
This file gives quick information on how to install the driver. For
|
||||
more info you are invited to look at the doc/ directory where you
|
||||
can find more documentation (in Latex and Postscript) on the driver
|
||||
and how to extend it. I am afraid there is not yet a complete set of
|
||||
manual pages for using the driver. The files in doc/ should give a
|
||||
good idea of what the driver is supposed to do and how, the Voxware
|
||||
documentation should be of some help, and the various driver modules
|
||||
in misc/ should also give some help.
|
||||
|
||||
Also note that you might need the PnP code (pnp971020.tgz), which
|
||||
as of January 1998 has been incorporated in -current and -stable
|
||||
versions of FreeBSD.
|
||||
|
||||
Updated versions of this code will available at the following URL:
|
||||
|
||||
@ -45,20 +30,6 @@ to build a working kernel. The configuration is DIFFERENT (and
|
||||
hopefully much simpler) from the original Voxware driver. The
|
||||
relevant steps are indicated at "---INSTALLATION---".
|
||||
|
||||
This code (and the associated patches) should work unmodified on 2.2.5
|
||||
and in general on 2.2.X versions of FreeBSD. Minor modifications will be
|
||||
necessary to make the code work on 2.1.X. Finally, depending on the
|
||||
version of their system, 3.0 users might need to uncomment the
|
||||
following line in snd/sound.h:
|
||||
|
||||
/* #define USE_POLL */
|
||||
|
||||
This archive includes:
|
||||
* the main files for the driver, in this directory, which must be
|
||||
moved to /sys/i386/isa/snd;
|
||||
* miscellaneous, but important, files in the "misc" subdirectory;
|
||||
* documentation, in the "doc" subdirectory;
|
||||
|
||||
CARDS:
|
||||
|
||||
The driver supports most clones of WSS, SB16 and SBPro cards.
|
||||
@ -78,55 +49,10 @@ APPLICATIONS:
|
||||
- xanim
|
||||
- various mpeg players (mpg123, amp, ...);
|
||||
|
||||
WITH SPECIAL DRIVER MODULE (supplied)
|
||||
- speak_freely, full duplex (requires removing the definition of
|
||||
HALF_DUPLEX in the Makefile);
|
||||
- the realaudio player (3.0, dynamically linked);
|
||||
- vat, full duplex (driver included);
|
||||
- nas, full duplex (driver included);
|
||||
- timidity, a software midi-to-pcm converter;
|
||||
|
||||
NOT WORKING
|
||||
- xquake (we do not support mmapped buffers yet);
|
||||
|
||||
|
||||
---INSTALLATION---
|
||||
|
||||
In order to use this driver, you need FreeBSD 2.2 or above (I have
|
||||
tested this code on 2.2.1 and 2.2.5, and have many reports of the
|
||||
driver working on various vintages of 3.0 ). The enclosed patch
|
||||
file refers to FreeBSD 2.2.5. Your mileage may vary -- e.g. both
|
||||
-stable and -current at the time of this writing (Jan.98) have
|
||||
included the modifications to isa.c .
|
||||
|
||||
Installation requires the following steps:
|
||||
|
||||
* install the PnP support files (pnp971020.tgz). This is optional,
|
||||
in case you don't you might need to do some simple modifications
|
||||
to the file because pnp.h might not exist.
|
||||
|
||||
* unpack the content of this archive in /sys/i386/isa/snd/
|
||||
|
||||
* if you are running a version of 2.2 earlies than 2.2.5-RELEASE,
|
||||
apply the patches in "patches.22x" to isa.c
|
||||
|
||||
* patch the following system files using the patches in
|
||||
"patches.225" :
|
||||
|
||||
/sys/i386/isa/isa.c
|
||||
a couple of new functions have been added;
|
||||
|
||||
/sys/i386/conf/files.i386
|
||||
lines related to this audio driver have been added;
|
||||
|
||||
* update file soundcard.h by copying the one in this directory into:
|
||||
|
||||
/sys/i386/include/soundcard.h
|
||||
/usr/include/machine/soundcard.h
|
||||
|
||||
The new file should be compatible with the old one, but has
|
||||
the definition of new ioctl() calls which are implemented by
|
||||
this driver.
|
||||
---INSTALLATION---
|
||||
|
||||
* add the following lines to your kernel configuration file:
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* AD1848, CS4248, CS423x, OPTi931, Yamaha SA2 and many others.
|
||||
*
|
||||
* Copyright Luigi Rizzo, 1997
|
||||
* Copyright Luigi Rizzo, 1997,1998
|
||||
* Copyright by Hannu Savolainen 1994, 1995
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -1392,7 +1392,7 @@ cs423x_attach(u_long csn, u_long vend_id, char *name,
|
||||
return ;
|
||||
}
|
||||
snddev_last_probed = &tmp_d;
|
||||
if (d.flags) { /*** use sb-compatible codec ***/
|
||||
if (d.flags & DV_PNP_SBCODEC) { /*** use sb-compatible codec ***/
|
||||
dev->id_alive = 16 ; /* number of io ports ? */
|
||||
tmp_d = sb_op_desc ;
|
||||
if (vend_id==0x2000a865 || vend_id==0x3000a865 || vend_id==0x8140d315) {
|
||||
@ -1511,7 +1511,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
enable_pnp_card();
|
||||
|
||||
snddev_last_probed = &tmp_d;
|
||||
tmp_d = d.flags ? sb_op_desc : mss_op_desc ;
|
||||
tmp_d = d.flags & DV_PNP_SBCODEC ? sb_op_desc : mss_op_desc ;
|
||||
|
||||
strcpy(tmp_d.name, name);
|
||||
|
||||
@ -1533,7 +1533,7 @@ opti931_attach(u_long csn, u_long vend_id, char *name,
|
||||
opti_write(p, 4, 0xd6 /* fifo empty, OPL3, audio enable, SB3.2 */ );
|
||||
ad_write (&tmp_d, 10, 2); /* enable interrupts */
|
||||
|
||||
if (d.flags) { /* sb-compatible codec */
|
||||
if (d.flags & DV_PNP_SBCODEC) { /* sb-compatible codec */
|
||||
/*
|
||||
* the 931 is not a real SB, it has important pieces of
|
||||
* hardware controlled by both the WSS and the SB port...
|
||||
|
@ -32,7 +32,7 @@
|
||||
*/
|
||||
|
||||
#include <i386/isa/snd/sound.h>
|
||||
#include <i386/isa/snd/ulaw.h>
|
||||
#include <i386/isa/sound/ulaw.h>
|
||||
|
||||
#define MIN_CHUNK_SIZE 256 /* for uiomove etc. */
|
||||
#define DMA_ALIGN_THRESHOLD 4
|
||||
@ -247,7 +247,7 @@ dsp_write_body(snddev_info *d, struct uio *buf)
|
||||
* the previous operation.
|
||||
*/
|
||||
bsz = b->dl ? MIN_CHUNK_SIZE : b->bufsize ;
|
||||
while ( n = buf->uio_resid ) {
|
||||
while ( (n = buf->uio_resid) ) {
|
||||
l = min (n, bsz); /* at most n bytes ... */
|
||||
s = spltty(); /* no interrupts here ... */
|
||||
dsp_wr_dmaupdate(b);
|
||||
@ -761,7 +761,7 @@ snd_flush(snddev_info *d)
|
||||
return -1 ;
|
||||
}
|
||||
if ( ret && --count == 0) {
|
||||
printf("timeout flushing dbuf_out.chan, cnt 0x%x flags 0x%08x\n",
|
||||
printf("timeout flushing dbuf_out.chan, cnt 0x%x flags 0x%08lx\n",
|
||||
b->rl, d->flags);
|
||||
break;
|
||||
}
|
||||
|
@ -208,6 +208,8 @@ sb_dsp_open(dev_t dev, int flags, int mode, struct proc * p)
|
||||
d->flags |= SND_F_NBIO ;
|
||||
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
ask_init(d);
|
||||
|
||||
return 0;
|
||||
@ -420,6 +422,9 @@ sb_callback(snddev_info *d, int reason)
|
||||
sb_cmd3(d->io_base, c1 , l - 1) ;
|
||||
} else if (d->bd_flags & BD_F_ESS) {
|
||||
/* XXX this code is still incomplete */
|
||||
sb_cmd2(d->io_base, 0xb8, rd ? 4 : 0xe ) ; /* auto dma */
|
||||
sb_cmd2(d->io_base, 0xa8, d->flags & SND_F_STEREO ? 1 : 2) ;
|
||||
sb_cmd2(d->io_base, 0xb9, 2) ; /* demand dma */
|
||||
} else { /* SBPro -- stereo not supported */
|
||||
u_char c ;
|
||||
if (!rd)
|
||||
@ -429,6 +434,10 @@ sb_callback(snddev_info *d, int reason)
|
||||
c = (rd) ? 0x98 : 0x90 ;
|
||||
else
|
||||
c = (rd) ? 0x2c : 0x1c ;
|
||||
if (d->flags & SND_F_STEREO)
|
||||
sb_setmixer(d->io_base, 0xe, 2 );
|
||||
else
|
||||
sb_setmixer(d->io_base, 0xe, 0 );
|
||||
/*
|
||||
* some ESS extensions -- they can do 16 bits
|
||||
*/
|
||||
@ -450,6 +459,8 @@ sb_callback(snddev_info *d, int reason)
|
||||
cmd = DSP_CMD_DMAPAUSE_16 ;
|
||||
if (d->bd_flags & BD_F_HISPEED) {
|
||||
sb_reset_dsp(d->io_base);
|
||||
if (d->bd_flags & BD_F_ESS)
|
||||
sb_cmd(d->io_base, 0xc6 ); /* enable extended ESS mode */
|
||||
d->flags |= SND_F_INIT ;
|
||||
} else {
|
||||
sb_cmd(d->io_base, cmd); /* pause dma. */
|
||||
@ -481,7 +492,7 @@ sb_reset_dsp(int io_base)
|
||||
{
|
||||
int loopc;
|
||||
|
||||
outb(io_base + SBDSP_RST, 1);
|
||||
outb(io_base + SBDSP_RST, 3);
|
||||
DELAY(100);
|
||||
outb(io_base + SBDSP_RST, 0);
|
||||
for (loopc = 0; loopc<100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++)
|
||||
@ -795,7 +806,9 @@ dsp_speed(snddev_info *d)
|
||||
* simultaneously using midi.
|
||||
* At the moment we do not support either...
|
||||
*/
|
||||
#if 0
|
||||
d->flags &= ~SND_F_STEREO;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* here enforce speed limitations.
|
||||
|
@ -50,7 +50,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "opt_devfs.h"
|
||||
|
||||
#include <i386/isa/snd/sound.h>
|
||||
#ifdef DEVFS
|
||||
#include <sys/devfsext.h>
|
||||
#endif /* DEVFS */
|
||||
|
||||
|
||||
#if NPCM > 0 /* from "snd.h" */
|
||||
|
||||
@ -215,6 +221,29 @@ pcmattach(struct isa_device * dev)
|
||||
isadev = makedev(CDEV_MAJOR, 0);
|
||||
cdevsw_add(&isadev, &snd_cdevsw, NULL);
|
||||
|
||||
#ifdef DEVFS
|
||||
/*
|
||||
* XXX remember to store the returned tokens if you want to
|
||||
* be able to remove the device later
|
||||
*/
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_DSP,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "dsp%n", dev->id_unit);
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_DSP16,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "dspW%n", dev->id_unit);
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_AUDIO,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "audio%n", dev->id_unit);
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_CTL,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "mixer%n", dev->id_unit);
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_STATUS,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "sndstat%n", dev->id_unit);
|
||||
#if 0 /* these two are still unsupported... */
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_MIDIN,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "midi%n", dev->id_unit);
|
||||
devfs_add_devswf(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_SYNTH,
|
||||
DV_CHR, UID_ROOT, GID_WHEEL, 0600, "sequencer%n", dev->id_unit);
|
||||
#endif
|
||||
#endif /* DEVFS */
|
||||
|
||||
/*
|
||||
* should try and find a suitable value for id_id, otherwise
|
||||
* the interrupt is not registered and dispatched properly.
|
||||
@ -330,7 +359,7 @@ get_snddev_info(dev_t dev, int *unit)
|
||||
case SND_DEV_DSP :
|
||||
case SND_DEV_DSP16 :
|
||||
case SND_DEV_AUDIO :
|
||||
case SND_DEV_SEQ : /* XXX goes here... */
|
||||
case SND_DEV_SEQ : /* XXX when enabled... */
|
||||
d = & pcm_info[u] ;
|
||||
break ;
|
||||
case SND_DEV_SEQ2 :
|
||||
@ -687,7 +716,7 @@ sndioctl(dev_t i_dev, int cmd, caddr_t arg, int mode, struct proc * p)
|
||||
{
|
||||
snd_chan_param *p = (snd_chan_param *)arg;
|
||||
d->play_speed = p->play_rate;
|
||||
d->rec_speed = p->play_rate; /* XXX */
|
||||
d->rec_speed = p->play_rate; /* XXX one speed allowed */
|
||||
if (p->play_format & SND_F_STEREO)
|
||||
d->flags |= SND_F_STEREO ;
|
||||
else
|
||||
@ -975,6 +1004,7 @@ sndioctl(dev_t i_dev, int cmd, caddr_t arg, int mode, struct proc * p)
|
||||
*/
|
||||
|
||||
case SOUND_MIXER_READ_DEVMASK :
|
||||
case SOUND_MIXER_READ_CAPS :
|
||||
case SOUND_MIXER_READ_STEREODEVS :
|
||||
*(int *)arg = d->mix_devs;
|
||||
break ;
|
||||
@ -999,10 +1029,10 @@ sndioctl(dev_t i_dev, int cmd, caddr_t arg, int mode, struct proc * p)
|
||||
|
||||
/*
|
||||
* we use the name 'select', but the new "poll" interface this is
|
||||
* really sndpoll. Second arg is not "rw" but "events"
|
||||
* really sndpoll. Second arg for poll is not "rw" but "events"
|
||||
*/
|
||||
int
|
||||
sndselect(dev_t i_dev, int rw, struct proc * p)
|
||||
sndselect(dev_t i_dev, int rw, struct proc *p)
|
||||
{
|
||||
int dev, unit, c = 1 /* default: success */ ;
|
||||
snddev_info *d ;
|
||||
@ -1011,39 +1041,24 @@ sndselect(dev_t i_dev, int rw, struct proc * p)
|
||||
dev = minor(i_dev);
|
||||
d = get_snddev_info(dev, &unit);
|
||||
DEB(printf("sndselect dev 0x%04x rw 0x%08x\n",i_dev, rw));
|
||||
if (d == NULL ) {
|
||||
#ifdef USE_POLL
|
||||
return ( (rw & (POLLIN|POLLOUT|POLLRDNORM|POLLWRNORM)) | POLLHUP);
|
||||
#else
|
||||
if (d == NULL ) /* should not happen! */
|
||||
return (ENXIO) ;
|
||||
#endif
|
||||
}
|
||||
if (d->select == NULL)
|
||||
#ifdef USE_POLL
|
||||
return ( (rw & (POLLIN|POLLOUT|POLLRDNORM|POLLWRNORM)) | POLLHUP);
|
||||
#else
|
||||
return 1 ; /* always success ? */
|
||||
#endif
|
||||
else if (d->select != sndselect )
|
||||
return d->select(i_dev, rw, p);
|
||||
else {
|
||||
/* handle it here with the generic code */
|
||||
|
||||
int lim ;
|
||||
int revents = 0 ;
|
||||
|
||||
/*
|
||||
* if the user selected a block size, then we want to use the
|
||||
* device as a block device, and select will return ready when
|
||||
* we have a full block.
|
||||
* In all other cases, select will return when 1 byte is ready.
|
||||
*/
|
||||
lim = 1;
|
||||
#ifdef USE_POLL
|
||||
int lim = 1;
|
||||
|
||||
int revents = 0 ;
|
||||
if (rw & (POLLOUT | POLLWRNORM) ) {
|
||||
#else
|
||||
if (rw == FWRITE) {
|
||||
#endif
|
||||
if ( d->flags & SND_F_HAS_SIZE )
|
||||
lim = d->play_blocksize ;
|
||||
/* XXX fix the test here for half duplex devices */
|
||||
@ -1054,19 +1069,12 @@ sndselect(dev_t i_dev, int rw, struct proc * p)
|
||||
c = d->dbuf_out.fl ;
|
||||
if (c < lim) /* no space available */
|
||||
selrecord(p, & (d->wsel));
|
||||
#ifdef USE_POLL
|
||||
else
|
||||
revents |= rw & (POLLOUT | POLLWRNORM);
|
||||
#endif
|
||||
splx(flags);
|
||||
}
|
||||
#ifdef USE_POLL
|
||||
}
|
||||
if (rw & (POLLIN | POLLRDNORM)) {
|
||||
#else
|
||||
return c < lim ? 0 : 1 ;
|
||||
} else if (rw == FREAD) {
|
||||
#endif
|
||||
if ( d->flags & SND_F_HAS_SIZE )
|
||||
lim = d->rec_blocksize ;
|
||||
/* XXX fix the test here */
|
||||
@ -1079,24 +1087,15 @@ sndselect(dev_t i_dev, int rw, struct proc * p)
|
||||
c = d->dbuf_in.rl ;
|
||||
if (c < lim) /* no data available */
|
||||
selrecord(p, & (d->rsel));
|
||||
#ifdef USE_POLL
|
||||
else
|
||||
revents |= rw & (POLLIN | POLLRDNORM);
|
||||
#endif
|
||||
splx(flags);
|
||||
}
|
||||
DEB(printf("sndselect on read: %d >= %d flags 0x%08x\n",
|
||||
c, lim, d->flags));
|
||||
return c < lim ? 0 : 1 ;
|
||||
#ifdef USE_POLL
|
||||
}
|
||||
return revents;
|
||||
#else
|
||||
} else {
|
||||
DDB(printf("select on exceptions, unimplemented\n"));
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return ENXIO ; /* notreached */
|
||||
}
|
||||
@ -1198,7 +1197,7 @@ init_status(snddev_info *d)
|
||||
if (status_len != 0) /* only do init once */
|
||||
return ;
|
||||
sprintf(status_buf,
|
||||
"FreeBSD Audio Driver (980123) " __DATE__ " " __TIME__ "\n"
|
||||
"FreeBSD Audio Driver (980215) " __DATE__ " " __TIME__ "\n"
|
||||
"Installed devices:\n");
|
||||
|
||||
for (i = 0; i < NPCM_MAX; i++) {
|
||||
|
@ -1,5 +1,3 @@
|
||||
/* uncomment the next line for -current with select->poll changes */
|
||||
#define USE_POLL
|
||||
/*
|
||||
* sound.h
|
||||
*
|
||||
@ -67,10 +65,9 @@
|
||||
#include <i386/isa/isa_device.h>
|
||||
#include <machine/clock.h> /* for DELAY */
|
||||
|
||||
#ifdef USE_POLL
|
||||
/* To minimize changes with the code in 2.2.X */
|
||||
#include <sys/poll.h>
|
||||
#define d_select_t d_poll_t
|
||||
#endif
|
||||
|
||||
#else
|
||||
struct isa_device { int dummy ; } ;
|
||||
@ -296,36 +293,6 @@ struct _snddev_info {
|
||||
|
||||
#define NPCM_MAX 8 /* Number of supported devices */
|
||||
|
||||
/*
|
||||
* Supported card ID numbers (were in soundcard.h...)
|
||||
*/
|
||||
|
||||
#define SNDCARD_ADLIB 1
|
||||
#define SNDCARD_SB 2
|
||||
#define SNDCARD_PAS 3
|
||||
#define SNDCARD_GUS 4
|
||||
#define SNDCARD_MPU401 5
|
||||
#define SNDCARD_SB16 6
|
||||
#define SNDCARD_SB16MIDI 7
|
||||
#define SNDCARD_UART6850 8
|
||||
#define SNDCARD_GUS16 9
|
||||
#define SNDCARD_MSS 10
|
||||
#define SNDCARD_PSS 11
|
||||
#define SNDCARD_SSCAPE 12
|
||||
#define SNDCARD_PSS_MPU 13
|
||||
#define SNDCARD_PSS_MSS 14
|
||||
#define SNDCARD_SSCAPE_MSS 15
|
||||
#define SNDCARD_TRXPRO 16
|
||||
#define SNDCARD_TRXPRO_SB 17
|
||||
#define SNDCARD_TRXPRO_MPU 18
|
||||
#define SNDCARD_MAD16 19
|
||||
#define SNDCARD_MAD16_MPU 20
|
||||
#define SNDCARD_CS4232 21
|
||||
#define SNDCARD_CS4232_MPU 22
|
||||
#define SNDCARD_MAUI 23
|
||||
#define SNDCARD_PSEUDO_MSS 24 /* MSS without WSS regs.*/
|
||||
#define SNDCARD_AWE32 25
|
||||
|
||||
/*
|
||||
* values used in bd_id for the mss boards
|
||||
*/
|
||||
@ -346,11 +313,7 @@ struct _snddev_info {
|
||||
/*
|
||||
* TODO: add some card classes rather than specific types.
|
||||
*/
|
||||
#ifdef KERNEL
|
||||
#include <i386/isa/snd/soundcard.h>
|
||||
#else
|
||||
#include </sys/i386/isa/snd/soundcard.h>
|
||||
#endif
|
||||
#include <machine/soundcard.h>
|
||||
/*
|
||||
* many variables should be reduced to a range. Here define a macro
|
||||
*/
|
||||
@ -468,12 +431,6 @@ int pcmattach(struct isa_device * dev);
|
||||
int midiattach(struct isa_device * dev);
|
||||
int synthattach(struct isa_device * dev);
|
||||
|
||||
/*
|
||||
* functions in isa.c
|
||||
*/
|
||||
|
||||
int isa_dmastatus(int chan);
|
||||
int isa_dmastop(int chan);
|
||||
/*
|
||||
* DMA buffer calls
|
||||
*/
|
||||
@ -544,4 +501,9 @@ int sb_getmixer (int io_base, u_int port);
|
||||
* so it is better to make this the default behaviour
|
||||
*/
|
||||
|
||||
/*
|
||||
* the following flags are for PnP cards only and are undocumented
|
||||
*/
|
||||
#define DV_PNP_SBCODEC 0x1
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user