Hi
Ich bin grad dabei mir ein Tastaturtreiber zu programmieren.
Da hab ich nur ein Problem:
Wenn ich ein Befehl an die Tastatur sende wird eine #General Protection ausgelöst.
Hier der Code
kbc.h:
keyboard.c:
Grüße
Ich bin grad dabei mir ein Tastaturtreiber zu programmieren.
Da hab ich nur ein Problem:
Wenn ich ein Befehl an die Tastatur sende wird eine #General Protection ausgelöst.
Hier der Code
kbc.h:
Code: [Auswählen]
/**
* kernel/driver/kbc/kbc.h
* portdefinitionen & send_kbc_command
*
* (C) Copyright 2012 Michael Sippel
*/
#ifndef _KBC_H
#define _KBC_H
#include <stdint.h>
#include <portio.h>
#define KBC_PORT_KBDCOMMAND 0x60 /* Befehl an Tastatur */
#define KBC_PORT_KBCDATA 0x60 /* Daten-Puffer auslesen & schreiben */
#define KBC_PORT_KBCCOMMAND 0x64 /* Befehl an KBC */
#define KBC_PORT_KBCREGISTER 0x64 /* Statusregiser auslesen */
#define KBC_COMM_P1_PORT 0xC0
#define KBC_COMM_READ_OPP 0xD0
#define KBC_COMM_WRITE_OPP 0xD1
#define KBC_COMM_READ_CCB 0x20
#define KBC_COMM_WRITE_CCB 0x60
#define KBC_COMMAND_OK 0xFA
/* ---------- Befehl an KBC senden -------------------- */
static uint8_t send_kbc_command(uint8_t port,uint8_t command){
static int fz = 3; /// @p fz Fehlerzähler
uint8_t ret;/// @p ret Rückgabe vom KBC
//Warten bis Eigabepuffer leer ist
while( inb(KBC_PORT_KBCREGISTER) & 0x2 );
//KBC-Befehl senden
outb(port, command);
//Warten bis Antwort im Ausgabepuffer liegt
while( inb(KBC_PORT_KBCREGISTER) & 0x1 );
//Antwort einlesen
ret = inb(KBC_PORT_KBCDATA);
//Erfolgreich?
if(ret = KBC_COMMAND_OK || fz > 2){
fz = 3;//Fehlerzähler rücksetzen
return ret;//ENDE
}else{
--fz;//Fehlerzähler dekremantieren
send_kbc_command(port, command);//Nochmal versuchen
}
}
/* ---------- Befehl an Tastatur senden --------------- */
static uint8_t send_kbd_command(uint8_t command){
return send_kbc_command(KBC_PORT_KBDCOMMAND,command);
}
/* -- ENDE --- kbc.h -- */
#endifkeyboard.c:
Code: [Auswählen]
/**
* kernel/driver/kbc/keyboard/init.c
* init_keyboard, keyboard_irq_handler
*
* (C) Copyright 2012 Michael Sippel
*/
#include <stdint.h>
#include <portio.h>
#include <stdbool.h>
#include <console.h>
#include "kbc.h"
#define KBD_COMM_LEDS 0xED /* LEDS ansteuern */
#define KBD_COMM_ECHO 0xEE /* Echo */
#define KBD_COMM_WDHR 0xF3 /* Wiederholrate setzen */
#define KBD_COMM_ACTV 0xF4 /* Tastatur aktivieren */
#define KBD_COMM_DAKV 0xF5 /* Tastatur deaktivieren */
#define KBD_COMM_STDW 0xF6 /* Standarderte setzen */
#define KBD_COMM_KRST 0xFF /* Tastatur-Reset */
#define KBD 0
/* ---------- Tastatur initalisieren ------------------ */
void init_keyboard(void){
color = 0x0F;debug(KBD," \n");
//Warten bis Tastatur nicht mehr im Resetmodus ist
while(! inb(KBC_PORT_KBCREGISTER) & 0x4 );
//Ausgabepuffer leeren
while (inb(KBC_PORT_KBCREGISTER) & 0x1){
//Solange Ausgabepuffer voll ist Datenregister lesen
inb(KBC_PORT_KBCDATA);
}
//LEDs ausschalten
send_kbd_command(KBD_COMM_LEDS);
outb(KBC_PORT_KBCDATA, 0);
//Schnellste Wiederholrate einstellen
send_kbd_command(KBD_COMM_WDHR);
outb(KBC_PORT_KBCDATA, 0);
//Tastatur aktivieren
send_kbd_command(KBD_COMM_ACTV);
}
/* ---------- IRQ handler für Tastatur ---------------- */
void keyboard_irq_handler(void){
printf("Taste gedrückt!\n\n");
}
/* ------- ENDE -- keyboard.c --- */Grüße

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
??