Die Kunst des Schamanismus oder der benutzerdefinierten Firmware für Olinuxino. UBOOT Teil 2

All dies wurde unter Ubuntu 16.04 gesammelt.

Die Entscheidung zum Erstellen der Firmware wurde aufgrund des fehlenden freien Zugriffs auf das Image für dieses Board (Olimex A13-Olinuxino) getroffen. Und der Hersteller bot an, eine SD-Karte mit einem Image zu kaufen, die zu diesem Zeitpunkt etwa 10 Euro kostete, was nicht wirklich funktionierte. Außerdem war sie für einen Monitor konzipiert.

Wir werden die Bootloader-Konfiguration für das Booten von der SD-Karte konfigurieren. Da sich kein NAND-Speicher auf der Karte befindet und alle anderen Startoptionen leicht schief sind (wer uboot zusammenstellen kann, um von USB-Medien zu booten, sollte zwei Schritte vorwärts gehen und freigeben). Der Allwinner-Algorithmus zum Laden von a13-Prozessoren finden Sie auf der Website des Herstellers. Oder hier ist ein Ausschnitt aus einem Datenblatt.



Aus dem Algorithmus ist klar ersichtlich, dass der Bootloader zuerst auf der SD-Karte überprüft wird, dann der Rest und erst am Ende der Bootloader auf USB überprüft wird. Daher können Tablets und Smartphones mit Ubuntu ausgeführt werden, wenn sie die SD-Karte auf die entsprechende Weise verschieben. Und anscheinend wird ein solcher Algorithmus, wenn nicht für alle, für viele Hersteller von Armprozessoren gelten.

Zuerst müssen Sie die SD-Karte beschädigen, damit beim Eingeben von Befehlen kein Fehler auftritt. Wir reduzieren den gesamten Vorgang auf eine Skriptdatei (ich ziehe es vor, alles auf solche Dateien zu reduzieren, da Sie sie mehrmals ausführen müssen).

#!/bin/sh DEViCELINK=/dev/sdb fdisk $DEViCELINK <<EOF n #    p #   1 #   2048 #     2MiB +64M #  ,    kernel     dts  n p 2 +2G #    ubuntu n p 3 +2G #         n p 4 #         w EOF mkfs.ext2 /dev/sdb1 << EOF #   kernel    fat16  ext2 y EOF mkfs.ext4 /dev/sdb2 << EOF y EOF mkfs.ext4 /dev/sdb3 << EOF y EOF mkfs.ext4 /dev/sdb4 << EOF y EOF 

UBOOT Build


Lassen Sie uns näher auf den Bootloader eingehen, und da wir UBOOT auswählen, pumpen wir die Version von u-boot-2018.05 aus, letztere zu diesem Zeitpunkt.

Es wird davon ausgegangen, dass die gesamte für die Montage erforderliche Software bereits installiert ist. Starten Sie den Build, indem Sie den Bootloader konfigurieren.

Um die Konfiguration zu starten, müssen Sie mit UBOOT in den Ordner gehen und von dort aus den folgenden Befehl ausführen:

 make O=../olimex-uboot #       -j4 #     ARCH=arm #      CROSS_COMPILE=arm-linux-gnueabihf- #    xconfig #   GUI  

Als Ergebnis der Ausführung erhalten wir ein solches Fenster.



Dies ist die sogenannte X-Version des Konfigurators. Sie verwenden normalerweise die Konsolenoption. Weitere Informationen sind darin enthalten. Dies ist jedoch visueller und deckt unsere Anforderungen vollständig ab.

Und wenn Sie viel Zeit haben oder es Ihnen nichts ausmacht, können Sie den Bootloader selbst von Grund auf neu konfigurieren. Es ist jedoch besser, die fertige Konfiguration dieser Karte über das Dateimenü herunterzuladen. Wählen Sie im Ordner mit der Bootloader-Quelle unter /u-boot-2018.05/configs/ die Datei A13-OlinuXino_defconfig aus. Dies ist unsere Konfiguration, in der bereits alles installiert ist. Klicken Sie anschließend auf Speichern und schließen Sie das Fenster, da hier nichts geändert werden muss.

Der Build-Befehl muss noch ausgeführt werden:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

In diesem Befehl sind die Elemente alle dieselben wie im vorherigen, nur ohne den Parameter xconfig, was Konfiguration bedeutet. Das ist alles, der Bootloader ist zusammengebaut.

Nachdem die Assembly abgeschlossen ist, müssen wir in dem im Befehl angegebenen Ordner diese Datei "u-boot-sunxi-with-spl.bin" finden. Dies ist der gewünschte Bootloader.

Verwenden Sie als Nächstes den folgenden Befehl, um den Bootloader auf die SD-Karte hochzuladen:

 dd if=../olimex-uboot/u-boot-sunxi-with-spl.bin #      of=/dev/sdb #     SD  bs=1024 seek=8 #  8KiB  ,      

Der Bootloader, der gerade nach dem Start aufgezeichnet wurde, zeigt auf den nächsten Abschnitt der SD-Karte / dev / sdb1 und sucht dort nach einer Skriptdatei mit Umgebungsvariablen, die Anweisungen zum weiteren Laden enthält.

Diese Datei sollte boot.scr heißen. Eine Datei mit diesem Namen sucht nach dem Download nach uboot. Natürlich können sowohl der Dateiname als auch die Download-Methode geändert werden, wenn Sie in die UBOOT-Konfiguration wechseln. Lassen Sie uns jedoch auf diese Option eingehen.

Sie sollten auch Gerätebaumdateien für eine Sache kompilieren, sie befinden sich in der Quelle mit dem Bootloader unter /u-boot-2018.05/arch/arm/dts/. Wir sind an der Datei sun5i-a13-olinuxino.dts interessiert. Es repräsentiert eine Konfiguration von Registern und Peripheriegeräten des Prozessors. Dies ist eine universelle Konfigurationsdatei, daher ist die Option möglich, wenn ein Uboot-Bootloader für verschiedene Prozessoren verwendet wird, jedoch unterschiedliche dts-Dateien verwendet werden. Dieselben dts-Dateien befinden sich auch im Quellcode des Linux-Kernels. Sie sind im Grunde die gleichen, nur ein wenig anders geschrieben, und Sie können auswählen, woher der zusammengestellte Gerätebaum stammt. Im Allgemeinen müssen Sie zum Erstellen von dts-Dateien den folgenden Befehl ausführen:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs #      dts  

Die kompilierte Datei befindet sich unter ../olimex-uboot/arch/arm/dts/.
Erwägen Sie, die Datei boot.scr detaillierter abzurufen.
Erstellen Sie zunächst die Datei boot.cmd mit dem Inhalt:

 load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb load mmc 0 0x42000000 uImage setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait console=ttyS0,115200 bootm 0x42000000 – 0x43000000 

Damit uboot die Anweisungen verstehen kann, muss diese Datei in Form eines Skripts vorliegen. Dazu müssen Sie den folgenden Befehl ausführen:

  mkimage -C none -A arm -T script -d boot.cmd boot.scr 

Wobei boot.scr die erforderliche Datei ist.

Die erste Zeile lädt mmc 0 0x43000000 sun5i-a13-olinuxino.dtb lädt die Gerätebaumdatei an der angegebenen Adresse im RAM. load mmc 0 gibt an, dass Sie die Datei aus dem ersten Abschnitt der SD-Karte herunterladen müssen, während die Nummerierung für uboot null und nicht eins ist.

Die zweite Zeile load mmc 0 0x42000000 uImage lädt den zusammengestellten Linux-Kernel unter der angegebenen Adresse.

Für unsere Version wird die normalerweise weiter verwendete Variable setenv video-mode für uns nicht benötigt, da die Verwendung des Monitors nicht geplant ist.

Dritte Zeile:

 setenv bootargs #    root=/dev/mmcblk0p2 #    SD    rootfs rootfstype=ext4 #    rootfs rw #    rootwait console=ttyS0,115200 #    uart0 

Nun, der letzte Bootm-Befehl lädt den Kernel aus dem zuvor in den Speicher geladenen.

Im nächsten Artikel wird der letzte Teil, der auf dem ersten Abschnitt der SD-Karte platziert werden sollte, die Bildung des Linux-Kernel-Kernels sein.

Der erste Teil des Artikels
Der dritte Teil des Artikels

Source: https://habr.com/ru/post/de434942/


All Articles