sb16: make it work in bochs
This commit is contained in:
parent
f148f75f09
commit
7b0e90b5d1
2 changed files with 62 additions and 132 deletions
|
@ -38,8 +38,6 @@ enum
|
||||||
{
|
{
|
||||||
Bufsize = 1024, /* 5.8 ms each, must be power of two */
|
Bufsize = 1024, /* 5.8 ms each, must be power of two */
|
||||||
Nbuf = 128, /* .74 seconds total */
|
Nbuf = 128, /* .74 seconds total */
|
||||||
Dma = 6,
|
|
||||||
IrqAUDIO = 7,
|
|
||||||
SBswab = 0,
|
SBswab = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -364,7 +362,6 @@ contindma(void)
|
||||||
audio.current = b;
|
audio.current = b;
|
||||||
if(b == 0)
|
if(b == 0)
|
||||||
goto shutdown;
|
goto shutdown;
|
||||||
iprint("d");
|
|
||||||
if(dmasetup(blaster.dma, b->virt, Bufsize, 0) >= 0)
|
if(dmasetup(blaster.dma, b->virt, Bufsize, 0) >= 0)
|
||||||
return;
|
return;
|
||||||
print("#A%d: dmasetup fail\n", audio.ctlrno);
|
print("#A%d: dmasetup fail\n", audio.ctlrno);
|
||||||
|
@ -400,12 +397,17 @@ sb16startdma(void)
|
||||||
sbcmd(speed>>8);
|
sbcmd(speed>>8);
|
||||||
sbcmd(speed);
|
sbcmd(speed);
|
||||||
|
|
||||||
count = (Bufsize >> 1) - 1;
|
|
||||||
if(0)
|
if(0)
|
||||||
sbcmd(0xbe); /* A/D, autoinit */
|
sbcmd(0xbe); /* A/D, autoinit */
|
||||||
else
|
else
|
||||||
sbcmd(0xb6); /* D/A, autoinit */
|
sbcmd(0xb6); /* D/A, autoinit */
|
||||||
sbcmd(0x30); /* stereo, signed 16 bit */
|
sbcmd(0x30); /* stereo, signed 16 bit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* not really sure if this is correct, but
|
||||||
|
* it works in bochs
|
||||||
|
*/
|
||||||
|
count = (Bufsize >> 2) - 1;
|
||||||
sbcmd(count);
|
sbcmd(count);
|
||||||
sbcmd(count>>8);
|
sbcmd(count>>8);
|
||||||
|
|
||||||
|
@ -518,45 +520,39 @@ pokeaudio(void)
|
||||||
static void
|
static void
|
||||||
sb16intr(void)
|
sb16intr(void)
|
||||||
{
|
{
|
||||||
int stat, dummy;
|
int stat;
|
||||||
|
|
||||||
stat = mxread(0x82) & 7; /* get irq status */
|
stat = mxread(0x82); /* get irq status */
|
||||||
iprint("i%d",stat);
|
if(stat & 7) {
|
||||||
if(stat) {
|
|
||||||
dummy = 0;
|
|
||||||
if(stat & 2) {
|
|
||||||
ilock(&blaster);
|
ilock(&blaster);
|
||||||
dummy = inb(blaster.clri16);
|
if(stat & 2)
|
||||||
|
inb(blaster.clri16);
|
||||||
|
else if(stat & 1)
|
||||||
|
inb(blaster.clri8);
|
||||||
|
if(stat & 3){
|
||||||
contindma();
|
contindma();
|
||||||
iunlock(&blaster);
|
iunlock(&blaster);
|
||||||
|
|
||||||
audio.intr = 1;
|
audio.intr = 1;
|
||||||
wakeup(&audio.vous);
|
wakeup(&audio.vous);
|
||||||
}
|
}
|
||||||
if(stat & 1) {
|
if(stat & 4)
|
||||||
dummy = inb(blaster.clri8);
|
inb(blaster.clri401);
|
||||||
}
|
|
||||||
if(stat & 4) {
|
|
||||||
dummy = inb(blaster.clri401);
|
|
||||||
}
|
|
||||||
USED(dummy);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ess1688intr(void)
|
ess1688intr(void)
|
||||||
{
|
{
|
||||||
int dummy;
|
|
||||||
|
|
||||||
if(audio.active){
|
if(audio.active){
|
||||||
ilock(&blaster);
|
ilock(&blaster);
|
||||||
contindma();
|
contindma();
|
||||||
dummy = inb(blaster.clri8);
|
inb(blaster.clri8);
|
||||||
iunlock(&blaster);
|
iunlock(&blaster);
|
||||||
audio.intr = 1;
|
audio.intr = 1;
|
||||||
wakeup(&audio.vous);
|
wakeup(&audio.vous);
|
||||||
USED(dummy);
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
print("#A%d: unexpected ess1688 interrupt\n", audio.ctlrno);
|
print("#A%d: unexpected ess1688 interrupt\n", audio.ctlrno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,6 +592,7 @@ waitaudio(void)
|
||||||
pokeaudio();
|
pokeaudio();
|
||||||
tsleep(&audio.vous, anybuf, 0, 10000);
|
tsleep(&audio.vous, anybuf, 0, 10000);
|
||||||
if(audio.intr == 0) {
|
if(audio.intr == 0) {
|
||||||
|
audio.active = 0;
|
||||||
print("#A%d: audio timeout\n", audio.ctlrno); /**/
|
print("#A%d: audio timeout\n", audio.ctlrno); /**/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -709,10 +706,8 @@ audiowrite(Audio *, void *vp, long n, vlong)
|
||||||
if(b == 0) {
|
if(b == 0) {
|
||||||
b = getbuf(&audio.empty);
|
b = getbuf(&audio.empty);
|
||||||
if(b == 0) {
|
if(b == 0) {
|
||||||
if(waitaudio() < 0){
|
if(waitaudio())
|
||||||
audio.active = 0;
|
|
||||||
pokeaudio();
|
pokeaudio();
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
audio.filling = b;
|
audio.filling = b;
|
||||||
|
@ -840,13 +835,14 @@ audioprobe(Audio *adev)
|
||||||
ISAConf sbconf;
|
ISAConf sbconf;
|
||||||
int i, x;
|
int i, x;
|
||||||
static int irq[] = {2,5,7,10};
|
static int irq[] = {2,5,7,10};
|
||||||
|
static int dma16[] = {0,5,6,7};
|
||||||
|
|
||||||
if(audio.probed)
|
if(audio.probed)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
sbconf.port = 0x220;
|
sbconf.port = 0x220;
|
||||||
sbconf.dma = Dma;
|
sbconf.dma = 1;
|
||||||
sbconf.irq = IrqAUDIO;
|
sbconf.irq = 5;
|
||||||
if(isaconfig("audio", adev->ctlrno, &sbconf) == 0)
|
if(isaconfig("audio", adev->ctlrno, &sbconf) == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -877,23 +873,6 @@ audioprobe(Audio *adev)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(sbconf.irq){
|
|
||||||
case 2:
|
|
||||||
case 5:
|
|
||||||
case 7:
|
|
||||||
case 9:
|
|
||||||
case 10:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
print("#A%d: bad irq %d\n", audio.ctlrno, sbconf.irq);
|
|
||||||
iofree(sbconf.port);
|
|
||||||
iofree(sbconf.port+0x100);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
print("#A%d: %s port 0x%04lux irq %d\n", audio.ctlrno, sbconf.type,
|
|
||||||
sbconf.port, sbconf.irq);
|
|
||||||
|
|
||||||
blaster.reset = sbconf.port + 0x6;
|
blaster.reset = sbconf.port + 0x6;
|
||||||
blaster.read = sbconf.port + 0xa;
|
blaster.read = sbconf.port + 0xa;
|
||||||
blaster.write = sbconf.port + 0xc;
|
blaster.write = sbconf.port + 0xc;
|
||||||
|
@ -954,42 +933,56 @@ audioprobe(Audio *adev)
|
||||||
* but then use the contents in case the write is
|
* but then use the contents in case the write is
|
||||||
* disallowed.
|
* disallowed.
|
||||||
*/
|
*/
|
||||||
mxcmd(0x80, /* irq */
|
for(i=0; i<nelem(irq); i++){
|
||||||
(sbconf.irq==2)? 1:
|
if(irq[i] == sbconf.irq){
|
||||||
(sbconf.irq==5)? 2:
|
mxcmd(0x80, 1<<i);
|
||||||
(sbconf.irq==7)? 4:
|
|
||||||
(sbconf.irq==9)? 1:
|
|
||||||
(sbconf.irq==10)? 8:
|
|
||||||
0);
|
|
||||||
|
|
||||||
mxcmd(0x81, 1<<blaster.dma); /* dma */
|
|
||||||
|
|
||||||
x = mxread(0x81);
|
|
||||||
for(i=5; i<=7; i++)
|
|
||||||
if(x & (1<<i)){
|
|
||||||
blaster.dma = i;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
x = mxread(0x80);
|
x = mxread(0x80);
|
||||||
for(i=0; i<=3; i++)
|
for(i=0; i<nelem(irq); i++)
|
||||||
if(x & (1<<i)){
|
if(x & (1<<i)){
|
||||||
sbconf.irq = irq[i];
|
sbconf.irq = irq[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
adev->write = audiowrite;
|
if(blaster.dma < 4)
|
||||||
adev->close = audioclose;
|
mxcmd(0x81, 1<<blaster.dma);
|
||||||
adev->status = audiostatus;
|
else {
|
||||||
adev->buffered = audiobuffered;
|
for(i=0; i<nelem(dma16); i++){
|
||||||
|
if(dma16[i] == blaster.dma){
|
||||||
|
x = mxread(0x81);
|
||||||
|
mxcmd(0x81, 0x10<<i | (x & 0xf));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x = mxread(0x81);
|
||||||
|
for(i=0; i<4; i++)
|
||||||
|
if(x & (1<<i))
|
||||||
|
blaster.dma = i;
|
||||||
|
for(i=0; i<nelem(dma16); i++)
|
||||||
|
if(x & (0x10<<i)){
|
||||||
|
blaster.dma = dma16[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
dmainit(blaster.dma, Bufsize);
|
print("#A%d: %s port 0x%04lux irq %d dma %d\n", audio.ctlrno, sbconf.type,
|
||||||
|
sbconf.port, sbconf.irq, blaster.dma);
|
||||||
|
|
||||||
|
if(dmainit(blaster.dma, Bufsize))
|
||||||
|
return -1;
|
||||||
intrenable(sbconf.irq, pcaudiosbintr, 0, BUSUNKNOWN, "sb16");
|
intrenable(sbconf.irq, pcaudiosbintr, 0, BUSUNKNOWN, "sb16");
|
||||||
|
|
||||||
sbbufinit();
|
sbbufinit();
|
||||||
setempty();
|
setempty();
|
||||||
mxvolume();
|
mxvolume();
|
||||||
|
|
||||||
|
adev->write = audiowrite;
|
||||||
|
adev->close = audioclose;
|
||||||
|
adev->status = audiostatus;
|
||||||
|
adev->buffered = audiobuffered;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
# do not edit; automatically generated
|
|
||||||
|
|
||||||
$ pnp
|
|
||||||
/ root
|
|
||||||
A audio
|
|
||||||
A uda1341
|
|
||||||
B bridge
|
|
||||||
C ce
|
|
||||||
D ssl
|
|
||||||
E sdp
|
|
||||||
F flash
|
|
||||||
G gs1
|
|
||||||
I ip
|
|
||||||
K kprof
|
|
||||||
L lpt
|
|
||||||
M mnt
|
|
||||||
P arch
|
|
||||||
S sd
|
|
||||||
T lm78
|
|
||||||
U usb
|
|
||||||
V lml
|
|
||||||
V tv
|
|
||||||
X loopback
|
|
||||||
Y pccard
|
|
||||||
a tls
|
|
||||||
b irq
|
|
||||||
c cons
|
|
||||||
d dup
|
|
||||||
e env
|
|
||||||
f floppy
|
|
||||||
g segment
|
|
||||||
i draw
|
|
||||||
k fs
|
|
||||||
l ether
|
|
||||||
m mouse
|
|
||||||
m penmouse
|
|
||||||
p proc
|
|
||||||
q qmux
|
|
||||||
r rtc
|
|
||||||
r µc
|
|
||||||
s srv
|
|
||||||
t uart
|
|
||||||
v vga
|
|
||||||
w wd
|
|
||||||
y i82365
|
|
||||||
y pcmcia
|
|
||||||
| pipe
|
|
||||||
¤ cap
|
|
||||||
æ aoe
|
|
||||||
Ι kbin
|
|
||||||
κ kbmap
|
|
||||||
μ moipv6
|
|
||||||
霞 kasumi
|
|
||||||
|
|
||||||
α local use
|
|
||||||
β local use
|
|
||||||
γ local use
|
|
||||||
δ local use
|
|
||||||
ε local use
|
|
||||||
ζ local use
|
|
||||||
η local use
|
|
||||||
θ local use
|
|
||||||
ι local use
|
|
Loading…
Add table
Add a link
Reference in a new issue