[LINUX] Erweitern Sie devicetree source include, um das Lesen zu vereinfachen

Frohes neues Jahr 2020.

Ich habe drei Tage lang die Gerätebaumquelle (dts) von Raspberry Pi 4 gelesen. Ich lese es immer noch, also werde ich Ihnen irgendwo einige Informationen darüber geben, aber dieses Mal werde ich die Tricks vorstellen, mit denen ich dts gelesen habe.

TL;DR

--dts mit # include lassen sich leichter durch cpp und dtc lesen

Was ist ein Gerätebaum?

devicetree (im Folgenden dt) beschreibt, wo und welches Gerät an eine bestimmte Hardware angeschlossen ist.

Unter Linux wird dt hauptsächlich verwendet, um die Konfiguration eines eingebetteten Computers mithilfe von ARM oder PowerPC zu kennen, und Raspberry Pi verwendet diesen dt auch, um dem Linux-Kernel die Konfiguration des Computers beizubringen.

Wie eine kompilierte Sprache kompiliert dt eine Gerätebaumquelle (im Folgenden dts), die in einem für Menschen lesbaren Format geschrieben ist, mit einem Gerätebaum-Compiler (im Folgenden dtc), um einen Gerätebaum-Blob (im Folgenden dtb) zu generieren und zu verwenden. Machen.

Beispielsweise wird im Linux-Kernel (ARM) die Adresse von dtb, die zuvor von einem Bootloader usw. in den Speicher geladen wurde, über ein Register empfangen, und das dtb im Speicher wird bezeichnet, um die Maschinenkonfiguration zu kennen.

Weitere Details zu dt finden Sie im Folgenden.

Warum dts lesen

Der im Raspberry Pi 4 installierte BCM2711 SoC weist verschiedene Unterschiede zwischen dem SoC und dem Raspberry Pi 3 auf, z. B. die Installation des GIC-400 im Interrupt-Controller.

Das Handbuch für Peripheriegeräte, in dem die im SoC installierten Peripheriegeräte und deren Handhabung erläutert werden, wurde jedoch noch nicht veröffentlicht (Stand Juli 2019: "Es ist fast fertig, aber es scheint, dass es mehrere Wochen dauern wird" Mitte Geschrieben von einer Person ist bis zum 6. Januar 2020 noch nicht erschienen) ..

Um so etwas wie eine Bare-Metal-Entwicklung durchzuführen, die Peripheriegeräte auf Raspberry Pi 4 direkt steuert, finden Sie sie daher in Linux-Kernelquelle für Raspberry Pi. Sie müssen sich die dts ansehen, um die Konfiguration der Peripheriegeräte und die zugeordnete Adresse des MMIO herauszufinden.

Erstellen Sie einfach zu lesende Daten, indem Sie include erweitern

Die dts für Raspberry Pi 4 werden unten veröffentlicht.

Die ersten Zeilen dieser dts-Datei sind unten angegeben.

#include "bcm2711.dtsi"
#include "bcm2711-rpi.dtsi"
#include "bcm283x-rpi-csi1-2lane.dtsi"

Wie Sie sehen können, verwendet bcm2711-rpi-4-b.dts die include-Anweisung, um mehrere dtsi-Dateien zu lesen.

Und das hier gelesene bcm2711.dtsi liest auch bcm2838.dtsi, das heißt, das Include ist verschachtelt, so dass es ein wenig mühsam ist, es so zu lesen, wie es ist.

Daher möchte ich eine dts-Datei zum Lesen mit dem im Voraus erweiterten Include erstellen.

Vorbereitung

Bringen Sie den Linux-Kernel für Raspberry Pi von git und gehen Sie in dieses Verzeichnis.

$ git clone --depth=1 https://github.com/raspberrypi/linux raspberrypi_linux
$ cd raspberrypi_linux

Finden Sie heraus, wie Sie mit include umgehen können

In dtc, das beim Setzen von dts auf dtb verwendet wird, ist es möglich, dts mit dts als Eingabe auszugeben. Daher dachte ich: "Wenn Sie dtc durchlaufen, sollte include ordnungsgemäß verarbeitet werden und Sie sollten dts erhalten, die leicht zu lesen sind ...", aber wenn ich versuche, es auszuführen, erscheint der folgende Fehler und es funktioniert nicht.

$ dtc -I dts -O dts -o readable.dts arch/arm/boot/dts/bcm2711-rpi-4-b.dts 
Error: arch/arm/boot/dts/bcm2711-rpi-4-b.dts:3.1-9 syntax error
FATAL ERROR: Unable to parse input tree

Informationen zur Ursache finden Sie unter Devicetree Specification Release v0.2. "6.1 Compiler-Direktiven" besagt, dass in dts enthaltenes Format im folgenden Format erfolgen sollte.

/include/ "FILE"

Andererseits scheint dtc in bcm2711-rpi-4-b.dts einen Fehler ausgegeben zu haben, da er nicht in dem in der Gerätebaumspezifikation beschriebenen Format enthalten ist.

Aus den bisherigen Untersuchungsergebnissen sollte hervorgehen, dass die include-Anweisung von bcm2711-rpi-4-b.dts dts nicht kompilieren kann. Aber warum kompiliert dts unter Linux?

Suchen Sie die dtb-Build-Regeln aus dem Linux-Quellcode nach scripts / Makefile.lib. Aus Makefile.lib # L287) wurde herausgefunden, dass dts unter Linux den C-Präprozessor durchläuft, bevor es mit dtk kompiliert wird. Der relevante Teil von scripts / Makefile.lib wird unten zitiert.

cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
	$(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
	$(DTC) -O dtb -o $@ -b 0 \
		$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
		-d $(depfile).dtc.tmp $(dtc-tmp) ; \
	cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)

Unter Bezugnahme auf diese Regel scheint es daher einfach zu lesende dts zu erhalten, indem dts mit geeigneten Optionen durch den Präprozessor geleitet und dann mit dtc kompiliert werden.

Machen Sie einfach zu lesende dts

Lassen Sie uns von hier aus ein einfach zu lesendes DTS erstellen, indem wir uns auf das Verfahren beziehen, das Linux ausführt.

Durch den Präprozessor

Führen Sie den Präprozessor wie folgt durch den Präprozessor, um include zu verarbeiten.

cpp -nostdinc -undef -D__DTS__ -x assembler-with-cpp \
  -I./scripts/dtc/include-prefixes \
  ./arch/arm/boot/dts/bcm2711-rpi-4-b.dts \
  -o ~/bcm2711-rpi-4-b_readable.dts

dtc

Es ist schwierig zu lesen, da der Präprozessor viele Kommentare anfügt, indem er sie einfach durch den Präprozessor leitet. Kompilieren Sie sie daher mit dtc, um das Lesen zu erleichtern.

dtc -I dts -O dts -o ~/bcm2711-rpi-4-b_readable.dts ~/bcm2711-rpi-4-b_readable.dts

Es gibt viele Warnungen, aber wenn es keine Fehler gibt, sollte es dts geben, die in ~ / bcm2711-rpi-4-b_readable.dts leichter zu lesen sind.

Das Ende

Damit ist die Einführung abgeschlossen, wie ein einfach zu lesendes dts erstellt werden kann, das erweitert.

Wenn ich die dts von Raspberry Pi 4 lese,

"Der Anfang der Kompatibilität von gpio ist bcm2711-gpio, aber da auch bcm2835-gpio enthalten ist, scheint der Code für RasPi3 dank der Kompatibilität zu funktionieren. Aber was ist neu? Treiber. Ich muss lesen ... "

Es macht Spaß, solche Dinge zu entdecken und darüber nachzudenken.

Ich hoffe, Sie können diesen Spaß mit den Leuten teilen, die diesen Artikel lesen.

Recommended Posts

Erweitern Sie devicetree source include, um das Lesen zu vereinfachen
Tipps, um das Lesen von Python-Hördokumenten zu vereinfachen
Der Hintergrund der Zeichen im Textbild ist überbelichtet, um das Lesen zu erleichtern.
Sie, die das Protokoll ausmalen, um es besser sehen zu können
Ein Liner, der JSON formatiert, um die Anzeige zu vereinfachen
Ich habe Django-Befehle geschrieben, um das Debuggen von Sellerie-Aufgaben zu vereinfachen
Erleichtern Sie das Testen von Programmen, die mit APIs mit vcrpy arbeiten
Hinweis: Verbesserte nervige Eingabeaufforderungen, um das Lesen zu erleichtern. // Linux-Eingabeaufforderung ändern
Verwenden Sie Discord Bot, um .eml von Ihrem Smartphone zu lesen
Gorilla-Urteilsmaschine, Gorinator! !! Versucht es zu schaffen!
Vereinfachen Sie die Verwendung der Klickfunktion von SikuliX
Ich las "Wie man ein Hacking Lab macht"