ODROID-N2+ was launched in July 2020, but I only got the Amlogic S922X Rev C SBC recently with Hardkernel wanting me to test their latest Ubuntu 21.10 image with the Panfrost open-source GPU driver.
ODROID-N2+ Kit Unboxing
Let’s start by checking out the kit I received from the Korean SBC manufacturer.
The package includes ODROID-N2+ single board computer fitted with a 32GB eMMC flash module, a 12V/2A power supply with an EU plug adapter, an 80mm fan kit, and a USB 3.0 to eMMC reader.
ODROID-N2+ is now only available with 4GB RAM, as the old ODROID-N2 with 2GB was deprecated, and we get four USB 3.0 ports, HDMI 2.0 video output, Gigabit Ethernet networking, and a 40-pin GPIO header with the board cooled by a larger heatsink attached to the bottom of the board.
Fan installation, first boot, and system information
As we’ll see below the fan is not always necessary, but since I got one, I installed it on top of the heatsink using 4 of the 5 spacers provided.
So no we get a board slightly elevated to provide better airflow for the ultra-quiet heatsink that shipped with my board. Since Ubuntu 21.10 is pre-installed on the eMMC flash that come with the board, I could just connect Ethernet, HDMI, USB keyboard and mouse, a USB 3.0 hard drive, and the 12V/2A power supply to get started.
The board is completely silent most of the time since the heatsink will only start if the temperature goes above 65°C, and when it did start under load, I could not hear it, and I had to lift to board to check the fan was indeed spinning. Back to our first boot.
The board is working fine, and the vertical lines are just due to my broken LG TV. The log prompt shows Hardkernel user, and we can login with odroid password, but when we’ll use SSH later we’ll find out we need to use odroid/odroid, as Hardkernel is just the name for odroid user….
Let’s check out some system information:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
odroid@ubuntu:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=21.10 DISTRIB_CODENAME=impish DISTRIB_DESCRIPTION="Ubuntu 21.10" odroid@ubuntu:~$ uname -a Linux ubuntu 5.14.0-odroid-arm64 #1 SMP PREEMPT Ubuntu 5.14.13-202110221853~impish (2021-10-22) aarch64 aarch64 aarch64 GNU/Linux odroid@ubuntu:~$ free -mh total used free shared buff/cache available Mem: 3.6Gi 628Mi 2.3Gi 137Mi 668Mi 2.8Gi Swap: 1.3Gi 0B 1.3Gi odroid@ubuntu:~$ df -mh Filesystem Size Used Avail Use% Mounted on tmpfs 370M 1.7M 369M 1% /run /dev/mmcblk0p2 29G 5.6G 22G 21% / tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock /dev/mmcblk0p1 220M 37M 166M 19% /boot tmpfs 370M 88K 370M 1% /run/user/1000 /dev/sda2 241G 85G 144G 38% /media/odroid/USB3_EXT4 /dev/sda1 245G 194G 51G 80% /media/odroid/USB3_NTFS /dev/sda4 200G 175G 24G 89% /media/odroid/USB3_BTRFS /dev/sda3 245G 163G 82G 67% /media/odroid/USB3_EXFAT odroid@ubuntu:~$ |
Ubuntu 21.10 is installed on a 32GB eMMC flash (29GB rootfs) as expected, and the system comes with 4GB RAM, 3.6GB of which is available to Linux.
We can get more details for inxi, including confirmation Panfrost open-source GPU driver is used in the Ubuntu 21.10 image:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
odroid@ubuntu:~$ inxi -Fc0 System: Host: ubuntu Kernel: 5.14.0-odroid-arm64 aarch64 bits: 64 Console: tty pts/1 Distro: Ubuntu 21.10 (Impish Indri) Machine: Type: ARM Device System: Hardkernel ODROID-N2Plus details: N/A CPU: Info: 6-Core (2-Die) model: N/A variant-1: cortex-a73 variant-2: cortex-a53 bits: 64 type: MCP MCM Speed: 2208 MHz min/max: 1000/2016:2400 MHz Core speeds (MHz): 1: 2016 2: 2016 3: 2208 4: 2208 5: 2208 6: 2208 Graphics: Device-1: meson-g12a-vpu driver: meson_drm v: kernel Device-2: meson-g12a-mali driver: panfrost v: kernel Device-3: meson-g12a-dw-hdmi driver: meson_dw_hdmi v: kernel Display: server: X.org 1.20.13 driver: loaded: meson_dw_hdmi note: n/a (using device driver) tty: 203x55 Message: Advanced graphics data unavailable in console. Try -G --display Audio: Device-1: meson-g12a-dw-hdmi driver: meson_dw_hdmi Device-2: axg-sound-card driver: axg_sound_card Sound Server-1: ALSA v: k5.14.0-odroid-arm64 running: yes Sound Server-2: PulseAudio v: 15.0 running: yes Sound Server-3: PipeWire v: 0.3.32 running: yes Network: Device-1: meson-g12a-dwmac driver: meson8b_dwmac IF: eth0 state: up speed: 1000 Mbps duplex: full mac: 00:1e:06:42:cb:88 Drives: Local Storage: total: 960.63 GiB used: 620.82 GiB (64.6%) ID-1: /dev/mmcblk0 vendor: Samsung model: BJTD4R size: 29.12 GiB ID-2: /dev/sda type: USB vendor: Seagate model: 1 Expansion size: 931.51 GiB Partition: ID-1: / size: 28.3 GiB used: 5.57 GiB (19.7%) fs: ext4 dev: /dev/mmcblk0p2 ID-2: /boot size: 219.4 MiB used: 36.7 MiB (16.7%) fs: ext4 dev: /dev/mmcblk0p1 Swap: ID-1: swap-1 type: file size: 1.34 GiB used: 0 KiB (0.0%) file: /swapfile Sensors: System Temperatures: cpu: 42.6 C mobo: N/A Fan Speeds (RPM): N/A Info: Processes: 256 Uptime: 9m Memory: 3.61 GiB used: 859 MiB (23.2%) Init: systemd runlevel: 5 Shell: Bash inxi: 3.3.06 |
The audio part is also interesting with the new PipeWire audio/video server running alongside the more traditional ALSA and PulseAudio.
Benchmarks
Let’s run some headless and graphics benchmarks on the board.
We’ll start with SBC Bench:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ wget https://raw.githubusercontent.com/ThomasKaiser/sbc-bench/master/sbc-bench.sh $ sudo /bin/bash ./sbc-bench.sh -c WARNING: this tool is meant to run only on Debian Stretch, Buster, Bullseye or Ubuntu Bionic, Focal. When running on other distros results are partially meaningless or can't be collected. Press [ctrl]-[c] to stop or [enter] to continue. sbc-bench v0.8.1 Installing needed tools. This may take some time... Done. Checking cpufreq OPP... Done. Executing tinymembench. This will take a long time... Done. Executing OpenSSL benchmark. This will take 3 minutes... Done. Executing 7-zip benchmark. This will take a long time... Done. Checking cpufreq OPP... Done. Memory performance (big.LITTLE cores measured individually): memcpy: 2256.6 MB/s (0.9%) memset: 7755.6 MB/s memcpy: 4299.9 MB/s memset: 7477.0 MB/s 7-zip total scores (3 consecutive runs): 9800,9774,9802 OpenSSL results (big.LITTLE cores measured individually): type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 176082.23k 523975.23k 1013665.45k 1359812.61k 1510255.27k 1520052.91k aes-128-cbc 421729.18k 1043425.51k 1584737.54k 1810880.17k 1904719.19k 1911783.42k aes-192-cbc 167821.18k 465602.20k 827600.55k 1048505.69k 1136981.33k 1142565.55k aes-192-cbc 391623.20k 926669.76k 1324086.87k 1521390.93k 1589032.28k 1593972.05k aes-256-cbc 162742.46k 427874.47k 717046.87k 877222.91k 938270.72k 942221.99k aes-256-cbc 378114.54k 847673.83k 1187437.06k 1313454.42k 1363293.53k 1366933.50k Full results uploaded to http://ix.io/3DtN. Please check the log for anomalies (e.g. swapping or throttling happenend) and otherwise share this URL. |
No throttling was detected, and I could not hear the fan, but it was most likely triggered based on the temperatures reported:
1 2 3 4 5 6 7 8 9 10 11 12 |
System health while running 7-zip multi core benchmark: Time big.LITTLE load %cpu %sys %usr %nice %io %irq Temp 22:26:18: 2400/2016MHz 4.98 9% 0% 8% 0% 0% 0% 48.8°C 22:26:42: 2400/2016MHz 4.97 90% 0% 89% 0% 0% 0% 64.2°C 22:27:02: 2400/2016MHz 4.99 81% 0% 80% 0% 0% 0% 58.2°C 22:27:22: 2400/2016MHz 4.89 91% 0% 90% 0% 0% 0% 60.2°C 22:27:45: 2400/2016MHz 5.34 91% 0% 90% 0% 0% 0% 65.8°C 22:28:05: 2400/2016MHz 5.16 80% 0% 79% 0% 0% 0% 60.1°C 22:28:25: 2400/2016MHz 5.34 89% 0% 87% 0% 0% 0% 58.6°C 22:28:49: 2400/2016MHz 5.67 91% 0% 90% 0% 0% 0% 65.4°C 22:29:09: 2400/2016MHz 5.56 81% 0% 80% 0% 0% 0% 58.9°C |
Despite not being that loud, my laptop fan would overwhelm the noise from the ODROID-N2+ fan, so it’s barely audible. Note that the fan was only triggered during the more demanding multi-threaded 7-zip benchmark, and most of the time it is not activated. The test occurred in a room with a 28°C ambient temperature.
For reference, the ODROID-N2+ is still significantly faster than a Raspberry Pi 4 overclocked at 2.0 GHz.
Since Panfrost support is one of the highlight of the Ubuntu 21.10 image for ODROID-N2+, let’s double-check i’s needed enabled with glxinfo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Extended renderer info (GLX_MESA_query_renderer): Vendor: Panfrost (0xffffffff) Device: Mali-G52 (Panfrost) (0xffffffff) Version: 21.3.0 Accelerated: yes Video memory: 3698MB Unified memory: yes Preferred profile: core (0x1) Max core profile version: 3.1 Max compat profile version: 3.1 Max GLES1 profile version: 1.1 Max GLES[23] profile version: 3.1 OpenGL vendor string: Panfrost OpenGL renderer string: Mali-G52 (Panfrost) OpenGL core profile version string: 3.1 Mesa 21.3.0-devel (git-4e7a777093) OpenGL core profile shading language version string: 1.40 OpenGL core profile context flags: (none) |
That Panfrost with Mesa 21.3 development branch. The output from glxinfo is rather long, so I’ve included it a pastebin.
Now time for the usual es2gears and glmark2-es2 benchmarks.
es2gears can easily run at 60 fps in full screen mode
glmark2-es2-wayland also worked just fine with the Panfrost open-source driver.
The is the output from the onscreen test:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$ glmark2-es2-wayland ======================================================= glmark2 2021.02 ======================================================= OpenGL Information GL_VENDOR: Panfrost GL_RENDERER: Mali-G52 (Panfrost) GL_VERSION: OpenGL ES 3.1 Mesa 21.3.0-devel (git-4e7a777093) ======================================================= [build] use-vbo=false: FPS: 687 FrameTime: 1.456 ms [build] use-vbo=true: FPS: 1242 FrameTime: 0.805 ms [texture] texture-filter=nearest: FPS: 1460 FrameTime: 0.685 ms [texture] texture-filter=linear: FPS: 1422 FrameTime: 0.703 ms [texture] texture-filter=mipmap: FPS: 1551 FrameTime: 0.645 ms [shading] shading=gouraud: FPS: 867 FrameTime: 1.153 ms [shading] shading=blinn-phong-inf: FPS: 881 FrameTime: 1.135 ms [shading] shading=phong: FPS: 736 FrameTime: 1.359 ms [shading] shading=cel: FPS: 743 FrameTime: 1.346 ms [bump] bump-render=high-poly: FPS: 402 FrameTime: 2.488 ms [bump] bump-render=normals: FPS: 2033 FrameTime: 0.492 ms [bump] bump-render=height: FPS: 1879 FrameTime: 0.532 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 930 FrameTime: 1.075 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 363 FrameTime: 2.755 ms [pulsar] light=false:quads=5:texture=false: FPS: 1794 FrameTime: 0.557 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 274 FrameTime: 3.650 ms [desktop] effect=shadow:windows=4: FPS: 597 FrameTime: 1.675 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 216 FrameTime: 4.630 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 83 FrameTime: 12.048 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 261 FrameTime: 3.831 ms [ideas] speed=duration: FPS: 487 FrameTime: 2.053 ms [jellyfish] <default>: FPS: 767 FrameTime: 1.304 ms [terrain] <default>: FPS: 36 FrameTime: 27.778 ms [shadow] <default>: FPS: 227 FrameTime: 4.405 ms [refract] <default>: FPS: 71 FrameTime: 14.085 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 1454 FrameTime: 0.688 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 1544 FrameTime: 0.648 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 1537 FrameTime: 0.651 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 1519 FrameTime: 0.658 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 1201 FrameTime: 0.833 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 1098 FrameTime: 0.911 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 2077 FrameTime: 0.481 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 1876 FrameTime: 0.533 ms ======================================================= glmark2 Score: 979 ======================================================= |
The glmark2 score is 979 points. A few years ago we wrote about the same test with ODROID-N2 running Ubuntu 18.04 + Gnome3 + Linux 5.0 on top of Wayland with GPU drivers from Arm. The score was 1,119 points. That was two years ago, a lot must have changed, but it appears the open-source driver might be a little slower than the closed-source driver. I can also see Panfrost relies on OpenGL ES 3.1, while the Arm driver used OpenGL ES 3.2.
I also tried the benchmark in offscreen mode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
glmark2-es2-wayland --off-screen ======================================================= glmark2 2021.02 ======================================================= OpenGL Information GL_VENDOR: Panfrost GL_RENDERER: Mali-G52 (Panfrost) GL_VERSION: OpenGL ES 3.1 Mesa 21.3.0-devel (git-4e7a777093) ======================================================= [build] use-vbo=false: FPS: 532 FrameTime: 1.880 ms [build] use-vbo=true: FPS: 787 FrameTime: 1.271 ms [texture] texture-filter=nearest: FPS: 822 FrameTime: 1.217 ms [texture] texture-filter=linear: FPS: 834 FrameTime: 1.199 ms [texture] texture-filter=mipmap: FPS: 856 FrameTime: 1.168 ms [shading] shading=gouraud: FPS: 635 FrameTime: 1.575 ms [shading] shading=blinn-phong-inf: FPS: 610 FrameTime: 1.639 ms [shading] shading=phong: FPS: 581 FrameTime: 1.721 ms [shading] shading=cel: FPS: 581 FrameTime: 1.721 ms [bump] bump-render=high-poly: FPS: 343 FrameTime: 2.915 ms [bump] bump-render=normals: FPS: 937 FrameTime: 1.067 ms [bump] bump-render=height: FPS: 879 FrameTime: 1.138 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 931 FrameTime: 1.074 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 393 FrameTime: 2.545 ms [pulsar] light=false:quads=5:texture=false: FPS: 887 FrameTime: 1.127 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 312 FrameTime: 3.205 ms [desktop] effect=shadow:windows=4: FPS: 711 FrameTime: 1.406 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 226 FrameTime: 4.425 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 84 FrameTime: 11.905 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 267 FrameTime: 3.745 ms [ideas] speed=duration: FPS: 314 FrameTime: 3.185 ms [jellyfish] <default>: FPS: 584 FrameTime: 1.712 ms [terrain] <default>: FPS: 39 FrameTime: 25.641 ms [shadow] <default>: FPS: 197 FrameTime: 5.076 ms [refract] <default>: FPS: 66 FrameTime: 15.152 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 861 FrameTime: 1.161 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 858 FrameTime: 1.166 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 837 FrameTime: 1.195 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 854 FrameTime: 1.171 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 801 FrameTime: 1.248 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 817 FrameTime: 1.224 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 846 FrameTime: 1.182 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 842 FrameTime: 1.188 ms ======================================================= glmark2 Score: 609 ======================================================= |
The score is lower, which does not make any sense to me.
User Experience with ODROID-N2+
I’ve tested some of the supported features of Ubuntu 21.10 on the board to see how well it would work as a desktop machine:
- Multi-tasking – Launch Firefox, Thunderbird, LibreOffice Writer, and Gimp in sequence from a cold boot
- Web browsing with Firefox and Chromium – Opening multiple tabs, Youtube 1080p, 1440p, and 2160p (4K), WebGL demo: Aquarium
- Gaming with SuperTuxKart and Dolphin emulator
You can watch the video below.
In summary, ODROID-N2+ is fast for an Arm platform. For perfectly smooth video playback in YouTube better use 720p at this time. Firefox uses H.264 video decoding limited to 1080p, while Chromium supports up to 4K using VP9, but it’s unwatchable. The WebGL aquarium demo renders at 16-17 fps in Firefox with 500 fish, but only 3 fps in Chromium, probably because GPU acceleration is not supported/enabled? SuperTuxKart plays OK in full-screen mode, but it’s not as smooth as I would like. I tried Super Mario Sunshine in the Dolphin emulator, and it worked very well.
I had an issue with white text on white background in the Dolphin emulator, and the workaround was to switch to the dark theme in Ubuntu’s Appearance Settings.
I also wanted to play 4K video with other programs and command-line utilities, but I could not install Kodi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo add-apt-repository ppa:team-xbmc/ppa $ sudo apt install kodi Reading package lists... Done Building dependency tree... Done Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: kodi : Depends: kodi-bin (< 6:19.3+git20211024.1941-49a04cd6a7-0~impish.1~) but it is not installable Recommends: i965-va-driver but it is not installable Recommends: kodi-peripheral-joystick but it is not installable Recommends: kodi-inputstream-adaptive but it is not installable Recommends: kodi-inputstream-rtmp but it is not installable E: Unable to correct problems, you have held broken packages. |
VLC would just show a black screen with audio playing fine, and the command line tools listed in the wiki namely kplayer and c2play were not installed, and I did not manage to build the latter from source. I asked Hardkernel yesterday morning, but I still have received an answer, and I’ll update the post if there’s a solution. I can see the download page still does not have Ubuntu 21.10 for download, so it may mean the image is still being worked on. Anyway, it’s very good we’ve come to a point where an open-source Arm Mali GPU driver is usable in a modern SoC.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress
It’s not an amazing gles2 performance. Rpi4 with the gpu overclocked performs quite similar on wayland. It’s on X11 that the n2 and the rpi4 sunk deeply…memory bandwidth.
Surrounding heatsink+fan certainly makes for a minimalist case design
As the author of c2play, I can state that it will not work on 5.x kernels. The reason is that mainline Linux uses V4L2 for hardware codecs. C2play is designed to use Amlogic’s 4.9 kernel codec interface.
I got 1244 glmark2-es2-wayland score with my bild Debian11+Mesa 21.2.4+Linux Kernel 5.15.1-darkstar on GT-King-Pro yesterday. You can check it on bee-links forum.
Looks like you didn’t get the case. I originally didn’t order it either, but then I saw how clean it was and decided to upgrade. The case is two pieces which slide together from front and back and lock in place. There’s still access to all connectors, but the main board is protected from accidental contact.
A pity it was not part of the giveaway week 😛
Don’t get greedy.
Where can I get the software? Whats the URL?
I think they are probably still working on it because at the time of my review, it was not really ready for primetime, and I can’t see any download link yet either in the Wiki or forums.
Any idea of how to download this image?
Would you be able to perform an HDMI capture and video encode test?
I don’t have the board with me, but since it does not have HDMI input, I’m not sure how HDMI video capture would work.
There should be a frictionless way for the Internet to route unbroken TVs people routinely throwaway to anyone who wants one to replace their broken one. Not a pro-look to model functionality on a broken TV.