Maison > php教程 > PHP开发 > le corps du texte

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

黄舟
Libérer: 2016-12-23 13:45:16
original
1241 Les gens l'ont consulté

1 Introduction

Linux a été largement utilisé dans les systèmes embarqués en raison de ses nombreux avantages tels qu'un noyau puissant et stable, une extension et une réduction faciles et une prise en charge matérielle riche. De nombreux systèmes Linux embarqués, en particulier ceux ayant une forte interaction avec les utilisateurs, doivent souvent être équipés d'un clavier spécial. À l'heure actuelle, les développeurs doivent écrire des pilotes pour leurs propres claviers spéciaux en fonction des conditions réelles.

2 Introduction au pilote de clavier Linux

La plupart des pilotes sous Linux adoptent une architecture hiérarchique, et les pilotes de clavier ne font pas exception. Sous Linux, le pilote du clavier est implémenté en deux couches. Parmi eux, la couche supérieure est une couche d'abstraction générale du clavier, qui remplit certaines fonctions du pilote de clavier qui ne dépendent pas du matériel spécifique sous-jacent, et est responsable de la fourniture de services à la couche sous-jacente, la couche inférieure est la couche de traitement matériel ; , qui est étroitement lié au matériel spécifique et est principalement responsable du traitement matériel. Les parties publiques supérieures du pilote de clavier se trouvent dans driver/keyboard.c. La chose la plus importante dans ce fichier est la fonction handle_scancode exportée par le noyau à l'aide de la macro EXPORT_SYMBOL. La fonction complétée par handle_scancode est la suivante : convertissez d'abord le code de numérisation en code clé, puis convertissez le code clé en code cible en fonction de la pression sur Maj, Alt et autres touches étendues, généralement un code ASCII, et enfin mettez le code ASCII. dans le tampon du terminal et planifie un tasklet pour qu'il fasse écho sur le moniteur. On peut voir que cette fonction complète une partie du travail de base dans le pilote de clavier, et ces fonctions logiques de base ne dépendent pas du matériel sous-jacent, elles peuvent donc être isolées et exportées vers les appels de fonction de traitement matériel sous-jacent. Plusieurs autres fonctions de rappel sont également définies dans ce fichier, qui sont appelées par les parties publiques de niveau supérieur du pilote de clavier et implémentées par les fonctions de traitement matériel sous-jacentes. Par exemple, kbd_init_hw, kbd_translate, kbd_unexpected_up et ainsi de suite. Parmi eux, kbd_translate est appelé par handle_scancode, qui est responsable de la conversion du code de numérisation en code clé ; la partie de traitement matériel sous-jacente du pilote de clavier a différentes implémentations selon le matériel. Par exemple, les fonctions de traitement matériel sous-jacentes du clavier standard sur la plate-forme PC sont concentrées dans driver/Pc_keyb.c. Ce fichier comprend la fonction de traitement des interruptions du clavier clavier_interrupt, la fonction de conversion du code de numérisation en code clé pckbd_translate et d'autres fonctions étroitement liées au matériel sous-jacent.

Sous cette architecture, il est particulièrement clair d'ajouter un clavier spécial au système. Les développeurs n'ont qu'à écrire les fonctions de traitement matériel sous-jacentes dans le pilote pour piloter le clavier. D'une manière générale, la tâche la plus importante dans la fonction de traitement matériel sous-jacente est d'obtenir le code de scan de la touche enfoncée dans le traitement de l'interruption du clavier et d'appeler handle_scancode avec celui-ci comme paramètre. Le code de scan peut être défini par vous-même, mais il doit le faire. l'identifier de manière unique. La position de la touche enfoncée sur le clavier. De plus, les développeurs doivent également fournir la fonction de conversion correspondante kbd_translate des codes d'analyse personnalisés en codes clés. La conversion spécifique du code clé, le placement du code cible dans le tampon d'entrée du terminal et l'écho sont tous complétés par handle_scancode. Nous pouvons également voir ici que la fonction d'exportation du noyau handle_scancode joue un rôle clé dans le collage de la couche d'abstraction générale supérieure et de la couche de traitement matériel sous-jacente dans l'ensemble du pilote de clavier.

3 Exemple d'application

Ci-dessous, nous utiliserons un exemple d'application spécifique pour illustrer le processus spécifique d'écriture d'un pilote pour un clavier spécial dans un système Linux embarqué.

3.1 Description du module matériel

La construction de ce système utilise la carte de développement S3C2410 de Samsung comme plate-forme matérielle. Le module matériel du clavier spécial est principalement composé de deux puces SN74hc164 et d'un circuit de balayage matriciel à 4 lignes et 16 colonnes. SN74hc164 est un registre à décalage d'entrée série et de sortie parallèle de 8 bits, composé de 8 bascules D connectées en série. Son principe de fonctionnement est simplement le suivant. La puce SN74hc164 transmet l'entrée série sur les broches A et B vers les broches de sortie QA à QH en parallèle après 8 impulsions d'horloge sur le front montant de l'impulsion d'horloge CLK. Sa table de vérité est présentée à la figure 1.

Une fois les deux puces SN74hc164 connectées en série, connectez respectivement leur broche CLK et leur broche CLR aux ports GPB2 et GPB4 de la carte de développement S3C2410, et connectez les broches A et B de la première puce SN74hc164 connectée à Le port GPB1 de la carte de développement, ces trois ports GPIO sont configurés comme ports de sortie. De cette façon, nous utilisons deux registres SN74hc164 pour occuper seulement 3 ports GPIO et fournir une entrée aux 16 colonnes du circuit de balayage matriciel, économisant ainsi des coûts et évitant le gaspillage de ressources GPIO. Mais cela entraîne également certains problèmes dans la mise en œuvre du pilote de clavier. Le pilote doit d'abord piloter le SN74hc164, puis il peut contrôler les 16 colonnes du circuit matriciel. Les quatre broches de rangée du circuit matriciel sont respectivement connectées aux ports GPG6, GPG7, GPG8 et GPG9 du S3C2410, et ces quatre ports sont configurés comme sources d'interruption. Lorsqu'aucune touche n'est enfoncée, elle est directement lue comme un potentiel élevé. Lors de son utilisation, les 16 colonnes du clavier sont d'abord réglées au potentiel bas via la puce SN74hc164. Lorsqu'une touche est enfoncée, le port GPG de la rangée correspondante aura une tension. sauter de haut en bas Cela déclenche une interruption.

3.2 Description du module logiciel

Ce qui précède est le contenu de l'implémentation du pilote de clavier d'un système Linux embarqué (1). Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www). .php.cn) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!