]> Joshua Wise's Git repositories - netwatch.git/commitdiff
more reliable keyboard injection
authorJoshua Wise <joshua@rebirth.joshuawise.com>
Mon, 6 Oct 2008 08:48:35 +0000 (04:48 -0400)
committerJoshua Wise <joshua@rebirth.joshuawise.com>
Mon, 6 Oct 2008 08:48:35 +0000 (04:48 -0400)
aseg/counter.c

index 0ab5d4c6355efa6d9e4dadc51ccddd5231efa0b8..d6208d6545f753bfe6079f5ae031c1b150cdc25b 100644 (file)
 #include "keyboard.h"
 
 unsigned int counter = 0;
 #include "keyboard.h"
 
 unsigned int counter = 0;
+unsigned int lastctr = 0;
 unsigned long pcisave;
 unsigned char vgasave;
 unsigned long pcisave;
 unsigned char vgasave;
+static int curdev = 0; /* 0 if kbd, 1 if mouse */
+
+static void cause_kbd_irq()
+{
+       outl(0x844, 0x0);
+       outl(0x848, 0x0);
+       while (inb(0x64) & 0x1)
+               inb(0x60);
+       outb(0x60, 0xee);       /* Cause an IRQ. */
+       while (!(inb(0x64) & 0x1))
+               ;
+       while (inb(0x64) & 0x1)
+               inb(0x60);
+}
 
 void pci_dump() {
        unsigned long cts;
 
 void pci_dump() {
        unsigned long cts;
-       static int curdev = 0;  /* 0 if kbd, 1 if mouse */
-       static int takeover = 0;
                
        cts = inl(0x84C);
        
                
        cts = inl(0x84C);
        
-       outl(0x848, 0x0);
        outl(0x840, 0x0);
        outl(0x840, 0x0);
+       outl(0x848, 0x0);
        switch(cts&0xF0000)
        {
        case 0x20000:
        switch(cts&0xF0000)
        {
        case 0x20000:
@@ -35,7 +48,8 @@ void pci_dump() {
                        b = inb(0x64);
                        if (kbd_has_injected_scancode())
                        {
                        b = inb(0x64);
                        if (kbd_has_injected_scancode())
                        {
-                               takeover = 1;
+                               dologf("OS wants to know; we have data");
+                               lastctr = counter;
                                b |= 0x01;
                                b &= ~0x20;     /* no mouse for you! */
                                curdev = 0;
                                b |= 0x01;
                                b &= ~0x20;     /* no mouse for you! */
                                curdev = 0;
@@ -44,16 +58,22 @@ void pci_dump() {
                        *(unsigned char*)0xAFFD0 /* EAX */ = b;
                        break;
                case 0x60:
                        *(unsigned char*)0xAFFD0 /* EAX */ = b;
                        break;
                case 0x60:
-                       if (takeover)
+                       if (kbd_has_injected_scancode())
                        {
                                b = kbd_get_injected_scancode();
                        {
                                b = kbd_get_injected_scancode();
-                               takeover = 0;
+                               lastctr = counter;
+                               inb(0x60);
                        } else
                                b = inb(0x60);
                        if ((curdev == 0) && (b == 0x01)) {     /* Escape */
                                outb(0xCF9, 0x4);       /* Reboot */
                                return;
                        }
                        } else
                                b = inb(0x60);
                        if ((curdev == 0) && (b == 0x01)) {     /* Escape */
                                outb(0xCF9, 0x4);       /* Reboot */
                                return;
                        }
+                       
+                       /* If there is more nus to come, generate another IRQ. */
+                       if (kbd_has_injected_scancode())
+                               cause_kbd_irq();
+                       
                        *(unsigned char*)0xAFFD0 /* EAX */ = b;
                        break;
                }
                        *(unsigned char*)0xAFFD0 /* EAX */ = b;
                        break;
                }
@@ -74,8 +94,8 @@ void pci_dump() {
                dolog("Unhandled PCI cycle");
        }
        
                dolog("Unhandled PCI cycle");
        }
        
+       outl(0x844, 0x1000);
        outl(0x848, 0x1000);
        outl(0x848, 0x1000);
-       outl(0x840, 0x0100);
 }
 
 void timer_handler(smi_event_t ev)
 }
 
 void timer_handler(smi_event_t ev)
@@ -85,6 +105,14 @@ void timer_handler(smi_event_t ev)
        smi_disable_event(SMI_EVENT_FAST_TIMER);
        smi_enable_event(SMI_EVENT_FAST_TIMER);
        
        smi_disable_event(SMI_EVENT_FAST_TIMER);
        smi_enable_event(SMI_EVENT_FAST_TIMER);
        
+       if (kbd_has_injected_scancode() && (counter > (lastctr + 2)))
+       {
+               smi_disable_event(SMI_EVENT_DEVTRAP_KBC);
+               dolog("Kicking timer");
+               cause_kbd_irq();
+               smi_enable_event(SMI_EVENT_DEVTRAP_KBC);
+       }
+       
        outb(0x80, (ticks++) & 0xFF);
        
        outlog();
        outb(0x80, (ticks++) & 0xFF);
        
        outlog();
This page took 0.029065 seconds and 4 git commands to generate.