summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>1999-12-18 22:21:47 +0000
committercg <cg@FreeBSD.org>1999-12-18 22:21:47 +0000
commit42c32f7a3bce72d01778522bc5aefc5269d0183b (patch)
tree003d0965d42629694b66629b6c89f03789315150
parentcf78a64fe544a3f151650ec18a70d3d08b303cd2 (diff)
downloadFreeBSD-src-42c32f7a3bce72d01778522bc5aefc5269d0183b.zip
FreeBSD-src-42c32f7a3bce72d01778522bc5aefc5269d0183b.tar.gz
make the vibra16x work for playback at least, record is untested
-rw-r--r--sys/dev/sound/isa/sb.c18
-rw-r--r--sys/dev/sound/isa/sb.h7
-rw-r--r--sys/dev/sound/isa/sb16.c18
-rw-r--r--sys/dev/sound/isa/sb8.c18
-rw-r--r--sys/dev/sound/isa/sbc.c59
5 files changed, 75 insertions, 45 deletions
diff --git a/sys/dev/sound/isa/sb.c b/sys/dev/sound/isa/sb.c
index ef55248..cec7940 100644
--- a/sys/dev/sound/isa/sb.c
+++ b/sys/dev/sound/isa/sb.c
@@ -648,9 +648,9 @@ sb_start(struct sb_chinfo *ch)
int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
int l = ch->buffer->dl;
int dh = ch->buffer->chan > 3;
- u_char i1, i2 = 0;
+ u_char i1, i2;
- if (b16) l >>= 1;
+ if (b16 || dh) l >>= 1;
l--;
if (play) sb_cmd(sb, DSP_CMD_SPKON);
if (sb->bd_flags & BD_F_SB16) {
@@ -812,14 +812,18 @@ sbchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct sb_info *sb = devinfo;
struct sb_chinfo *ch = (dir == PCMDIR_PLAY)? &sb->pch : &sb->rch;
+ int dch, dl, dh;
ch->parent = sb;
ch->channel = c;
ch->buffer = b;
ch->buffer->bufsize = DSP_BUFFSIZE;
if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1) return NULL;
- ch->buffer->chan = (dir == PCMDIR_PLAY)? rman_get_start(sb->drq2)
- : rman_get_start(sb->drq1);
+ dch = (dir == PCMDIR_PLAY)? 1 : 0;
+ if (sb->bd_flags & BD_F_SB16X) dch = !dch;
+ dl = rman_get_start(sb->drq1);
+ if (sb->drq2) dh = rman_get_start(sb->drq2); else dh = dl;
+ ch->buffer->chan = dch? dh : dl;
return ch;
}
@@ -1078,7 +1082,7 @@ static int
sbsbc_probe(device_t dev)
{
char buf[64];
- u_int32_t func, ver, r;
+ u_int32_t func, ver, r, f;
/* The parent device has already been probed. */
r = BUS_READ_IVAR(device_get_parent(dev), dev, 0, &func);
@@ -1086,8 +1090,10 @@ sbsbc_probe(device_t dev)
return (ENXIO);
r = BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
+ f = (ver & 0xffff0000) >> 16;
ver &= 0x0000ffff;
- snprintf(buf, sizeof buf, "SB DSP %d.%02d", ver >> 8, ver & 0xff);
+ snprintf(buf, sizeof buf, "SB DSP %d.%02d%s", ver >> 8, ver & 0xff,
+ (f & BD_F_ESS)? " (ESS mode)" : "");
device_set_desc_copy(dev, buf);
return 0;
diff --git a/sys/dev/sound/isa/sb.h b/sys/dev/sound/isa/sb.h
index 0bb3496..22e8ebb 100644
--- a/sys/dev/sound/isa/sb.h
+++ b/sys/dev/sound/isa/sb.h
@@ -123,8 +123,10 @@
*/
#define BD_F_HISPEED 0x0001 /* doing high speed ... */
+#if 0
#define BD_F_JAZZ16 0x0002 /* jazz16 detected */
#define BD_F_JAZZ16_2 0x0004 /* jazz16 type 2 */
+#endif
#define BD_F_DUP_MIDI 0x0008 /* duplex midi */
@@ -135,16 +137,19 @@
#define BD_F_SB16 0x0100 /* this is a SB16 */
#define BD_F_SB16X 0x0200 /* this is a vibra16X or clone */
+#if 0
#define BD_F_MIDIBUSY 0x0400 /* midi busy */
+#endif
#define BD_F_ESS 0x0800 /* this is an ESS chip */
/*
* on some SB16 cards, at times I swap DMA channels. Remember this
* so that they can be restored later.
*/
+#if 0
#define BD_F_SWAPPED 0x1000 /* have swapped DMA channels */
+#endif
#define BD_F_DMARUN 0x2000
#define BD_F_DMARUN2 0x4000
-#define BD_F_DUPLEX 0x8000
/*
* Mixer registers of SB Pro
diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c
index ef55248..cec7940 100644
--- a/sys/dev/sound/isa/sb16.c
+++ b/sys/dev/sound/isa/sb16.c
@@ -648,9 +648,9 @@ sb_start(struct sb_chinfo *ch)
int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
int l = ch->buffer->dl;
int dh = ch->buffer->chan > 3;
- u_char i1, i2 = 0;
+ u_char i1, i2;
- if (b16) l >>= 1;
+ if (b16 || dh) l >>= 1;
l--;
if (play) sb_cmd(sb, DSP_CMD_SPKON);
if (sb->bd_flags & BD_F_SB16) {
@@ -812,14 +812,18 @@ sbchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct sb_info *sb = devinfo;
struct sb_chinfo *ch = (dir == PCMDIR_PLAY)? &sb->pch : &sb->rch;
+ int dch, dl, dh;
ch->parent = sb;
ch->channel = c;
ch->buffer = b;
ch->buffer->bufsize = DSP_BUFFSIZE;
if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1) return NULL;
- ch->buffer->chan = (dir == PCMDIR_PLAY)? rman_get_start(sb->drq2)
- : rman_get_start(sb->drq1);
+ dch = (dir == PCMDIR_PLAY)? 1 : 0;
+ if (sb->bd_flags & BD_F_SB16X) dch = !dch;
+ dl = rman_get_start(sb->drq1);
+ if (sb->drq2) dh = rman_get_start(sb->drq2); else dh = dl;
+ ch->buffer->chan = dch? dh : dl;
return ch;
}
@@ -1078,7 +1082,7 @@ static int
sbsbc_probe(device_t dev)
{
char buf[64];
- u_int32_t func, ver, r;
+ u_int32_t func, ver, r, f;
/* The parent device has already been probed. */
r = BUS_READ_IVAR(device_get_parent(dev), dev, 0, &func);
@@ -1086,8 +1090,10 @@ sbsbc_probe(device_t dev)
return (ENXIO);
r = BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
+ f = (ver & 0xffff0000) >> 16;
ver &= 0x0000ffff;
- snprintf(buf, sizeof buf, "SB DSP %d.%02d", ver >> 8, ver & 0xff);
+ snprintf(buf, sizeof buf, "SB DSP %d.%02d%s", ver >> 8, ver & 0xff,
+ (f & BD_F_ESS)? " (ESS mode)" : "");
device_set_desc_copy(dev, buf);
return 0;
diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c
index ef55248..cec7940 100644
--- a/sys/dev/sound/isa/sb8.c
+++ b/sys/dev/sound/isa/sb8.c
@@ -648,9 +648,9 @@ sb_start(struct sb_chinfo *ch)
int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0;
int l = ch->buffer->dl;
int dh = ch->buffer->chan > 3;
- u_char i1, i2 = 0;
+ u_char i1, i2;
- if (b16) l >>= 1;
+ if (b16 || dh) l >>= 1;
l--;
if (play) sb_cmd(sb, DSP_CMD_SPKON);
if (sb->bd_flags & BD_F_SB16) {
@@ -812,14 +812,18 @@ sbchan_init(void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
{
struct sb_info *sb = devinfo;
struct sb_chinfo *ch = (dir == PCMDIR_PLAY)? &sb->pch : &sb->rch;
+ int dch, dl, dh;
ch->parent = sb;
ch->channel = c;
ch->buffer = b;
ch->buffer->bufsize = DSP_BUFFSIZE;
if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1) return NULL;
- ch->buffer->chan = (dir == PCMDIR_PLAY)? rman_get_start(sb->drq2)
- : rman_get_start(sb->drq1);
+ dch = (dir == PCMDIR_PLAY)? 1 : 0;
+ if (sb->bd_flags & BD_F_SB16X) dch = !dch;
+ dl = rman_get_start(sb->drq1);
+ if (sb->drq2) dh = rman_get_start(sb->drq2); else dh = dl;
+ ch->buffer->chan = dch? dh : dl;
return ch;
}
@@ -1078,7 +1082,7 @@ static int
sbsbc_probe(device_t dev)
{
char buf[64];
- u_int32_t func, ver, r;
+ u_int32_t func, ver, r, f;
/* The parent device has already been probed. */
r = BUS_READ_IVAR(device_get_parent(dev), dev, 0, &func);
@@ -1086,8 +1090,10 @@ sbsbc_probe(device_t dev)
return (ENXIO);
r = BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver);
+ f = (ver & 0xffff0000) >> 16;
ver &= 0x0000ffff;
- snprintf(buf, sizeof buf, "SB DSP %d.%02d", ver >> 8, ver & 0xff);
+ snprintf(buf, sizeof buf, "SB DSP %d.%02d%s", ver >> 8, ver & 0xff,
+ (f & BD_F_ESS)? " (ESS mode)" : "");
device_set_desc_copy(dev, buf);
return 0;
diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c
index bd90ba6..c051604 100644
--- a/sys/dev/sound/isa/sbc.c
+++ b/sys/dev/sound/isa/sbc.c
@@ -241,12 +241,13 @@ bad: return s? 0 : ENXIO;
static int
sbc_attach(device_t dev)
{
+ char *err = NULL;
struct sbc_softc *scp;
struct sndcard_func *func;
device_t child;
u_int32_t logical_id = isa_get_logicalid(dev);
int flags = device_get_flags(dev);
- int f = 0, dh = -1, dl = -1;
+ int f, dh, dl, x, irq;
if (!logical_id && (flags & DV_F_DUAL_DMA)) {
bus_set_resource(dev, SYS_RES_DRQ, 1,
@@ -256,11 +257,15 @@ sbc_attach(device_t dev)
scp = device_get_softc(dev);
bzero(scp, sizeof(*scp));
scp->dev = dev;
+ err = "alloc_resource";
if (alloc_resource(scp)) goto bad;
+ err = "sb_reset_dsp";
if (sb_reset_dsp(scp->io[0])) goto bad;
+ err = "sb_identify_board";
scp->bd_ver = sb_identify_board(scp->io[0]) & 0x00000fff;
if (scp->bd_ver == 0) goto bad;
+ f = 0;
switch ((scp->bd_ver & 0x0f00) >> 8) {
case 1: /* old sound blaster has nothing... */
break;
@@ -279,33 +284,34 @@ sbc_attach(device_t dev)
case 4:
f |= BD_F_SB16 | BD_F_MIX_CT1745;
- if (scp->drq[0]) dl = rman_get_start(scp->drq[0]);
+ if (scp->drq[0]) dl = rman_get_start(scp->drq[0]); else dl = -1;
if (scp->drq[1]) dh = rman_get_start(scp->drq[1]); else dh = dl;
- if (dh != dl) f |= BD_F_DUPLEX;
- if (dh < dl) {
- struct resource *r;
- r = scp->drq[0];
- scp->drq[0] = scp->drq[1];
- scp->drq[1] = r;
- dl = rman_get_start(scp->drq[0]);
- dh = rman_get_start(scp->drq[1]);
- }
if (!logical_id) {
- /* soft irq/dma configuration */
- int x = -1, irq = rman_get_start(scp->irq);
- if (irq == 5) x = 2;
- else if (irq == 7) x = 4;
- else if (irq == 9) x = 1;
- else if (irq == 10) x = 8;
- if (x == -1) device_printf(dev,
- "bad irq %d (5/7/9/10 valid)\n",
- irq);
- else sb_setmixer(scp->io[0], IRQ_NR, x);
- sb_setmixer(scp->io[0], DMA_NR, (1 << dh) | (1 << dl));
- device_printf(dev, "setting non-pnp card to irq %d, drq %d", irq, dl);
- if (dl != dh) printf(", %d", dh);
- printf("\n");
+ if (dh < dl) {
+ struct resource *r;
+ r = scp->drq[0];
+ scp->drq[0] = scp->drq[1];
+ scp->drq[1] = r;
+ dl = rman_get_start(scp->drq[0]);
+ dh = rman_get_start(scp->drq[1]);
+ }
+ }
+ /* soft irq/dma configuration */
+ x = -1;
+ irq = rman_get_start(scp->irq);
+ if (irq == 5) x = 2;
+ else if (irq == 7) x = 4;
+ else if (irq == 9) x = 1;
+ else if (irq == 10) x = 8;
+ if (x == -1) {
+ err = "bad irq (5/7/9/10 valid)";
+ goto bad;
}
+ else sb_setmixer(scp->io[0], IRQ_NR, x);
+ sb_setmixer(scp->io[0], DMA_NR, (1 << dh) | (1 << dl));
+ device_printf(dev, "setting card to irq %d, drq %d", irq, dl);
+ if (dl != dh) printf(", %d", dh);
+ printf("\n");
break;
}
@@ -348,7 +354,8 @@ sbc_attach(device_t dev)
return (0);
-bad: release_resource(scp);
+bad: if (err) device_printf(dev, "%s\n", err);
+ release_resource(scp);
return (ENXIO);
}
OpenPOWER on IntegriCloud