implement exercise 04 interrupts
This commit is contained in:
@ -12,44 +12,53 @@
|
||||
#define __Keyboard_include__
|
||||
|
||||
#include "devices/Key.h"
|
||||
#include "kernel/IOport.h"
|
||||
#include "kernel/interrupts/IntDispatcher.h"
|
||||
#include "kernel/interrupts/ISR.h"
|
||||
#include "kernel/interrupts/PIC.h"
|
||||
#include "kernel/IOport.h"
|
||||
|
||||
class Keyboard : public ISR {
|
||||
|
||||
private:
|
||||
Keyboard(const Keyboard ©); // Verhindere Kopieren
|
||||
|
||||
unsigned char code; // Byte von Tastatur
|
||||
unsigned char prefix; // Prefix von Tastatur
|
||||
Key gather; // letzter dekodierter Key
|
||||
char leds; // Zustand LEDs
|
||||
private:
|
||||
Keyboard(const Keyboard& copy); // Verhindere Kopieren
|
||||
|
||||
unsigned char code; // Byte von Tastatur
|
||||
unsigned char prefix; // Prefix von Tastatur
|
||||
Key gather; // letzter dekodierter Key
|
||||
char leds; // Zustand LEDs
|
||||
|
||||
// Benutzte Ports des Tastaturcontrollers
|
||||
const IOport ctrl_port; // Status- (R) u. Steuerregister (W)
|
||||
const IOport data_port; // Ausgabe- (R) u. Eingabepuffer (W)
|
||||
const IOport ctrl_port; // Status- (R) u. Steuerregister (W)
|
||||
const IOport data_port; // Ausgabe- (R) u. Eingabepuffer (W)
|
||||
|
||||
// Bits im Statusregister
|
||||
enum { outb = 0x01, inpb = 0x02, auxb = 0x20 };
|
||||
enum { outb = 0x01,
|
||||
inpb = 0x02,
|
||||
auxb = 0x20 };
|
||||
|
||||
// Kommandos an die Tastatur
|
||||
struct kbd_cmd {
|
||||
enum { set_led = 0xed, set_speed = 0xf3 };
|
||||
enum { set_led = 0xed,
|
||||
set_speed = 0xf3 };
|
||||
};
|
||||
enum { cpu_reset = 0xfe };
|
||||
|
||||
// Namen der LEDs
|
||||
struct led {
|
||||
enum { caps_lock = 4, num_lock = 2, scroll_lock = 1 };
|
||||
};
|
||||
enum { caps_lock = 4,
|
||||
num_lock = 2,
|
||||
scroll_lock = 1 };
|
||||
};
|
||||
|
||||
// Antworten der Tastatur
|
||||
struct kbd_reply {
|
||||
enum { ack = 0xfa };
|
||||
};
|
||||
};
|
||||
|
||||
// Konstanten fuer die Tastaturdekodierung
|
||||
enum { break_bit = 0x80, prefix1 = 0xe0, prefix2 = 0xe1 };
|
||||
enum { break_bit = 0x80,
|
||||
prefix1 = 0xe0,
|
||||
prefix2 = 0xe1 };
|
||||
|
||||
// Klassenvariablen
|
||||
static unsigned char normal_tab[];
|
||||
@ -57,36 +66,35 @@ private:
|
||||
static unsigned char alt_tab[];
|
||||
static unsigned char asc_num_tab[];
|
||||
static unsigned char scan_num_tab[];
|
||||
|
||||
|
||||
// Interpretiert die Make und Break-Codes der Tastatur.
|
||||
bool key_decoded ();
|
||||
bool key_decoded();
|
||||
|
||||
// Ermittelt anhand von Tabellen den ASCII-Code.
|
||||
void get_ascii_code ();
|
||||
|
||||
|
||||
void get_ascii_code();
|
||||
|
||||
public:
|
||||
// Initialisierung der Tastatur.
|
||||
Keyboard();
|
||||
|
||||
// Initialisierung der Tastatur.
|
||||
Keyboard ();
|
||||
// Tastaturabfrage (vorerst Polling)
|
||||
Key key_hit();
|
||||
|
||||
// Tastaturabfrage (vorerst Polling)
|
||||
Key key_hit ();
|
||||
// Fuehrt einen Neustart des Rechners durch.
|
||||
void reboot();
|
||||
|
||||
// Fuehrt einen Neustart des Rechners durch.
|
||||
void reboot ();
|
||||
// Einstellen der Wiederholungsrate der Tastatur.
|
||||
void set_repeat_rate(int speed, int delay);
|
||||
|
||||
// Einstellen der Wiederholungsrate der Tastatur.
|
||||
void set_repeat_rate (int speed, int delay);
|
||||
// Setzt oder loescht die angegebene Leuchtdiode.
|
||||
void set_led(char led, bool on);
|
||||
|
||||
// Setzt oder loescht die angegebene Leuchtdiode.
|
||||
void set_led (char led, bool on);
|
||||
// Aktivierung der Unterbrechungen fuer die Tastatur
|
||||
// TODO: NOTE: I added this (parameters), but is it supposed to be this way?
|
||||
void plugin(IntDispatcher& intdis, PIC& pic);
|
||||
|
||||
// Aktivierung der Unterbrechungen fuer die Tastatur
|
||||
void plugin ();
|
||||
|
||||
// Unterbrechnungsroutine der Tastatur.
|
||||
void trigger ();
|
||||
// Unterbrechnungsroutine der Tastatur.
|
||||
void trigger() override;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user