1

Wie ich weiß, können Plattformgerätetreiber automatisch geladen werden, wenn das Feld "compatible" im Gerätebaum mit dem Feld "compatible" im Kernelmodul übereinstimmt. Hier ist pwm-overlay.dts Datei von Raspberry Pi Distro:Autoloading-Mechanismus für Plattformgerätetreiber

/ { 
    [email protected] { 
     target = <&gpio>; 
     __overlay__ { 
      pwm_pins: pwm_pins { 
       brcm,pins = <18>; 
       brcm,function = <2>; /* Alt5 */ 
      }; 
     }; 
    }; 

    [email protected] { 
     target = <&pwm>; 
     __overlay__ { 
      pinctrl-names = "default"; 
      pinctrl-0 = <&pwm_pins>; 
      status = "okay"; 
     }; 
    }; 

    [email protected] { 
     target = <&clk_pwm>; 
     frag2: __overlay__ { 
      clock-frequency = <100000000>; 
     }; 
    }; 

    __overrides__ { 
     pin = <&pwm_pins>,"brcm,pins:0"; 
     func = <&pwm_pins>,"brcm,function:0"; 
     clock = <&frag2>,"clock-frequency:0"; 
    }; 
}; 

Zunächst einmal, ich sehe kein "kompatibel" Feld, aber in pwm-bcm2835.c Datei gibt es solche Strings:

static const struct of_device_id bcm2835_pwm_of_match[] = { 
    { .compatible = "brcm,bcm2835-pwm", }, 
    { /* sentinel */ } 
}; 

Auch, wenn ich Overlay laden, Treiber erfolgreich automatisch geladen. Wie es funktioniert? Wie weiß er, welcher Treiber geladen werden soll?

+0

Können Sie die dts (Gerätebaum) -Datei teilen? Ich erwarte die Antwort ist da – levengli

Antwort

2

Sie haben Recht, wie "kompatible" Felder angepasst werden, um einen Treiber an ein Gerät zu binden, Sie suchen einfach nicht den richtigen Platz dafür.

Die Datei, die Sie betrachten, ist ein Gerätebaum-Overlay. Es wird zu einer vorhandenen Gerätestruktur hinzugefügt, indem einige der Knoten und Eigenschaften hinzugefügt, entfernt oder geändert werden. Der letzte Gerätebaum ist das Ergebnis der Kombination des Originals mit einer Anzahl von Überlagerungen. Eine bestimmte Eigenschaft kann in den Quelldateien des Originals und/oder der Überlagerungen (neu) definiert werden. Es ist eine willkürliche Entscheidung des Designers, wie der Quellcode des Gerätebaums strukturiert wird.

Aber denken Sie ein wenig darüber nach, warum Overlays existieren. Diese Überlagerung dient zur Konfiguration der PWM, da die Konfiguration der PWM nicht für jede Karte identisch ist (Sie können sie möglicherweise gar nicht verwenden). Durch die Verwendung von Overlays für etwas, das sich ändern kann, können wir diese Änderung vornehmen, ohne dass eine neue Gerätestruktur erstellt und gebootet werden muss. Die Existenz der PWM-Hardware im SoC ist konstant. Auch wenn es nicht benutzt wird, ist es nie da. Bestimmte Dinge, wie die Basisadresse der Geräteregister, ändern sich ebenfalls nicht. Es macht also keinen Sinn, dies in ein Overlay zu schreiben, da es sich nicht ändert und wahrscheinlich in der Baumquelle des Basisgeräts liegt.

In der Überlagerung ändert [email protected] einen vorhandenen Zielknoten mit der Bezeichnung "pwm". Wenn wir für diesen Knoten, so finden wir es in bcm283x.dtsi:

  pwm: [email protected] { 
        compatible = "brcm,bcm2835-pwm"; 
        reg = <0x7e20c000 0x28>; 
        clocks = <&clocks BCM2835_CLOCK_PWM>; 
        assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; 
        assigned-clock-rates = <10000000>; 
        #pwm-cells = <2>; 
        status = "disabled"; 
      }; 

Und dort haben Sie die kompatible Eigenschaft mit dem Wert „BRCM, bcm2835-pwm“. Da es nicht geändert werden müsste, ist es in der Quelle des Basisgerätbaums, wie wir es erwarten würden.

Verwandte Themen