[LINUX] Développer la source devicetree pour faciliter la lecture

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

Qu'est-ce qu'une arborescence d'appareils

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.

Pourquoi lire dts

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.

Créez des dts faciles à lire en développant include

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.

Préparation

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

Découvrez comment gérer

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.

Créez des DTS faciles à lire

De là, faisons un dts facile à lire en se référant à la procédure que Linux est en train de faire.

Par le préprocesseur

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.

La fin

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

Développer la source devicetree pour faciliter la lecture
Conseils pour faciliter la lecture des documents d'audition Python
L'arrière-plan des caractères de l'image texte est surexposé pour faciliter la lecture.
Vous qui coloriez le journal pour le rendre plus facile à voir
Une doublure qui formate JSON pour le rendre plus facile à voir
J'ai écrit des commandes Django pour faciliter le débogage des tâches Celery
Facilitez le test des programmes qui fonctionnent avec les API avec vcrpy
Remarque: Améliorez les invites ennuyeuses pour les rendre plus faciles à lire. // Changement d'invite Linux
Rendre possible la lecture de .eml depuis un smartphone à l'aide d'un bot Discord
Machine de jugement de gorille, gorinator! !! J'ai essayé de le faire!
Faciliter l'utilisation de la fonction clic de SikuliX
J'ai lu "Comment créer un laboratoire de piratage"