[LINUX] J'ai examiné l'arborescence des appareils

1.Tout d'abord

Lors de l'exécution d'un FPGA avec un processeur ARM sous Linux, il est devenu nécessaire de modifier quelque chose appelé une arborescence de périphériques. Par conséquent, j'aimerais écrire sur ce que j'ai étudié (j'ai compris) afin de pouvoir comprendre approximativement le contenu de la source de l'arborescence des périphériques (.dts) incluse dans la source du noyau. J'espère que le contenu donnera aux gens qui regardent le fichier .dts dans la source du noyau et pensent «ce qui ne va pas» qu'ils peuvent le comprendre et apporter des corrections supplémentaires.

2. Qui est l'arborescence des appareils

2.1 Origine

L'arborescence des périphériques peut être considérée comme une structure de données (format de fichier) qui décrit les composants matériels accessibles depuis le système d'exploitation (CPU) du point de vue du logiciel (pilote de périphérique). Ce format a été développé par un groupe appelé Open Firmware (un groupe distinct du groupe de développement Linux).

2.2 Comment utiliser sous Linux

Ce format est également utilisé sous Linux, et le code du noyau et les informations pour chaque carte (c'est-à-dire l'arborescence des périphériques) sont séparés et exploités. En conséquence, si une arborescence de périphériques est préparée pour la carte, il est possible d'opérer sur différentes cartes tout en gardant le binaire du noyau commun. La source du noyau a un fichier source de l'arborescence des périphériques (.dts) pour les principales cartes prises en charge, et le binaire de l'arborescence des périphériques se trouve sur le système Makefile ainsi que la construction du binaire du noyau (par exemple make zImage). Il peut être généré (par exemple «make dt bs»). À propos, au moment de la rédaction de cet article (mai 2020), l'arborescence des sources du noyau Linux de Kernel.org d'origine enregistrait plus de 1200 fichiers .dts uniquement pour les processeurs ARM 32 bits. Le code du noyau (chaque pilote de périphérique) recherche dans l'arborescence des périphériques les informations dont vous avez besoin au moment de l'initialisation, et termine l'enregistrement et l'initialisation du périphérique en fonction de ces informations. Par conséquent, il peut y avoir des situations où le noyau ne démarrera pas à moins que les informations requises par le code du noyau ne soient décrites dans l'arborescence des périphériques, donc en principe, le binaire du noyau et l'arborescence des périphériques doivent être créés à partir de la même version de la source du noyau. Je vais.

2.3 Type de fichier de l'arborescence des périphériques

Écrit dans un format de texte lisible par l'homme est appelé une source d'arborescence de périphériques et a une extension .dts. Le fichier converti au format binaire est appelé un objet blob d'arborescence de périphériques et a une extension .dtb. Le noyau lit un objet blob d'arborescence de périphériques (.dtb) au format binaire. Le compilateur d'arborescence de périphériques (commande dtc) est utilisé pour convertir la source de l'arborescence de périphériques en blob de l'arborescence de périphériques. Le compilateur de l'arborescence des périphériques a la possibilité de faire la conversion inverse .dtb-> .dts ainsi que .dts-> .dtb, que vous pouvez utiliser si vous voulez voir le contenu du binaire .dtb.

3. Comprendre l'arborescence des appareils

Comprendre l'arborescence des périphériques sous Linux (bien que l'introduction ait été allongée) --Format de l'arborescence des périphériques (comment écrire)

Je pense qu'il est bon de le comprendre en le divisant en deux parties. Ici, nous allons nous concentrer sur «l'écriture (format) de l'arborescence des périphériques». Les informations à écrire dans l'arborescence des périphériques dépendent des informations dont le pilote de périphérique Linux a besoin. À la fin de cet article, je vais vous donner une brève introduction.

3.1 Vue d'ensemble du format de fichier dts

** À propos du fichier dts, **

est. Pour plus de détails, veuillez consulter le lien ci-dessous. https://elinux.org/Device_Tree_Usage

3.2 Node

format de nœud


	[label:] node-name[@unit-address] {
		[properties definitions]
		[child nodes]
	}

--device est représenté comme un nœud --node a une propriété et un nœud (nœud enfant)

--node name Définit le nom au format @ unit-address, et définit le contenu du nœud dans le crochet central suivant {} --La partie adresse-unité décrit l'adresse spécifiée par la propriété reg en hexadécimal. Même s'il existe plusieurs périphériques avec le même nom de nœud, ils peuvent être distingués par des adresses d'unité. L'adresse d'unité n'est pas requise pour les nœuds qui n'ont pas de propriété reg. Linux dtc peut être compilé sans adresse d'unité (bien qu'un avertissement apparaisse)

3.3 Property --property est une combinaison de property-name = value --Il n'y a peut-être aucune valeur

[label:] property-name = value; [label:] property-name ;

3.3.1 Types de valeur utilisés dans la propriété

--Text String: Entourer entre guillemets compatibles = " arm, cortex-a9 "; --Array / Cell-list: Un ensemble d'entiers non signés 32 bits séparés par des crochets angulaires <> reg = <0xffd04000 0x1000>; --Données binaires: séparées par des crochets [] mac-address = [12 34 56 ab cd ef]; --Données multiples: peuvent être concaténées en utilisant la virgule reg = <0xff900000 0x100000>, <0xffb80000 0x10000>; mixed-property ="a string", [0x01 0x23 0x45 0x67], <0x12345678>;

3.3.2 Propriété standard couramment utilisée dans de nombreux nœuds

#address-cells,Exemple d'utilisation de renges


/{
    ....
	sopc0: sopc@0 {
		ranges;
/*
sopc@0 (Parent) et bridge@Relation de 0xc0000000 (enfant)
sopc@0 et pont@0xc0000000 a le même espace mémoire (pas de traduction d'adresse).
*/
		#address-cells = <1>;
		#size-cells = <1>;
		....
		hps_0_bridges: bridge@0xc0000000 {
			reg = <0xc0000000 0x20000000>,
			         <0xff200000 0x00200000>;
/*
bridge@0xc0000000 est un espace mémoire de 0xc0000000 à la taille 0x20000000,
Dispose de deux zones de mémoire avec un espace mémoire de 0xff200000 à 0x00200000
*/
			#address-cells = <2>;
			#size-cells = <1>;
/*
bridge@Le nœud enfant de 0xc0000000 est l'adresse-les cellules sont deux nombres de 32 bits, taille-la cellule est représentée par une valeur numérique de 32 bits.
*/
			ranges = 	< 0x00000000 0x00000000 0xc0000000 0x00010000 >,
					< 0x00000001 0x00020000 0xff220000 0x00000008 >,
					< 0x00000001 0x00010040 0xff210040 0x00000020 >;
/*
La zone de mémoire de 0xc0000000 à la taille 0x00010000 est l'adresse du nœud enfant.<0x00000000 0x00000000>Attribué à la taille 0x00010000 à partir de
La zone de mémoire de 0xff220000 à la taille 0x00000008 est l'adresse du nœud enfant.<0x00000001 0x00020000>Attribué à la taille 0x00000008 à partir de
La zone de mémoire de 0xff210040 à la taille 0x00000020 est l'adresse du nœud enfant.<0x00000001 0x00010040>Attribuer à la taille 0x00000020 à partir de
(Les autres zones ne sont pas allouées aux nœuds enfants).
*/			

			....
			led_pio: gpio@0x100010040 {
				compatible = "altr,pio-16.0", "altr,pio-1.0";
				reg = <0x00000001 0x00010040 0x00000020>;
/*
gpio@0x10001004 est<0x00000001 0x00010040>À partir de la taille 0x00000020
A une zone de mémoire, mais c'est le parent(Upper) Taille de 0xff210040 du nœud
Correspond à la zone de mémoire 0x00000020(0xff210040 du CPU-Accessible dans une gamme de 60).
*/
				....
			}; //end gpio@0x100010040 (led_pio)
			....
		}; //end bridge@0xc0000000 (hps_0_bridges)
    };
};

3.5 Autres suppléments

4. Quel type d'informations écrire dans l'arborescence des périphériques

À cet égard, il est préférable de lire la documentation Kernel Source. À titre d'exemple, jetons un coup d'œil à la description d'un nœud qui a les interruptions suivantes.

intc: intc@fffed000 {
    compatible = "arm,cortex-a9-gic";
    #interrupt-cells = <3>;
    interrupt-controller;
    ....
};
soc {
  interrupt-parent = <&intc>;
     ....
    i2c0: i2c@ffc04000 {
	    ....
	    interrupts = <0 158 0x4>;
	    ....
    };
};

Dans le code ci-dessus, la propriété interruptions de i2c @ ffc04000 se compose de 3 cellules, mais comment savoir quoi écrire dans ces 3 nombres. Recherchez "arm, cortex-a9-gic", qui est une chaîne compatible d'interruption-controller, dans le fichier sous le répertoire Documentation / devicetree / bindings de Kernel Source (exemple: find Documentation / devicetree / bindings -name" *. txt "| xargs grep" arm, cortex-a9-gic ", git grep" arm, cortex-a9-gic "--Documentation / devicetree / bindings si vous avez apporté la source du noyau avec git). Cela va frapper Documentation / devicetree / bindings / interrupt-controller / arm, gic.txt. En regardant le contenu de ce fichier, # interrupt-cells est défini sur 3 et le contenu de chacun est

Il est déclaré être. <0 158 4> dans le code ci-dessus est

Aussi, si vous voulez en savoir plus sur la façon d'écrire .dts en général, vous pouvez lire Documentation / devicetree / booting-without-of.txt dans le dossier Documentation de Linux Source. En tant que nœud obligatoire - root node - /cpus node - /cpus/* nodes - /memory node(s) - /chosen node - /soc node Il existe de nombreuses descriptions telles que.

C'est tout.

5. Documents de référence

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

J'ai examiné l'arborescence des appareils
J'ai étudié la superposition de l'arborescence des appareils
J'ai compté les grains
J'ai examiné le processus de filtrage d'OpenCV
J'ai examiné l'argument class_weight de la fonction softmax_cross_entropy de Chainer.
J'ai examiné le mappage de données entre ArangoDB et Java
J'ai tweeté depuis le terminal!
J'ai essayé de toucher l'API Qiita
J'ai essayé la bibliothèque changefinder!
J'ai téléchargé la source python
J'ai lu l'article de SHAP
Vérifiez l'utilisation du périphérique d'E / S du serveur avec la commande Linux iostat
J'ai essayé le tutoriel TensorFlow 1er
Je me suis perdu dans le labyrinthe
J'ai essayé le roman Naro API 2
J'ai installé la plateforme IoT "Rimotte"
J'ai étudié le mécanisme de connexion flask!
J'ai participé au tour de qualification ISUCON10!
J'ai essayé le tutoriel TensorFlow 2ème
J'ai essayé de calculer l'intégrale de probabilité (I à l'intégrale)
J'ai étudié à quoi ressemble la lunette
J'ai aimé le tweet avec python. ..
J'ai écrit la file d'attente en Python
J'ai essayé l'API du roman Naruro
J'ai essayé de déplacer le ballon
J'ai essayé d'utiliser l'API checkio
J'ai écrit la pile en Python
J'ai essayé d'estimer la section.
Je ne connais pas l'erreur de valeur
J'ai vérifié le montant de la taxe sur les cadeaux
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
[Python] J'ai examiné la méthode de conversion exe pour distribuer des outils d'efficacité commerciale.