Initialisierungsteil. Dieser Teil umfasst die Initialisierung auf der Hardware- und Softwareschicht. In diesem Beispiel müssen Sie zunächst die Matrixschaltung und die vom SN74hc164-Chip verwendeten GPIO-Ports konfigurieren, damit die CPU sie steuern und darauf zugreifen kann. Um einen GPIO-Port als Eingabe-, Ausgabe- oder Interrupt-Quelle zu konfigurieren, müssen Sie den richtigen Wert im entsprechenden GPIO-Steuerregister einstellen. Den spezifischen Wert finden Sie im Handbuch der S3C2410-Entwicklungsplatine. Um beispielsweise GPB1 als Eingangsanschluss von SN74hc164 festzulegen, müssen zwei Bits 2 und 3 im GPBCON-Steuerwort auf binär 01 gesetzt werden. Um GPG6 als Niederspannungs-Sprung-Interrupt-Quelle festzulegen, müssen zwei Bits 12 und 12 eingestellt werden 13 in GPGCON muss auf binär 10 gesetzt werden. Nach Abschluss des Hardware-Initialisierungsvorgangs erfolgt die Initialisierung auf der Softwareebene. Registrieren Sie zunächst die Tastatur-Interrupt-Verarbeitungsfunktion im System und richten Sie dann eine Timer-Struktur ein, damit der Interrupt beim Auftreten in der Timer-Warteschlange des Kernels hängen bleibt. Der Timer löst den Scanvorgang der Tastatur aus. Abschließend werden die 16 Spalten der Matrixschaltung über SN74hc164 auf Null gesetzt.
Verarbeitungsteil unterbrechen. Wie bereits erwähnt, sollte dieser Teil der Software die spezielle Tastatur scannen, feststellen, welche Taste gedrückt wird, einen stabilen Scancode erhalten und dann die Kernel-Exportfunktion handle_scancode aufrufen. In dieser Anwendung ähnelt das Layout der Spezialtastatur dem Layout der PC-Standardtastatur, sodass wir den Systemscancode der entsprechenden Taste auf der PC-Tastatur direkt als Scancode für jede Taste auf unserer Spezialtastatur verwenden Gleichzeitig verwenden wir den PC-Tastaturtreiber. Die Konvertierungsfunktion pckbd_translate vom Scancode in den Tastencode wird als unsere kbd_translate-Funktion verwendet.
Der Algorithmus zur Bestimmung, welche Taste gedrückt wird, ist wie folgt. Wenn der Interrupt kommt, können wir anhand der Interrupt-Nummer bereits feststellen, zu welcher Zeile die gedrückte Taste gehört, und wir müssen auch bestimmen, zu welcher Spalte die gedrückte Taste gehört. Zu diesem Zweck senden wir zunächst ein CLR-Signal an die beiden in Reihe geschalteten SN74hc164-Chips, löschen es und senden dann 16 1s, sodass die Spalten der Spezialtastatur zu diesem Zeitpunkt alle hoch sind Die Anschlüsse der Tastatur sind alle potenzialstark. Unter 16 Taktimpulsen werden 1 0 und 15 1s an den SN74hc164-Chip gesendet, sodass 0 nur einmal in jeder Spalte erscheint und gleichzeitig der Tastaturzeilen-Port gescannt wird. Wenn die Spalte der gedrückten Taste auf 0 gesetzt ist, zeigt die Zeile, in der sie sich befindet, einen niedrigen Pegel an. Mit dieser „Walk 0-Methode“ können wir feststellen, welche Taste auf der Tastatur gedrückt wurde. Dieser einfache Scan-Algorithmus reicht jedoch nicht aus, da bei dieser Art von Matrix-Scan-Tastatur jedes Mal, wenn eine Taste gedrückt und angehoben wird, ein Burr-Jitter von 10 bis 20 ms auftritt (die Länge dieses Zeitraums wird durch die Hardwareeigenschaften bestimmt). ., wie in Abbildung 2 dargestellt. Um stabile Tasteninformationen zu erhalten, muss eine Möglichkeit gefunden werden, diesen Jitter zu beseitigen, um zu vermeiden, dass ein Tastendruck des Benutzers mit mehreren Tastendrücken verwechselt wird. Eine übliche Methode zum Entgraten besteht darin, die Tastatur nicht sofort zu scannen, wenn eine Tastaturunterbrechung eintrifft, sondern eine Zeit lang zu warten und dann die Tastatur zu scannen, nachdem der Grat-Jitter übersprungen wurde. Der Pseudocode lautet wie folgt:
Warten Sie eine Weile und überspringen Sie den Jitter.
Wenn keine Taste auf der Tastatur gedrückt wird.
Wenn a Taste auf der Tastatur wird gedrückt
Warten Sie eine Weile und prüfen Sie dann, ob dieselbe Taste immer noch gedrückt wird
Wenn dieselbe Taste immer noch gedrückt wird
Geben Sie den Lesescan zurück Code;
else
Direkt zurückgeben
Diese Lösung ist sicherlich machbar, aber das System verwendet die Busy-Warte-Methode, um Grate zu entfernen jede nützliche Arbeit erledigen. Dies ist eine luxuriöse Verschwendung für eingebettete Linux-Systeme mit begrenzten Rechenressourcen. Für diese Anwendung haben wir eine Entgratungslösung entwickelt, die für eingebettete Systeme geeignet ist und gute Ergebnisse liefert.
Da der Linux-Kernel eine Timer-Warteschlange bereitstellt, können wir diesen Mechanismus nutzen, um geschäftiges Warten zu vermeiden und die Systemleistung zu verbessern. Wenn eine Taste auf der Tastatur gedrückt wird, schließt der Tastatur-Interrupt-Handler zunächst die Interrupt-Quelle, wechselt in den Abfragemodus und endet, nachdem ein Timerlist-Objekt in die Timer-Warteschlange eingefügt wurde. Der in den Kernel eingebundene Timer wird pünktlich ausgelöst und die von ihm ausgelöste Funktion führt die folgenden Aufgaben aus: Scannt zunächst alle Tasten auf der gesamten Tastatur und speichert die Scanergebnisse in einer statischen zweidimensionalen Array-Variablen snap_shot_matrix[16][4 ]. Diese Variable beschreibt den Druckstatus aller Tasten auf der Tastatur zu diesem Zeitpunkt dieses Tastaturscans. Ist eine Taste nicht gedrückt, also im losgelassenen Zustand, dann wird der entsprechende Wert in snap_shot_matrix auf 0 gesetzt. Wird eine Taste gedrückt, dann wird der entsprechende Wert in snap_shot_matrix um 1 erhöht. Wenn Wenn der Wert nach einer Erhöhung um 1 größer als eine vorab festgelegte Zahl ist, können wir ihn als stabilen Wert betrachten und den Wert in den entsprechenden Koordinaten einer anderen zweidimensionalen Array-Variablen current_matrix mit einer Größe von 16*4 festlegen auf 1, andernfalls auf 0 setzen. Diese Variable beschreibt den stabilen Wert der aktuellen Tastenanschläge auf der Tastatur. Das heißt, wir verarbeiten zuerst die in diesem Scan erhaltenen Abtastdaten, speichern sie in snap_shot_matrix und filtern sie dann, um die current_matrix basierend auf dem Wert in dieser Variablen zu erhalten. Durch diesen Prozess führen wir eine Entgratungsverarbeitung durch. Nachdem wir den stabilen Wert current_matrix dieses Scans erhalten haben, vergleichen wir ihn mit dem stabilen Wert previous_matrix, der beim letzten Mal erhalten wurde, um festzustellen, ob sich die Tastenbedingungen auf der Tastatur in diesem Moment im Vergleich zum letzten Scan geändert haben und ob sich die Tastaturbedingungen in diesem Moment geändert haben geändert, ob eine Taste gedrückt wird. Wenn festgestellt wird, dass keine Tasten auf der Tastatur gedrückt werden, schalten Sie den Tastatur-Interrupt ein und wechseln Sie erneut in den Interrupt-Modus. Wenn eine Taste auf der Tastatur gedrückt wird und diese sich von der zuletzt gescannten gedrückten Taste unterscheidet, rufen wir sofort die Tastenverarbeitungsfunktion „process_key“ auf, die die übergeordnete Funktion „handle_scancode“ im Tastaturtreiber aufruft. Wenn die Taste, die auf der Tastatur gedrückt wurde, die zuletzt gedrückte Taste ist, erhöhen wir einen Zähler. Wenn der Zähler einen bestimmten festgelegten Wert erreicht, starten wir die sogenannte Auto-Repeat-Funktion, das heißt, der Benutzer drückt weiterhin eine bestimmte Taste. Der Treiber generiert automatisch wiederholt Tastatureingaben. Dieser Zähler wird auf 0 gesetzt, wenn sich die gedrückte Taste ändert. Solange aber noch Tasten auf der Tastatur gedrückt sind, kopieren wir den aktuell gelesenen stabilen Tastaturwert current_matrix in die previous_matrix und hängen das zuvor beschriebene Timer-Objekt nach einer Weile in die Kernel-Timer-Warteschlange ein. Anschließend scannen wir das Ganze erneut erneut auf der Tastatur, bis keine Tasten mehr gedrückt werden.
4 Fazit
Mit der Weiterentwicklung der Informationsgesellschaft und der Computersoftware- und -hardwaretechnologie haben sich Design und Anwendung eingebetteter Informationsprodukte rasant weiterentwickelt, und es ist notwendig, Ihren eingebetteten Produkten spezielle Funktionen hinzuzufügen Auch der Bedarf an Tastaturtreibern wird immer größer. Nach der Einführung des Gesamtrahmens des Tastaturtreibers unter Linux wird in diesem Artikel eine spezielle Tastatur auf der S3C2410-Entwicklungsplatine als Beispiel verwendet, um sich auf die Beschreibung der Arbeit zu konzentrieren, die beim Schreiben eines Treibers für eine spezielle Tastatur in einer eingebetteten Linux-Umgebung ausgeführt werden muss , Bereitstellung einer Grundlage für ähnliche Die Entwicklung bietet eine Idee und Referenz.
(T114)
Das Obige ist der Inhalt der Tastaturtreiberimplementierung (1) (2) eines eingebetteten Linux-Systems. Bitte beachten Sie mehr Verwandte Inhalte. PHP-chinesische Website (www.php.cn)!