Einleitung
Nach der Entwicklung eines kundenspezifischen Carrier-Boards für ein Variscite System on Module besteht eine der ersten Softwareaufgaben darin, den Linux-Kernel zu unterstützen. Dafür sind folgende Schritte zu erledigen:
- Hinzufügen eines neuen Gerätebaums zum Linux-Kernel
- Hinzufügen von Geräten zum Gerätebaum
- Aktivieren von Treibern in der Kernel-Konfiguration für jedes Gerät
Diese Anleitung zeigt, wie Sie neue Gerätebaumdateien hinzufügen und neue Geräte im Gerätebaum konfigurieren. Bitte besuchen Sie die Variscite Kernel Konfigurationshandbuch, um zu erfahren, wie Sie Treiber in der Kernel-Konfiguration aktivieren können.
Was ist ein Gerätebaum?
Der Gerätebaum ist eine Knotenstruktur, die die Systemhardware für den Linux-Kernel beschreibt. Während des Bootvorgangs lädt U-Boot den Gerätebaum aus dem Dateisystem in den Speicher. Der Linux-Kernel analysiert dann den Gerätebaum zur Laufzeit und ruft schließlich die Probefunktion für jeden Treiber auf.
Der Gerätebaum enthält nur Geräte, die nicht automatisch erkannt werden können. So muss beispielsweise der Gerätebaum die SoC-USB-Controller definieren, aber der Kernel kann USB-Geräte während der Laufzeit erkennen.
Variscite Gerätebaumdateien
Die Variscite i.MX8-Gerätebaumdateien befinden sich im Verzeichnis arch/arm64/boot/dts/freescale im Linux-Quellbaum und werden aus einer Kombination von NXP SoC-, Variscite SoM- und Variscite Carrier-Board-Dateien erstellt. Jedes Carrier-Board sollte einen eigenen Gerätebaum haben, der den entsprechenden SoM-Gerätebaum von Variscite enthält. Abbildung 1 unten zeigt ein Beispiel für die Gerätebaumdateien für die Evaluierungskits VAR-SOM-MX8M-MINI und DART-MX8M-MINI von Variscite:
arch/arm64/boot/dts/freescale/
…
imx8mm.dtsi
…
imx8mm-var-dart.dtsi
imx8mm-var-dart-dt8mcustomboard.dts
…
imx8mm-var-som.dtsi
imx8mm-var-som-symphony.dts
Abbildung 1: Beispielhafte SoC-, SoM- und Carrier-Board-Gerätebaumdateien für Variscite VAR-SOM-MX8M-MINI und DART-MX8M-MINI-Bewertungs-Kits.
Hinzufügen neuer Gerätebaumdateien
Am besten erstellen Sie einen neuen Gerätebaum für Ihr benutzerdefiniertes Carrier-Board. Es ist zwar möglich, den Gerätebaum von Variscite direkt zu ändern, aber das erschwert die Portierung Ihrer Änderungen auf neuere Linux-Versionen, da es wahrscheinlich zu Konflikten bei der Zusammenführung kommen wird. Für die Erstellung neuer Gerätebaumdateien gibt es zwei Möglichkeiten:
1. Binden Sie den SoM-Level-Gerätebaum von Variscite ein und fügen Sie alle erforderlichen Knoten hinzu. Dieser Ansatz ist am besten geeignet, wenn sich Ihr Carrier-Board erheblich von dem Evalierungskit von Variscite unterscheidet. Zum Beispiel:
arch/arm64/boot/dts/freescale/imx8mm-var-som-customer.dts
/dts-v1/;
#include „imx8mm-var-som.dtsi“
…
2. Binden Sie den EVK-Gerätebaum von Variscite ein und erweitern Sie ihn, um Geräte für Ihr Carrier-Board hinzuzufügen und zu entfernen. Dieser Ansatz ist am besten, wenn Ihr Carrier-Board dem EVK von Variscite ähnelt. Zum Beispiel:
arch/arm64/boot/dts/freescale/imx8mm-var-som-customer.dts
/dts-v1/;
#include „imx8mm-var-som-symphony.dts“
…
Als Nächstes fügen Sie den neuen Gerätebaum zum Makefile hinzu, damit er vom Make-Target ‚dtbs‘ gebaut wird:
arch/arm64/boot/dts/freescale/Makefile
dtb-$(CONFIG_ARCH_MXC) += imx8mm-var-som-customer.dtb
Hinzufügen neuer Geräte
Im Folgenden finden Sie eine allgemeine Anleitung zum Hinzufügen neuer Geräteknoten zum Gerätebaum:
1. Gerätebaumbindungen finden
Wenn Sie neue Geräteknoten hinzufügen, ist die erste Ressource, die Sie verwenden sollten, die Gerätebaumbindungen in der Kernel-Dokumentation. Die vom Kernel erkannten Gerätebaumbindungen sind in Documentation/devicetree/bindings dokumentiert.
Eine Möglichkeit, die Gerätebaumbindungen für Ihr Gerät zu finden, besteht darin, den Ordner Documentation für das Gerätemodell zu durchsuchen. Das folgende Beispiel zeigt, wie Sie die Dokumentation für die Echtzeituhr DS1337 finden, die in einigen Variscite-Evalierungskits verwendet wird:
linux-imx$ grep ds1337 -lr ./Documentation/
./Documentation/devicetree/bindings/rtc/rtc-ds1307.txt
2. Geräteknoten zum Gerätebaum hinzufügen
Als Nächstes fügen Sie mithilfe der Bindungsdokumentation einen neuen Knoten zu Ihrem Gerätebaum hinzu. Die Dokumentation der Gerätebaumbindung enthält eine Gerätebeschreibung, die erforderlichen und optionalen Eigenschaften und einen Beispiel-Geräteknoten.
Hier ist zum Beispiel die Dokumentation für die Echtzeituhr DS1337 (aus dem Kernel-Zweig 5.4-2.3.x-imx_var01):
https://github.com/varigit/linux-imx/blob/5.4-2.3.x-imx_var01/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt
Es kann auch hilfreich sein, den kompatiblen String in arch/arm64/boot/dts nach Beispielknoten auf ähnlichen Plattformen zu suchen.
3. Erstellen, Installieren und Testen des neuen Gerätebaums
Nachdem Sie die neuen Geräteknoten hinzugefügt haben, testen Sie das neue Gerät, indem Sie den Gerätebaum neu aufbauen und auf dem Zielgerät bereitstellen. Richten Sie zunächst Ihre Umgebung mithilfe des von Yocto bereitgestellten SDKs ein:
linux-imx$ source /opt/<sdk>/<sdk version>/environment-setup-aarch64-fslc-linux
Hinweis: Um zu erfahren, wie Sie das SDK installieren, besuchen Sie bitte https://variwiki.com, klicken Sie auf die SoM- und die Yocto-Version, die Sie verwenden möchten, und dann auf den Link „Toolchain installation for out of Yocto builds“.
Als Nächstes erstellen Sie den Gerätebaum:
linux-imx$ make mrproper
linux-imx$ make imx8_var_defconfig
linux-imx$ make dtbs
Stellen Sie den Gerätebaum über Ethernet auf Ihrem Zielgerät bereit:
linux-imx$ scp arch/arm64/boot/dts/freescale/imx8mn-var-som-customer.dtb root@<target ip address>:/boot/
Konfigurieren Sie schließlich das Zielgerät, um den neuen Gerätebaum zu booten:
root@imx8mm-var-dart:~# fw_setenv fdt_file imx8mn-var-som-customer.dtb
root@imx8mm-var-dart:~# reboot
Hinweis: Sie sollten auch überprüfen, ob der Gerätetreiber in der Kernelkonfiguration aktiviert ist. Weitere Informationen finden Sie in der Variscite Kernel-Konfigurationsanleitung.
Tipps zur Fehlersuche
Gerätebaum bootet nicht?
Es ist möglich, dass ein falsch konfigurierter Gerätebaum oder Treiber dazu führt, dass das System nicht startet. Wenn Sie sich in dieser Situation befinden, kann es hilfreich sein, den folgenden Prozess durchzugehen:
- Beginnen Sie mit einem minimalen Gerätebaum, der durch Entfernen oder Deaktivieren von Geräteknoten gebootet wird
- Hinzufügen und Testen eines einzelnen Geräts zu einer Zeit
- Kleine iterative Änderungen vornehmen
- Wenn Sie neue Geräte hinzufügen und testen, zeichnen Sie die Änderungen mit Git auf, damit Sie einen funktionierenden Gerätebaum haben, auf den Sie zurückgreifen können
Der Treiber prüft nicht?
Im Folgenden finden Sie einige Tipps zur Fehlersuche, wenn der Treiber nach dem Hinzufügen des Geräteknotens nicht reagiert:
- Überprüfen Sie, ob der Treiber in der Kernelkonfiguration aktiviert ist
- Überprüfen Sie, ob das Gerät im Gerätebaum aktiviert ist (Status = “okay”)
- Überprüfen Sie, ob die Gerätebindung mit der Dokumentation übereinstimmt
- Weitere Beispiele finden Sie in arch/arm64/boot/dts
- Prüfen Sie dmesg auf Fehler im Zusammenhang mit dem Treiber
Der Arbeitsablauf zum Bearbeiten und Testen des Gerätebaums kann in Sekundenschnelle erledigt werden:
- Gerätebaum bearbeiten
- $ make dtbs
- $ scp arch/arm64/boot/dts/freescale/<device tree> root@<ip addr>:/boot/
- Neustart des Boards
Um zu überprüfen, ob Ihr Arbeitsablauf funktioniert und Sie den aktualisierten Gerätebaum booten, kann es hilfreich sein, /sys/firmware/devicetree zu inspizieren, um zu überprüfen, ob der Kernel den aktualisierten Gerätebaum korrekt geparst hat.
Zusammenfassung
Gerätebäume sind für die Beschreibung der Hardware für den Linux-Kernel verantwortlich. Variscite stellt für jedes seiner SoMs und Evaluationskit-Carrier-Boards Referenz-Gerätebaumdateien zur Verfügung, die als Referenz verwendet oder für kundenspezifische Carrier-Boards erweitert werden können. Für zusätzliche Unterstützung besuchen Sie bitte das Variscite-Software-Wiki, das detaillierte Anleitungen für jedes Variscite-Modul und unterstützte Betriebssysteme enthält.
Verwandte Ressourcen
Webinar: Getting Started with Device Trees on Variscite SOMs
Blogbeitrag: i.MX Device Tree Pinmux Settings
Blogbeitrag: Variscite Kernel Configuration Guide
Blogbeitrag: Creating a Custom Yocto BSP Layer
Blogbeitrag: Disabling Unused Drivers and Peripherals in Linux