Odroid XU4 (Debian 8 through 10)
This page contains archived notes on Debian 8/9/10 on the Odroid XU4. For up to date instructions on recent Armbian installations on it, see the Odroid XU4 page.
Hardkernel, the manufacturer, is nice enough to include a power supply in the
package. They also offer eMMC modules (or microSD cards) with Linux pre-installed
- I picked the minimum size (8 GB) and installed a trimmed Debian Jessie image
on it. The modules themselves seem to come with Ubuntu or Android. You also get
a microSD adapter to flash the eMMC module with. Hardkernel ships an older LTS
kernel (3.10). The upside of course is this will be maintained for a while,
and that's where my AD10 was problematic - for HDMI audio to work in a command
line environment, I was stuck with kernel 3.11. Here, everything works out of the
box. All I needed to do was install MPD, mount the music NFS share, make sure
the HDMI output was kept active - append consoleblank=0
to your kernel command
line in /boot/boot.ini
- and the box was good to go.
Setup for Debian 8 'Stretch' / 9 'Jessie' / 10 'Buster'
The sections below covers the original setup on the XU4: a Debian image with tailored 4.9 (and later 4.14) kernel on Debian Stretch, Jessie and then Buster.
If you prefer setting things up headlessly, just make sure you allow remote root
logins before you boot your Odroid. The image author has disabled remote root login
with a password, but if you intend to set it up remotely, it's a chicken and egg
problem - my Logitech Unified receiver is not supported on a 3.10 kernel, which
means a perpetual QWERTY layout, and endless irritation (how do I type :wq
in
Vim?!). So, mount your module or SD card on the system you flashed it on and fix
that before you try your hand at a remote setup. Just a word of warning. Since I
have set up Salt a while ago, and had also integrated the bits and pieces for my
previous MPD server, further configuration was pretty straightforward: just a few
switches to flip, so to speak.
Limiting fan noise
I have seen some people over at the Hardkernel forums modding their XU4 with a
fanless heatsink, but that approach has its own headaches. Apparently the biggest
jump in power is from 1,9 GHz to 2,0 GHz, which will surely trigger the fan. Oddly
enough, the default governor is set to performance
. You can set this directly at
boot by editing /boot/boot.ini
and setting it to ondemand
. I have also limited
the maximum clock speed of the four 'big' cores to 1,5 GHz, with this in /etc/rc.local
:
for i in 4 5 6 7
do
echo "1500000" > "/sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq"
done
You can of course limit this further; the cores take increments of 100 MHz. I have not tested if the fan spins back on while under sustained load. Under normal circumstances, you will rarely hear it spin up though, and the SoC is still plenty fast at 1,5 GHz. You can check the temperature with the following command:
$ cat /sys/devices/10060000.tmu/temp
sensor0 : 46000
sensor1 : 48000
sensor2 : 51000
sensor3 : 47000
sensor4 : 45000
I only found out after ordering that Hardkernel reports their C1 heatsink to be compatible with the XU4. If you get it, just don't apply the TIM.
Hardware on/off button
I kind of hoped (naively, I guess) that the presence of a hardware button would mean
I could plug in the device and push that button to start it. Alas, it does not - the
moment you plug it into a wall socket, the Odroid will boot up. It does allow you
though to shut it down - it's not clear if this happens cleanly or not; it certainly
works, but the VFAT /boot
partition always has its dirty bit set next time it comes
up. Either way: shutdown works, and after that, you can boot up just fine as well by
pushing the power button.
Upgrade to Debian 9 'Stretch'
Upgrading to Stretch is as easy as replacing all Jessie entries in /etc/apt/sources.list
with Stretch ones. Meveric's meveric-all
repository is OS independent. I don't use
the deb-multimedia
repository, but I suppose by now (November 2017) they have Stretch
repositories up as well. This won't touch your kernel, however, since the provided kernel
is not part of the Debian repositories. Similarly, you can replace the Stretch entries
with Buster ones and like that upgrade to Debian 10 (while staying on the same kernel).
Kernel 4.9 (LTS)
Hardkernel provides a 4.9 kernel (they are even working on the next planned LTS - 4.14). Switching to the 4.9 release, however, requires a bit of manual work. First, install the 4.9 release:
$ sudo apt-get install linux-image-4.9-armhf-odroid-xu3
Make sure to install the newest uboot
package as well. That should be at least the following
version:
$ sudo dpkg -l|awk '/uboot/ {print $3}'
20170824-9+deb8u1
Uboot should replace /boot/boot.ini
; however, in case it does not, make sure to adapt
/boot/boot.ini
since kernel 4.9 will need the Odroid XU4 DTS to be loaded. It
won't work with the U3 DTS like 3.10 used to.
Find this section - it might look a bit different, but the fatload
commands should be the same:
# Load kernel, initrd and dtb in that sequence
fatload mmc 0:1 0x40008000 zImage
fatload mmc 0:1 0x42000000 uInitrd
if test "${board_name}" = "xu4"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu4.dtb; setenv fdtloaded "true"; fi
if test "${board_name}" = "xu3"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu3.dtb; setenv fdtloaded "true"; fi
if test "${board_name}" = "xu3l"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu3-lite.dtb; setenv fdtloaded "true"; fi
#failsafe
if test "${fdtloaded}" != "true"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu4.dtb; fi
Replace it with this:
# Load kernel, initrd and dtb in that sequence
fatload mmc 0:1 0x40008000 zImage
fatload mmc 0:1 0x42000000 uInitrd
if test "${board_name}" = "xu4"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu4.dtb; setenv fdtloaded "true"; fi
if test "${board_name}" = "xu3"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu3.dtb; setenv fdtloaded "true"; fi
if test "${board_name}" = "xu3l"; then fatload mmc 0:1 0x44000000 exynos5422-odroidxu3-lite.dtb; setenv fdtloaded "true"; fi
#force xu4
fatload mmc 0:1 0x44000000 exynos5422-odroidxu4.dtb
Kernel 4.9 has no fan control implemented so far, so you need a workaround for this. Add the
following to /etc/rc.local
. Adjust the trip points and fan speeds to your liking.
echo Set thermal trip points to 60C and higher
echo '60000' > /sys/devices/virtual/thermal/thermal_zone0/trip_point_0_temp
echo '70000' > /sys/devices/virtual/thermal/thermal_zone0/trip_point_1_temp
echo '80000' > /sys/devices/virtual/thermal/thermal_zone0/trip_point_2_temp
fi
if [ -f '/sys/devices/platform/pwm-fan:/hwmon/hwmon0/fan_speed' ]; then
#set fan speed
echo Set fan speed
echo "0 80 150 245" > /sys/devices/platform/pwm-fan:/hwmon/hwmon0/fan_speed
fi