![]() |
Spielen mit den Tastatur-LEDsProf. Jürgen Plate |
Auf dem Motherboard des PCs befindet sich ein Tastaturcontroller, der auf der einen Seite mit der Tastatur über einen Eingabeport und einen Ausgabeport (Kommandos an die Tastatur) kommuniziert. Auf der anderen Seite hat der Controller Register, die mit Hilfe von in- und out-Befehlen über den Systembus gelesen und beschrieben werden können. Wenn bei einer PC Tastatur eine Taste gedrückt wird, werden zwei sich kreuzende Leitungen der Scan-Matrix innerhalb der Tastatur verbunden. Der Tastaturprozessor ermittelt die Position der gedrückten Taste und daraus den Scancode. Über eine serielle Schnittstelle wird der Code zum Motherboard des PCs gesendet.
Bei PS/2-PCs ist die Maus ebenfalls an den Tastaturcontroller angeschlossen. Dadurch landen im Ausgabepuffer sowohl Codes von der Tastatur als auch von der Maus. Damit die Quelle des Bytes unterschieden werden, steht im Statusregister das Bit 5 (AUXB) zur Verfügung (1 = Maus, 0 = Tastatur).
Der Tastaturcontroller kann durch das Schicken von Befehlscodes an den Eingabepuffer konfiguriert werden. Zuvor sollte man sicherstellen, das der Eingabepuffer des Tastaturcontrollers leer ist. Danach wird der Befehlscode in den Datenport geschrieben. Nun wird gewartet, bis der Tastaturcontroller geantwortet hat und der Ausgabepuffer das Bestätigungsbyte 0xfa (ACK) enthält (wieder vor dem Lesen outb prüfen). Hier interessiert nur eine Funktion, das Lesen und Setzen der Tastatur-LEDs. Auf die gleiche Weise kann man übrigens auch die Wiederholrate setzen.
Befehlscode | Name | Beschreibung | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0xed | set_led | Ein-/Ausschalten der Tastatur-LEDs. Nach dem
Befehlscode muss ein weiteres Byte an den Tastaturcontroller geschrieben
werden, das den Zustand der LEDs steuert.
|
Die Ansteuerung per Programm wird uns leicht gemacht, da unter Linux mit der Funktion ioctl() die Ansteuerung mit Kernel-Unterstützung erfolgen kann. Das folgende C-Programm bietet ein Kommandozeilen-Tool zum Setzen der LEDs.
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Spielen mit den Tastatur-LEDs unter Linux * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Das Programm schaltet die Tastatur-LEDs für eine * vorgegebene Zeit (Angabe in ms) an oder aus * * Aufruf: leds [value duration] * * 'value' muss zwischen 0 und 7 liegen: * Keyboard layout: [NUM] [CAP] [SCR] * Value: 2 4 1 * * Beim Aufruf ohne Parameter werden alle Leds 1 Sekunde * eingeschaltet. * * Wegen des Zugriffs auf /dev/console (wahlweise /dev/tty0) * und der ioctl-Aufrufe kann das Programm nur von root * aufgerufen werden (ggf. mit 'chmod 4711 beep' SUD-root setzen) * Für eine Produktiv-Version sollte noch eine Fehlerbehandlung * hinzugefügt werden. * * JPL 10.11.04 */ #include <sys/types.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/kd.h> #include <unistd.h> #include <stdlib.h> #define SCRLED 1 #define NUMLED 2 #define CAPLED 4 int main(int argc, char *argv[]) { int fd, time; char leds, oldleds; fd = open("/dev/console",O_RDONLY); if (argc > 2) { leds = atoi(argv[1]); time = atoi(argv[2]); } else { leds = SCRLED|NUMLED|CAPLED; time = 1000; } leds = leds%8; /* zur Sicherheit */ ioctl(fd, KDGETLED, &oldleds); /* alten Wert merken */ ioctl(fd, KDSETLED, leds); /* Ausgabe */ usleep(1000*time); ioctl(fd, KDSETLED, oldleds); /* alten Wert restaurieren */ close(fd); return(0); }Oder Sie lassen einen Binärzähler laufen. Da die Wertigkeit CAPS-NUM-SCR ist, die Anordnung auf der Tastatur aber NUM-CAPS-SCR, wird die Zuordnung über ein Array hergestellt.
#include <sys/types.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/kd.h> #include <unistd.h> #include <stdlib.h> /* Keyboard layout: [NUM] [CAP] [SCR] Value: 2 4 1 */ #define SCRLED 1 #define NUMLED 2 #define CAPLED 4 int main(void) { int fd, i; int leds[] = {0,1,4,5,2,3,6,7}; /* binary counter */ fd = open("/dev/console",O_RDONLY); while (1) { i = (i + 1)%8; ioctl(fd, KDSETLED, leds[i]); sleep(1); } close(fd); return(0); }