Autor Thema: Help me! Keyboard-Treiber [PM] Grundfunktion schon fertig  (Gelesen 3062 mal)

B.G.

  • Beiträge: 27
    • Profil anzeigen
Gespeichert
Also, ich programmiere im PM und habe nun nach dem 2. Versuch (Beim ersten [~2,5 Stunden Versuch] hab ich mir letztendlich den Code zerschossen) geschafft meine eigenen IDT anzulegen (direkt aus dem PM herraus) und mit einträgen zu füllen.

Dafür hab ich mir fürs Keyboard das hier gecodet:

void irq_1(void) // Keyboard
{
  printf("Keyboard!");
}

Funktioniert auch im Grunde wunderbar und tut was es soll. Einen Text ausgeben bei Tastendruck. Allerdings nur ein mal. Drücke ich auf eine Taste wird der Code ausgegeben. Lass ich los und drück wieder kommt nichts.

So habe ich zwei Fragen:
1. Was muss ich tun um es beim 2. Mal auch zum Funktionieren zu bringen?
2. Wo bekomm ich letztendlich den Scancode der gedrückten Taste her?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. April 2005, 09:37 »
zu 1. du musst ein End-of-Interrupt-Signal an den PIC senden, wenn du mit einem IRQ-handler fertig bist. Einmal 0x20 an Port 0x20 und noch einmal 0x20 an Port 0xA0
zu 2. den keycode bekommst du, wenn du port 0x60 ausliest.
Dieser Text wird unter jedem Beitrag angezeigt.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #2 am: 17. April 2005, 10:01 »
Das ist so nicht ganz 100% richtig^^
Damit das Keyboard weitere Daten schickt, muss das EOI-Signal gesendet werden UND Port 0x60 gelesen werden.
EOI->Damit der PIC die IRQ's weiterleitet (allerdings reicht 0x20 an 0x20, da IRQ am Master anliegt und der Slave nicht wieder aktiviert werden muss, also nix mit 0xA0)
Port 0x60->Damit das Keyboard weitere an den PIC schickt
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

B.G.

  • Beiträge: 27
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 17. April 2005, 11:33 »
Jup, danke Jungs.


void irq_1(void) // Keyboard
{
  printf("Keyboard meldet sich!");
  out(0x20,0x20);
  out(0xA0,0x20);
  in(0x60);
}


Funktioniert wunderbar.  :D

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 17. April 2005, 11:58 »
das outb(0xA0,0x20); kannste weglassen, Keyboard liegt am Master-PIC und 0xA0 ist der Port für den Slave.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen