Während ein FPGA mit einer ARM-CPU unter Linux ausgeführt wurde, musste ein sogenannter Gerätebaum geändert werden. Daher möchte ich über das, was ich untersucht habe (ich habe es verstanden), schreiben, damit ich den Inhalt der Gerätebaumquelle (.dts), die in der Kernelquelle enthalten ist, grob verstehen kann. Ich hoffe, dass Leute, die sich die .dts-Datei in der Kernel-Quelle ansehen und denken, "was ist falsch", das Gefühl haben, sie verstehen und zusätzliche Korrekturen vornehmen zu können.
Der Gerätebaum kann als Datenstruktur (Dateiformat) bezeichnet werden, die Hardwarekomponenten beschreibt, auf die vom Betriebssystem (CPU) aus Sicht der Software (Gerätetreiber) zugegriffen werden kann. Dieses Format wurde von einer Gruppe namens Open Firmware (einer von der Linux-Entwicklungsgruppe getrennten Gruppe) entwickelt.
Dieses Format wird auch unter Linux verwendet, und der Kernel-Code und die Informationen für jede Karte (dh den Gerätebaum) werden getrennt und betrieben. Wenn ein Gerätebaum für die Karte vorbereitet wird, ist es daher möglich, auf verschiedenen Karten zu arbeiten, während die Kernel-Binärdatei gemeinsam bleibt.
Die Kernel-Quelle verfügt über eine Gerätebaum-Quelldatei (.dts) für die unterstützten Hauptplatinen, und die Gerätebaum-Binärdatei befindet sich auf dem Makefile-System sowie der Build der Kernel-Binärdatei (z. B. make zImage
). Es kann generiert werden (zB make dt bs
). Zum Zeitpunkt des Schreibens dieses Artikels (Mai 2020) registrierte der Linux-Kernel-Quellbaum des ursprünglichen Kernel.org übrigens mehr als 1200 .dts-Dateien nur für ARM 32-Bit-CPUs.
Der Kernel-Code (jeder Gerätetreiber) durchsucht den Gerätebaum nach den Informationen, die Sie zum Zeitpunkt der Initialisierung benötigen, und schließt die Geräteregistrierung und -initialisierung gemäß diesen Informationen ab.
Daher kann es Situationen geben, in denen der Kernel nur gestartet wird, wenn die für den Kernel-Code erforderlichen Informationen im Gerätebaum beschrieben sind. Daher sollten die Kernel-Binärdatei und der Gerätebaum im Prinzip aus derselben Version der Kernel-Quelle erstellt werden. Ich werde.
In einem für Menschen lesbaren Textformat geschrieben, wird als Gerätebaumquelle bezeichnet und hat die Erweiterung .dts. Die in das Binärformat konvertierte Datei wird als Gerätebaum-Blob bezeichnet und hat die Erweiterung .dtb. Der Kernel liest einen Gerätebaum-Blob (.dtb) im Binärformat. Der Gerätebaum-Compiler (Befehl dtc) wird verwendet, um die Gerätebaumquelle in den Gerätebaum-Blob zu konvertieren. Der Gerätebaum-Compiler hat die Möglichkeit, die inverse Konvertierung .dtb-> .dts sowie .dts-> .dtb durchzuführen, die Sie verwenden können, wenn Sie den Inhalt der binären .dtb anzeigen möchten.
Um den Gerätebaum unter Linux zu verstehen (obwohl die Einführung verlängert wurde)
Ich denke, es ist gut, es zu verstehen, indem man es in zwei Teile teilt. Hier konzentrieren wir uns auf die "Gerätebaum-Schreibmethode (Format)". Welche Informationen in den Gerätebaum geschrieben werden müssen, hängt davon ab, welche Informationen der Linux-Gerätetreiber benötigt. Am Ende dieses Artikels werde ich Ihnen eine kurze Einführung geben.
** Grob gesagt über die dts-Datei, **
ist. Weitere Details finden Sie unter dem folgenden Link. https://elinux.org/Device_Tree_Usage
3.2 Node
Knotenformat
[label:] node-name[@unit-address] {
[properties definitions]
[child nodes]
}
--device wird als Knoten dargestellt --node hat Eigenschaft und Knoten (untergeordneter Knoten)
--knotenname Definieren Sie den Namen im Format @ Einheitsadresse und definieren Sie den Knoteninhalt in der folgenden mittleren Klammer {}
/ {...};
3.3 Property --property ist eine Kombination aus Eigenschaftsname = Wert
[label:] property-name = value;
[label:] property-name ;
--Text String: In doppelte Anführungszeichen setzen kompatibel = " arm, cortex-a9 ";
--Array / Cell-list: Ein Satz von 32-Bit-Ganzzahlen ohne Vorzeichen, die durch spitze Klammern <> getrennt sind
reg = <0xffd04000 0x1000>;
[12 34 56 ab cd ef];
<0xff900000 0x100000>, <0xffb80000 0x10000>;
mixed-property ="a string", [0x01 0x23 0x45 0x67], <0x12345678>;
compatible
Die wichtigste Eigenschaft für die Verbindung mit dem Gerätetreiber.
Geräte, für die ein Gerätetreiber erforderlich ist, benötigen diese Eigenschaft
Die Gerätetreiber-Initialisierungsroutine mit einer kompatiblen Zeichenfolge, die mit der durch diesen Wert angegebenen Zeichenfolge übereinstimmt, wird aufgerufen und die Geräteregistrierung durchgeführt.
Eine Liste von Textzeichenfolgen im Format "Hersteller, Modell".
--Beispiel: compatible =" altr, socfpga-stmmac "," snps, dwmac-3.70a "," snps, dwmac ";
status
Ob das Gerät aktiviert werden soll oder nicht. --Wert ist "okay" oder "deaktiviert"
phandle
Stellen Sie die ID-Nummer ein, die den Knoten als Zellenliste angibt
Normalerweise weggelassen (in von Menschen geschriebenen .dts)
Für Knoten, bei denen Phandle weggelassen wird, generiert der DTC-Compiler automatisch eine eindeutige ID, fügt Phandle hinzu und generiert .dtb.
Sie können den Phandle eines Knotens mit der Bezeichnung "XXX" im Format "<& XXX>" angeben. Wird häufig bei der Beschreibung von Interrupt-Eigenschaften verwendet.
reg
Adressinformationen für das Gerät. Angegeben durch ein Paar von (Adresszellen, Größenzellen).
Geben Sie die Basisadresse mit Adresszellen und die Speichergröße (Bytegröße) mit Größenzellen an
Die Anzahl der Adresszellen und Größenzellen wird durch die Werte von # Adresszellen und # Größenzellen auf dem übergeordneten Knoten bestimmt.
#address-cells, #size-cells
Definiert durch Knoten mit untergeordnetem Knoten. Definiert, wie der untergeordnete Knoten angehängt wird. Hiermit wird festgelegt, wie die Adresse in den Bereichen der Hierarchie und der reg-Eigenschaft der untergeordneten Hierarchie angegeben wird.
Die Anzahl der Adresszellen in der reg-Eigenschaft des untergeordneten Knotens, normalerweise 1. 2, wenn Sie mehrere Busmaster haben (angegeben durch Busnummer und Adresse). Die 64-Bit-Adresse lautet 2.
Anzahl der Zellen in der reg-Eigenschaft des untergeordneten Knotens (normalerweise 1, 0, wenn kein Speicher zugeordnet ist)
ranges
Definieren Sie mit dem Knoten, der den Bus darstellt, und geben Sie die Adresskonvertierungsmethode zwischen Ihnen und dem untergeordneten Knoten an.
<Wert für untergeordnete Adresszellen, Wert für übergeordnete Adresszellen, Wert für untergeordnete Größenzellen>
Wenn es keinen Wert hat, bedeutet dies, dass sich der übergeordnete Knoten und der untergeordnete Knoten im selben Adressraum befinden.
#address-cells,Beispiel für die Verwendung von Renges
/{
....
sopc0: sopc@0 {
ranges;
/*
sopc@0 (Elternteil) und Brücke@Beziehung von 0xc0000000 (Kind)
sopc@0 und Brücke@0xc0000000 hat den gleichen Speicherplatz (keine Adressübersetzung).
*/
#address-cells = <1>;
#size-cells = <1>;
....
hps_0_bridges: bridge@0xc0000000 {
reg = <0xc0000000 0x20000000>,
<0xff200000 0x00200000>;
/*
bridge@0xc0000000 ist ein Speicherplatz von 0xc0000000 bis Größe 0x20000000,
Hat zwei Speicherbereiche mit einem Speicherplatz von 0xff200000 bis 0x00200000
*/
#address-cells = <2>;
#size-cells = <1>;
/*
bridge@Der untergeordnete Knoten von 0xc0000000 ist die Adresse-Zellen sind zwei 32-Bit-Zahlen, Größe-Die Zelle wird durch einen 32-Bit-Zahlenwert dargestellt.
*/
ranges = < 0x00000000 0x00000000 0xc0000000 0x00010000 >,
< 0x00000001 0x00020000 0xff220000 0x00000008 >,
< 0x00000001 0x00010040 0xff210040 0x00000020 >;
/*
Der Speicherbereich von 0xc0000000 bis Größe 0x00010000 ist die Adresse des untergeordneten Knotens.<0x00000000 0x00000000>Zugewiesen an Größe 0x00010000 von
Der Speicherbereich von 0xff220000 bis Größe 0x00000008 ist die Adresse des untergeordneten Knotens.<0x00000001 0x00020000>Zugewiesen an Größe 0x00000008 von
Der Speicherbereich von 0xff210040 bis Größe 0x00000020 ist die Adresse des untergeordneten Knotens.<0x00000001 0x00010040>Zuweisen zu Größe 0x00000020 von
(Andere Bereiche sind nicht untergeordneten Knoten zugeordnet).
*/
....
led_pio: gpio@0x100010040 {
compatible = "altr,pio-16.0", "altr,pio-1.0";
reg = <0x00000001 0x00010040 0x00000020>;
/*
gpio@0x10001004 ist<0x00000001 0x00010040>Ab Größe 0x00000020
Hat einen Speicherbereich, aber dies ist der übergeordnete Bereich(Oben) Größe von 0xff210040 des Knotens
Wird dem Speicherbereich 0x00000020 zugeordnet(0xff210040 von der CPU-Zugänglich in einem Bereich von 60).
*/
....
}; //end gpio@0x100010040 (led_pio)
....
}; //end bridge@0xc0000000 (hps_0_bridges)
};
};
In diesem Zusammenhang lesen Sie am besten die Kernel Source-Dokumentation. Schauen wir uns als Beispiel die Beschreibung eines Knotens mit den folgenden Interrupts an.
intc: intc@fffed000 {
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>;
interrupt-controller;
....
};
soc {
interrupt-parent = <&intc>;
....
i2c0: i2c@ffc04000 {
....
interrupts = <0 158 0x4>;
....
};
};
Im obigen Code besteht die Interrupts-Eigenschaft von i2c @ ffc04000 aus 3 Zellen, aber wie man herausfindet, was in diese 3 Zahlen geschrieben werden soll. Suchen Sie in der Datei im Verzeichnis Documentation / devicetree / bindings der Kernel Source nach "arm, cortex-a9-gic", einer kompatiblen Zeichenfolge von Interrupt-Controllern (Beispiel: find Documentation / devicetree / bindings -name" *. txt "| xargs grep" arm, cortex-a9-gic "
, git grep" arm, cortex-a9-gic "--Documentation / devicetree / bindings
, wenn Sie die Kernel-Quelle mit git gebracht haben). Dies trifft auf Dokumentation / Gerätebaum / Bindungen / Interrupt-Controller / Arm, gic.txt. Wenn Sie sich den Inhalt dieser Datei ansehen, wird # Interrupt-Zellen auf 3 gesetzt, und der Inhalt jeder ist
Es soll sein. <0 158 4> im obigen Code ist
Wenn Sie mehr über das Schreiben von .dts im Allgemeinen erfahren möchten, lesen Sie möglicherweise Documentation / devicetree / booting-without-of.txt im Ordner Documentation von Linux Source.
Als erforderlicher Knoten
- root node
- /cpus node
- /cpus/* nodes
- /memory node(s)
- /chosen node
- /soc
Das ist es.
https://elinux.org/Device_Tree_Usage https://elinux.org/Device_Tree_presentations_papers_articles https://devicetree-specification.readthedocs.io/ https://git.kernel.org/?p=/linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/devicetree https://www.nds-osk.co.jp/forum/freedownload/08/casestudy2/DeviceTree2.pdf
Recommended Posts