Sehen Sie sich die dts des Boards an, das Ihrem Dev-Board am ähnlichsten ist. Verwenden Sie dies als Referenz und nehmen Sie Änderungen an den dts entsprechend den Unterschieden zwischen dem Referenzboard und Ihrem Entwicklungsboard vor.
Überprüfen Sie auch Folgendes:
- Gerätebaum-Dokumentationsprojekt bei eLinux (hat eine riesige Sammlung von Links, um mit dem Lesen zu beginnen).
- Artikelserie zu den Grundlagen des Gerätebaums.
- Exemplarische Vorgehensweise für die Migration zum Gerätebaum.
Minimum reg
+ interrupt
Beispiel mit dem virtuellen QEMU-Gerät
Unser Beispiel fügt den folgenden Gerätebaumknoten zu versatilepb
hinzu Gerätebaum, den QEMU aufgrund von -M versatilepb
verwenden wird :
[email protected] {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
Dann testen wir die folgenden DTS-Funktionen, indem wir ein Linux-Kernel-Modul verwenden, um mit dem Gerät zu interagieren:
- registriert Adressen
- IRQs
- benutzerdefinierte Eigenschaften aus dem Treiber lesen
Dies sind die Hauptkomponenten des Beispiels:
- Linux vielseitig
.dts
Patch auf Linux-Forkreg
undinterrupt
Übereinstimmungsnummern, die in der vielseitigen QEMU-Maschine (die das SoC darstellt) fest codiert sindcompatible
entspricht demplatform_driver.name
im Kernel-Modul und teilt dem Kernel mit, welches Modul dieses Gerät handhaben wird- Wir übergeben auch eine benutzerdefinierte Eigenschaft an den Treiber:
lkmc-asdf = <0x12345678>;
, die mitof_property_read_u32
gelesen wird - Der Gerätebaum wird mit dem
-dtb
an die Firmware von QEMU übergeben Argument
- QEMU-Fork:
- Gerät, das ein Register liest und Interrupts generiert
- Gerät in
-M versatilepb
einsetzen
- Kernel-Modul Schreibt bei Sonde in den Speicher, um Dinge zu testen, was auch einen IRQ generiert.
Gerätebäume haben viele weitere Funktionen, die wir nicht behandelt haben, aber dieses Beispiel sollte Ihnen den Einstieg erleichtern und es Ihnen ermöglichen, leicht mit neuen Funktionen herumzuspielen, die auftauchen.
Weitere Ressourcen:
- unverzichtbares Elinux-Tutorial:http://elinux.org/Device_Tree_Usage
- Spielen Sie mit
dtc
herum bei rein syntaktischen Fragen. Beispielsweise zeigt es, wie Knoten einfach nach Pfad zusammengeführt werden:https://unix.stackexchange.com/a/375923/32558 - https://unix.stackexchange.com/questions/118683/what-is-a-device-tree-and-a-device-tree-blob
Nehmen wir ein Beispiel und ich werde jedes davon wie folgt erklären
auart0: [email protected] {
compatible = "fsl,imx28-auart", "fsl,imx23-auart";
reg = <0x8006a000 0x2000>;
interrupts = <112>;
dmas = <&dma_apbx 8>, <&dma_apbx 9>;
dma-names = "rx", "tx";
};
Erforderliche Eigenschaften:
- compatible :Sollte "fsl,-auart" sein. Zu den unterstützten SoCs gehören imx23 und imx28.
- reg :Adresse und Länge des Registersatzes für das Gerät
- interrupts :Sollte die auart-Interrupt-Nummern enthalten
- dmas:DMA-Spezifizierer, bestehend aus einem Phandle zum DMA-Controller-Knoten und einer AUART-DMA-Kanal-ID.
- DMA-Namen:"rx" für RX-Kanal, "tx" für TX-Kanal.
Hinweis:Jeder auart-Port sollte einen korrekt nummerierten Alias im "aliases"-Knoten haben.
Für weitere fortgeschrittene Eigenschaften gehen Sie bitte zu diesem Link, es ist sehr nützlich
Erläuterung des Gerätebaums
Hoffe es hilft!