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:

  1. Hinzufügen einer neuen Gerätebaumdatei zum Linux-Kernel
  2. Hinzufügen von Geräten zur Gerätebaumdatei
  3. 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.

 

DART-MX8M-MINI System on Module (SoM)

NXP iMX 8M Mini System on Module

 

Bearbeiten der Konfiguration

  1. 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
  2. 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.

  3. Änderungen an der Konfigurationsdatei werden mit menuconfig vorgenommen:
    		
    $ make menuconfig
    Das folgende Menü wird im Terminalfenster geöffnet

    Variscite Kernel Configuration Guide_Figure 1

    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.

  4. 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
  5. 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”

 

VAR-SOM-MX8M-MINI System on Module (SoM)

VAR-SOM-MX8M-MINI SoM

 

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

Variscite Kernel Configuration Guide_Figure 2
Durchsuchen Sie die Kernel-Konfigurationsoptionen durch Eingabe von ‚/‘.

Variscite Kernel Configuration Guide_Figure 3

Geben Sie CONFIG_RTC_DRV_DS1307 ein und wählen Sie Ok, dann werden die Suchergebnisse angezeigt:

Variscite Kernel Configuration Guide_Figure 4

Um das erste Suchergebnis auszuwählen, geben Sie „1“ ein und überprüfen Sie, ob der Treiber aktiviert ist:

Variscite Kernel Configuration Guide_Figure 5

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