Dieser Artikel bietet eine ausführliche Einführung in das PWM-Treiber-Framework (Pulse-Width Modulation) von Linux, einschließlich seiner Implementierungsprinzipien, Methoden zum Hinzufügen von Treibern und Debugging-Methoden, um Entwicklern zu helfen, diese Funktion besser zu verstehen und zu verwenden.
Die in diesem Artikel gezeigte Beispiel-Linux-Kernelversion ist 6.2.8.
PWM-Technologie als häufig verwendete Modulationstechnologie kann das Tastverhältnis des effektiven Signals ändern, indem sie die Zeitbreite der periodischen Wellenform auf hohem Niveau anpasst und so eine Steuerung der Stromversorgung für das Gerät ermöglicht. Zu den gängigen PWM-Anwendungsbereichen gehören die Helligkeitsanpassung der Bildschirmhintergrundbeleuchtung, die Steuerung der Motorgeschwindigkeit und die Steuerung der Lüftergeschwindigkeit. Der Linux-Kernel unterstützt das PWM-Treiber-Framework und stellt den Kerncode des PWM-Treiber-Frameworks und den sysfs-Schnittstellencode bereit, indem er die Strukturdatentypen des PWM-Controllers und der PWM-Signale abstrahiert. Entwickler können dieses Treiber-Framework verwenden, um ganz einfach ihre eigenen spezifischen PWM-Controller-Treiber hinzuzufügen und die sysfs-Schnittstelle für das funktionale Debuggen zu verwenden.
Treiberentwickler können nach Bedarf eine dedizierte PWM-Controller-Struktur entwerfen, indem sie die Struktur struct pwm_chip als Mitgliedsvariable verwenden. Das Folgende ist ein Beispiel, das im Treiber ./drivers/pwm/pwm-ab8500.c definiert ist.
(2) struct pwm_ops-Struktur, einschließlich der Betriebsfunktion des PWM-Controllers. Die beiden Grundfunktionen, die von Treiberentwicklern implementiert werden sollten, sind die Apply-Funktion und die Get_State-Funktion; die Apply-Funktion wird zum Konfigurieren des PWM-Controllers verwendet, einschließlich der Konfiguration des Aktivierungszustands, der Periode, des Arbeitszyklus, der Polarität usw. des PWM-Signals ; Die Funktion get_state wird verwendet, um den Anfangsstatus des angegebenen PWM-Kanalsignals bei der Registrierung des PWM-Controllers abzurufen, einschließlich Aktivierungsstatus, Periode, Arbeitszyklus, Polarität usw.
(3) struct pwm_device-Struktur, die das vom PWM-Controller ausgegebene PWM-Signal darstellt.
3.3 Kernfunktion des Treiber-Frameworks
(1) pwmchip_add-Funktion. Wird verwendet, um ein neues PWM-Controller-Gerät zu registrieren. Definiert in ./drivers/pwm/core.c.
(2) pwmchip_remove-Funktion. Wird zum Entfernen eines PWM-Controller-Geräts verwendet. Definiert in ./drivers/pwm/core.c.
Typische Implementierungsmethode des 3.4-Treibers
(1) Zusammenfassung
Die Quelldatei des PWM-Treibers befindet sich im Pfad ./drivers/pwm. Der Treiberentwickler muss die entsprechende Quelldatei hinzufügen. Das Design der Quelldatei kann auf den Treibercode anderer Hersteller verweisen. Unter Bezugnahme auf den Benennungsstil des Originalcodes können Sie die neu hinzugefügte Treiberquelldatei pwm-xx.c nennen, die Sonden- und Entfernungsfunktionen als xx_pwm_probe bzw. xx_pwm_remove benennen und die PWM-Controller-Struktur als Struktur xx_pwm_chip definieren. Die Dateien im Pfad ./drivers/pwm lauten wie folgt.
(2) Funktion anwenden und Funktionsdefinition get_state
Laut dem Handbuch zum PWM-Controller werden die Apply-Funktion und die get_state-Funktion vom Treiberentwickler definiert.
(3)xx_pwm_probe-Funktionsdefinition
Die Implementierungsmethode der Funktion xx_pwm_probe lautet: Initialisieren Sie zuerst die Strukturvariable xx_pwm_chip der PWM-Controller-Struktur und rufen Sie dann die Kernfunktion pwmchip_add des PWM-Treiber-Frameworks auf, um ein neues PWM-Controller-Gerät zu registrieren.
(4)xx_pwm_remove Funktionsdefinition
Die Funktionxx_pwm_remove wird durch Aufrufen der Kernfunktion pwmchip_remove des PWM-Treiber-Frameworks implementiert, um ein PWM-Controller-Gerät zu entfernen.
4. So fügen Sie einen Treiber hinzu
4.1 Treiberquelldateien hinzufügen
Folgen Sie der in Abschnitt 3.4 beschriebenen Methode, schreiben Sie die Treiberquelldatei pwm-xx.c und fügen Sie sie dem Pfad ./drivers/pwm hinzu.
4.2 fügt Kompilierungsunterstützung hinzu
(1) Ändern Sie die Kconfig-Datei unter dem Pfad ./drivers/pwm und fügen Sie die hinzugefügten PWM-Treiberkonfigurationsoptionen hinzu.
(2) Ändern Sie die Makefile-Datei im Pfad ./drivers/pwm und fügen Sie die Kompilierungsoption pwm-xx.c hinzu.
(3) Aktivieren Sie in der memuconfig-Schnittstelle den hinzugefügten PWM-Treiber. Die Konfigurationsoberfläche ist wie folgt.
4.3 PWM-Controller-Gerätebaumknoten hinzufügen
PWM-Controller-Gerätebaumknoten im Gerätebaum hinzufügen. Zu den grundlegenden Eigenschaften dieses Knotens gehören Kompatibilität, Register und Anzahl der #pwm-Zellen. Fügen Sie nach Bedarf Interrupts, Takte, Resets und andere Eigenschaften hinzu.
Informationen zur Entwurfsmethode für den Gerätebaum des PWM-Controllers finden Sie unter ./Documentation/devicetree/bindings/pwm.
Unten finden Sie ein Beispiel für einen Gerätebaumknoten eines PWM-Controllers. Die Referenzdokumente lauten wie folgt:
./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml.
5.Debugging-Methode
Verwenden Sie die sysfs-Schnittstelle, um den PWM-Treiber funktional zu debuggen. Beispiele für die wichtigsten Debugging-Befehle sind wie folgt.
(1) PWM-Controller-Knoten anzeigen
ls /sys/class/pwm/pwmchip0
(2) Schalten Sie das angegebene PWM-Kanalsignal ein
echo n > /sys/class/pwm/pwmchip0/export
//n ist die Kanalnummer
(3) Stellen Sie die PWM-Signalperiode ein
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period
//pvalue ist der Periodenwert
(4)Stellen Sie den Arbeitszyklus des PWM-Signals ein
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
//dvalue ist der effektive Wert der Ebenenbreite
(5) Aktivieren Sie ein bestimmtes PWM-Kanalsignal
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
(6) Deaktivieren Sie ein bestimmtes PWM-Kanalsignal
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
Das obige ist der detaillierte Inhalt vonLinux-PWM-Treiber. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!