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
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.
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.
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.
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
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.
Lassen Sie uns von hier aus ein einfach zu lesendes DTS erstellen, indem wir uns auf das Verfahren beziehen, das Linux ausführt.
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.
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