Cet article fournira une introduction approfondie au cadre de pilote PWM (Pulse-Width Modulation) de Linux, y compris ses principes de mise en œuvre, ses méthodes d'ajout de pilote et ses méthodes de débogage pour aider les développeurs à mieux comprendre et utiliser cette fonction.
L'exemple de version du noyau Linux présenté dans cet article est la 6.2.8.
La technologie PWM, en tant que technologie de modulation couramment utilisée, peut modifier le cycle de service du signal effectif en ajustant la largeur temporelle de haut niveau de la forme d'onde périodique, permettant ainsi de contrôler l'alimentation de l'appareil. Les domaines d'application PWM courants incluent le réglage de la luminosité du rétroéclairage de l'écran, le contrôle de la vitesse du moteur et le contrôle de la vitesse du ventilateur. Le noyau Linux prend en charge le cadre de pilote PWM et fournit le code principal du cadre de pilote PWM et le code d'interface sysfs en faisant abstraction des types de données de structure du contrôleur PWM et des signaux PWM. Les développeurs peuvent utiliser ce framework de pilotes pour ajouter facilement leurs propres pilotes de contrôleur PWM spécifiques et utiliser l'interface sysfs pour le débogage fonctionnel.
Les développeurs de pilotes peuvent concevoir une structure de contrôleur PWM dédiée selon les besoins, en utilisant la structure struct pwm_chip comme variable membre. Ce qui suit est un exemple, défini dans le pilote ./drivers/pwm/pwm-ab8500.c.
(2) structure struct pwm_ops, y compris la fonction de fonctionnement du contrôleur PWM. Les deux fonctions de base qui doivent être implémentées par les développeurs de pilotes sont la fonction apply et la fonction get_state ; la fonction apply est utilisée pour configurer le contrôleur PWM, y compris la configuration de l'état d'activation, de la période, du rapport cyclique, de la polarité, etc. du signal PWM. ; la fonction get_state est utilisée pour obtenir l'état initial du signal de canal PWM spécifié lors de l'enregistrement du contrôleur PWM, y compris l'état d'activation, la période, le rapport cyclique, la polarité, etc.
(3) structure struct pwm_device, représentant le signal PWM émis par le contrôleur PWM.
3.3 Fonction de base du framework de pilotes
(1) fonction pwmchip_add. Utilisé pour enregistrer un nouveau périphérique contrôleur PWM. Défini dans ./drivers/pwm/core.c.
(2) fonction pwmchip_remove. Utilisé pour supprimer un périphérique de contrôleur PWM. Défini dans ./drivers/pwm/core.c.
Méthode d'implémentation typique du pilote 3.4
(1) Résumé
Le fichier source du pilote PWM se trouve dans le chemin ./drivers/pwm. Le développeur du pilote doit ajouter le fichier source correspondant. La conception du fichier source peut faire référence au code du pilote d'autres fabricants. En vous référant au style de dénomination du code d'origine, vous pouvez nommer le fichier source du pilote nouvellement ajouté pwm-xx.c, nommer la sonde et supprimer les fonctions respectivement xx_pwm_probe et xx_pwm_remove, et définir la structure du contrôleur PWM comme struct xx_pwm_chip. Les fichiers dans le chemin ./drivers/pwm sont les suivants.
(2) appliquer la fonction et la définition de la fonction get_state
Selon le manuel du contrôleur PWM, la fonction apply et la fonction get_state sont définies par le développeur du pilote.
(3)Définition de la fonction xx_pwm_probe
La méthode d'implémentation de la fonction xx_pwm_probe est la suivante : initialisez d'abord la variable struct xx_pwm_chip de la structure du contrôleur PWM, puis appelez la fonction principale du cadre de pilote PWM pwmchip_add pour enregistrer un nouveau périphérique de contrôleur PWM.
(4) définition de la fonction xx_pwm_remove
La fonctionxx_pwm_remove est implémentée en appelant la fonction principale du cadre de pilote PWM pwmchip_remove pour supprimer un périphérique de contrôleur PWM.
4. Comment ajouter un pilote
4.1 Ajouter des fichiers sources du pilote
Suivez la méthode décrite dans la section 3.4, écrivez le fichier source du pilote pwm-xx.c et ajoutez-le au chemin ./drivers/pwm.
4.2 ajoute le support de la compilation
(1) Modifiez le fichier Kconfig sous le chemin ./drivers/pwm et ajoutez les options de configuration du pilote PWM ajoutées.
(2) Modifiez le fichier Makefile dans le chemin ./drivers/pwm et ajoutez l'option de compilation de pwm-xx.c.
(3) Dans l'interface memuconfig, activez le pilote PWM ajouté. L'interface de configuration est la suivante.
4.3 Ajouter un nœud d'arborescence de périphériques de contrôleur PWM
Ajoutez un nœud d'arborescence de périphériques de contrôleur PWM dans l'arborescence des périphériques. Les propriétés de base de ce nœud incluent la compatibilité, les registres et le nombre de cellules #pwm. Ajoutez des interruptions, des horloges, des réinitialisations et d'autres propriétés si nécessaire.
Pour la méthode de conception de l'arborescence des périphériques du contrôleur PWM, veuillez vous référer à ./Documentation/devicetree/bindings/pwm.
Vous trouverez ci-dessous un exemple de nœud d'arborescence de périphériques de contrôleur PWM. Les documents de référence sont les suivants :
./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml.
5.Méthode de débogage
Utilisez l'interface sysfs pour déboguer fonctionnellement le pilote PWM. Des exemples des principales commandes de débogage sont les suivants.
(1) Afficher le nœud du contrôleur PWM
ls /sys/class/pwm/pwmchip0
(2) Activez le signal du canal PWM spécifié
echo n > /sys/class/pwm/pwmchip0/export
//n est le numéro de la chaîne
(3) Définir la période du signal PWM
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period
//pvalue est la valeur de la période
(4) Définir le cycle de service du signal PWM
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
//dvalue est la valeur effective de la largeur du niveau
(5) Activer un certain signal de canal PWM
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
(6) Désactivez un certain signal de canal PWM
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!