[LINUX] Ich habe den Gerätebaum untersucht

1. Zuallererst

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.

2. Wer ist der Gerätebaum?

2.1 Herkunft

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.

2.2 Verwendung unter Linux

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.

2.3 Dateityp des Gerätebaums

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.

3. Grundlegendes zum Gerätebaum

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.

3.1 Übersicht über das dts-Dateiformat

** 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 ;

3.3.1 In Property verwendete Werttypen

--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>;

3.3.2 Standardeigenschaft, die häufig in vielen Knoten verwendet wird

#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)
    };
};

3.5 Andere Ergänzungen

4. Welche Art von Informationen soll in den Gerätebaum geschrieben werden?

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 node Es gibt viele Beschreibungen wie.

Das ist es.

5. Referenzmaterialien

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

Ich habe den Gerätebaum untersucht
Ich habe die Gerätebaumüberlagerung untersucht
Ich habe die Körner gezählt
Ich habe den Filterprozess von OpenCV untersucht
Ich habe das Argument class_weight von Chainers Funktion softmax_cross_entropy untersucht.
Ich habe die Datenzuordnung zwischen ArangoDB und Java untersucht
Ich habe vom Terminal getwittert!
Ich habe versucht, die Qiita-API zu berühren
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe die Python-Quelle heruntergeladen
Ich habe SHAPs Zeitung gelesen
Überprüfen Sie die Verwendung des Server-E / A-Geräts mit dem Linux-Befehl iostat
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe mich im Labyrinth verlaufen
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe die IoT-Plattform "Rimotte" installiert.
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe an der ISUCON10-Qualifikationsrunde teilgenommen!
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe versucht, das Wahrscheinlichkeitsintegral (I zu Integral) zu berechnen.
Ich habe untersucht, wie das Zielfernrohr aussieht
Ich mochte den Tweet mit Python. ..
Ich habe die Warteschlange in Python geschrieben
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe den Stack in Python geschrieben
Ich habe versucht, den Abschnitt zu schätzen.
Ich kenne den Wertfehler nicht
Ich habe den Betrag der Schenkungssteuer überprüft
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
[Python] Ich habe die exe-Konvertierungsmethode für die Verteilung von Business-Effizienz-Tools untersucht.