2017-11-14 2 views
2

Ich versuche, Ethernet-Treiber für Linux-Kernel 4.13.x für Banana Pi M2 ultra zu schreiben. Vor einiger Zeit wurde der so genannte "Device Tree" (DT) in der Linux-Kernel-Infrastruktur eingeführt. Ich habe nicht viel Erfahrung mit DT beim Schreiben von Gerätetreibern und deshalb habe ich ein paar Fragen.Linux-Gerätetreiber für Bananen-Pi und Gerät Baum

Soweit ich weiß - im Falle von Bananen-Pi-System - ist es notwendig, einige Clock-Quelle für gegebene Peripheriegerät zur Verfügung zu stellen. Es ist die Funktion der CCU in Banana Pi, eine solche Uhr zu liefern. Die CCU ist speicherplatziert Ressource an einer Adresse im Linux-Kernel. Ich möchte Treiber für Ethernet schreiben, die benötigt einige Uhr von CCU.

Ich weiß, dass die physikalische Adresse der CCU über ioremap() oder ähnliche Funktion zu virtuellen Adresse zugeordnet werden muss.

Meine Frage ist, wie kann ich die virtuelle Adresse der CCU in meinem Ethernet-Treiber holen? Ist es möglich, über Gerätebaum zu tun? Wenn ja - wie geht das? Oder vielleicht kann diese virtuelle Adresse einen anderen Weg gehen?

Ich bin nur nicht sicher, ob es getan wird (Virt-Adresse abrufen) über DT oder nur durch eine Prozedur oder über den globalen Zeiger.

Irgendwelche Ideen oder Vorschläge?

+1

Der Fahrer sollte nicht * „holen die virtuelle Adresse der CCU“ * Analogus zu Plattform Daten in Betracht gezogen werden. Der Kernel verwendet objektorientierte Techniken wie die Datenkapselung, so dass Treiber diese Adresse oder Daten nicht teilen. Es sollte eine Funktion geben, die Ihr Treiber aufrufen kann, um die erforderliche Uhr zu erhalten oder zu aktivieren. – sawdust

Antwort

0

Es gibt Beispiele im Linux-Kernel für Plattformtreiber. Ich habe auf i2c und i2s auf Raspberry Pi gearbeitet, so dass ich diese Beispiele zitieren kann.

In http://elixir.free-electrons.com/linux/v4.3.2/source/drivers/i2c/busses/i2c-bcm2835.c

Blick auf die Probe-Funktion, ruft sie das Subsystem api

platform_get_resource(pdev, IORESOURCE_MEM, 0); 

Dies kann physikalische Adresse gibt, die ioremap ist ..

Dazu ist es erforderlich, eine schaffen Geräteknoten im Gerätebaum wie in https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/bcm283x.dtsi

Überprüfen Sie für i2c0 Devi ce-Knoten in der Datei bcm283x.dtsi.

Der Ausrichtungs-Schlüssel ist, wo physikalische Adresse

reg = <0x7e205000  0x1000>; 

     physical add  size 

Hope Diese Hilfe, die Sie gespeichert.

Gerätebaum kann vorher

+0

Entweder bekomme ich Ihren Standpunkt nicht oder Sie haben meinen Standpunkt verfehlt. Ich suche nicht nach der Art und Weise, wie die physikalische Adresse zu platzieren ist, sondern vielmehr, wie die virtuelle Adresse der CCU zwischen allen Peripheriegeräten geteilt wird, die diese CCU verwenden müssen. Jeder Peripherietreiber muss die virtuelle CCU-Adresse verwenden, um die Uhr dafür richtig zu konfigurieren. Also das ist die Beziehung 1: n - viele Treiber verwendet virtuelle Adresse von einem der Peripheriegeräte (CCU). Das Hauptproblem für mich ist, wie man Zugang zu dieser virtuellen Adresse von CCU erhält? – user2699113

+0

Dies kann über den Gerätebaum erfolgen. Erstellen Sie einen Geräteknoten für die CCU-Uhr, und Sie können den Geräteknoten für alle Peripheriegeräte freigeben, für die dies erforderlich ist.Sie können das Konzept des Phandle des Gerätebaums verwenden. Sehen Sie sich an, wie der Geräteknoten des Geräts unter verschiedenen Knoten geteilt wird. Https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/bcm283x.dtsi. Hoffentlich habe ich Ihre Frage verstanden – Varun

+0

Der richtige Weg, um zu tun ist, klicken Sie richtig Framework wie von @sawdust gezeigt. – 0andriy