Khadas Captain / Edge SBC Review – Part 2: Ubuntu 18.04

I received Khadas Edge Developer Package with Khadas Edge RK3399 module, Khadas Captain carrier board, and several accessories a few weeks ago, and after checking the hardware in the first part of the review, I’ve now taken the time to review software support, specially Ubuntu 18.04 on the board.

Khadas Edge / Captain Firmware

There are currently four main choices of firmware for Khadas Edge / Khadas Captain:

I decided to focus on Ubuntu 18.04 for this review, and Karl who has his own sample will review the stable Android Nougat firmware that has been released a few days ago.

Khadas Captain First Boot to Android, and Firmware Update to Ubuntu 18.04

Let’s connect the board to an HDMI TV, Ethernet, and the USB Type-C power supply, to see if it boots just fine.

Khadas Edge USB-C Power Supply, HDMI, Ethernet

After applying power, Android OS will boot within a few seconds.

Khadas Edge Android
Click to Enlarge

But we want to upgrade the firmware, and it’s possible to do so with SDcard or USB type-C cable method. I went with the USB method in Ubuntu 18.04:

But initially there was just a small problem:

Oops, so this would only work with Ubuntu 16.04, so I tried with docker:

But the installation would not complete, and then tried to modify the script to force it to work in Ubuntu 18.04, but it turned out not to be such a good idea with carefully reading the code, as bad things happened with my file system on my laptop switching to read-only, and after rebooting to “solve the issue”, my computer would not boot anymore. It took me 6 hours to solve… Oh well.

I finally switched to an Ubuntu 16.04 laptop with I picked to fix my main laptop.

./INSTALL 
Installing Amlogic flash-tool…
===============================================
Host PC: Ubuntu 16.04
===============================================
Installing USB rules…
Installing flash-tool…
Done!
Installing Rockchip flash-tool…
===============================================
Host PC: Ubuntu 16.04
===============================================
Installing USB rules…
Installing flash-tool…
Installing configuration…
Done!
Installing Khadas burn-tool…
Done

But luckily, if you run the latest LTS version of Ubuntu, you don’t have to through the pain I experienced, as the company reacted, and eventually added support for Ubuntu 18.04:

./INSTALL
Installing Amlogic flash-tool...

===============================================

Host PC: Ubuntu 18.04

===============================================

Installing USB rules...
Installing flash-tool...
Done!

Installing Rockchip flash-tool...

===============================================

Host PC: Ubuntu 18.04

===============================================

Installing USB rules...
Installing flash-tool...
Installing configuration...
Done!

Installing ToneBoard burn-tool...

===============================================

Host PC: Ubuntu 18.04

===============================================

Installing USB rules...
Installing toneboard-burn-tool...
Done!
Installing Khadas burn-tool...
Done!

The new step is to download the firmware, extract it:

wget https://dl.khadas.com/Firmware/Edge/Ubuntu/EMMC/Edge_Ubuntu-lxde-bionic_Linux-4.4_arm64_EMMC_V20181115.7z
7z x Edge_Ubuntu-lxde-bionic_Linux-4.4_arm64_EMMC_V20181115.7z 

But before flashing the firmware, you’ll need to enter Upgrade Mode with one of five methods. If you don’t, the flash tool will return an error:

ERROR: You should put your board enter upgrade mode!

I used to TST (Terry’s Smart Tweezers) method to enter firmware upgrade mode, and connected relevant cables as shown below.

Khadas Edge Upgrade ModeIt does not matter which USB type-C port is used for power and data connection. To enter firmware upgrade mode, I pressed the functions key three times within 2 seconds, and the Blue LED started to blink to indicate upgrade mode is activate. We can now run the command to flash the firmware:

rk-burn-tool -i Edge_Ubuntu-lxde-bionic_Linux-4.4_arm64_EMMC_V20181115/Edge_Ubuntu-lxde-bionic_Linux-4.4_arm64_EMMC_V20181115.img 
Burn to eMMC...
Rockchip Android image (or linux image compatible with AndroidTool one image burning) found!
Try to burn Rockchip image...
Loading firmware...
Support Type:RK330C	FW Ver:6.0.41	FW Time:2018-11-15 10:05:44
Loader ver:1.15	Loader Time:2018-11-15 10:01:03
Upgrade firmware ok.
Done!

The board will automatically reboot, and boot to Ubuntu 18.04 with LXDE.

Khadas Edge Ubuntu 18.04

Khadas Captain & Edge System Information

Use khadas /khadas username and password to login. I also connected more peripherals include a USB hard drive, and a USB RF dongle for my keyboard and mouse.

Khadas Edge Review
Click to Enlarge

I also connected through SSH from my laptop since it’s easier to copy/paste terminal output that way:

ssh khadas@khadas.local
khadas@khadas.local's password: 

Welcome to Fenix 0.4 Ubuntu 18.04.1 LTS Linux 4.4.154  
 _  ___               _              ____            _        _       
| |/ / |__   __ _  __| | __ _ ___   / ___|__ _ _ __ | |_ __ _(_)_ __  
| ' /| '_ \ / _ |/ _ |/ _ / __| | |   / _ | '_ \| __/ _` | | '_ \ 
| . \| | | | (_| | (_| | (_| \__ \ | |__| (_| | |_) | || (_| | | | | |
|_|\_\_| |_|\__,_|\__,_|\__,_|___/  \____\__,_| .__/ \__\__,_|_|_| |_|
                                              |_|                     

 * Website:        https://www.khadas.com
 * Documentation:  https://docs.khadas.com
 * Forum:          https://forum.khadas.com

Last login: Mon Dec 17 14:31:35 2018 from 192.168.1.22
khadas@Khadas:~$ uname -a
Linux Khadas 4.4.154 #11 SMP Wed Nov 14 11:01:05 CST 2018 aarch64 aarch64 aarch64 GNU/Linux
khadas@Khadas:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            946M     0  946M   0% /dev
tmpfs           190M  656K  190M   1% /run
/dev/mmcblk1p7   15G  2.7G   12G  20% /
tmpfs           950M   12M  938M   2% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           950M     0  950M   0% /sys/fs/cgroup
tmpfs           190M   16K  190M   1% /run/user/1000
/dev/sda2       241G  181G   48G  80% /media/khadas/USB3_EXT4
/dev/sda1       245G  182G   63G  75% /media/khadas/USB3_NTFS
khadas@Khadas:~$ free -mh
              total        used        free      shared  buff/cache   available
Mem:           1.9G        711M        256M         23M        932M        1.1G
Swap:          949M        1.3M        948M
khadas@Khadas:~$ zramctl
NAME       ALGORITHM DISKSIZE  DATA  COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram4 lzo         237.4M  352K   155K  420K       1 [SWAP]
/dev/zram3 lzo         237.4M  344K 146.2K  440K       1 [SWAP]
/dev/zram2 lzo         237.4M  344K 141.6K  464K       1 [SWAP]
/dev/zram1 lzo         237.4M  348K 140.4K  432K       1 [SWAP]

The board run Ubuntu 18.04 with Linux 4.4.154, and since I have Khadas Edge Basic board fitted into Khadas Captain carrier board there’s 1.9GB RAM, and a 15 GB rootfs partition. Khadas team also decided to enable ZRAM by default which is not a bad idea.

lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda            8:0    0 931.5G  0 disk 
├─sda1         8:1    0 244.1G  0 part /media/khadas/USB3_NTFS
├─sda2         8:2    0 244.1G  0 part /media/khadas/USB3_EXT4
├─sda3         8:3    0 244.1G  0 part 
└─sda4         8:4    0 199.1G  0 part 
mmcblk1      179:0    0  14.6G  0 disk 
...

All the four partitions in my hard drive are detected, but only EXT4 and NTFS partitions could be mounted, since BTRFS and exFAT are not enabled in the kernel. That should be something easy enough to do on your own.

lsmod
Module                  Size  Used by
zram                   32768  4
lz4_compress           16384  1 zram
bcmdhd               1249280  0
lzo_compress           16384  1 zram

Load kernel modules are mostly for ZRAM support, except for bcmdhd WiFi driver.

GPIO are enabled like in other RK3399 boards:

ls /sys/class/gpio/
export  gpiochip0  gpiochip128  gpiochip32  gpiochip64  gpiochip96  unexport

The GPIO definitions are a little different, and it does not look like all are enabled in the current Ubuntu image:

sudo cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/pinctrl, gpio0:
 gpio-1   (                    |vcc_sd              ) out hi    
 gpio-4   (                    |bt_default_wake_host) out hi    
 gpio-5   (                    |GPIO Key Power      ) in  hi    
 gpio-6   (                    |?                   ) out lo    

GPIOs 32-63, platform/pinctrl, gpio1:
 gpio-34  (                    |int-n               ) in  hi    
 gpio-45  (                    |vsel                ) out lo    

GPIOs 64-95, platform/pinctrl, gpio2:
 gpio-83  (                    |bt_default_rts      ) out lo    
 gpio-90  (                    |bt_default_wake     ) out hi    
 gpio-91  (                    |bt_default_reset    ) out hi    
 gpio-92  (                    |reset               ) out hi    

GPIOs 96-127, platform/pinctrl, gpio3:
 gpio-111 (                    |mdio-reset          ) out hi    

GPIOs 128-159, platform/pinctrl, gpio4:
 gpio-153 (                    |vcc5v0_host         ) out hi    
 gpio-154 (                    |vbus-5v             ) out lo    
 gpio-158 (                    |int-n               ) in  hi  

3D Graphics Acceleration on Khadas Edge with Ubuntu 18.04

es2_info and es2gears are already installed.

es2_info
EGL_VERSION: 1.4 Midgard-"r14p0-01rel0"
EGL_VENDOR: ARM
EGL_EXTENSIONS:
    EGL_KHR_image_pixmap, EGL_KHR_partial_update, EGL_KHR_config_attribs, 
    EGL_KHR_image, EGL_KHR_image_base, EGL_KHR_fence_sync, EGL_KHR_wait_sync, 
    EGL_KHR_gl_colorspace, EGL_KHR_get_all_proc_addresses, 
    EGL_IMG_context_priority, EGL_ARM_pixmap_multisample_discard, 
    EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_renderbuffer_image, 
    EGL_KHR_create_context, EGL_KHR_surfaceless_context, 
    EGL_KHR_gl_texture_cubemap_image, EGL_EXT_create_context_robustness, 
    EGL_KHR_cl_event2
EGL_CLIENT_APIS: OpenGL_ES
GL_VERSION: OpenGL ES 3.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3
GL_RENDERER: Mali-T860
GL_EXTENSIONS:
    GL_ARM_rgba8, GL_ARM_mali_shader_binary, GL_OES_depth24, 
    GL_OES_depth_texture, GL_OES_depth_texture_cube_map, 
    GL_OES_packed_depth_stencil, GL_OES_rgb8_rgba8, GL_EXT_read_format_bgra, 
    GL_OES_compressed_paletted_texture, GL_OES_compressed_ETC1_RGB8_texture, 
    GL_OES_standard_derivatives, GL_OES_EGL_image, GL_OES_EGL_image_external, 
    GL_OES_EGL_image_external_essl3, GL_OES_EGL_sync, GL_OES_texture_npot, 
    GL_OES_vertex_half_float, GL_OES_required_internalformat, 
    GL_OES_vertex_array_object, GL_OES_mapbuffer, 
    GL_EXT_texture_format_BGRA8888, GL_EXT_texture_rg, 
    GL_EXT_texture_type_2_10_10_10_REV, GL_OES_fbo_render_mipmap, 
    GL_OES_element_index_uint, GL_EXT_shadow_samplers, 
    GL_OES_texture_compression_astc, GL_KHR_texture_compression_astc_ldr, 
    GL_KHR_texture_compression_astc_hdr, 
    GL_KHR_texture_compression_astc_sliced_3d, GL_KHR_debug, 
    GL_EXT_occlusion_query_boolean, GL_EXT_disjoint_timer_query, 
    GL_EXT_blend_minmax, GL_EXT_discard_framebuffer, 
    GL_OES_get_program_binary, GL_OES_texture_3D, GL_EXT_texture_storage, 
    GL_EXT_multisampled_render_to_texture, GL_OES_surfaceless_context, 
    GL_OES_texture_stencil8, GL_EXT_shader_pixel_local_storage, 
    GL_ARM_shader_framebuffer_fetch, 
    GL_ARM_shader_framebuffer_fetch_depth_stencil, GL_ARM_mali_program_binary, 
    GL_EXT_sRGB, GL_EXT_sRGB_write_control, GL_EXT_texture_sRGB_decode, 
    GL_KHR_blend_equation_advanced, GL_KHR_blend_equation_advanced_coherent, 
    GL_OES_texture_storage_multisample_2d_array, GL_OES_shader_image_atomic, 
    GL_EXT_robustness, GL_EXT_draw_buffers_indexed, 
    GL_OES_draw_buffers_indexed, GL_EXT_texture_border_clamp, 
    GL_OES_texture_border_clamp, GL_EXT_texture_cube_map_array, 
    GL_OES_texture_cube_map_array, GL_OES_sample_variables, 
    GL_OES_sample_shading, GL_OES_shader_multisample_interpolation, 
    GL_EXT_shader_io_blocks, GL_OES_shader_io_blocks, 
    GL_EXT_tessellation_shader, GL_OES_tessellation_shader, 
    GL_EXT_primitive_bounding_box, GL_OES_primitive_bounding_box, 
    GL_EXT_geometry_shader, GL_OES_geometry_shader, 
    GL_ANDROID_extension_pack_es31a, GL_EXT_gpu_shader5, GL_OES_gpu_shader5, 
    GL_EXT_texture_buffer, GL_OES_texture_buffer, GL_EXT_copy_image, 
    GL_OES_copy_image, GL_EXT_color_buffer_half_float, 
    GL_EXT_color_buffer_float, GL_EXT_YUV_target, GL_OVR_multiview, 
    GL_OVR_multiview2, GL_OVR_multiview_multisampled_render_to_texture, 
    GL_KHR_robustness, GL_KHR_robust_buffer_access_behavior, 
    GL_EXT_draw_elements_base_vertex, GL_OES_draw_elements_base_vertex

es2gears works OK, but the framerate is a little on the low side.

Khadas Edge es2gears Ubuntu-18.04

I could run glmark2-es2 after installing it:

apt install glmark2-es2
khadas edge glmark2-es2
Click to Enlarge

The score was 42 with some of the benchmark maxing out at 50 fps because video output was 720p50. But then I wanted to repeat glmark2-es2 benchmark in offscreen  mode, and I decided to install gimp as well. After a while, the system logged out automatically, and 3D GPU drivers did not work any more:

khadas@Khadas:~$ glmark2-es2
Error: eglInitialize() failed with error: 0x3001
Error: eglInitialize() failed with error: 0x3001
Error: main: Could not initialize canvas

I first through gimp may have messed with the GPU drivers somehow, and reinstalled the firmware with rk-flash-tool, but the resulting remained the same, and Khadas was unable to provide a solution in time for this review. So I somehow permanently lost accelerated 3D graphics on the board for the rest of the review.

Khadas Edge Video Playback

When trying to play videos from the NTFS partition of the USB drive, or copy files from the USB to the eMMC flash the connection would often fail, interrupting video playback or file copy. That’s what it would look like in the kernel log:

[ 3224.443270] usb 5-1: USB disconnect, device number 5
[ 3224.445235] sd 3:0:0:0: [sda] tag#0 uas_zap_pending 0 uas-tag 1 inflight: CMD 
[ 3224.445255] sd 3:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 3d 09 07 80 00 00 08 00
[ 3224.445385] sd 3:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x01 driverbyte=0x00
[ 3224.445394] sd 3:0:0:0: [sda] tag#0 CDB: opcode=0x28 28 00 3d 09 07 80 00 00 08 00
[ 3224.445402] blk_update_request: I/O error, dev sda, sector 1024001920
[ 3224.456266] sd 3:0:0:0: [sda] Synchronizing SCSI cache
[ 3224.531000] sd 3:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=0x07 driverbyte=0x00
[ 3224.964000] usb 5-1: new high-speed USB device number 6 using ehci-platform

At some point, I finally managed to play a 1080p60 video with mpv, but it relies on software decoding at this point, and the video was very choppy.

Khadas Edge Ubuntu Video Playback
Click to Enlarge

It’s unclear how to play 1080p or 4K videos smoothly in Ubuntu 18.04, so instead you may have to use LibreELEC image instead if that’s something you need. So far, I’ve been unable to play videos in any of the RK3399 boards I tested with Ubuntu Desktop firmware.

Web browsing in Khadas Captain

The Ubuntu 18.04 images comes with Chromium pre-installed.

Khadas Edge Ubuntu Screenshot
Click for Original Size

However, Thai fonts  are missing, so characters will show as blocks with this language when accessing Google and Facebook from my location, so I installed Thai fonts:

sudo apt install fonts-thai-tlwg

I wanted to install Thai language support and the corresponding keyboard, but it failed due to permissions issues:

rg.freedesktop.PolicyKit.Error.Failed: ('system-bus-name', {'name': ':1.78'}): org.debian.apt.install-or-remove-packages

Khadas Captain Ubuntu Language Support

Followed by more error messages:

You are not allowed to perform this action You don’t have the required privileges to perform this action.

That’s a minor issue that should be easy to fix.

Overall “standard” web browsing worked well, just like on other RK3399 boards and I edited a lot of this review on the board itself. However, I could not play Candy Crush Saga in Facebook as flash player is missing:

No Flash Player found. 11.0.0 version required.   

 

YouTube videos can play at 720p with very few dropped frames, but some tearing is clearly visible. 3D graphics acceleration is broken on my board, but I went to visit WelGL Quake demo anyway, and unsurpringsly was greeted with an error message:

Sorry, but your browser does not support WebGL or does not have it enabled.

eMMC flash and USB Storage Performance 

Let’s run the usual iozone benchmark in the eMMC flash:

khadas@Khadas:~$ iozone  iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
	Iozone: Performance Test of File I/O
	        Version $Revision: 3.429 $
		Compiled for 64 bit mode.
		Build: linux 

	
	Output is in kBytes/sec
	Time Resolution = 0.000001 seconds.
	Processor cache size set to 1024 kBytes.
	Processor cache line size set to 32 bytes.
	File stride size set to 17 * record size.
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
          102400       4    11828    13354    15267    13684    17186    21738                                                          
          102400      16    46154    47429    67887    68979    72140    45976                                                          
          102400     512    49017    48523   252322   254329   223441    48436                                                          
          102400    1024    48760    49352   267336   267311   254040    48286                                                          
          102400   16384    49149    49470   285466   298166   274397    49097                                                          

iozone test complete.

Up to 300MB/s sequential read speed, up to around 50MB/s sequential write speed, and random I/O values also look pretty good here.

But then I switched to USB storage performance, and the NTFS test performance would not complete:

khadas@Khadas:/media/khadas/USB3_NTFS$ iozone  iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
	Iozone: Performance Test of File I/O
	        Version $Revision: 3.429 $
		Compiled for 64 bit mode.
		Build: linux 

	Output is in kBytes/sec
	Time Resolution = 0.000001 seconds.
	Processor cache size set to 1024 kBytes.
	Processor cache line size set to 32 bytes.
	File stride size set to 17 * record size.
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
         1024000       4    14294    16520    26406    26594
Error reading block at 364781568
read: Input/output error

After two more tries, I switched to EXT-4 and that was OK, so maybe I really do have a hardware issue on the NTFS partition…

khadas@Khadas:/media/khadas/USB3_EXT4$ iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
	Iozone: Performance Test of File I/O
	        Version $Revision: 3.429 $
		Compiled for 64 bit mode.
		Build: linux 

	Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
	             Al Slater, Scott Rhine, Mike Wisner, Ken Goss
	             Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
	             Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
	             Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone,
	             Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root,
	             Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer,
	             Vangel Bojaxhi, Ben England, Vikentsi Lapa.

	Run began: Sat Dec 22 09:53:40 2018

	Include fsync in write timing
	O_DIRECT feature enabled
	Auto Mode
	File size set to 1024000 kB
	Record Size 4 kB
	Record Size 16 kB
	Record Size 512 kB
	Record Size 1024 kB
	Record Size 16384 kB
	Command line used: iozone -e -I -a -s 1000M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 iozone
	Output is in kBytes/sec
	Time Resolution = 0.000001 seconds.
	Processor cache size set to 1024 kBytes.
	Processor cache line size set to 32 bytes.
	File stride size set to 17 * record size.
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
         1024000       4     5852     6369     7682     7613      407      267                                                          
         1024000      16    14726    15352    18142    17968     1490      988                                                          
         1024000     512    27818    28583    32034    32104     9939    18701                                                          
         1024000    1024    30065    30320    32038    32272    19148    29809                                                          
         1024000   16384    32128    32242    33187    33223    32581    32148        

The values are really low at about 33MB/s for read and write, and then I realized oops… The USB port on one of the edges of the board is USB 2.0, so I moved the drive to the  USB 3.0 port, and results were inline with expectations for a mechanical drive:

khadas@Khadas:/media/khadas/USB3_EXT4$ iozone  iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
	Iozone: Performance Test of File I/O
	        Version $Revision: 3.429 $
		Compiled for 64 bit mode.
		Build: linux 

	Output is in kBytes/sec
	Time Resolution = 0.000001 seconds.
	Processor cache size set to 1024 kBytes.
	Processor cache line size set to 32 bytes.
	File stride size set to 17 * record size.
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
          102400       4    14857    19350    22412    18319      329      595                                                          
          102400      16    50996    62250    59027    68382     2106     7009                                                          
          102400     512    90509    89635    94827    96983    34258    51358                                                          
          102400    1024    90524    89672    95280    97579    49900    60626                                                          
          102400   16384    90892    90758    93144    95004    89712    86382                                                          

iozone test complete.

Around  93MB/s sequential read speed, and 91 MB/s sequential write speed.

As a side note, since the tests take time on the hard drive I tried to do some debugging/monitoring, first by checking syslog but it’s filled with message related to IR remote control:

tail -f /var/log/syslog 
Dec 23 07:06:44 localhost lircd[889]: lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:44 localhost lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:45 localhost lircd[889]: lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:45 localhost lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:46 localhost lircd[889]: lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:46 localhost lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:47 localhost lircd[889]: lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*
Dec 23 07:06:47 localhost lircd-0.10.0[889]: Error: Cannot glob /sys/class/rc/rc0/input[0-9]*/event[0-9]*

and iotop – used to see whether any I/O occured – did not work either:

sudo iotop
Traceback (most recent call last):
  File "/usr/sbin/iotop", line 17, in 
    main()
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 620, in main
    main_loop()
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 610, in 
    main_loop = lambda: run_iotop(options)
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 508, in run_iotop
    return curses.wrapper(run_iotop_window, options)
  File "/usr/lib/python3.6/curses/__init__.py", line 94, in wrapper
    return func(stdscr, *args, **kwds)
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 501, in run_iotop_window
    ui.run()
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 155, in run
    self.process_list.duration)
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 434, in refresh_display
    lines = self.get_data()
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 415, in get_data
    return list(map(format, processes))
  File "/usr/lib/python3/dist-packages/iotop/ui.py", line 388, in format
    cmdline = p.get_cmdline()
  File "/usr/lib/python3/dist-packages/iotop/data.py", line 292, in get_cmdline
    proc_status = parse_proc_pid_status(self.pid)
  File "/usr/lib/python3/dist-packages/iotop/data.py", line 196, in parse_proc_pid_status
    key, value = line.split(':\t', 1)
ValueError: not enough values to unpack (expected 2, got 1)
Error in sys.excepthook:

But this one seems to be a bug with iotop while using the latest version of Python. One way might have been to downgrade Python version, but instead I used:

watch -n1 iostat -hm

in order to monitor I/Os to partitions.

Network performance – Gigabit Ethernet & 802.11ac WiFi

Let’s test Gigabit Ethernet performance with iperf starting with a full duplex data transfer:

------------------------------------------------------------
Client connecting to 192.168.1.52, TCP port 5001
TCP window size:  332 KByte (default)
------------------------------------------------------------
[  6] local 192.168.1.22 port 57042 connected with 192.168.1.52 port 5001
[ ID] Interval       Transfer     Bandwidth
[  6]  0.0-60.0 sec  3.24 GBytes   464 Mbits/sec
[  4]  0.0-60.0 sec  5.46 GBytes   781 Mbits/sec

That’s fairly typical for a Rockchip RK3399 platform. Upload only result looks fine…

[  4] local 192.168.1.22 port 5001 connected with 192.168.1.52 port 59110
[  4]  0.0-60.0 sec  5.75 GBytes   822 Mbits/sec

and download only is even closer to the limit:

[  3] local 192.168.1.22 port 57168 connected with 192.168.1.52 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec  6.57 GBytes   940 Mbits/sec

So Gigabit Ethernet is working just as expected.

Time to test WiFi 5 (802.11ac) performance. Please note that I have the Khadas Edge Basic board with AP6356S module, while Edge Pro and Max boards come with AP6398S that support RSDB (Real Simulataneous Dual Band) , and should offer even better performance.

802.11ac WiFi upload result:

[  4] local 192.168.1.22 port 5001 connected with 192.168.1.87 port 34252
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-60.0 sec  1.55 GBytes   222 Mbits/sec

802.11ac WiFi download result:

------------------------------------------------------------
[  3] local 192.168.1.22 port 39176 connected with 192.168.1.87 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.0 sec   746 MBytes   104 Mbits/sec

I’ve frequently found asymmetries between upload and download, but usually that’s at the benefit of the download part. That’s somehow the opposite with Khadas Edge, and I had to double check it to confirm. 222 Mbps upload is very good with the router I use, but 104 Mbps download could be better, as some other platforms could achieve a little over 250 Mbps.

Khadas-Captain-AC-WiFi-Performance
WiFi Data Throughput in Mbps – Click to Enlarge

USB-C DisplayPort Alternate Mode on Khadas Captain

When I connected MINIX NEO-C plus USB-C adapter to RockPro64 RK3399 board in order to make use of USB-C DisplayPort Alternate mode over HDMI it did not work quite as expected (although it may be fixed now), but I did not have such an issue with Khadas Edge.

Khadas Edge USB-C DisplayPort / HDMI
Click to Enlarge

I just move the HDMI cable that I had connected to the HDMI port of Khadas Edge to the HDMI port in the MINIX USB-C adapter, and within a few seconds, the image was up and running. I only have access to one TV right now, so I was not able to test dual monitor setups and things like extended desktop.

Conclusion

The hardware design looks solid with a fast eMMC flash, excellent Gigabit Ethernet performance, and acceptable WiFi AC performance, dual video output, and more.

But while Ubuntu 18.04 LXDE image is mostly usable, there were several issues such as accelerated 3D graphics support breaking after a while, even after reinstalling the firmware, and the lack of hardware video decoding is a recurring issues on RK3399 platforms at least on desktop Linux images, as LibreELEC is another story. I also encountered several less important software only issues like failure to install language packs, as well as some potential (power?) issues when connecting the USB hard drive that would disconnect from time to time when connected to the USB 2.0 port. 

But bear in mind Khadas Edge and Captain boards are not shipping yet, so what I did here was really beta testing, and I’m pretty sure Shenzhen Wesion will look into the issues and fix many of them before the rewards ship to backers later in January.

Khadas Edge crowdfunding campaign is still ongoing, and you can back the project on Indiegogo if you are interested.

Share this:
FacebookTwitterHacker NewsSlashdotRedditLinkedInPinterestFlipboardMeWeLineEmailShare

Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress. We also use affiliate links in articles to earn commissions if you make a purchase after clicking on those links.

Radxa Orion O6 Armv9 mini-ITX motherboard

3 Replies to “Khadas Captain / Edge SBC Review – Part 2: Ubuntu 18.04”

  1. Framebuffer presentation layer seems botched (ergo the low glgears fps), but at least the GLES stack is 3.2 and the revision quite recent. Now they need to fix eglSwapBuffers() and they’re in GLES business! : )

  2. Thanks for your review.

    About some issues in this review:

    1. there were several issues such as accelerated 3D graphics support breaking after a while, even after reinstalling the firmware

    How does this happend? When you reinstall the firmware it still not working?

    2. How to play 1080p or 4K videos?

    You can use gstreamer to play videos. And I added a simple command to use.

    E.g., play_video /path/to/video

    And for latest version you can use QT5 player, Sound & Video->QT5 Media Player

    3. WebGL not working

    WebGL is enabled. If 3D graphics acceleration not working, it will not work.

    4. but only EXT4 and NTFS partitions could be mounted, since BTRFS and exFAT are not enabled in the kernel.

    BTRFS & exFAT are enabled, they are built in kernel, not as modules.

    5. After two more tries, I switched to EXT-4 and that was OK, so maybe I really do have a hardware issue on the NTFS partition…

    I’ll check this issue..

    1. About 1. I’ve sent an email about that issue several days ago. Basically, install gimp while running glmark2-es2 offscreen mode, suddenly log out after a while. Login again the error show, reboot the error still show, reinstalling Ubuntu with rk-flash-tool and the issue is still there.

Leave a Reply

Your email address will not be published. Required fields are marked *

Boardcon MINI1126B-P AI vision system-on-module wit Rockchip RV1126B-P SoC
Boardcon MINI1126B-P AI vision system-on-module wit Rockchip RV1126B-P SoC