Da ich das noch nie von Anfang an gemacht habe, hier mal der Versuch es ein wenig zu dokumentieren.
Als Hardwarebasis dient mir ein Pine H64 mit einem Allwinner H6.
Als Start dient die Seite linux-sunxi.org unter Manual build howto wird erklärt wie man sich ein Image selbst erstellen kann.
Alle Schritte werde ich mal im Eingangsthread niederschreiben, so dass Interessierte alle Schritte nachvollziehen können.
Ich hoffe auf die Unterstützung von User rell, der mir hoffentlich bei dem ein oder anderen auftretenden Problemchen behilflich sein kann.
Als erster Schritt habe ich mir bereits eine virtuelle Maschine mit Ubuntu Focal Fossa erstellt auf der ich arbeiten werde.
Jetzt gehts erstmal mit der sunxi Toolchain los.
Zuerst habe ich mir unter meinem HomeDir ein Verzeichnis mit dem Namen PineH64 angelegt darin nochmal ein Verzeichnis Namens Sunxi in dem ich arbeiten werde.
mkdir PineH64
cd PineH64
git clone https://github.com/LibreELEC/LibreELEC.tv.git
mkdir sunxi
cd sunxi
sudo apt-get install flex bison
sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install swig python-dev
Vorherige u-boot Quelle
Danach die Repositorys von u-boot und Arm Trusted Firmware geklont
git clone https://github.com/u-boot/u-boot.git
Nachdem ich mich auf anraten von rell an LibreELEC halte, gehe ich hier etwas anders vor. In der Datei package.mk wird das Vorgehen von LE beschrieben.
LE verwendet U-Boot Version 2021.01 dies wird mit folgendem Befehl heruntergeladen
wget http://ftp.denx.de/pub/u-boot/u-boot-2021.01.tar.bz2
Diese Datei wird entpackt mit
tar xvjf u-boot-2021.01.tar.bz2
im Verzeichnis u-boot-2021.01 befindet sich jetzt die u-boot Version mit der LE arbeitet ohne angewande patches.
Zuerst werden die Patches aus /LibreELEC/LibreELEC.tv/projects/Allwinner/patches/u-boot/ angewendet. Dazu in das Verzeichnis u-boot-2021.01 wechseln und mit dem Befehl
patch -p 1 < ../../LibreELEC/LibreELEC.tv/projects/Allwinner/patches/u-boot/"Dateiname.patch"
danach alle Patches aus /LibreELEC/LibreELEC.tv/projects/Allwinner/devices/H6/patches/u-boot/ mit
patch -p 1 < ../../LibreELEC/LibreELEC.tv/projects/Allwinner/devices/H6/patches/u-boot/"Dateiname.patch"
anwenden.
Anschließend noch die Firmware kompilieren, dazu ins Arbeitsverzeichnis wechseln und mit
git clone https://github.com/ARM-software/arm-trusted-firmware.git
die Quellen holen und ins angelete Verzeichnis wechseln.
cd arm-trusted-firmware
Patchen
git am -i ../../LibreELEC/LibreELEC.tv/projects/Allwinner/patches/atf/.patch
Die .bin Datei für den H6 wird mit
sudo make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_h6 DEBUG=1 bl31 erzeugt.
Diese liegt nun unter arm-trusted-firmware/build/sun50i_h6/debug und heißt bl31.bin und wird für ein 64bit System benötigt.
Für menuconfig brauch man noch libncurses-dev also
sudo apt-get install libncurses-dev installieren.
Damit das ganze dann ohne Problem durchläuft müssen noch zwei Pakete installiert werden.
sudo apt-get install python3-distutils python3-dev
32Bit u-boot:
make CROSS_COMPILE=arm-linux-gnueabihf- pine_h64_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make CROSS_COMPILE=arm-linux-gnueabihf-
64Bit u-boot:
make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h6/debug/bl31.bin pine_h64_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h6/debug/bl31.bin menuconfig
make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h6/debug/bl31.bin
Für den H6 wird ein 64Bit System aufgesetzt somit die Befehlen unter der Rubrik 64Bit u-boot anwenden.
Nachdem der Compiler durchgelaufen ist meckert er eine fehlende SCP firmware an, die für den Suspend zuständig ist. Diese ist wohl optional.
Fehlermeldung
Image 'main-section' is missing external blobs and is non-functional: scp
/binman/u-boot-sunxi-with-spl/fit/images/scp/scp:
SCP firmware is required for system suspend, but is otherwise optional.
Please read the section on SCP firmware in board/sunxi/README.sunxi64
Some images are invalid
Nicht mehr benötigtes script.bin
So als nächstes steht das Hardware description file script.bin auf dem Programm.
Dazu muss man sich die bin2flex utilitys bauen. Dazu werden die folgenden Pakete noch benötigt
sudo apt-get install libusb-1.0-0-dev zlib1g-dev
Im Anschluss die sunxi tools aus dem repository holen
git clone https://github.com/linux-sunxi/sunxi-tools
und anschließend ins sunxi-tools Verzeichnis gewechselt. Um die tools kompilieren zu können muss noch ein Paket installiert werden.
sudo apt-get install pkg-config
mit
make all CROSS_COMPILE=arm-linux-gnueabihf-
werden die Tools für das Buildsystem und für das ARM System komplett kompiliert und man kann das Verzeichnis wieder verlassen.
Als nächstes wird das sunxi-board Repository geholt.
git clone git://github.com/linux-sunxi/sunxi-boards.git
In diesem Repository sind die fex-Files enthalten, in meinem Fall unter /sunxi-boards/sys-config/h6/pine64_h64.fex
Um dem ARM Board eine feste MAC zuzuweisen müssen am Ende des fex-files zwei Zeilen angehängt werden.
[dynamic]
MAC = "0123456789AB" MAC Adresse noch anpassen
Um nicht die gleiche MAC wie aus dem Wiki zu nehmen habe ich mir hier eine zufällige generieren lassen.
Um das script.bin zu kompilieren gibt folgenden Befehl ein.
../../../sunxi-tools/fex2bin pine64_h64.fex script.bin
Leider komme ich hier momentan nicht weiter, da im fex-File einpaar Fehler sind. Dabei handelt es sich um "-" und "/" in den in den Keys
Lösung gefunden, dazu müssen bei den sunxi-tools einpaar Modifikationen vor dem Kompilieren in den Quelldateinen gemacht werden, diese sind hier im Pullrequest aufgeführt. Leider hat die Änderung noch nicht den Weg in den Master gefunden.
Danach müssen noch zwei kleine Fehler im fex-File korrigiert werden (Zeile 1 ein ";" voranstellen und in Zeile 1244 ein ";" am Ende entfernen und schon funktioniert der obige Befehl und das script.bin liegt im Verzeichnis /sunxi-boards/sys-config/h6/.