Odroid C2 mit Arch Mainline Kernel

Der Einplatinencomputer Odroid-C2 von Hardkernel wird standardmäßig mit dem nicht mehr ganz aktuellen Kernel 3.14.x ausgeliefert. Unter Arch Linux läuft mein System aktuell mit dem Mainline Kernel. So steht immer die aktuelle Version des Linux Kernels zur Verfügung. Allerdings ist dieser Vorgang mit ein wenig Vorsicht zu betrachten. Es ist nicht garantiert, dass alle Funktionen mit dem Mainline Kernel gegeben sind, da durchaus benötigte Patches fehlen können. Im reinen Headless Betrieb kann ich auf alle wichtigen Funktionen wie Ethernet und USB Ports zugreifen. Der Wechsel auf den Mainline Kernel ist generell nicht kompliziert. Allerdings empfiehlt sich auf jeden Fall im Vorfeld ein Backup anzulegen, um wieder ohne großen Aufwand auf die vorherige Version zurückwechseln zu können. Eine einfache Lösung liefert Partclone unter Linux. Damit lassen sich komprimierte Images einer Partition anlegen.

Wie der Vorgang funktioniert, ist hier beschrieben. Klick
Ist das Image des aktuellen Zustands erzeugt, sollte das System auf den aktuellen Stand gebracht werden.

sudo pacman -Syu

Um den Mainline Kernel auch starten zu können, muss zusätzlich auf die U-Boot Mainline Version gewechselt werden. Die aktuell eingesetzte Version wird dazu entfernt.

sudo pacman -R uboot-odroid-c2

Sollte später wieder das Image mit dem ausgelieferten Kernel zurückgewechselt werden, muss der Bootloader angepasst werden. Wie das funktioniert, folgt später. Um die Mainline Versionen des Kernels und U-Boots zu nutzen, werden diese aus den Repositories installiert.

sudo pacman -S uboot-odroid-c2-mainline linux-aarch64

Danach wird der Odroid-C2 neu gestartet.

Odroid-C2 Arch Linux Mainline Kernel

Mit dem Mainline Kernel sollte geprüft werden, ob alle Systemdienste ordentlich laufen.

sudo systemctl list-units

Zum Zeitpunkt der Erstellung des Artikels mit Kernel 4.14 hatte ich Probleme mit “haveged” und “cpupower”. Damit cpupower wieder funktioniert, muss die boot.txt angepasst und danach in eine boot.scr konvertiert werden.

cd /boot
sudo nano boot.txt

Folgender Inhalt muss eingefügt werden.

#add support for cpupower
fdt addr ${fdt_addr_r}; fdt set /scpi/clocks status okay;

Die gesamte boot.txt sieht dann so aus:

# After modifying, run ./mkscr

test -n "${distro_bootpart}" || setenv distro_bootpart 1
part uuid ${devtype} ${devnum}:${distro_bootpart} uuid
setenv bootargs "console=ttyAML0,115200n8 root=PARTUUID=${uuid} rw rootwait earlycon"

if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /boot/Image; then
  if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /boot/dtbs/${fdtfile}; then

    #add support for cpupower
    fdt addr ${fdt_addr_r}; fdt set /scpi/clocks status okay;

    if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /boot/initramfs-linux.img; then
      booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
    else
      booti ${kernel_addr_r} - ${fdt_addr_r};
    fi;
  fi;
fi

Damit die angepasste Datei auch angewendet wird, muss eine neue boot.scr Datei erstellt werden. Dazu muss das Paket „uboot-tools“ installiert sein.

sudo ./mkscr

Nach einem Neustart funktioniert auch cpupower wieder. Haveged kann durch “rng-tools” ersetzt werden.

sudo pacman -R haveged
sudo pacman -S rng-tools

Um die rng-tools sauber zu verwenden, wird die Konfiguration entsprechend angepasst.

sudo nano /etc/conf.d/rngd
RNGD_OPTS="-o /dev/random -r /dev/hwrng”

Danach kann der Dienst gestartet werden.

sudo systemctl enable rngd.servive
sudo systemctl enable rngd.servive

Wird der Odroid-C2 mit einem eMMC Modul betrieben, kann es mit dem Mainline Kernel zu CRC Fehlern beim Starten kommen. Das Dateisystem wird dann nur noch im Lesemodus eingebunden. Um das zu verhindern, kann die Taktung des eMMC Moduls heruntergesetzt werden. Dazu muss der vorhandene Device Tree Blob wieder in ein Device Tree Source rekompiliert werden.

cd /boot/dtbs/amlogic
sudo dtc -I dtb -O dts -o meson-gxbb-odroidc2.dts meson-gxbb-odroidc2.dtb
sudo nano meson-gxbb-odroidc2.dts

In der Datei gibt es zwei Einträge für „max-frequency“. Der erste Eintrag ist für die SD Karte, der zweite für das eMMC Modul. Das eMMC Modul hat standardmäßig einen Wert von „200000000“ oder „0xbebc200“ in Hex Form. Um die CRC Fehler zu vermeiden, kann der Wert auf „0x8f0d180“ (150000000) gesetzt werden. Danach muss das DTS wieder in ein DTB kompiliert werden.

sudo dtc -O dtb -b O -o meson-gxbb-odroidc2.dtb meson-gxbb-odroidc2.dts

Ab jetzt sollte das System ohne Fehler starten.

Der Wechsel auf den ursprünglichen Kernel kann auch direkt aus dem System erfolgen, ohne das Image zurückzuspielen.

sudo pacman -R uboot-odroid-c2-mainline
sudo pacman -S uboot-odroid-c2 linux-odroid-c2

Sollte das erstellte Image zurückgespielt werden, muss noch zusätzlich der Bootloader angepasst werden. Dazu wird die SD Karte oder das eMMC Modul eingebunden, um es bearbeiten zu können. Das Gerät „/dev/sdX“ muss natürlich an den tatsächlichen Namen angepasst werden.

sudo mkdir /mnt/odroid
sudo mount /dev/sdX1 /mnt/odroid
cd /mnt/odroid/boot
sudo ./sd_fusing.sh /dev/sdX
cd ../..
sudo umount /mnt/odroid

Ohne diesen Schritt würde das System nicht mehr starten.
Der Wechsel auf den Mainline Kernel unter Arch Linux ist nicht sonderlich aufwändig. Allerdings sollte im Vorfeld geprüft werden, welche Funktionalitäten zwingend gegeben sein müssen. Auch nach dem Wechsel sollte auf jeden Fall geprüft werden, ob das System in einem brauchbaren Zustand ist, bevor es ansonsten im laufenden Betrieb zu permanenten Störungen kommt.