Ich verwende seit geraumer Zeit Gentoo-Linux für meine Cloud-Dienste auf dem Cubietruck. Zu einer modernen Linux-Distribution passt der antiquierte 3.4er SUNXI-Kernel für den Allwinner A20-Prozessor nicht wirklich. Nach langem probieren ist es mir nun gelungen, den 3.19er (rc2) (Mainline- bzw. Upstream-) Kernel mit aktiviertem Framebuffer zu starten. Der U-Boot in der Version 2015.04 unterstützt sowohl die HDMI-, als auch die VGA-Ausgabe. Den zu nutzenden Ausgang muss man in der boot.cmd spezifizieren.

Am Anfang steht ein moderner Bootloader (U-Boot). Ich habe hierfür den sunxi/next-Bootloader in der Version 2015.01-rc4 verwendet. Auf dem Gentoo-System ist dieser schnell übersetzt.

git clone git://git.denx.de/u-boot.git
cd u-boot
make Cubietruck_defconfig
make

Meine übersetzte Version des U-Boot befindet sich mit der verwendeten Konfigurationsdatei hier: u-boot_2015.01-rc4

Als nächstes folgt die Vorbereitung der SD-Card zum Booten. Mein System liegt auf einer SATA-Festplatte. Wer die Root-Partition lieber auf die SD-Card legt, sollte den entsprechenden Gerätenamen für die Root-Partition anpassen. Als ersten Schritt wird eine Partitionstabelle angelegt:

sfdisk -R /dev/mmcblk0
cat <<EOT | sfdisk --in-order -L -uM /dev/mmcblk0
1,16,83
,,L
EOT

Anschließend wird der U-Boot installiert:

dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8

Der Bootloader wird über eine boot.cmd-Datei konfiguriert, die den alten uEnv.txt-Mechanismus ersetzt. Hier ist meine Datei:

ext2load mmc 0 0x46000000 uImage
ext2load mmc 0 0x49000000 sun7i-a20-cubietruck.dtb
setenv bootargs console=tty0 earlyprintk root=/dev/sda1 rootwait panic=10 ${extra}
setenv video-mode sunxi:1280x1024-24@60,monitor=hdmi,hpd=1,edid=1
bootm 0x46000000 - 0x49000000

Diese wird mit der Hilfe des beim U-Boot mitgelieferten mkimage-Programmes in eine binäre Form übersetzt:

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

Die boot.scr-Datei wird auf die erste Partition der SD-Card kopiert. Nun kann mit dem Herunterladen und Übersetzen des Kernels begonnen werden. Ich habe den zum Zeitpunkt des Schreibens dieses Artikels aktuellen Mainline-Kernel 3.19-rc2 von heruntergeladen und entpackt. Hier ist meine Kernelkonfiguration Kernel 3.19-rc2. Eine um den NAND-Zugriff erweiterte befindet sich hier: (Kernelkonfiguration mit NAND-Zugriff) Der Kernel muss mit korrekter Startadresse übersetzt werden und anschließend muss der Device-Tree-Blob erzeugt werden, der die FEX-Dateien der alten Sunxi-Kernels ersetzt:

LOADADDR=0x40008000 make -j2 uImage modules modules_install dtbs

Anschließend können das uImage unter „arch/arm/boot“ und die DTB-Datei (arch/arm/boot/dts/sun7i-a20-cubietruck.dtb) auf die Boot-Partition kopiert werden.

Fertig! Damit sollte der Kernel booten und als Drop-In-Replacement für den alten 3.4er Kernel funktionieren.

Näheres dazu kann man hier nachlesen:

Mainline U-Boot-Howto

SUNXI Mainline Kernel Howto

Update: Ich habe den Kernel nun auf Version 4.0 aktualisiert und um die Unterstützung für den SUNXI Security-System genannten Crypto-Beschleuniger erweitert. Näheres kann hier nachgelesen werden.

Den jeweils aktuellen Kernel stelle ich ab sofort auf dieser Seite zur Verfügung:

Mainline Kernel für Cubietruck

18 thoughts on “Cubietruck: Migration auf Mainline-Kernel 3.19 mit Simple-Framebuffer

  1. Ich verwende den aktuellen sunxi-u-boot. Es ist mir bisher nicht gelungen damit einen upstream kernel zu booten. Es kommt immer wrong arm zimage magic. Muss ich unbedingt auf den mainline u-boot umsteigen?

    1. Das liegt meines Erachtens nach an der fehlenden Unterstützung für den Device-Tree-Blob. Es gibt zwar die Möglichkeit, den Device-Tree-Blob an den Kernel direkt anzuhängen, aber das habe ich bisher noch nicht ausprobiert, weil ich zur Überwachung meines Servers einen Monitor benutze und daher auf den Simple-Framebuffer angewiese bin. Die Option in der Kernel-Config lautet:

      Boot options ---> [*] Use appended device tree blob to zImage (EXPERIMENTAL)
      und
      [*] Supplement the appended DTB with traditional ATAG information

      (CONFIG_ARM_APPENDED_DTB=y und CONFIG_ARM_ATAG_DTB_COMPAT=y)

      Dann kann die DBT-Datei einfach via cat an das zImage angehängt werden – aber alle wie gesagt ohne gewähr. 🙂 Bitte dran denken, dass der DBT an das zImage anzuhängen ist, also damit auch via bootz zu booten ist.

  2. Gibt es bezüglich des Kernels eigentlich noch irgendwelche Einschränkungen? Ich habe ja gelesen, dass die Grafikausgabe wegen des fehlenden Mali-Treibers noch hakt, aber gibt es bezüglich der Nutzung als Server noch Stolpersteine?

    1. Es gibt in der Tat noch einige Einschränkungen, die aber für den Server-Betrieb wenig relevant sind. Aus Sicht des Stromverbrauchs und der Systemtemperatur ist aber zumindest das Fehlen des cpufreq-Treibers zu erwähnen. Unter normaler Last sollte das in gut gekühlten Umgebungen kein Problem sein, aber im engen Serverschrank ohne weitere Kühlung könnte das zu einem Problem werden.

  3. Der cpufreq-Treiber für die Sun7i-Architektur steht übrigens schon auf der Liste der Merges für Kernel 3.20, es sollte also nicht mehr allzulange dauern, bis auch dieser Punkt behoben ist.

  4. Hallo,

    ich würde auch gern auf dem 3.19er Kernel wechseln, hauptsächlich weil ich btrfs nutzen will. Das ist auf dem 3.4er leider noch nicht wirklich verwendbar.

    Kannst Du mir sagen, ob der 3.19er Kernel den internen Flash des Cubietrucks unterstützt? Oder muss ich von SD-Karte booten? Ich hatte es zwischenzeitlich mal mit einem 3.18-rc5 probiert, da habe ich den aber nicht ans rennen bekommen.

    Ich fände es extrem toll, wenn Du Deine Kernel-config zur Verfügung stellen könntest. Ich würde die gern als Basis verwenden, und dann ggf. dazupacken, was ich brauche.

    Vielen Dank für Deine Beschreibung.

    Sascha

    1. Hallo Sascha,

      der 3.19er Kernel soll tatsächlich (und erstmalig) NAND unterstützen. Insofern sind die gescheiterten Versuche mit dem 3.18er Kernel schon erklärlich. Ich habe meine Kernel-Konfiguration im Artikel hinterlegt und nun auch eine Version mit NAND-Unterstützung dazugepackt. Ausprobiert habe ich dies noch nicht, kann das aber mal in den nächsten Tagen tun. Bisher hatte ich wenig Interesse auf den NAND-Speicher zuzugreifen, weil dort ein Android-Image liegt (das ich nicht zerstören möchte) und ich ohnehin von SD-Karte und angeschlossener SATA-Festplatte boote.

      1. Hallo Sascha,

        ich habe nun endlich Zeit gefunden, den Kernel mit der NAND-Unterstützung auszuprobieren. Leider erkennt dieser den Flash nicht. Es bleibt also nur von der SD Karte zu starten. Am NAND-Treiber wird zur Zeit noch gearbeitet, eventuell ändert sich das Bild ja mit dem 3.20er Kernel. Sollten hier Patches vor-veröffentlicht werden, kann ich diese ja mal testweise rückportieren.

      2. Hallo,

        vielen Dank für Deine Mühe. Ich bin mittlerweile auch auf eine SD-Card umgestiegen, vielleicht klappt das je mit der 3.20. Ich vermute mal, dass die Geräte MLC haben. Der wird im derzeitigen Treiber noch nicht unterstützt. Dafür habe ich jetzt endlich ein System, bei dem BTRFS vernünftig rennt.

        Ich werde in den nächsten Tagen mal schauen, ob ich den SimpleFB. Momentan baue ich gerade uboot. Dabei musste ich auf meiner Ubuntu 14.10 ARCH und CROSSCOMPILE mit angeben. Das endete in folgendem Aufruf:

        make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

        Vielleicht stolpert ja noch jemand drüber…

      3. Wenn Du den uboot auf einem Desktop-PC übersetzen möchtest, sollte auf jeden Fall die richtige Toolchain zum Übersetzen von ARM-Code installiert sein. Dies geschieht via „apt-get install gcc-arm-linux-gnueabihf„. Anschließend sollte der Compiler mit in den Suchpfad aufgenommen werden. Für die aktuelle Session kann man das über „export PATH="$PATH":/home/user/folder/gcc-linaro-arm-linux-gnueabihf-*_linux/bin/“ machen. Anschließend sollte der uboot mit „make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-“ übersetzbar sein. Diese Schritte sind natürlich nicht nötig, wenn Du den uboot auf dem Cubietruck übersetzt. dann genügt natürlich ein einfaches „make„, denn hier wird ja nicht Cross-Compiliert.
        Ich hoffe das hilft 🙂

      4. Hallo,

        hast Du den Kernel auf dem Cubietruck kompiliert? Wie lange hat das gedauert?

        tschau

        Sascha

      5. Hallo Sascha,

        mein Cubietruck ist üblicherweise ziemlich beschäftigt, daher kann ich keine exakte Zeit angeben. Üblicherweise ist ein Kernel in 1-2 Stunden übersetzt, was natürlich auch sehr von dessen Konfiguration abhängt. Sowohl Gentoo-Updates als auch Kernels übersetzen bei mir mit hohem Nice-Level im Hintergrund. Der Wechsel auf BTRFS hat den Zeitaufwand übrigens (gefühlt) halbiert.

        LG,
        Robert

  5. I understand that is might not be possible to boot a system on a root filesystem in the NAND flash. But is it possible to boot the kernel from flash and use a SATA drive for the system?

    Thanks,
    Phil

  6. Hallo Robert, deine Anleitung war hilfreich, in einem Punkt hat es bei mir aber nicht geklappt: console=ttyS0,115200 macht keinen Sinn, wenn man die default tty Terminals am Monitor verwenden will -> ändern nach tty1 und schon hatte ich ein Bild auf dem HDMI Monitor. Evtl ist eine anschliessende Korrektur der /etc/inittab vonnöten, falls dort das noch ttyS0 Terminal aktiviert ist. Danach läuft alles wie gewünscht und ich boote fertig bis zum Terminal Prompt. Hab Dir den Link zum sunxi mainline wiki hinterlegt, wo dieses Detail erwähnt wurde.

  7. Hallo,
    ich bin sehr unerfahren in diesem Bereich. Ich habe auch einen cubietruck, den ich mit verschiedenen debian distributionen versehen habe. Da ich mit der Performance nicht zu frieden war, wollte ich jetzt gentoo testen. Mein host system ist ein ubuntu. Mein Problem ist: Wo ist mkimage ??? Ich habe versucht u-boot zu bauen, das ging nicht, weil es für arm configured ist …. ?

  8. Okay, ich muss gestehen. Ich habe zu wenig in den Kommentaren gelesen … es funktioniert !!!! Super Seite hier ! Ausserdem bestätigt es mal wieder die Thesen: RFM und „wer lesen kann hat Vorteile“. Danke an alle hier und hauptsächlich an den Author der Page !!!

    1. Na prima, dass es letztendlich geklappt hat. Ich bin ständig dabei den Kernel zu verbessern und an die Einsatzzwecke meiner Leser anzupassen. Sollte noch etwas in den Kernelbuilds fehlen bzw. besser zu konfigurieren sein, bin ich jederzeit für Anregungen offen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Name *

4 × 3 =