diff --git a/sys/src/9/pc/devkbd.c b/sys/src/9/pc/devkbd.c index bf43d85ba..96baab79f 100644 --- a/sys/src/9/pc/devkbd.c +++ b/sys/src/9/pc/devkbd.c @@ -152,7 +152,8 @@ i8042auxcmd(int cmd) iunlock(&i8042lock); if(c != 0xFA){ - print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n", c, cmd, getcallerpc(&cmd)); + print("i8042: %2.2ux returned to the %2.2ux command (pc=%#p)\n", + c, cmd, getcallerpc(&cmd)); return -1; } return 0; @@ -253,11 +254,12 @@ i8042auxenable(void (*putc)(int, int)) { char *err = "i8042: aux init failed\n"; + ilock(&i8042lock); + /* enable kbd/aux xfers and interrupts */ ccc &= ~Cauxdis; ccc |= Cauxint; - ilock(&i8042lock); if(outready() < 0) print(err); outb(Cmd, 0x60); /* write control register */ @@ -274,6 +276,7 @@ i8042auxenable(void (*putc)(int, int)) } auxputc = putc; intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux"); + iunlock(&i8042lock); } @@ -285,6 +288,20 @@ kbdpoll(void) i8042intr(0, 0); } +static void +kbdshutdown(void) +{ + if(nokbd) + return; + ccc &= ~(Ckbdint|Cauxint); + ccc |= (Cauxdis|Ckbddis); + outready(); + outb(Cmd, 0x60); + outready(); + outb(Data, ccc); + outready(); +} + static Chan * kbdattach(char *spec) { @@ -371,60 +388,17 @@ kbdwrite(Chan *c, void *a, long n, vlong) return n; } -Dev kbddevtab = { - L'b', - "kbd", - - devreset, - devinit, - devshutdown, - kbdattach, - kbdwalk, - kbdstat, - kbdopen, - devcreate, - kbdclose, - kbdread, - kbdbread, - kbdwrite, - devbwrite, - devremove, - devwstat, -}; - - -static char *initfailed = "i8042: kbdinit failed\n"; - -static int -outbyte(int port, int c) +static void +kbdreset(void) { - outb(port, c); - if(outready() < 0) { - print(initfailed); - return -1; - } - return 0; -} + static char *initfailed = "i8042: init failed\n"; + int c, try; -void -kbdenable(void) -{ kbd.q = qopen(1024, Qcoalesce, 0, 0); if(kbd.q == nil) - panic("kbdenable"); + panic("kbdreset"); qnoblock(kbd.q, 1); - ioalloc(Data, 1, 0, "kbd"); - ioalloc(Cmd, 1, 0, "kbd"); - - intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); -} - -void -kbdinit(void) -{ - int c, try; - /* wait for a quiescent controller */ try = 1000; while(try-- > 0 && (c = inb(Status)) & (Outbusy | Inready)) { @@ -440,7 +414,7 @@ kbdinit(void) /* get current controller command byte */ outb(Cmd, 0x20); if(inready() < 0){ - print("i8042: kbdinit can't read ccc\n"); + print("i8042: can't read ccc\n"); ccc = 0; } else ccc = inb(Data); @@ -448,14 +422,44 @@ kbdinit(void) /* enable kbd xfers and interrupts */ ccc &= ~Ckbddis; ccc |= Csf | Ckbdint | Cscs1; + + /* disable ps2 mouse */ + ccc &= ~Cauxint; + ccc |= Cauxdis; + if(outready() < 0) { print(initfailed); return; } + outb(Cmd, 0x60); + outready(); + outb(Data, ccc); + outready(); nokbd = 0; - - /* disable mouse */ - if (outbyte(Cmd, 0x60) < 0 || outbyte(Data, ccc) < 0) - print("i8042: kbdinit mouse disable failed\n"); + ioalloc(Data, 1, 0, "kbd"); + ioalloc(Cmd, 1, 0, "kbd"); + intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); } + +Dev kbddevtab = { + L'b', + "kbd", + + kbdreset, + devinit, + kbdshutdown, + kbdattach, + kbdwalk, + kbdstat, + kbdopen, + devcreate, + kbdclose, + kbdread, + kbdbread, + kbdwrite, + devbwrite, + devremove, + devwstat, +}; + diff --git a/sys/src/9/pc/fns.h b/sys/src/9/pc/fns.h index 553695b56..02fac41b8 100644 --- a/sys/src/9/pc/fns.h +++ b/sys/src/9/pc/fns.h @@ -96,8 +96,6 @@ int ioreserve(int, int, int, char*); int iprint(char*, ...); int isaconfig(char*, int, ISAConf*); void* kaddr(ulong); -void kbdenable(void); -void kbdinit(void); #define kmapinval() void ldmxcsr(ulong); void lgdt(ushort[3]); diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index f049c49ab..6672717c2 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -137,7 +137,6 @@ main(void) print("\nPlan 9\n"); trapinit0(); - kbdinit(); i8253init(); cpuidentify(); meminit(); @@ -155,7 +154,6 @@ main(void) arch->intrinit(); timersinit(); mathinit(); - kbdenable(); if(arch->clockenable) arch->clockenable(); procinit0(); diff --git a/sys/src/9/pc64/fns.h b/sys/src/9/pc64/fns.h index 46922f53d..5cbef27aa 100644 --- a/sys/src/9/pc64/fns.h +++ b/sys/src/9/pc64/fns.h @@ -87,8 +87,6 @@ int ioreserve(int, int, int, char*); int iprint(char*, ...); int isaconfig(char*, int, ISAConf*); void* kaddr(uintptr); -void kbdenable(void); -void kbdinit(void); KMap* kmap(Page*); void kunmap(KMap*); #define kmapinval() diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 5dcf3da48..8695b6ea3 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -486,7 +486,6 @@ main() screeninit(); print("\nPlan 9\n"); trapinit0(); - kbdinit(); i8253init(); cpuidentify(); meminit(); @@ -504,7 +503,6 @@ main() arch->intrinit(); timersinit(); mathinit(); - kbdenable(); if(arch->clockenable) arch->clockenable(); procinit0();