summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vmx/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/cmd/vmx/io.c')
-rw-r--r--sys/src/cmd/vmx/io.c68
1 files changed, 48 insertions, 20 deletions
diff --git a/sys/src/cmd/vmx/io.c b/sys/src/cmd/vmx/io.c
index 507dda972..0ba1233af 100644
--- a/sys/src/cmd/vmx/io.c
+++ b/sys/src/cmd/vmx/io.c
@@ -363,6 +363,7 @@ picio(int isin, u16int port, u32int val, int sz, void *)
p->init = 4;
picupdate(p);
return 0;
+ case 0:
case 4:
p->imr = val;
picupdate(p);
@@ -412,10 +413,12 @@ struct PITChannel {
enum { READLO, READHI, READLATLO, READLATHI } readstate;
u8int writestate;
vlong lastnsec;
+ u8int output;
};
PITChannel pit[3] = {
[0] { .state 1 },
};
+u8int port61;
enum { PERIOD = 838 };
void
@@ -437,6 +440,18 @@ settimer(vlong targ)
threadint(timerid);
}
+static void
+pitout(int n, int v)
+{
+ if(n == 0)
+ irqline(0, v);
+ switch(v){
+ case IRQLLOHI: case 1: pit[n].output = 1; break;
+ case 0: pit[n].output = 0; break;
+ case IRQLTOGGLE: pit[n].output ^= 1; break;
+ }
+}
+
void
pitadvance(void)
{
@@ -455,11 +470,11 @@ pitadvance(void)
case 0:
if(p->state != 0){
nc = t / PERIOD;
- if(p->count <= nc && i == 0)
- irqline(0, 1);
+ if(p->count <= nc)
+ pitout(i, 1);
p->count -= nc;
p->lastnsec -= t % PERIOD;
- if(i == 0 && (pic[0].lines & 1<<0) == 0)
+ if(!p->output)
settimer(p->lastnsec + p->count * PERIOD);
}
break;
@@ -474,8 +489,7 @@ pitadvance(void)
nc -= p->count - 1;
nc %= rel;
p->count = rel - nc + 1;
- if(i == 0)
- irqline(0, IRQLLOHI);
+ pitout(i, IRQLLOHI);
}
p->lastnsec -= t % PERIOD;
settimer(p->lastnsec + p->count * PERIOD);
@@ -492,8 +506,7 @@ pitadvance(void)
nc -= p->count;
nc %= rel;
p->count = rel - nc;
- if(i == 0)
- irqline(0, IRQLTOGGLE);
+ pitout(i, IRQLTOGGLE);
}
p->lastnsec -= t % PERIOD;
settimer(p->lastnsec + p->count / 2 * PERIOD);
@@ -515,8 +528,7 @@ pitsetreload(int n, int hi, u8int v)
p->reload = p->reload & 0xff00 | v;
switch(p->mode){
case 0:
- if(n == 0)
- irqline(0, 0);
+ pitout(n, 0);
if(p->access != 3 || hi){
p->count = p->reload;
p->state = 1;
@@ -569,6 +581,7 @@ pitio(int isin, u16int port, u32int val, int sz, void *)
return pit[n].latch >> 8;
}
return 0;
+ case 0x10061: return port61 | pit[2].output << 5;
case 0x40:
case 0x41:
case 0x42:
@@ -608,16 +621,18 @@ pitio(int isin, u16int port, u32int val, int sz, void *)
pit[n].readstate = pit[n].access == 1 ? READHI : READLO;
pit[n].writestate = pit[n].access == 1 ? READHI : READLO;
pit[n].lastnsec = nsec();
- if(n == 0)
- switch(pit[n].mode){
- case 0:
- irqline(0, 0);
- break;
- default:
- irqline(0, 1);
- }
+ switch(pit[n].mode){
+ case 0:
+ pitout(n, 0);
+ break;
+ default:
+ pitout(n, 1);
+ }
}
return 0;
+ case 0x61:
+ port61 = port61 & 0xf0 | val & 0x0f;
+ return 0;
}
return iowhine(isin, port, val, sz, "pit");
}
@@ -628,7 +643,7 @@ struct I8042 {
int cmd;
u16int buf; /* |0x100 == kbd, |0x200 == mouse, |0x400 == cmd */
} i8042 = {
- .cfg 0x34,
+ .cfg 0x74,
.stat 0x10,
.oport 0x01,
.cmd -1,
@@ -809,7 +824,13 @@ mousecmd(u8int val)
break;
case 0xe7: mouseputc(0xfa); mouse.scaling21 = 1; break; /* set 2:1 scaling */
case 0xe6: mouseputc(0xfa); mouse.scaling21 = 0; break; /* set 1:1 scaling */
- default: vmerror("unknown mouse command %#ux", val); mouseputc(0xfc);
+
+ case 0x88: case 0x00: case 0x0a: /* sentelic & cypress */
+ case 0xe1: /* trackpoint */
+ mouseputc(0xfe);
+ break;
+
+ default: vmerror("unknown mouse command %#ux", val); mouseputc(0xfe);
}
}
i8042kick(nil);
@@ -894,6 +915,12 @@ i8042io(int isin, u16int port, u32int val, int sz, void *)
case 0x60: case 0xd1: case 0xd2: case 0xd3: case 0xd4:
i8042.cmd = val;
return 0;
+ case 0xf0: case 0xf2: case 0xf4: case 0xf6: /* pulse reset line */
+ case 0xf8: case 0xfa: case 0xfc: case 0xfe:
+ sysfatal("i8042: system reset");
+ case 0xf1: case 0xf3: case 0xf5: case 0xf7: /* no-op */
+ case 0xf9: case 0xfb: case 0xfd: case 0xff:
+ return 0;
}
vmerror("unknown i8042 command %#ux", val);
return 0;
@@ -1204,6 +1231,7 @@ IOHandler handlers[] = {
0x70, 0x71, rtcio, nil,
0xa0, 0xa1, picio, nil,
0x60, 0x60, i8042io, nil,
+ 0x61, 0x61, pitio, nil, /* pc speaker */
0x64, 0x64, i8042io, nil,
0x2f8, 0x2ff, uartio, nil,
0x3b0, 0x3bb, vgaio, nil,
@@ -1219,7 +1247,7 @@ IOHandler handlers[] = {
0x3f6, 0x3f6, ideio, nil, /* ide primary (aux) */
0x3f0, 0x3f7, fdcio, nil, /* floppy */
- 0x061, 0x061, nopio, nil, /* pc speaker */
+ 0x080, 0x080, nopio, nil, /* dma -- used by linux for delay by dummy write */
0x084, 0x084, nopio, nil, /* dma -- used by openbsd for delay by dummy read */
0x100, 0x110, nopio, nil, /* elnk3 */
0x240, 0x25f, nopio, nil, /* ne2000 */