Images für ARM Einplatinenrechner erstellen for dummys

  • 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


    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.

    Hier gehts weiter

    The post was edited 23 times, last by JoeBar ().

  • rell Sind die U-Boot Patches von LE eigentlich schon angewendet? Oder besser gefragt sind die Patches unter projects/Allwinner/devices/h6/patches/u-boot/ schon angewendet und die unter projects/Allwinner/patches/u-boot nocht nicht? Ist es sinnvoll diese noch einzubauen?

  • Die Fehlermeldung kannst du wohl ignorieren, dafür bräuchtest du noch das crust Zeug, aber halt nur für den Fall, der in der Fehlermeldung angegeben ist.

    script.bin brauchst du nicht!! Das war beim alten 3.4er Kernel bzw. U-Boot, der direkt von Allwinner kam, erforderlich.

    Für dich ist im Wiki nur entscheidend, was "mainline" oder "upstream" betrifft. Die ganzen "legacy" Beschreibungen kannst du ignorieren.

  • Wegen den Patches:


    https://github.com/LibreELEC/L…ls/u-boot/patches/default wird von LE generell angewendet, "projects/Allwinner/patches/" wird von LE auf alle Allwinner SoCs angewendet, "projects/Allwinner/devices/h6/patches/u-boot/" nur auf die H6 builds. Und als Basis verwendet LE die U-Boot Version von https://github.com/LibreELEC/L…s/tools/u-boot/package.mk


    So kannst du dich quasi durch alle Pakete hangeln und nachvollziehen, wie es LE macht.


    Ich würde die U-Boot-Version nehmen und alle Patches darauf anwenden und dann U-Boot bauen, weil einige Optimierungen für H6 drin sind.

  • Ok, dann werd ich das mal so anpassen. Hardware ist auch gerade eingetrudelt, leider ist der Stecker am vorhanden 5V Netzteil zu groß. Ich muss jetzt erst mal ein anderes mit 3,5mm Hohlstecker besorgen um auf der Hardware zu testen.

  • rell OK U-Boot mit allen LE Patches gebaut. Kannst Du mir kurz dein Vorgehen beim Kernel erläutern? Nimmst du den Kernel den LE verwendet oder die letzte stable Version?

  • rell ich hab bei den Patches 0002 - 0004 aus /projects/Allwinner/devices/H6/patches/linux/ ein paar Schwirigkeiten. 0002 läuft sauber durch aber 0003 und 0004 wollen dann einfach nicht mehr alle 3 patchen die gleiche Datei drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c . Bin ich denn mit dem Kernel v5.10.7 richtig. Wo steht denn genau welchen Kernel LibreElec genau verwendet?


    P.S. Ich hab den Fehler glaube ich gefunden, ich muss in den master Zweig

    The post was edited 1 time, last by JoeBar ().

  • Nimm https://git.kernel.org/pub/scm…nel/git/stable/linux.git/ und checke v5.10.4 aus. Darauf dann die Patches mit “git am“ anwenden.

  • In 5.10.4 stimmt die Datei drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c nicht mit der vom master tree überein :(

  • Ok ich werde es mal mit dem Link von oben versuchen, vieleicht bin ich da irgrendwo verrutscht...

    git am werde ich probieren kannte ich noch nicht. Das scheint das ganze zu vereinfachen :)

  • Der von hier git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git wenn ich hier mit git checkout auf 5.10.4 gewechselt habe stimmte der inhalt der Datei drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c nicht mit dem Inhalt im Master üeberein.

  • soll ja auch nicht!? “git checkout v5.10.4“ sollte dich auf den Stand bringen, die mit den Patches zusammenpassen.

  • So der 5.10.4 ist jetzt jungfreulich hergestellt. Trotzdem passt der 0003 Patch aus /projects/Allwinner/devices/H6/patches/linux/ zur Datei drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c nicht zusammen. Erst ab 5.10.8 kann ich die Patches 0002-0004 anwenden.

    Mal schauen ob da der Rest auch noch geht.

  • Scheint so, als würden die nur passen, wenn man die Crust Patches mit drauf nimmt.


    EDIT: Ja, dann gehts. https://github.com/LibreELEC/L…inner/patches/linux/crust vorher, dann klappen die von H6.

  • Bei 5.10.10 funktionieren sie wenn man zuerst die allgemeinen Patches und dann die H6 Patches einspielt.


    Bei git am möchte er von mir eine mailadresse haben da muss ich mich mal damit beschäftigen wie das funktionier. Wäre schon angenehmer alle Patches auf einen Schlag einspielen zu können.


    Wenn das mit den Crust Patches funktioniert dann schau ich mir jetzt mal git am an und versuch es nochmal mit 5.10.4