Let’s do one more RK3399 Linux review using Pine64 RockPro64 development board. After shortly checking out the hardware, I’ll test Ubuntu 18.04 “Bionic” LXDE on the board, test 3D graphics acceleration, video playback, USB storage and network performance among other things on the board.
RockPro64 Board Unboxing
The board came in a cardboard package, and the sticker made it clear I had received the 2GB LPDDR4 version.
Even after FriendlyELEC NanoPi M4 announcement, Rockchip ROCKPro64 is still the cheapest RK3399 development board around, so it should come as no surprise that the board does not come with any accessories by default.
Another way to keep the price low was not to include any built-in storage apart from SPI flash, so instead most people will either boot from micro SD card or an eMMC flash module both of which need to be purchase separately. Another cost-saving is the lack of built-in wireless module for WiFi and/or Bluetooth connectivity, which makes sense as FCC certification is easier that way, and the board is cheaper for people who do not need WiFi. WiFi can be added via Pine64 802.11ac 2×2 + Bluetooth 4.2 module ($15.99 – Ampak AP6359SA), or USB. The power supply is not included either, and you’ll need a 12V/3A or greater, especially if you connect power-hungry devices to the USB 3.0 port and/or the PCIe slot, in which case a 12V/5A power supply is recommended. The latter is an exclusivity for RockPro64 as I can’t remember seeing it on any other RK3399 maker boards. I won’t test PCIe myself in this review since I don’t have any compatible card, but Pine64 provides card mostly for storage with a PCI-e to Dual SATA-II Interface Card ($9.99) and a PCI-e X4 to M.2/NGFF NVMe SSD Interface Card ($5.99). Note that Rockchip RK3399’s PCIe interface is not suitable for graphics card since addressable memory is limited to 32 MB.
There’s not much to see on the bottom of the board except for the micro SD card and Everest Semi ES8316 audio codec.
It’s also interested to look at the sides fo the board, especially with regards to the USB 3.0 + USB type-C connector which I don’t think I have seen in the past.
The other side is more “traditional” with an HDMI 2.0 port, RJ45 connector for Gigabit Ethernet, and the DC jack.
Since I’ve tested five Rockchip RK3399 development boards so far, I thought it would be interested to take a photo of all five models to compare the form factors.
From top left to bottom right: RockPro64, NanoPC-T4, Videostrong VS-RD-RK3399, AIO-3399J, and Firefly-RK3399. The smallest of the lot is NanoPC-T4, but now we have a smaller board with business card sized NanoPi M4 board, and soon an even smaller RK3399 SBC with the upcoming NanoPi NEO4.
Initial Setup and First Boot
While RockPro64 does not come with a heatsink by default, some sort of cooling solution is a must for Rockchip RK3399, as we’ve seen with Firefly-RK3399 that a fansink can make a big difference in terms of performance compared to a thin heatsink, so I can’t imagine what would happen if I run the board without any heatsink at all.
I first try the same heatsink as used in AIO-3399J review, and it was close but no cigar, so instead I went with another thicker heatsink and some old thermal paste.
I connected Ethernet, HDMI, USB key board and mouse, as well as USB 3.0 drive, but I did not connect a USB-C adapter with HDMI output just yet, since it caused issues with other boards (HDMI disabled when USB-C DisplayPort Alternate mode is enabled). I also connected a serial debug board as explained in Pine64 forums.
But first we need to get some firmware to play with. News about Ayufan firmware images is also reported in the forums, so I went to Github release page and download one of the latest stable image, currently v 0.7.9 with bionic-lxde-rockpro64-0.7.9-1067-arm64.img.xz.
I flashed the image to a 16GB micro SD card using Etcher, inserted the micro Card into the board, connected the power, some light turned on, and …nothing. I connected the serial console using 1.5 Mbps 8N1 no flow control and no output in the serial console. I took out the micro SD card, and pushed it back in the socket, and … success!
I would get a login prompt in the HDMI display for Rock64 and in the serial console. Default username/password for RockPro64 images are: rock64/rock64.
Here’s the boot log for reference (N.B.: not the first boot).
RockPro64 Ubuntu 18.04 System Info & Drivers
Once we login into the serial console we can find out the board is indeed running the latest Ubuntu 18.04.1 LTS on top of Linux 4.4.135.
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 |
rockpro64 login: rock64 Password: Last login: Sat Aug 25 07:15:04 UTC 2018 on ttyS2 Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.4.132-1075-rockchip-ayufan-ga83beded) _ __ _ _ _ __ ___ ___| | ___ __ _ __ ___ / /_ | || | | '__/ _ \ / __| |/ / '_ \| '__/ _ \| '_ \| || |_ | | | (_) | (__| <| |_) | | | (_) | (_) |__ _| |_| \___/ \___|_|\_\ .__/|_| \___/ \___/ |_| |_| * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Sat Aug 25 07:15:27 UTC 2018 System load: 0.31 Processes: 168 Usage of /: 14.7% of 14.30GB Users logged in: 0 Memory usage: 6% IP address for eth0: 192.168.1.55 Swap usage: 0% * Read about Ubuntu updates for L1 Terminal Fault Vulnerabilities (L1TF). - https://ubu.one/L1TF * Check out 6 great IDEs now available on Ubuntu. There may even be something worthwhile there for those crazy EMACS fans ;) - https://bit.ly/6-cool-IDEs rock64@rockpro64:~$ |
The micro SD card was automatically resized and I get a 14.30 GB root partition with about 14.7% used.
Some more info about storage and memory:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
rock64@rockpro64:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 992M 0 992M 0% /dev tmpfs 200M 524K 199M 1% /run /dev/mmcblk0p7 15G 2.2G 12G 16% / tmpfs 996M 0 996M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 996M 0 996M 0% /sys/fs/cgroup /dev/mmcblk0p6 112M 4.0K 112M 1% /boot/efi tmpfs 200M 0 200M 0% /run/user/1000 rock64@rockpro64:~$ free -mh total used free shared buff/cache available Mem: 1.9G 84M 1.7G 17M 203M 1.8G Swap: 995M 0B 995M rock64@rockpro64:~$ zramctl NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram5 lzo 166M 4K 78B 12K 1 [SWAP] /dev/zram4 lzo 166M 4K 78B 12K 1 [SWAP] /dev/zram3 lzo 166M 4K 78B 12K 1 [SWAP] /dev/zram2 lzo 166M 4K 78B 12K 1 [SWAP] /dev/zram1 lzo 166M 4K 78B 12K 1 [SWAP] /dev/zram0 lzo 166M 4K 78B 12K 1 [SWAP] rock64@rockpro64:~$ |
This confirms I really got the 2GB version of the board, and that’s one of the first time I see a Linux firmware image where ZRAM is enabled by default. There;s one problem though… None of of USB partition are automatically mounted despite all four partitions being properly detected:
1 2 3 4 5 6 7 8 9 |
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 |-sda2 8:2 0 244.1G 0 part |-sda3 8:3 0 244.1G 0 part `-sda4 8:4 0 199.1G 0 part mtdblock0 31:0 0 4M 0 disk ... |
We’ll have a look at that a little later…. Moving on to loaded kernel modules:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rock64@rockpro64:~$ lsmod Module Size Used by zram 32768 6 lz4_compress 16384 1 zram rockchip_saradc 16384 0 ip_tables 24576 0 x_tables 32768 1 ip_tables autofs4 40960 0 uas 20480 0 usb_storage 61440 1 uas phy_rockchip_pcie 16384 0 midgard_kbase 651264 0 dw_hdmi_i2s_audio 16384 0 |
Contrary to Firefly Team who build all drivers inside the kernel, Pine64 guys built many drivers as modules.
1 2 |
ls /sys/class/gpio/ export gpiochip0 gpiochip128 gpiochip32 gpiochip64 gpiochip96 unexport |
The info about GPIOs is exactly the same as in AIO-3399J in /sys/class/gpio, but the GPIO definitions are quite different:
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 |
sudo cat /sys/kernel/debug/gpio [sudo] password for rock64: GPIOs 0-31, platform/pinctrl, gpio0: gpio-2 ( |? ) out lo gpio-4 ( |bt_default_wake_host) in lo gpio-5 ( |power ) in hi gpio-9 ( |bt_default_reset ) out lo gpio-11 ( |? ) out hi GPIOs 32-63, platform/pinctrl, gpio1: gpio-34 ( |int-n ) in hi gpio-35 ( |vbus-5v ) out lo gpio-45 ( |hp det ) in lo gpio-46 ( |vsel ) out lo gpio-49 ( |vsel ) out lo gpio-56 ( |vcc3v3_pcie ) out lo GPIOs 64-95, platform/pinctrl, gpio2: gpio-83 ( |bt_default_rts ) in hi gpio-91 ( |bt_default_wake ) in lo GPIOs 96-127, platform/pinctrl, gpio3: gpio-111 ( |mdio-reset ) out hi GPIOs 128-159, platform/pinctrl, gpio4: gpio-154 ( |vcc5v0_host ) out hi rock64@rockpro64:~$ |
I does not look like all GPIO available via the expansion header have been made available (TBC),. You’ll find the Pi-2 header’s pinout diagram here.
3D Graphics Acceleration on RockPro64 Board with Ubuntu 18.04
es2_info and es2gears were already installed.
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 46 47 48 49 50 51 52 53 54 55 56 |
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 |
So 3D hardware acceleration works here, and slightly faster than on AIO-3399J (75 fps vs ~59 fps).
I also ran glmark2-es2 after installing it
1 |
sudo apt install glmark2-es2 |
It works OK, but with a slightly lower score than on AIO-3399J board (48 points):
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 ======================================================= glmark2 2014.03+git20150611.fa71af2d ======================================================= OpenGL Information GL_VENDOR: ARM GL_RENDERER: Mali-T860 GL_VERSION: OpenGL ES 3.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3 ======================================================= [build] use-vbo=false: FPS: 49 FrameTime: 20.408 ms [build] use-vbo=true: FPS: 48 FrameTime: 20.833 ms [texture] texture-filter=nearest: FPS: 42 FrameTime: 23.810 ms [texture] texture-filter=linear: FPS: 90 FrameTime: 11.111 ms [texture] texture-filter=mipmap: FPS: 57 FrameTime: 17.544 ms [shading] shading=gouraud: FPS: 38 FrameTime: 26.316 ms [shading] shading=blinn-phong-inf: FPS: 39 FrameTime: 25.641 ms [shading] shading=phong: FPS: 42 FrameTime: 23.810 ms [shading] shading=cel: FPS: 36 FrameTime: 27.778 ms [bump] bump-render=high-poly: FPS: 33 FrameTime: 30.303 ms [bump] bump-render=normals: FPS: 40 FrameTime: 25.000 ms [bump] bump-render=height: FPS: 40 FrameTime: 25.000 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 38 FrameTime: 26.316 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 27 FrameTime: 37.037 ms [pulsar] light=false:quads=5:texture=false: FPS: 53 FrameTime: 18.868 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 26 FrameTime: 38.462 ms [desktop] effect=shadow:windows=4: FPS: 35 FrameTime: 28.571 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 20 FrameTime: 50.000 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 21 FrameTime: 47.619 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 23 FrameTime: 43.478 ms [ideas] speed=duration: FPS: 31 FrameTime: 32.258 ms [jellyfish] <default>: FPS: 33 FrameTime: 30.303 ms [terrain] <default>: FPS: 10 FrameTime: 100.000 ms [shadow] <default>: FPS: 33 FrameTime: 30.303 ms [refract] <default>: FPS: 18 FrameTime: 55.556 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 58 FrameTime: 17.241 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 38 FrameTime: 26.316 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 43 FrameTime: 23.256 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 39 FrameTime: 25.641 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 35 FrameTime: 28.571 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 38 FrameTime: 26.316 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 38 FrameTime: 26.316 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 37 FrameTime: 27.027 ms ======================================================= glmark2 Score: 37 ======================================================= |
Off-screen results for reference:
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 46 |
glmark2-es2 --off-screen ======================================================= glmark2 2014.03+git20150611.fa71af2d ======================================================= OpenGL Information GL_VENDOR: ARM GL_RENDERER: Mali-T860 GL_VERSION: OpenGL ES 3.2 v1.r14p0-01rel0-git(966ed26).f44c85cb3d2ceb87e8be88e7592755c3 ======================================================= [build] use-vbo=false: FPS: 229 FrameTime: 4.367 ms [build] use-vbo=true: FPS: 293 FrameTime: 3.413 ms [texture] texture-filter=nearest: FPS: 338 FrameTime: 2.959 ms [texture] texture-filter=linear: FPS: 330 FrameTime: 3.030 ms [texture] texture-filter=mipmap: FPS: 315 FrameTime: 3.175 ms [shading] shading=gouraud: FPS: 241 FrameTime: 4.149 ms [shading] shading=blinn-phong-inf: FPS: 232 FrameTime: 4.310 ms [shading] shading=phong: FPS: 210 FrameTime: 4.762 ms [shading] shading=cel: FPS: 205 FrameTime: 4.878 ms [bump] bump-render=high-poly: FPS: 139 FrameTime: 7.194 ms [bump] bump-render=normals: FPS: 313 FrameTime: 3.195 ms [bump] bump-render=height: FPS: 297 FrameTime: 3.367 ms [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 188 FrameTime: 5.319 ms [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 205 FrameTime: 4.878 ms [pulsar] light=false:quads=5:texture=false: FPS: 302 FrameTime: 3.311 ms [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 172 FrameTime: 5.814 ms [desktop] effect=shadow:windows=4: FPS: 178 FrameTime: 5.618 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 33 FrameTime: 30.303 ms [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 33 FrameTime: 30.303 ms [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 41 FrameTime: 24.390 ms [ideas] speed=duration: FPS: 60 FrameTime: 16.667 ms [jellyfish] <default>: FPS: 166 FrameTime: 6.024 ms [terrain] <default>: FPS: 37 FrameTime: 27.027 ms [shadow] <default>: FPS: 161 FrameTime: 6.211 ms [refract] <default>: FPS: 73 FrameTime: 13.699 ms [conditionals] fragment-steps=0:vertex-steps=0: FPS: 305 FrameTime: 3.279 ms [conditionals] fragment-steps=5:vertex-steps=0: FPS: 194 FrameTime: 5.155 ms [conditionals] fragment-steps=0:vertex-steps=5: FPS: 299 FrameTime: 3.344 ms [function] fragment-complexity=low:fragment-steps=5: FPS: 239 FrameTime: 4.184 ms [function] fragment-complexity=medium:fragment-steps=5: FPS: 173 FrameTime: 5.780 ms [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 236 FrameTime: 4.237 ms [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 235 FrameTime: 4.255 ms [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 190 FrameTime: 5.263 ms ======================================================= glmark2 Score: 201 ======================================================= rock64@rockpro64:~$ |
The score is also slightly lower here (201 vs 222), but this could be because of the thermal issue (heatsink).
The Quake WebGL demo is not working in Chromium since WebGL is not enabled…
…and while it could launch in in Firefox the demo is quite slow since it is rendered at 9 to 11 fps, instead of the 50 to 60 fps I got with AIO-3399J board, or even ODROID-XU4Q running Ubuntu 18.04 .
Solving USB automount Issue (& RockPro64 Community Support)
I plan to play some videos from my USB harddrive, but first, it’s time to solve USB HDD automount. I could mount NTFS and EXT-4 partitions as root, but then the files are only accessible to root. I tried to mess up with PCManFM settings to automount partitions, but no luck. Finally, I discovered pmount tool that allows to mount drive as a normal user:
1 2 3 |
sudo apt install pmount pmount /dev/sda1 pmount /dev/sda2 |
It worked just fine:
1 2 3 4 5 6 7 8 9 10 11 12 |
df -h Filesystem Size Used Avail Use% Mounted on udev 992M 0 992M 0% /dev tmpfs 200M 556K 199M 1% /run /dev/mmcblk0p7 15G 2.2G 12G 16% / tmpfs 996M 0 996M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 996M 0 996M 0% /sys/fs/cgroup /dev/mmcblk0p6 112M 4.0K 112M 1% /boot/efi tmpfs 200M 4.0K 200M 1% /run/user/1000 /dev/sda1 245G 182G 63G 75% /media/sda1 /dev/sda2 241G 181G 48G 80% /media/sda2 |
I failed to mount exFAT since this file system is not included in the firmware images, that’s probably just a question of building those as kernel modules.
One main benefit of Pine64 boards is that they have active user forums, and IRC channels #pine64 and #rock64 where there’s always somebody who will try to help you. I did not use the forums, but I asked several questions on #Rock64 IRC channel, and people tried to help. One person who got automount to work but forgot this exact solution while in IRC, even contacted me later on by email telling to install gvfs (thanks dukla!):
1 |
sudo apt install gvfs |
and sure enough the three partitions were automatically mounted in /media/rock64 directory as shown in the screenshot below.
Video Playback in RockPro64 Board
AIO3399-J did not come with any video player, and for good reasons since I did not manage to play any videos with hardware decoding in that board, although software decoding works up to 1080p.
But in the case of RockPro64 Ubuntu 18.04 image, SMPlayer, YouTube Browser for SMPlayer, and mpv Media Player were already installed. So let’s play some videos.
Sadly the video was very choppy, and as you can see SMPlayer relies on mpv Media Player with everything decoded by software.
The good people in IRC told me to use rkmpv instead, but my first attempt failed miserably:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
rkmpv bbb_sunflower_1080p_60fps_normal.mp4 Playing: bbb_sunflower_1080p_60fps_normal.mp4 (+) Video --vid=1 (*) (h264 1920x1080 60.000fps) (+) Audio --aid=1 --alang=und (*) (mp3 2ch 48000Hz) Audio --aid=2 --alang=und (*) (ac3 6ch 48000Hz) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version [vo/gpu] VT_GETMODE failed: Inappropriate ioctl for device [vo/gpu/opengl] Failed to set up VT switcher. Terminal switching will be unavailable. Illegal instruction |
I was then told to following video playback instructions in the Wiki which basically asks us to install the following:
1 |
sudo apt install ffmpeg mpv libmali-rk-midgard-t86x-r14p0-gbm |
I did miss the libmail-rk-midgard thing, and after that I could play the video… sort of:
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 |
rkmpv bbb_sunflower_1080p_60fps_normal.mp4 Playing: bbb_sunflower_1080p_60fps_normal.mp4 (+) Video --vid=1 (*) (h264 1920x1080 60.000fps) (+) Audio --aid=1 --alang=und (*) (mp3 2ch 48000Hz) Audio --aid=2 --alang=und (*) (ac3 6ch 48000Hz) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version [vo/gpu] VT_GETMODE failed: Inappropriate ioctl for device [vo/gpu/opengl] Failed to set up VT switcher. Terminal switching will be unavailable. mpi: mpp version: Without VCS, under bleeding hal_h264d_api: Assertion p_hal->vcodec_type & ((0x00000200) | (0x00000001) | (0x00000002)) failed at hal_h264d_init:186 mpp_device: mpp_device_init failed to find device for coding 0 type 7 hal_h264d_api: p_hal->vpu_socket <= 0 mpp_hal: mpp_hal_init hal h264d_rkdec init failed ret -2 mpp_hal: mpp_hal_init could not found coding type 7 mpp_dec: mpp_dec_init could not init hal mpp: error found on mpp initialization mpp: WARNING: setup buffer group before decoder init mpp: command 310002 param 0x55985771c0 ret -1 [ffmpeg] h264_rkmpp: Failed to assign buffer group (code = -1) [ffmpeg] h264_rkmpp: Failed to initialize RKMPP decoder. Could not open codec. AO: [pulse] 48000Hz stereo 2ch s16 VO: [gpu] 1920x1080 yuv420p AV: 00:00:01 / 00:10:34 (0%) A-V: 0.494 Dropped: 43 Audio/Video desynchronisation detected! Possible reasons include too slow hardware, temporary CPU spikes, broken drivers, and broken files. Audio position will not match to the video (see A-V status field). AV: 00:00:35 / 00:10:34 (5%) A-V: 51.684 Dropped: 1952 |
The video played in full screen mode, was very choppy, and from the error messages above it’s pretty clear hardware video decoding failed. People told me they manage to use rkmpv, but I failed to fix the issue in a reasonable amount of time. Anyway, I’m pretty sure this will be working in subsequent firmware releases, and rkmpv is the program to look into for hardware video playback.
Another interesting issue is YouTube videos are playing at accelerated speed in both Firefox and YouTube Browser for SMPlayer, but the issue is known and being worked on.
Web browsing in RockPro64
Both Firefox and Chromium are pre-installed.
However, Thai fonts are missing, so characters will show as blocks, so I installed Thai fonts:
1 |
sudo apt install fonts-thai-tlwg |
Apart from that little issue, web browsing was quite fast like on other RK3399 boards both with Chromium or Firefox.
I could not play Candy Crush Saga in Chromium however due to missing Adobe Flash player, but Firefox could handle it somehow, but only in really slow motion. Both Core 5/6 (Cortex A72 AFAIK) were heavily used while playing the game, but core 1 to 4 (Cortex A53) cores were basically sleeping.
As mentioned previously, Youtube acts funny (2x or 4x accelerated playback), and WebGL is slow in Firefox, and not working in Chromium. So there are still some issue with web browsing, but in the current firmware, Firefox works a little better.
USB 3.0 Storage Performance
I normally test internal storage and USB 3.0 performance, but since I’m running the OS on the micro SD card instead of an eMMC module, I’ve gone straight to USB 3.0 testing on the EXT-4 partition of the drive:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ 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 23159 26885 26531 26283 410 255 1024000 16 65181 73247 68223 66236 1580 1069 1024000 512 78280 85452 95970 95750 14898 19470 1024000 1024 89869 94851 95867 96655 26526 34260 1024000 16384 91158 94595 95816 96132 79414 84089 iozone test complete. |
That’s about 91 MB/s sequential write speed, and 95 MB/s sequential read speed, and about the numbers to be expected from this mechanical hard drive over USB 3.0. Over the test appeared to be stuck for a while, and looking at the kernel log…
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 |
[ 9092.190795] usb 5-1: USB disconnect, device number 2 [ 9092.195211] sd 0:0:0:0: [sda] Synchronizing SCSI cache [ 9092.286379] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=0x07 driverbyte=0x00 [ 9093.455012] usb 3-1: USB disconnect, device number 2 [ 9094.851443] usb 6-1: new low-speed USB device number 2 using ohci-platform [ 9095.032578] usb 6-1: New USB device found, idVendor=0461, idProduct=4d15 [ 9095.032613] usb 6-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [ 9095.032634] usb 6-1: Product: USB Optical Mouse [ 9095.041448] input: USB Optical Mouse as /devices/platform/fe3a0000.usb/usb6/6-1/6-1:1.0/0003:0461:4D15.0004/input/input5 [ 9095.093069] hid-generic 0003:0461:4D15.0004: input,hidraw2: USB HID v1.11 Mouse [USB Optical Mouse] on usb-fe3a0000.usb-1/input0 [ 9098.198585] usb 4-1: new SuperSpeed USB device number 2 using xhci-hcd [ 9098.215522] usb 4-1: New USB device found, idVendor=0bc2, idProduct=2312 [ 9098.215541] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 9098.215549] usb 4-1: Product: Expansion [ 9098.215557] usb 4-1: Manufacturer: Seagate [ 9098.215565] usb 4-1: SerialNumber: NA495NNC [ 9098.231039] scsi host1: uas [ 9098.232966] scsi 1:0:0:0: Direct-Access Seagate Expansion 0636 PQ: 0 ANSI: 6 [ 9098.237510] sd 1:0:0:0: [sda] Spinning up disk... [ 9101.760475] .ready [ 9101.760878] sd 1:0:0:0: [sda] 1953525167 512-byte logical blocks: (1.00 TB/932 GiB) [ 9101.762119] sd 1:0:0:0: [sda] Write Protect is off [ 9101.762135] sd 1:0:0:0: [sda] Mode Sense: 2b 00 10 08 [ 9101.763015] sd 1:0:0:0: [sda] Write cache: enabled, read cache: enabled, supports DPO and FUA [ 9101.763190] xhci-hcd xhci-hcd.6.auto: ERROR Transfer event for disabled endpoint or incorrect stream ring [ 9101.764045] xhci-hcd xhci-hcd.6.auto: @000000007c44a340 00000000 00000000 1b000000 01078001 [ 9101.802052] sda: sda1 sda2 sda3 sda4 [ 9101.806984] sd 1:0:0:0: [sda] Attached SCSI disk [ 9105.259226] UDF-fs: warning (device sda2): udf_load_vrs: No VRS found [ 9105.259235] UDF-fs: warning (device sda2): udf_fill_super: No partition found (2) [ 9105.275183] ISOFS: Unable to identify CD-ROM format. [ 9105.278807] FAT-fs (sda2): bogus number of reserved sectors [ 9105.279305] FAT-fs (sda2): Can't find a valid FAT filesystem [ 9105.282944] hfsplus: unable to find HFS+ superblock [ 9105.291465] EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities [ 9105.295710] EXT4-fs (sda2): couldn't mount as ext2 due to feature incompatibilities [ 9105.307833] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: errors=remount-ro |
… we can see the drive got disconnected, before the EXT-4 got remounted about 13 seconds later. The always useful people in IRC also mentioned a USB3.0 disconnect issue to me when I had troubles with USB automount. More details can be found here.
Network performance – Gigabit Ethernet
Although you can add a WiFi module through headers, there’s no WiFi built-into RockPro64, so I only tested Gigabit Ethernet performance using iperf.
- Full duplex
1 2 3 4 5 6 7 |
Client connecting to 192.168.1.55, TCP port 5001 TCP window size: 178 KByte (default) ------------------------------------------------------------ [ 6] local 192.168.1.6 port 42072 connected with 192.168.1.55 port 5001 [ ID] Interval Transfer Bandwidth [ 6] 0.0-60.0 sec 3.07 GBytes 440 Mbits/sec [ 4] 0.0-60.0 sec 5.98 GBytes 856 Mbits/sec |
Just like in Android on other RK3399 boards, and in Linux with AIO-3399J, one direction is quite slower than the other while doing full duplex. I’ve been told to monitor the CPU usage while doing so, and I could see 4 iperf thread apparently distributed on Cortex A53 and A72 cores.
But as usual once we transfer data in one direction only at a time, everything is good:
- Upload only
1 2 |
[ 4] local 192.168.1.6 port 5001 connected with 192.168.1.55 port 35310 [ 4] 0.0-60.0 sec 6.57 GBytes 940 Mbits/sec |
- Download only
1 2 3 |
[ 3] local 192.168.1.6 port 42138 connected with 192.168.1.55 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-60.0 sec 6.57 GBytes 941 Mbits/sec |
Fore reference, upload was handled by a Cortex A53 core not fully utilized (40%), while download was moved to a Cortex A72 core (Core 5 / 6).
USB-C DisplayPort Alternate Mode on RockPro64
I previously reviewed MINIX NEO-C plus USB-C adapter with RK3399 boards using one of its HDMI port, and it worked, except HDMI and USB-C video output would not work at the same time. I’ve been told it should just be a device tree configuration thing, but I’ve not had time to look into it yet.
The good news is that with RockPro64 board I can get output to displays connected to HDMI and USB-C at the same time.
The bad news – as you can see above – is that the output to the display connected to the USB-C port is completely scrambled. Again it’s probably a configuration option, but I could not find information related to this in the Wiki.
Final Words
Just like other Linux firmware image on Rockchip RK3399, Ubuntu 18.04 + LXDE on RockPro64 does work but with some issues which are being worked on by the team. Overall performance is very good, 3D graphics works, Gigabit Ethernet performs as expected, but some features are not working well in web browsers with WebGL and HTML5 games being slow in Firefox, USB 3.0 having some potential disconnect issues, and hardware video decoding not working (yet) in my case, among other smaller issues like USB automount, which can be easily fixed by install an extra package.
IMHO, one advantage of Pine64 over companies like FriendlyELEC or Firefly is their community which seems more active in forums and IRC.
RockPro64 is the cheapest RK3399 board available on the market to date, but you also have to consider the need to add boot storage (micro SD card or eMMC module), and potentially WiFi + Bluetooth module, so the actual price difference is not as large as the promoted price may imply.
RockPro64 (2GB RAM) board reviewed here sells for just $59.99, or you could get the 4GB RAM version for $79.99 instead. Both are amazing value, but remember you need some cooling solution (heatsink or fansink), a micro SD card or eMMC flash, and a 12V/3A power supply at least in order to use the board. Alternatively it’s also possible to purchase the board on Ameridroid, and eventually I’d expect the board to be listed on Amazon too since its older sibling – Rock64 – is also offered there.
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
Re low GLES performance, clearly the issue is in the display manager/framebuffer presentation layer, as off-screen results are in-line with other boards.
Too bad about the 32mb addressable memory PCI-e limit. A couple more bits (2^25 -> 2^27) and they’d qualify for something like Nvidia Quadro NVS 285 128MB PCI-e which are covered by nouveau.
RockPro64 is already available on amazon.fr: https://www.amazon.fr/s/ref=nb_sb_noss_1?__mk_fr_FR=ÅMÅŽÕÑ&url=search-alias%3Daps&field-keywords=rockpro64 But at 100€ it is far more expansive than on official pine64.org site. And there are no expansions/cases
That includes VAT (21%?), but even considering that that’s still pretty expensive.
> you’ll need a 12V/3A or greater if you connect power-hungry devices to the USB 3.0 port and/or the PCIe slot. The latter is an exclusivity for RockPro64 as I can’t remember seeing it on any other RK3399 maker boards
With demanding PCIe cards or disks to be connected to the board I would better choose Pine’s 12V/5A PSU. The Rock960 EE (Enterprise Edition) will also have a PCIe slot (mechanical x16 but of course only 4 lanes available due to SoC limitation)
Could I ask what USB2TTL are you using for debug UART?
I’m recently doing some some experiments on USB2TTL with RK3399.
I’m using a CP2102 USB2TTL board. See photo:
https://www.cnx-software.com/wp-content/uploads/2018/08/USB2TTL-Board.jpg
Output from host computer when connecting the board:
I’m assuming your already have someone like that, but if not better tell me today if you want to test something, as I plan to start packing my office tonight or tomorrow morning.
It looks like everybody is using their own method for video hardware decoding.
FriendlyELEC told me their Ubuntu 18.04 firmware for NanoPC-T4 can play videos using Menu->Sound & Video->Qt5-VideoPlayer
I tried to collect some hopefully useful info about thermal ‘performance’ of the different heatsink options for RockPro64 and how the PCB already helps with heat dissipation: https://forum.armbian.com/topic/7310-rockpro64/?do=findComment&comment=60708
Thing is, it would be interesting to compare with the boards that have the RK3399 mounted on the bottom of the PCB, where a much better heatsink can be mounted (Renegade Elite and NanoPi M4 AFAIK). Because it might be that the board from Libre Computer, with it’s slim design and nice case, does not need any forced cooling and is usable anywhere, while for the RP64 with tall heatsink it is much more difficult to find proper casing.
After adding a ‘thermal test’ mode to sbc-bench I’m just about to do exactly that: test for the thermal efficiency of various heatsinks variations:
https://forum.armbian.com/topic/7819-sbc-bench/?do=findComment&comment=60880
(Not so) surprisingly these thermal pads used by board makers to connect SoC with heatsink are rather inefficient. By simply replacing such a pad with a copper shim + thermal paste temperatures decrease by more than 10°C. Now imagine saving the copper shim too and directly connecting SoC and heatsink with a superiour thermal paste (mine was something lying in the drawer for more than 20 years — no idea if aging effects apply here too)
Glad could help with pcmanfm, sorry couldnt get your video playback going.
Just did some tests tonight: a bionic minimal install with only apt-get install mpv ffmpeg libmali-rk-midgard-t86x-r14p0-gbm
does work. Also did a Big Buck run on my desktop with sbc-bench in monitor mode in another terminal, results are in pastebin here https://pastebin.com/ray74DyL
Stuff before *** is terminal playing video, I got bored at 1:38 and quit but no dropped frames. After *** is monitor results, CPU barely reaching 30% and no temp rise.
With that CPU usage, it should certainly be running on the hardware decoder. That’s just odd you have all those errors that seem to imply the hardware failed to initialize like:
or
Thw source seem to indicate that /dev/rkdec device is missing on the kernel provided with bionic images. I opened a topic on pine64 regarding this but no answer yet: https://forum.pine64.org/showthread.php?tid=6379
I have to set up a web server on the ROCK64pro board so that when it runs , it creates a wifi network around it and the client mobile devices or tablets can connect to the SSID of the ROCK64 to access the web-resources/website present on the web-server.
How to create a network SSID without the availability of internet connectivity.
If 50, 60 people can connect to web-server simultaneously that will be awesome.