Maison >php教程 >PHP开发 >Implémentation d'un driver de clavier pour un système Linux embarqué (1) (2)

Implémentation d'un driver de clavier pour un système Linux embarqué (1) (2)

黄舟
黄舟original
2016-12-23 14:03:371602parcourir

Partie initialisation. Cette partie comprend l'initialisation sur la couche matérielle et la couche logicielle. Dans cet exemple, vous devez d'abord configurer le circuit matriciel et les ports GPIO utilisés par la puce SN74hc164 afin que le CPU puisse les contrôler et y accéder. Afin de configurer un port GPIO comme source d'entrée, de sortie ou d'interruption, vous devez définir la valeur correcte dans le registre de contrôle GPIO correspondant. La valeur spécifique peut être obtenue en consultant le manuel de la carte de développement S3C2410. Par exemple, afin de définir GPB1 comme borne d'entrée du SN74hc164, deux bits 2 et 3 dans le mot de contrôle GPBCON doivent être définis sur 01 binaire. Afin de définir GPG6 comme source d'interruption de saut basse tension, deux bits 12 et 13 dans GPGCON doit être défini sur le bit binaire 10. Après avoir terminé l'opération d'initialisation matérielle, c'est l'initialisation sur la couche logicielle. Tout d'abord, enregistrez la fonction de traitement des interruptions du clavier sur le système, puis configurez une structure de minuterie de sorte que lorsque l'interruption se produit, elle soit suspendue dans la file d'attente des minuteries du noyau. La minuterie déclenchera l'opération d'analyse du clavier. Enfin, les 16 colonnes du circuit matriciel sont mises à zéro via SN74hc164.

Partie traitement des interruptions. Comme mentionné précédemment, cette partie du logiciel doit scanner le clavier spécial, déterminer quelle touche est enfoncée, obtenir un code d'analyse stable, puis appeler la fonction d'exportation du noyau handle_scancode. Dans cette application, la disposition du clavier spécial est similaire à la disposition du clavier standard du PC, nous utilisons donc directement le code de numérisation système de la touche correspondante du clavier du PC comme code de numérisation de chaque touche de notre clavier spécial, et en même temps, nous utilisons le pilote du clavier du PC. La fonction de conversion pckbd_translate du code scan en code clé est utilisée comme notre fonction kbd_translate.

L'algorithme permettant de déterminer quelle touche est enfoncée est le suivant. Lorsque l'interruption survient, nous pouvons déjà déterminer à quelle ligne se trouve la touche enfoncée en fonction du numéro d'interruption, et nous devons également déterminer à quelle colonne se trouve la touche enfoncée. À cette fin, nous envoyons d'abord un signal CLR aux deux puces SN74hc164 connectées en série, l'effaçons, puis envoyons 16 1, de sorte que les colonnes du clavier spécial soient toutes hautes à ce moment-là, ce que nous lisons sur la ligne. les ports du clavier sont tous à fort potentiel. Sous 16 impulsions d'horloge, 1 0 et 15 1 sont envoyés à la puce SN74hc164, de sorte que 0 n'apparaisse qu'une seule fois dans chaque colonne, et en même temps, le port de la rangée du clavier est scanné. Lorsque la colonne de la touche enfoncée est mise à 0, la ligne où elle se trouve indiquera un niveau bas. En utilisant cette « méthode walk 0 », nous pouvons déterminer quelle touche du clavier a été enfoncée. Mais ce simple algorithme de balayage ne suffit pas, car dans ce type de clavier à balayage matriciel, chaque fois qu'une touche est enfoncée et levée, il y aura une gigue de bavure de 10 à 20 ms (la durée de cette période est déterminée par les caractéristiques matérielles). , comme le montre la figure 2, donc afin d'obtenir des informations de touche stables, il est nécessaire de trouver un moyen de supprimer cette instabilité pour éviter de confondre la pression d'une touche de l'utilisateur avec plusieurs pressions de touche. Une méthode courante d'ébavurage consiste à ne pas scanner le clavier immédiatement lorsqu'une interruption du clavier arrive, mais à attendre un certain temps, puis à scanner le clavier après avoir ignoré la gigue de bavure. Le pseudo-code est le suivant :

. Attendez un moment et évitez le gigue ;

Scannez le clavier ;

si aucune touche n'est enfoncée sur le clavier

Fin et revenez

si un ; la touche du clavier est enfoncée

attendez un moment puis vérifiez si la même touche est toujours enfoncée

si la même touche est toujours enfoncée

Renvoyer le scan de lecture ; code;

else

Retourner directement;

Cette solution est certainement réalisable, mais elle utilise la méthode d'attente occupée pour supprimer les bavures pendant la période d'attente chargée. faire tout travail utile. Il s'agit d'un gaspillage luxueux pour les systèmes Linux embarqués dotés de ressources informatiques limitées. Dans cette application, nous avons conçu une solution d'ébavurage adaptée aux systèmes embarqués avec de bons résultats.

Étant donné que le noyau Linux fournit une file d'attente de minuterie, nous pouvons utiliser ce mécanisme pour éviter les attentes occupées et améliorer les performances du système. Lorsqu'une touche du clavier est enfoncée, le gestionnaire d'interruption du clavier ferme d'abord la source d'interruption, passe en mode d'interrogation et se termine après avoir suspendu un objet timerlist dans la file d'attente du minuteur. La minuterie connectée au noyau est déclenchée à temps et la fonction qu'elle déclenche effectue les tâches suivantes : analyse d'abord toutes les touches de l'ensemble du clavier et enregistre les résultats de l'analyse dans une variable de tableau statique à 2 dimensions snap_shot_matrix[16 ][4 ]. Cette variable décrit l'état d'appui de toutes les touches du clavier à ce moment de ce balayage du clavier. Si une touche n'est pas enfoncée, c'est-à-dire qu'elle est dans un état relâché, alors la valeur correspondante dans snap_shot_matrix est définie sur 0. Si une touche est enfoncée, alors la valeur correspondante dans snap_shot_matrix est incrémentée de 1. Si Si la valeur est supérieure à un nombre prédéfini après avoir augmenté de 1, nous pouvons la considérer comme une valeur stable et définir la valeur dans les coordonnées correspondantes d'une autre variable de tableau à 2 dimensions current_matrix d'une taille de 16*4. à 1, sinon réglez-le à 0 . Cette variable décrit la valeur stable des frappes actuelles sur le clavier. C'est-à-dire que nous traitons d'abord les données échantillonnées obtenues lors de cette analyse et les enregistrons dans snap_shot_matrix, puis les filtrons pour obtenir la current_matrix en fonction de la valeur de cette variable. Grâce à ce processus, nous effectuons un traitement d'ébavurage. Après avoir obtenu la valeur stable current_matrix de cette analyse, nous la comparons avec la valeur stable previous_matrix obtenue la dernière fois pour déterminer si les conditions des touches du clavier ont changé à ce moment par rapport à la dernière analyse, et si les conditions du clavier à ce moment ont changé. modifié si une touche est enfoncée. S'il s'avère qu'aucune touche du clavier n'est enfoncée, activez l'interruption du clavier et revenez en mode interruption. Si une touche est enfoncée sur le clavier et qu'elle est différente de la dernière touche enfoncée numérisée, nous appelons immédiatement la fonction de traitement des touches process_key, qui appellera la fonction de niveau supérieur handle_scancode dans le pilote du clavier. Si la touche enfoncée sur le clavier est la touche enfoncée la dernière fois, nous incrémenterons un compteur. Lorsque le compteur atteint une certaine valeur spécifiée, nous démarrons la fonction dite de répétition automatique, c'est-à-dire que l'utilisateur continue d'appuyer sur une certaine touche. Le pilote génère automatiquement une saisie au clavier à plusieurs reprises. Ce compteur est mis à 0 lorsque la touche enfoncée change. Mais tant qu'il y a encore des touches sur le clavier qui sont enfoncées, nous copions la valeur stable du clavier actuellement lue current_matrix dans la previous_matrix et suspendons à nouveau l'objet timer décrit précédemment dans la file d'attente du minuteur du noyau. Après un certain temps, puis analysons l'intégralité. appuyez à nouveau sur le clavier jusqu'à ce qu'aucune touche du clavier ne soit enfoncée.

4 Conclusion

Avec les progrès de la société de l'information et de la technologie informatique et matérielle, la conception et l'application des produits d'information embarqués se sont développées rapidement, et il est nécessaire d'ajouter des fonctionnalités spéciales à vos produits intégrés. Système Linux. Le besoin de pilotes de clavier devient également de plus en plus courant. Après avoir présenté le cadre général du pilote de clavier sous Linux, cet article prend comme exemple un clavier spécial sur la carte de développement S3C2410 pour se concentrer sur la description du travail qui doit être effectué lors de l'écriture d'un pilote pour un clavier spécial dans un environnement Linux embarqué. , fournissant une base pour un développement similaire. fournit une idée et une référence.


(T114)

Ce qui précède est le contenu de l'implémentation du pilote de clavier (1) (2) d'un système Linux embarqué. Veuillez prêter attention à plus. contenu associé. Site Web chinois PHP (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn