Hallo. Ich schreibe gerade ein kleines Programm, um mit einem AVR eine ordentliche Tastatur zu emulieren. Das Senden und Empfangen von Bytes scheint korrekt zu funktionieren, nach Einstecken des PS/2-Steckers kommt vom PC die erwartete Init-Sequenz, die ich auch ordnungsgemäß abarbeite, allerdings anscheinend nur bis zu dem Punkt, an dem ich das Kommando 0xF4 (Enable Keyboard) erhalte. Diese Kommando ACKe ich (so steht es in jeder PS/2-Tastaturprotokollbeschreibung im Netz), erhalte danach jedoch das Kommando 0xEF (Invalid Command) vom PC. ACKe ich das Enable-Kommand NICHT, so beginnt der PC aufs neue mit der Initsequenz (Reset, Send ID, Set Scan Code Set, Set LEDs, Set Typematic Delay ...und anschließend halt wieder Enable Keyboard). Und wenn ich das Kommando 0xEF (Invalid Command) ACKe, beginnt erneut die Initsequenz. Kurzum, ich denke irgendwas stimmt da nicht, irgendwas muss ich noch beachten, irgendwas will der PC nach dem Kommando 0xF4 (Enable Keyboard) noch von mir haben. Kann mir jemand weiterhelfen, der sich mal damit auseinandergesetzt hat? Wäre auch schön, wenn mir jemand sagen könnte, wie ich mit dem besagten Kommando 0xEF (Invalid Command) umgehen muss; dazu habe ich garnichts im Netz gefunden. Ich habe auch schon einschlägige Seiten wie - http://www.marjorie.de/ps2/ps2_protocol.htm - http://stanislavs.org/helppc/keyboard_commands.html und - http://pcbheaven.com/wikipages/The_PS2_protocol/ abgeklappert. Gruß, Paul
"Wäre auch schön, wenn mir jemand sagen könnte, wie ich mit dem besagten Kommando 0xEF (Invalid Command) umgehen muss; dazu habe ich garnichts im Netz gefunden." Einfach Ignorieren?
Woher weißt du das so genau? Bislang ignoriere ich es ja. Und dadurch empfange ich es in einer Endlosschleife. Kleiner Nachtrag (sollte eig. noch in den Eingangspost): Ich lasse mir parallel via RS232 alle empfangenen Befehle schicken. Daher weiß ich genau, dass ich keine anderen Befehle verpasse. Nach 0xF4 (Enable Keyboard) kommt einfach in einer Endlosschleife immer nur noch 0xEF an.
Also, laut http://www.computer-engineering.org/ps2keyboard/ ist das mit dem ACK richtig. Kannst du dir die Unterhaltung mit LA/Oszi anschauen? Vielleicht hast du das Timing nicht eingehalten? Siehe auch http://www.computer-engineering.org/ps2protocol/.
Ich schau mir nebenbei alles mit dem Oszi an, das Timing sollte in Ordnung sein. Zumal ich ja alles VOR 0xF4 korrekt empfange und beantworte. Ich habe mich dabei strikt an das auf http://www.marjorie.de/ps2/ps2_protocol.htm angegebene Timing und Protokoll gehalten. Frequenz stimmt, die Flanken sehen schick aus und ich warte auch brav 50µs, bevor ich nach Feststellung des RTS-Zustands mit der Ausgabe der Clockimpulse beginne. Kann es sein, dass ein Keyboard noch selbstständig irgendwas an den PC senden muss, nachdem es "Enabled" wurde? Irgendeinen ersten Tastendruck oder sowas? EDIT: Was noch seltsam ist: ca. 30ms nach Empfang des "Invalid Command" setzt der PC die Leitung einmal kurz in den Inhibit-Zustand, danach aber wieder auf Idle. KEIN RTS-Zustand. Komisch...
Da das vom selben Autor ist link ichs hier nochmal: http://www.marjorie.de/ps2/ps2.pdf Da steht zur Initilisierung und Kommunikation, dass das Ganze an sein Win98 angepasst ist. Evtl. liegt in die Richtung das Problem. Zum Timing und den in diesem Guide verwendeten Codes kann ich sagen, dass die mit einer 0815 PS/2-Tastatur funktionieren, wenn man selbst nicht die Tastatur baut, sondern den Host. - Hab den Code leider grade nicht zu Hand. Hast du mal die Kommunikation zwischer realer Tastatur und deinem PC abgegriffen?
LOL. Meine "richtige" Tastatur kämpft mit dem gleichen Problem, habe sie gerade mal ans Oszi gehängt: while (1) { PC: 0xEF - Invalid Command TT: 0xFE - Resend } Die Maschine ist ein Thinkpad T400, den PS/2-Port stellt mir eine Dockingstation zur Verfügung. Die Init-Sequenz der Tastatur konnte ich leider noch nicht abfangen; das ist ziemlich kniffelig, da alle Befehle recht weit auseinanderliegen, die PS2-Clock jedoch eine recht hohe Frequenz hat und der Speicher meines Oszis begrenzt ist. Ich probiere jetzt mal, ebenfalls immer mit "Resend" zu antworten und in der Zwischenzeit Tastendrücke zu senden. Ich werde der Sache mit dem "Invalid Commnd" weiter auf den Grund gehen und gleich mal einen etwas älteren Rechner herauskramen und mir die Übertragung erneut anschauen. @anno: Danke, die PDF kenne ich schon. ;-) Die Kommandos sind ja genormt und ich habe dann halt korrekt darauf zu antworten. Wie genau die Init-Sequenz aussieht (in Puncto "Vollständigkeit" und Reihenfolge der Kommandos) ist ja Wurst, das kann jedes BIOS und OS machen, wie es will. Gruß, Paul
Okay! Das Senden der Tastendrücke habe ich nun endlich hinbekommen. Hatte zuerst einen falschen Makecode gesendet peinlich, aber es ging mir ja auch erstmal um den Fehler 0xEF. Der Vollständigkeit halber habe ich wie versprochen die Tastatur auch mal an einen älteren PC gehängt; dort gibt es den Fehler nicht. Muss also eine Eigenart entweder des Laptops oder der Docking Station sein (keine Ahnung, wer sich da um PS/2 kümmert). Vielen Dank trotzdem nochmal an alle! :)
Dient das vielleicht zur Erkennung einer Maus? Der PS/2 geht bei den Thinkpads ja für beides.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.