Linux Kernel Build für DE10nano

Einführung

Für preisgünstiges Board Terasic DE10 nano mit integriertem FPGA mit ARM-CPU Ich werde darüber schreiben, wie man den Linux-Kernel erstellt und aktualisiert.

Mehrere Linux-SD-Karten-Images für dieses Board wurden auf die Terasic-Site hochgeladen. Wenn Sie sich als Benutzer registrieren, können Sie Linux sofort herunterladen und starten. Wenn Sie beim Spielen mit diesem Board versuchen, einen Kerneltreiber hinzuzufügen oder FPGA mit Device Tree Overlay zu konfigurieren, sollten Sie den Kernel selbst erstellen.

einpacken

Wenn Sie es gewohnt sind, eingebettetes Linux zu erstellen, sollten diese Informationen ausreichen.

Dinge notwendig

Arbeitsinhalt

Der Inhalt der SD-Karte, die für den Betrieb von Linux erforderlich ist, kann in zwei Typen unterteilt werden: Kernel-bezogenes und Root-Dateisystem. Hier werden nur Kernel-bezogene Dateien erstellt, und die Dateien des Root-Dateisystems werden unverändert verwendet.

Verfahren

Informationen zu Intel SoC-FPGAs finden Sie in der Dokumentation auf der Linux-Portal-Website RocketBoards.org. https://rocketboards.org/foswiki/Documentation/GSRDCompilingLinux Sie führen den Teil "Linux-Kernel erstellen" von "5. Kernel und U-Boot getrennt von Git-Bäumen erstellen" in aus.

Umweltvorbereitung

Laden Sie zunächst den Cross-Compiler herunter und bereiten Sie die für die Kernel-Erstellung erforderlichen Befehle vor. Wenn der Entwicklungs-PC beispielsweise Ubuntu 18.04 (64 Bit) im ursprünglichen Zustand ist, sind mindestens die folgenden Pakete erforderlich.

$ sudo apt update
$ sudo apt install -y wget git build-essential bc kmod libncursesw5-dev
$ sudo apt install -y lib32stdc++6 lib32ncurses5 lib32z1 

Cross Compiler herunterladen

Laden Sie den Cross-Compiler herunter und legen Sie die Umgebungsvariable CROSS_COMPILE fest. Ich arbeite hier unter dem Home-Verzeichnis, aber Sie können in ein beliebiges Verzeichnis gehen (in diesem Fall ändern Sie den in CROSS_COMPILE festgelegten PATH entsprechend).

$ cd ~
$ wget https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2 --no-check-certificate
$ tar xjf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2
$ export CROSS_COMPILE=~/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-

Laden Sie die Kernel-Quelle herunter

Klonen Sie die Kernelquelle aus dem Git-Repository. Dann überprüfen Sie Ihren bevorzugten Zweig oder Tag. Das Beispiel überprüft den Zweig socfpga-4.14.130-ltsi. Wieder beginne ich mit der Arbeit in meinem Home-Verzeichnis, aber mache es, wo immer du willst. Sie können die "test_branch" nach -b in einen beliebigen Namen ändern.

$ cd ~
$ git clone https://github.com/altera-opensource/linux-socfpga
$ cd linux-socfpga
$ git checkout -b test_branch origin/socfpga-4.14.130-ltsi 

Build zImage, .dtb

Erstellen Sie schließlich den endgültigen Zielkernelkörper, zImage und den Gerätebaum. (Angenommen, der Export CROSS_COMPILE = ... ist bereits festgelegt.)

$ export ARCH=arm 
$ make socfpga_defconfig
$ make zImage
$ make socfpga_cyclone5_de0_sockit.dtb

Das obige generiert zImage unter arch / arm / boot / und socfpga_cyclone5_de0_sockit.dtb unter arch / arm / boot / dts /. Socfpga_cyclone5_de0_sockit.dtb ist übrigens eine Gerätebaumdatei für DE10 nano. Ersetzen Sie diese durch die zImage, .dtb-Dateien in der FAT-Partition Ihrer SD-Karte.

Beispiel für das Schreiben auf eine SD-Karte

Zunächst müssen Sie den Partitionsinhalt der neu zu schreibenden SD-Karte überprüfen (eine Karte, die DE10nano unter Linux booten kann). Legen Sie die SD-Karte in den Entwicklungs-PC ein und zeigen Sie die Partitionsinformationen an. Wenn der Name des SD-Kartengeräts auf Ihrem PC / dev / mmcblk0 lautet Der Befehl lautet "sudo fdisk -l / dev / mmcblk0".

$ sudo fdisk -l /dev/mmcblk0
...Abkürzung...
Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  206848  204801  100M  b W95 FAT32
/dev/mmcblk0p2      227331 7395332 7168002  3.4G 83 Linux
/dev/mmcblk0p3      206849  227330   20482   10M a2 unknown

Anhand dieser Informationen können Sie erkennen, dass die FAT-Partition Partition1 (/ dev / mmcblk0p1) und die Linux-Partition Partition2 (/ dev / mmcblk0p2) ist.

Schreiben Sie zImage und .dtb in Partition1 (/ dev / mmcblk0p1) der FAT-Partition mit Ihrer eigenen neu. Zum Beispiel auf der Terasic-Site DE10-Nano Kit-Ressourcenseite Wenn Sie das MicroSD-Kartenabbild von "Linux LXDE Desktop (Kernel 4.5)" verwenden, heißt die entsprechende Datei in der FAT-Partition zImage, soc_system.dtb. Ersetzen Sie sie daher.

$ sudo mount /dev/mmcblk0p1 /mnt
$ cp /mnt/zImage /mnt/zImage.org
$ cp /mnt/soc_system.dtb /mnt/soc_system.dtb.org
$ cp arch/arm/boot/zImage /mnt 
$ cp arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dtb /mnt/soc_system.dtb
$ sudo umount /mnt

(Angenommen, der Gerätename der SD-Karte lautet / dev / mmcblk0 und das leere Verzeichnis / mnt ist bereits vorhanden.)

Kernel-Module auch

Die Kernel-Parameter werden sofort mit dem oben genannten make socfpga_defconfig festgelegt, aber die hier festgelegten haben auch ein Einstellungsmodul [M], das nicht in zImage enthalten ist und als Modul auf eine separate Datei (.ko) festgelegt ist. Es gibt einige. Da es sich auch um Kernel-bezogene Dateien handelt, schreiben Sie sie an den angegebenen Speicherort auf der SD-Karte. Dies ist auch erforderlich, wenn Sie das im Kernel-Parameter als [M] ausgewählte Modul verwenden möchten (obwohl ich glaube, dass dies in dem Bereich, in dem Sie normalerweise DE10 nano verwenden, nicht erforderlich ist).

$ make modules
$ mkdir /tmp/kmod
$ make modules_install INSTALL_MOD_PATH=/tmp/kmod
$ cd /tmp/kmod
$ tar cvzf /tmp/mod.tgz *
$ sudo mount /dev/mmcblk0p2 /mnt
$ sudo tar xf /tmp/mod.tgz -C /mnt
$ sudo umount /mnt
$ rm -rf /tmp/mod.tgz /tmp/kmod

(Dies ist ein Beispiel, wenn der Gerätename der SD-Karte / dev / mmcblk0 und die Linux-Partition der SD-Karte / dev / mmcblk0p2 lautet.) (In diesem Beispiel ist / tmp / kmod / lib / modules / \ * / build, / tmp / kmod / lib / modules / \ * / source eine symbolische Verknüpfung zum Kernel Source-Verzeichnis auf Ihrem Entwicklungs-PC. In diesem Fall kopieren Sie es in eine andere Umgebung mit. Ich denke, es ist in Ordnung, diese und dann tar cvzf zu löschen. Da es sich um eine symbolische Verknüpfung handelt, die erforderlich ist, wenn das Modul in Zukunft in der ARM-seitigen Umgebung erstellt wird. )

Bonus FrameBuffer Treiber hinzugefügt

Das von Terasic bereitgestellte SD-Karten-Image verfügt über ein Image, mit dem Sie die grafische Benutzeroberfläche des HDMI-Monitors verwenden können (z. B. das obige Image "Linux LXDE Desktop"). Wenn Sie es jedoch in den im obigen Verfahren erstellten Kernel umschreiben, Es gibt keinen Monitorausgang. Der Treiber für die Monitorausgabe (Frame Buffer Driver) ist nicht in der Standardeinstellung socfpga_defconfig enthalten. Um die Monitorausgabe zu aktivieren, muss ein Kernel erstellt werden, der einen Bildpuffertreiber enthält. Zwischen make socfpga_defconfig und make zImage, die oben erwähnt wurden

$ make menuconfig 

Bitte führen Sie die. Dadurch wird die GUI gestartet. Um Kernel-Parameter einzustellen, nutzen Sie die Cursortasten und die Eingabetaste vollständig. Gehen Sie zur Zeile "Gerätetreiber-> Grafikunterstützung-> Bildpuffergeräte-> Rahmenpufferunterstützung für Altera VIP-Rahmenleser" und markieren Sie sie als <*> (mit der Leertaste). Wählen Sie im unteren Menü Speichern und speichern Sie zum Beenden in .config. Anschließend müssen Sie eine Gerätebaumdatei hinzufügen, um den gerade aktivierten Frame-Puffer zu starten. Kopieren Sie socfpga_cyclone5_de0_sockit.dts als socfpga_cyclone5_de10nano_FB.dts und ändern Sie socffpga_cyclone5_de10nano_FB.dts mit Ihrem bevorzugten Editor.

$ cd arch/arm/boot/dts
$ cp socfpga_cyclone5_de0_sockit.dts socfpga_cyclone5_de10nano_FB.dts
$ vi socfpga_cyclone5_de10nano_FB.dts #Bearbeiten
$ cd ../../../..

Die Änderung besteht darin, am Ende der Datei Folgendes hinzuzufügen.

&base_fpga_region {
        ranges =  <0x00000000 0xff200000 0x00200000>;

        alt_vip_vfr_hdmi: vip@0x100031000 {
		compatible = "ALTR,vip-frame-reader-14.0", "ALTR,vip-frame-reader-9.1";
		reg = <0x00031000 0x00000080>;
		max-width = <1024>;
		max-height = <768>;
		bits-per-color = <8>;
		colors-per-beat = <4>;
		beats-per-pixel = <1>;
		mem-word-width = <128>;
	};
};

Erstellen Sie dann einen Gerätebaum .dtb mit dem umbenannten zImage und ersetzen Sie diese durch die SD-Kartendateien.

$ make zImage
$ make socfpga_cyclone5_de10nano_FB.dtb

Zusammenfassung

Ich habe geschrieben, wie man nur den Linux-Kernel der DE10 nano Linux SD-Karte erstellt und aktualisiert. Tatsächlich gibt es einen Aspekt, bei dem ich diesen Inhalt geschrieben habe, weil er in "FPGA-Konfiguration mit Gerätebaumüberlagerung" in einem anderen Artikel erforderlich war. Im obigen Arbeitsbefehlsbeispiel wird die SD-Karte von DE10nano in den Entwicklungs-PC eingelegt, gemountet und der Inhalt neu geschrieben, aber ich habe den DE10nano und den Entwicklungs-PC mit Ethernet verbunden und mit dem Entwicklungs-PC generiert. Ich arbeite, indem ich die Binärdatei mit scp an DE10nano sende und die Datei mit DE10nano neu schreibe (da das Einlegen und Entfernen der SD-Karte schwierig ist).

Referenzmaterial

Referenz: Linux kompilieren auf der Linux-Portalseite für Intel SoC FPGA

Recommended Posts

Linux Kernel Build für DE10nano
pyenv für Linux
Erstellen Sie eine mruby-Entwicklungsumgebung für ESP32 (Linux Edition)
Informationen zu Linux-Kernelparametern
Linux Kernel Release 5.x (2/4)
[Für Memo] Linux Teil 2
Überprüfen Sie die Linux-Kernelversion
Linux Kernel Release 5.x (3/4)
Wofür ist Linux?
Ihr eigener Koredake ist ein Linux-Befehl
Linux Kernel Release 5.x (4/4)
Linux Kernel Release 5.x (1/4)
[Linux] [Kernelmodul] Erstellen und laden Sie ein einfaches ladbares Kernelmodul
[Linux] WSL2 Erstellen Sie mit Ubuntu 20.04 eine Umgebung für laravel7
Selbst erstellter Linux-Kernel mit Clang
Empfohlene Linux-Distribution für Anfänger
Flatterplattformkanäle für Linux
Linux Command Dictionary (für mich)
Linux Command Memorandum [für Anfänger]
[LINUX-Kernel neu erstellen] Upgrade (4.18.0 → 5.8.8)
Praktische Linux-Verknüpfung (für Anfänger)
Bis verschiedene Krypto-Implementierungen im Linux Kernel for ARM aufgerufen werden
Dokumentation zum Linux-Kernel-Speichermodell
[Für Memo] Linux Part 1 vi Editor
Probieren Sie den Linux-Kernel-Sperrmechanismus aus
[Hinweis] Aufbau und Verwendung des WSL2-Kernels
[Linux] [Kernelmodul] Erstellen Sie kthread im Kernelmodul
Praktische Tastenkombination für Linux-Befehle! !! !!
Häufig verwendete Linux-Befehle (für Anfänger)
[Muss für Anfänger] Grundlagen von Linux
Quellanalyse von Linux (Kernel): Systemaufruf
Installationsverfahren für Teamviewer für Linux (CentOS)
pykintone unter Windows Subsystem für Linux
Linux-Grundausbildung für Front-End-Ingenieure
Verwenden Sie Azure AD für die Linux-Authentifizierung
Hinweise zur Verwendung von KUnit, dem Unit-Test-Mechanismus des Linux-Kernels
Führen Sie XRT (Xilinx Runtime) unter Debian GNU / Linux für Ultra96 / Ultra96-V2 (Build) aus.