Einführung
Nach der Entwicklung eines kundenspezifischen Carrier Boards für ein Variscite System on Module / Computer on Module besteht eine der ersten Softwareaufgaben darin, den Linux-Kernel zu unterstützen. Diese besteht aus:
- Hinzufügen einer neuen Gerätebaumdatei zum Linux-Kernel
- Hinzufügen von Geräten zur Gerätebaumdatei
- Aktivieren von Treibern in der Kernelkonfiguration für jedes Gerät
Diese Anleitung zeigt, wie man Gerätetreiber im Linux-Kernel aktiviert. Bitte besuchen Sie Variscites „Erste Schritte mit Variscite-Gerätebäumen“ von Variscite, um zu erfahren, wie man neue Geräteknoten zum Gerätebaum hinzufügt.
Kernel defconfig
Die defconfig-Datei ist eine minimale Darstellung der Kernelkonfiguration. Sie enthält eine Liste von Treibern, die als integriert oder als Module kompiliert werden. Integrierte Treiber sind in der Kernel-Binärdatei (Image.gz/zImage/uImage) enthalten. Treibermodule werden in .ko-Dateien kompiliert und im Root-Dateisystem unter „/lib/modules/…“ installiert.
Der Speicherort der defconfig-Datei im Linux-Kernel-Quellbaum hängt von der SoC-Architektur ab:
Für 32-Bit-Prozessoren:
arch/arm/configs
Für 64-Bit-Prozessoren:
arch/arm64/configs
Die Defconfig für Variscites NXP i.MX8M Mini befindet sich zum Beispiel unter:
arch/arm64/configs/imx8_var_defconfig
Die defconfig enthält eine Liste der verfügbaren Treiber. Zum Beispiel:
# CONFIG_CXD2880_SPI_DRV is not set
CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=m
CONFIG_CRC_ITU_T=m
CONFIG_CRC7=m
CONFIG_DMA_CMA=y
Für jeden Treiber gibt es drei Konfigurationsmöglichkeiten:
“is not set” | Wird nicht kompiliert |
“=m” | Wird kompiliert und als Modul installiert (.ko-Datei) |
“=y” | Wird kompiliert und installiert als integriert |
Beachten Sie, dass die defconfig-Datei, wie bereits erwähnt, eine minimale Darstellung der Kernelkonfiguration ist, d. h. sie listet nicht explizit alle verfügbaren Treiber auf, sondern stützt sich auf Standardwerte und Treiberabhängigkeiten, um die vollständige Konfiguration darzustellen.
Bearbeiten der Konfiguration
- Es wird nicht empfohlen, die defconfig direkt zu bearbeiten. Stattdessen sollte der Kernel mit dem Make-Target „menuconfig“ konfiguriert werden.
Im Folgenden wird die Konfiguration des Kernels für den DART-MX8M-MINI / VAR-SOM-MX8M-MINI von Variscite demonstriert:
Besuchen Sie https://variwiki.com, klicken Sie auf das SOM und die Yocto-Version, die Sie verwenden möchten, und klicken Sie dann auf den Link „Den Linux-Kernel aus dem Quellcode bauen“.
Folgen Sie den Anweisungen auf dieser Seite, um den Kernel-Quellcode herunterzuladen, den Zweig zu ändern und den Cross-Compiler zu konfigurieren.
Zum Beispiel der Link für die DART-MX8M-MINI / VAR-SOM-MX8M-MINI Yocto Hardknott Version:
https://variwiki.com/index.php?title=Yocto_Build_Linux&release=RELEASE_HARDKNOTT_V1.0_DART-MX8M-MINI - Konfigurieren Sie den Kernel mit der Standard-Defconfig für die Zielplatine. In diesem Beispiel verwenden Sie:
$ make imx8_var_defconfig
Dieser Befehl erstellt eine vollständige Konfigurationsdatei mit dem Namen .config, die auf imx8_var_defconfig basiert, im Stammverzeichnis des Linux-Kernel-Quellbaums.
Alle Änderungen werden nun in der Datei .config vorgenommen. - Änderungen an der Konfigurationsdatei werden mit menuconfig vorgenommen:
$ make menuconfig
Das folgende Menü wird im Terminalfenster geöffnet
Abbildung 2: Kernel menuconfig Bildschirm
Unter dem Punkt „Gerätetreiber“ werden alle verfügbaren Treiber aufgelistet, wobei links von jedem Treiber ein Kontrollkästchen zu finden ist. Dies sind die Optionen:
[ ]– Wird nicht kompiliert
[M] – Wird kompiliert und als Modul installiert
[*] – Wird kompiliert und als integriert installiert
Nach dem Ändern der Treiberauswahl speichern und beenden Sie die Konfiguration. Die neue Konfiguration wird in die Datei .config geschrieben. - Bauen Sie den Kernel mit dem Befehl make. Dadurch werden das Kernel-Image, die Module und die Gerätebäume erstellt.
$ make -j$(nproc)
Nach der Erstellung des Kernels befindet sich das Binary (Image.gz/zImage/uImage) unter arch/arm64/boot/.
Und die kompilierten Device-Tree-Blobs (.dtb-Dateien) befinden sich unter arch/arm64/boot/dts/freescale/imx8*.
Um die Module in das Root-Dateisystem zu installieren, führen Sie aus:
$ make modules_install INSTALL_MOD_PATH=path_to_the_target_rootfs - Speichern Sie die Änderungen in der defconfig-Datei
Nachdem Sie die Änderunge mit menuconfig ausgeführt haben, wird die neue Konfiguration in .config gespeichert. Um die Änderungen dauerhaft zu machen, aktualisieren Siearch/arm64/configs/imx8_var_defconfig und übergeben Sie an Git:
$ make savedefconfig $ mv defconfig arch/arm64/configs/imx8_var_defconfig $ git add arch/arm64/configs/imx8_var_defconfig $ git commit –m “commit message”
Finden und Aktivieren von Treibern in der defconfig
Um Treiber im Kernel zu finden, suchen Sie am besten zunächst in den Verzeichnissen Treiber und Dokumentation nach dem Gerätemodell. Der Dateiname des Treibers kann verwendet werden, um die Kernelkonfigurationsoption zu finden.
Das folgende Beispiel zeigt, wie man den Treiber für die Echtzeituhr ds1337, die in einigen Variscite-Evaluierungskits verwendet wird, findet und aktiviert:
1. Suchen Sie im Verzeichnis „drivers“ nach dem Gerät:
$ grep -ir --include "*.c" "ds1337" ./drivers
Daraus ergeben sich viele Treffer für:
drivers/rtc/rtc-ds1307.c
2. Suchen Sie den Konfigurationsstring, indem Sie das Makefile im gleichen Verzeichnis wie die .c-Datei durchsuchen:
$ grep "rtc-ds1307" drivers/rtc/Makefile
obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o
3. Aktivieren Sie CONFIG_RTC_DRV_DS1307 mit menuconfig
$ make menuconfig
Durchsuchen Sie die Kernel-Konfigurationsoptionen durch Eingabe von ‚/‘.
Geben Sie CONFIG_RTC_DRV_DS1307 ein und wählen Sie Ok, dann werden die Suchergebnisse angezeigt:
Um das erste Suchergebnis auszuwählen, geben Sie „1“ ein und überprüfen Sie, ob der Treiber aktiviert ist:
Wenn der Treiber nicht aktiviert ist, wählen Sie [*] oder [M] und beenden und speichern Sie. Alle notwendigen Abhängigkeiten werden ebenfalls ausgewählt, und die neue Konfiguration wird in .config geschrieben.
4. Speichern Sie die Änderungen in
arch/arm64/configs/imx8_var_defconfig
$ make savedefconfig
$ mv defconfig arch/arm64/configs/imx8_var_defconfig
5. Erstellen Sie das Kernel-Image, die Module und die Gerätebäume
$ make -j$(nproc)
Nächste Schritte
Bei Geräten, die automatisch erkannt werden können, wie z. B. USB-Geräte, reicht es möglicherweise aus, den Treiber in der Kernelkonfiguration zu aktivieren. Bei vielen Geräten müssen jedoch ein oder mehrere Knoten zum Gerätebaum hinzugefügt werden. Um mehr darüber zu erfahren, wie man den Linux-Gerätebaum bearbeitet, besuchen Sie bitte Variscites „Erste Schritte mit Variscite-Gerätebäumen“ oder das Software-Wiki von Variscite, das detaillierte Anleitungen für jedes Variscite-Modul und unterstützte Betriebssysteme enthält.
Verwandte Ressourcen
Webinar: Getting Started with Device Tree on Variscite SOMs
Blog-Beitrag: i.MX Device Tree Pinmux Settings
Blog-Beitrag: Getting Started with Variscite Device Trees
Blog-Beitrag: Creating a Custom Yocto BSP Layer
Blog-Beitrag: Disabling Unused Drivers and Peripherals in Linux