[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kbc: für langsame Tastaturen angepasst



! der Tastaturtreiber tut hier nun auch mit meinem Steinzeit-DIN Tastaturen :)

Signed-off-by: Stefan Linke <particleflux@xxxxxxxxx>
---
 src/modules/kbc/keyboard.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/modules/kbc/keyboard.c b/src/modules/kbc/keyboard.c
index 4fdaadc..af2106f 100644
--- a/src/modules/kbc/keyboard.c
+++ b/src/modules/kbc/keyboard.c
@@ -44,6 +44,7 @@
 #include <ports.h>
 #include <collections.h>
 #include <kbd.h>
+#include <sleep.h>
 
 #include "keyboard.h"
 #include "mouse.h"
@@ -67,7 +68,7 @@ static void rpc_register_callback(pid_t pid, uint32_t cid, size_t data_size,
 
 
 /**
- * IRQ-Hander
+ * IRQ-Handler
  */
 static void kbd_irq_handler(uint8_t irq);
 
@@ -86,10 +87,13 @@ static void send_key_event(uint8_t keycode, bool release);
 static void send_kbd_command(uint8_t command)
 {
     do {
-	while (inb(0x64) & 0x2) {
-	    yield();
-	}
-	outb(0x60, command);
+        while (inb(0x64) & 0x2) {
+            yield();
+        }
+        outb(0x60, command);
+        
+        /* bisschen warten fuer langsamere Tastaturen ;) */
+        msleep(500);
     } while (inb(0x60) == 0xfe);
 }
 
@@ -114,19 +118,21 @@ void keyboard_init(void)
 
     // Leds alle ausloeschen
     send_kbd_command(0xED);
-    outb(0x60, 0);
+    send_kbd_command(0);
+
 
     // Schnellste Wiederholrate
     send_kbd_command(0xF3);
-    outb(0x60, 0);
-
+    send_kbd_command(0);
+    
     // Tastatur aktivieren
-    send_kbd_command(0xF4);
+    send_kbd_command(0xF4);    
+    
     init_done = true;
 }
 
 /**
- * IRQ-Hander
+ * IRQ-Handler
  */
 void kbd_irq_handler(uint8_t irq) {
     uint8_t scancode;
@@ -139,14 +145,14 @@ void kbd_irq_handler(uint8_t irq) {
     // Datenbyte gelesen wurde
     static int      e1_code = 0;
     static uint16_t  e1_prev = 0;
-
-    scancode = inb(0x60);
-
+    
     // Abbrechen wenn die Initialisierung noch nicht abgeschlossen wurde
     if (!init_done) {
         return;
     }
-
+    
+    scancode = inb(0x60);
+    
     // Um einen Breakcode handelt es sich, wenn das oberste Bit gesetzt ist und
     // es kein e0 oder e1 fuer einen Extended-scancode ist
     if ((scancode & 0x80) &&
-- 
1.8.1.5