Je vais lancer un Linux sur ma carte de développement, et j'ai besoin d'un fichier dts (fichier d'arborescence de périphériques) pour décrire l'ensemble du matériel. Mais je ne connais que très peu la syntaxe de ce fichier qui ne suffit pas pour faire fonctionner Linux correctement sur la carte.
Ce que je sais maintenant, c'est seulement comment décrire le numéro d'interruption d'une unité, la fréquence, l'adresse, l'unité parentale et son type de pilote compatible (comme décrit ci-dessous):
ps7_scuwdt_0: ps7-scuwdt@f8f00620 {
compatible = "xlnx,ps7-scuwdt-1.00.a";
device_type = "watchdog";
interrupt-parent = <&ps7_scugic_0>;
interrupts = < 1 14 769 >;
reg = < 0xf8f00620 0xe0 >;
} ;
Une autre utilisation ou grammaire avancée ne m'est pas familière.
Jetez un œil aux dts de la planche qui ressemble le plus à votre dev-board. Utilisez-le comme référence et modifiez les dts en fonction des différences entre le tableau de référence et votre tableau de développement.
Vérifiez également les éléments suivants:
- Projet de documentation de l'arborescence des périphériques sur eLinux (possède une vaste collection de liens pour commencer la lecture).
- Série d'articles sur les bases de l'arborescence des appareils.
- Procédure pas à pas de migration vers l'arborescence des périphériques.
Minimal reg
+ interrupt
exemple avec périphérique virtuel QEMU
Notre exemple ajoutera le nœud d'arborescence de périphériques suivant à l'arborescence de périphériques versatilepb
que QEMU utilisera en raison de -M versatilepb
:
lkmc_platform_device@101e9000 {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
Ensuite, en utilisant un module de noyau Linux pour interagir avec l'appareil, nous testerons les fonctionnalités DTS:
Ce sont les principaux composants de l'exemple:
.dts
patch sur Linux forkreg
et interrupt
correspondent à des numéros codés en dur dans la machine polyvalente QEMU (qui représente le SoC)compatible
correspond à platform_driver.name
dans le module du noyau, et informe le noyau du module qui gérera ce périphériquelkmc-asdf = <0x12345678>;
, qui se lit avec of_property_read_u32
-dtb
argument-M versatilepb
Les arborescences de périphériques ont beaucoup plus de fonctionnalités que nous n'avons pas couvertes, mais cet exemple devrait vous aider à démarrer et vous permettre facilement de jouer avec les nouvelles fonctionnalités qui arrivent.
Autres ressources:
dtc
pour des questions purement syntaxiques. Par exemple, il montre comment les nœuds sont simplement fusionnés par chemin: https://unix.stackexchange.com/a/375923/32558Prenons un exemple et je vais expliquer chacun d'eux comme ci-dessous
auart0: serial@8006a000 {
compatible = "fsl,imx28-auart", "fsl,imx23-auart";
reg = <0x8006a000 0x2000>;
interrupts = <112>;
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
dma-names = "rx", "tx";
};
Propriétés requises:
- compatible: Devrait être "fsl, -auart". Les SoC pris en charge incluent imx23 et imx28.
- reg: adresse et longueur du registre défini pour le périphérique
- interruptions: doit contenir les numéros d'interruption auart
- dmas: DMA spécificateur, composé d'un phandle vers DMA nœud de contrôleur et AUART DMA canal ID.
- noms-dma: "rx" pour le canal RX, "tx" pour le canal TX.
Remarque: Chaque port auart doit avoir un alias correctement numéroté dans le nœud "alias".
Pour plus de propriétés avancées, veuillez consulter ce lien, il est très utile
Explication de l'arborescence des périphériques
J'espère que ça aide!
Complémentaire aux autres réponses:
Gardez à l'esprit qu'il y a aussi une section pour les devicetrees dans la source officielle du noyau sous root/Documentation/devicetree
( https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree?h=v5.2-rc5 ) .