Autor Thema: Tastaturtreiber Problem  (Gelesen 4428 mal)

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« am: 01. June 2005, 18:02 »
Hallo mal Wieder
Ich bin dabei meinen Tastaturtreiber zu schreiben. Nun, seit einiger zeit sagt boch nach ca. 40 Tastendrücken immer folgende meldung ausgibt.
nternal keyboard buffer full, ignoring scancode.

ich weiss nicht wo ich den fehler noch suchen könnte.


Hier ist der Code:


int0x21:

xor eax,eax
in al,0x60

push eax
call PutByte
pop eax

cmp al, 0xE0
je .ende
cmp al, 0x00
je .ende
cmp al, 0xff
je .ende


mov al,BYTE [Keycodetable + eax]

call PutByte


.ende



 mov al, 0x20
 out 0x20,al
 
iret


Sieht jemand den Fehler ?

Vielen dasnk im voraus

gruss Togi

drccpp

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. June 2005, 21:09 »
warum heist deine interrupt-routine int0x21.? 0x21 ist nicht der Keyboard-Int. Der Keyboard int ist 0x9. Wie hast du den Int installiert? (code)

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. June 2005, 21:44 »
Zitat von: drccpp
warum heist deine interrupt-routine int0x21.? 0x21 ist nicht der Keyboard-Int. Der Keyboard int ist 0x9. Wie hast du den Int installiert? (code)

Der Name ist ja im Prinzip egal auch wenn KeyHandler oder so schöner wär.
Wiese ist der Keyboaderd int 0x9? Ich denke 0x1 ist der richtige Int.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 01. June 2005, 22:04 »
Nein.

1. KeyboardIRQ ist 0x01
2. KeyboardInt ist im RM 0x09
3. KeyboardInt ist im PM 0x21, wenn man den PIC-Master auf 0x20 gesetzt hat
=> alles richtig.

Selbiges Problem wie er hab ich auch...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

drccpp

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. June 2005, 22:54 »
Was heißt das?
Ich hab den PM und trotzdem Int9 für keyboard! Wozu und wie könnt ihr den auf int21 machen?

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. June 2005, 01:32 »
Man muss den PIC (8259er Chip) umprogrammieren damit die IRQs andere Interrupt-Vektoren ansteuern. Dies geht mit einer bestimmten Befehlssequenz auf die Ports des Programmable Interrupt Controlers ;-) Die genaue Spezifikation findest du in der Cottontail OS Development Library http://www.osdever.net/cottontail/#ISA. Warum man das macht: da die Interrupt-Vektoren von 0x00 bis 0x1f für Prozessor Exceptions reserviert sind (siehe Architekur Specs) ist es sinnvoll  die IRQs der Geräte auf andere Int-Vektoren zu mappen, ganz einfach um IRQs von Exceptions unterscheiden zu können. Dass der Keyboard IRQ sprich IRQ 1 im Realmode auf Int 0x8 gemappt ist, ist historisch gewachsen (Stichwort Kompatibilität), weil dass warscheinlich irgendwann, vor langer langer Zeit, mal nicht anderweitig belegt war. Heutzutage sieht das allerdings anders aus.
Agieren statt Konsumieren!

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 02. June 2005, 11:45 »
Wenn man den PIC nicht umprogrammiert kriegt man 18,2 mal in der Sekunde eine Double Fault, weil der Timer-IRQ (IRQ0) auf Int 8 liegt^^
Im Realmode gibt es eben nur 8 Exceptions (0-7) deswegen legt man die IRQs ab 8 an. Da es aber im PM viel mehr Fehler geben kann, wegen Speicherschutz usw brauchte man mehr, und da man gelernt hat, das man irgendwann sicher nochmehr brauchen wird, hat man sich gedacht gleich ein paar mehr zu reservieren, also gleich 32.^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #7 am: 02. June 2005, 15:11 »
@Roshl: Richtig. ;) Und wenn man den PIT umprogrammiert hat, dann noch öfters oder weniger oft. ;)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. June 2005, 17:15 »
@PICs: Ich denke mal hier gibts den Code für sein PIC-Umprogrammierung:
http://www.lowlevel.brainsware.org/forum/viewtopic.php?t=771&sid=fbea7e9141b394f17cdda53ee250320f

DDR-RAM

  • Beiträge: 184
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. June 2005, 17:37 »
Zitat von: joachim_neu
@Roshl: Richtig. ;) Und wenn man den PIT umprogrammiert hat, dann noch öfters oder weniger oft. ;)


Hm, es geht mit niedriegerer Frequenz als 18,2 Hz ?
Ich dachte, das ist schon die niedrigste ...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #10 am: 02. June 2005, 17:40 »
Kann sein, jedenfalls kann man ihn umprogrammieren.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #11 am: 02. June 2005, 19:43 »
hat jemand ne ahnung wo es lieien könnte ?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #12 am: 03. June 2005, 11:17 »
18,2 ist das niedrigste, könnte euch das jetzt vorrechnen bin aber zu faul.

Zum umproggen kann man dat hier ganz einfach machen, als Parameter einfach angeben wo die IRQ loslegen sollen:

void remap_PIC(db ivec)
{
   outb(0x20,0x11);
   outb(0xA0,0x11);
   outb(0x21,ivec);
   outb(0xA1,ivec+8);
   outb(0x21,0x04);
   outb(0xA1,0x02);
   outb(0x21,0x01);
   outb(0xA1,0x01);
}
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #13 am: 04. June 2005, 18:36 »
Hallo,

cih habs jetzt hingekriecht. doch nun habe ich ein anderes Problem, ich hab ne tabelle gemach um die Scancodes in keycodes umzuwandeln. Doch die umwandlung funkioniert nur bis zur Backspacetaste, danach bekomme ich einfach null, die Scancodes, jedoch werdenm korrekt ausgegeben.

Hier ist die Tabelle:

keycode:
db 0 ;0
db 110 ;1
db 2 ;2
db 3 ;3
db 4 ;4
db 5 ;5
db 6 ;6
db 7 ;7
db 8 ;8
db 9 ;9
db 10 ;0a
db 11 ;0b
db 12 ;0c
db 13 ;0d
db 15 ;0e
db 16 ;0f
db 17 ;10
db 18
db 19
db 20
db 21
db 22
db 23
db 24
db 25
db 26
db 27
db 28
db 43 ;1c
db 58
db 31
db 32
db 33
db 34
db 35
db 36
db 37
db 38
db 39
db 40
db 41
db 0
db 44
db 42
db 46
db 47
db 48
db 49
db 50 ;30
db 51
db 52
db 53
db 54
db 55
db 57
db 100 ;37
db 60
db 61
db 30 ;3a
db 112 ;3b
db 113 ;3c
db 114 ;3d
db 115 ;3e
db 116 ;3f
db 117 ;40
db 118 ;41
db 119 ;42
db 120 ;43
db 121 ;44
db 90 ;45
db 0 ;46
db 91 ;47
db 0 ;48
db 0 ;49
db 105 ;4a
db 92 ;4b
db 0 ;4c
db 0 ;4d
db 106 ;4e
db 93 ;4f
db 98 ;50
db 103 ;51
db 99 ;52
db 104 ;53
db 0 ;54
db 0 ;55
db 0 ;56
db 122 ;57
db 123 ;58




Und hier noch die KeyhandlerRoutine:


;De Keyhandler Routine, die in der Idt eingetragen ist
keyhandler:

xor eax,eax
in al,0x60
PushAll
call PutByte
PopAll
mov al, [keycode+eax]

call PutByte



.ende
 mov al, 0x20
 out 0x20,al

iretd


Wo könnte ich den Fehelr suche, ich hab echt keine Ahnung wo er ist.

Vielen Dank schon im Voraus.

LG Togi

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #14 am: 05. June 2005, 09:43 »
Erstma musste alle Register sichern! Sehr wichtig.
Dann brauchste mindestens 3 Tabellen, eine bei normal, eine bei shift und eine bei alt. und dann musste diese tasten noch checken und die tabellen dann umstellen.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 14. June 2005, 13:46 »
Wie kommst du eigentlich auf die Keycode Tabelle, die passt nämlich scheinbar auf kein Scancodeset das ich kenne, woraus sich die nächste Frage ergibt: Welches Scancodeset benutzt du?
Noch ein Tipp: verwende doch mal mov al, [keycode+al]
Agieren statt Konsumieren!

 

Einloggen