Bonne année 2020.
J'ai lu la source de l'arborescence des appareils (dts) de Raspberry Pi 4 pendant trois jours. Je suis toujours en train de le lire, donc je vais vous donner quelques informations à ce sujet quelque part, mais cette fois je vais vous présenter les astuces que j'ai utilisées pour lire dts.
TL;DR
--dts avec # include
sera plus facile à lire via cpp et dtc
devicetree (ci-après dt) décrit où et quel périphérique est connecté à un matériel particulier.
Sous Linux, dt est principalement utilisé pour connaître la configuration de la machine embarquée en utilisant ARM ou PowerPC, et Raspberry Pi utilise également ce dt pour enseigner au noyau Linux la configuration de la machine.
Comme un langage compilé, dt compile une source devicetree (ci-après dts) écrite dans un format lisible par l'homme avec un compilateur devicetree (ci-après dtc) pour générer et utiliser un objet blob devicetree (ci-après dtb). Faire.
Par exemple, dans le noyau Linux (ARM), l'adresse de dtb chargée en mémoire à l'avance par un chargeur de démarrage, etc. est reçue via un registre, et la dtb en mémoire est appelée pour connaître la configuration de la machine.
Pour plus de détails sur dt, reportez-vous à ce qui suit.
Le SoC BCM2711 installé dans le Raspberry Pi 4 présente plusieurs différences entre le SoC et le Raspberry Pi 3, comme l'installation du GIC-400 dans le contrôleur d'interruption.
Cependant, le manuel des périphériques qui explique les périphériques installés dans le SoC et comment les gérer n'a pas encore été publié (en juillet 2019, il est presque terminé, mais il semble que cela prendra plusieurs semaines. Écrit par une personne](https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=244479&sid=3752ded6249ea465c13b398289b2464b#p1491246) n'est pas encore paru au 6 janvier 2020) ..
Par conséquent, afin de faire quelque chose comme le développement bare metal qui contrôle directement les périphériques sur Raspberry Pi 4, vous pouvez le trouver dans Linux Kernel Source pour Raspberry Pi. Vous devez regarder le dts pour connaître la configuration des périphériques et l'adresse mappée du MMIO.
Les dts pour Raspberry Pi 4 sont publiés ci-dessous.
Les premières lignes de ce fichier dts sont citées ci-dessous.
#include "bcm2711.dtsi"
#include "bcm2711-rpi.dtsi"
#include "bcm283x-rpi-csi1-2lane.dtsi"
Comme vous pouvez le voir, bcm2711-rpi-4-b.dts utilise l'instruction include pour lire plusieurs fichiers dtsi.
Et le bcm2711.dtsi lu ici lit également bcm2838.dtsi, c'est-à-dire que l'inclusion est imbriquée, il est donc un peu gênant de le lire tel quel.
Par conséquent, je voudrais créer un fichier dts pour la lecture avec l'inclusion développée à l'avance.
Apportez le noyau Linux pour Raspberry Pi de git et accédez à ce répertoire.
$ git clone --depth=1 https://github.com/raspberrypi/linux raspberrypi_linux
$ cd raspberrypi_linux
Dans dtc utilisé lors de la définition de dts sur dtb, il est possible de sortir dts avec dts comme entrée. Par conséquent, j'ai pensé: "Si vous passez par dtc, include devrait être traité correctement et vous devriez obtenir des dts faciles à lire ...", mais lorsque j'essaye de l'exécuter, l'erreur suivante apparaît et cela ne fonctionne pas.
$ 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
Voir Devicetree Specification Release v0.2 pour trouver la cause. , "6.1 Directives du compilateur" indique que l'inclusion dans dts doit être effectuée dans le format suivant.
/include/ "FILE"
En revanche, dans bcm2711-rpi-4-b.dts, dtc semble avoir émis une erreur car il n'est pas inclus dans le format décrit dans la spécification de l'arborescence des périphériques.
D'après les résultats de l'enquête jusqu'à présent, il devrait être correct que l'instruction include de bcm2711-rpi-4-b.dts ne peut pas compiler dts. Mais pourquoi dts compile-t-il sous Linux?
Recherche des règles de construction dtb à partir du code source Linux pour la raison, [scripts / Makefile.lib](https://github.com/raspberrypi/linux/blob/rpi-4.19.y/scripts/ De Makefile.lib # L287), il a été trouvé que sous Linux, dts est passé par le préprocesseur C avant d'être compilé avec dtk. La partie pertinente de scripts / Makefile.lib est citée ci-dessous.
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)
Par conséquent, en se référant à cette règle, il semble que des dts faciles à lire puissent être obtenus en passant dts à travers le préprocesseur avec les options appropriées, puis en les compilant avec dtc.
De là, faisons un dts facile à lire en se référant à la procédure que Linux est en train de faire.
Passez le préprocesseur à travers le préprocesseur comme suit pour traiter l'inclusion.
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
Il est difficile à lire car il y a beaucoup de commentaires attachés par le préprocesseur simplement en le passant par le préprocesseur, donc compilez-le avec dtc pour le rendre plus facile à lire.
dtc -I dts -O dts -o ~/bcm2711-rpi-4-b_readable.dts ~/bcm2711-rpi-4-b_readable.dts
Il y a beaucoup d'avertissements, mais s'il n'y a pas d'erreurs, il devrait y avoir des dts plus faciles à lire dans ~ / bcm2711-rpi-4-b_readable.dts
.
Ceci conclut l'introduction de la façon de créer un dts facile à lire qui se développe include.
Quand j'ai lu les dts de Raspberry Pi 4,
«Le début de la compatibilité de gpio est bcm2711-gpio, mais comme bcm2835-gpio est également inclus, le code pour RasPi3 semble fonctionner grâce à la compatibilité. Mais quoi de neuf? Pilote. Je dois lire ... "
C'est amusant de découvrir et de penser à des choses comme ça.
J'espère que vous pourrez partager ce plaisir avec les personnes qui liront cet article.
Recommended Posts