Using handheld computer as a main workstation

In this post I would like to share with you some detail about using GPD MicroPC as a main workstation.

Using MicroPC as a portable workstation

Monitor – Lenovo ThinkVision M14
Keyboard – ThinkPad Wired USB Keyboard with TrackPoint

The keyboard is OK. It’s quite light (398 grams) The build quality of the keyboard is decent. The layout is obviously much worse than the layout of the famous 7-row ThinkPad keyboard (AKA UltraNav). But these USB keyboards are no longer produced. The chinese copies of these keyboard available today are awful (read the user reviews on Amazon).

The monitor is very light for 14 inch screen (624 grams) and durable. The build quality is fine. I was quite surprised that 14 inch screen can be powered by such small device as GPD MicroPC. The only issue I have with this display is that sometimes it spontaneously turns off for a second or two. It does not bother me too much, because it happens 1-2 times per hour. But evetually I would like to resolve this issue somehow.

Using MicroPC as a home workstation

Monitor – Dell U2713HM

In general, MicroPC does the job pretty well. However, there are two notes I would like to mention.

  1. This monitor does not support the native resolution (2560×1440) via HDMI port. In order to connect MicroPC to this monitor I had to use StarTech HDMI to DisplayPort Adapter. This’s an active digital video converter, which requires external power (via USB port). All passive HDMI to DisplayPort cables do not support resolution higner that 1920×1080.

  2. It’s not very convenient to attach 5 cables in order to "dock" the MicroPC. I would really to have a dedicated docking port on MicroPC (like the docking port on ThinkPad laptops).

UPDATE from 2019 Sep 30: The second issue was fixed according to the anonymoushindeiru‘s suggestion. The USB Type-C Hub does the job pretty well. I’m using Satechi ST-TCMAM. See the last photo in the gallery.

Gentoo on a GPD MicroPC

Introduction

This manual is intended to help user to configure Gentoo distribution of the GNU/Linux operating system for GPD MicroPC handheld. It’s supposed that user is skilled enough to install bare system from stage, compile kernel from source code, apply patches, etc.

This article and all information and products in it are provided on an "as is" basis, without warranty of any kind, either express or implied. Your use of this article is at your own risk.

Content

Hardware info

Brief hardware description from the manufacturer: GPD MicroPC – Shenzhen GPD Technology Co., Ltd..

Type Name
Technical info
CPU Intel(R) Celeron(R) N4100 (Gemini Lake) Base frequency: 1,1 GHz; Max frequency: 2.4 GHz; 4 cores, 4 threads; TDP: 6W (up to 10W in MicroPC); Features: x86-64, SSE4.2, AES, SHA, IVT; L2 cache: 4MB; Arch: Goldmont Plus. [1], [2]
RAM SK Hynix? 8GB single channel, LPDDR4; Bus clock: 2133 Mhz
Video Intel UHD Graphics 600 (Goldmont Plus) EU: 12, Clock speed: 200-700Mhz; GFLOPS:38.4 – 134.4; OpenGL support in Linux: 4.5; Vulcan support in Linux: 1.1; Multimedia codecs [3] : MPEG-2, MPEG-4, AVC, VC-1, WMV9, HEVC, HEVC 10-bit, VP9, VP9 10-bit. Device id: 8086:3185 (rev 03); [4], [5], [6], [7]
Storage Original: Biwin G6327 Capacity: 128GB; Seq. R/W speed: 524/356 MB/s;
device Upgrade: Transcend TS256GMTS400S Capacity: 256GB; Seq. R/W speed: 545/473MB/s; MLC NAND flash; Terabytes Written (Max.): 1100 TB; [8]
Audio Realtek Semiconductor Co. ALC269VC 4 channels, 24-bit I/O; DAC max sample rate: 192kHz; EAX 1.0 & 2.0, Direct Sound 3D, A3D; Device id: 8086:3198 [9]
Ethernet Realtek Semiconductor Co. RTL8111/8168/8411 Speed: 10/100/1000 MB/s; Device id: 10ec:8168 (rev 15); [10]
WiFi & Bluetooth Intel Dual Band Wireless-AC 3165 Bands: 2.4GHz, 5GHz; Protocols: 802.11b/g/n; Max speed: 433 Mbps; Bluetooth Version 4.2; PCI Device id: 8086:3165 (rev 79); USB Device id: 8087:0a2a; [11]
Card reader Realtek Semiconductor Co. Device id: 0bda:0316;

References

  1. Intel® Celeron® N4100 Processor
  2. Goldmont Plus – Microarchitectures – Intel – WikiChip
  3. Intel Launches New Pentium Silver and Celeron Atom Processors: Gemini Lake is Here
  4. Intel Graphics Technology – Wikipedia
  5. List of Intel graphics processing units – Wikipedia
  6. UHD Graphics 600 – Intel – WikiChip
  7. Intel UHD Graphics 600 Specs | TechPowerUp GPU Database
  8. SATA III M.2 Solid State DriveM.2 SSD 400S
  9. ALC269 HIGH DEFINITION AUDIO CODEC WITHE MBEDDED CLASS-D SPEAKER AMPLIFIER DATASHEET
  10. RTL8168 INTEGRATED GIGABIT ETHERNET CONTROLLER FOR PCI EXPRESS APPLICATIONS DATASHEET
  11. Intel® Dual Band Wireless-AC 3165 Product Specifications

Logs

Linux support summary

Subsystem Feature Status
Input Keyboard Works perfectly
Touchpad Works perfectly
Video Integrated display Works perfectly
2D graphics Works perfectly
3D acceleration Works perfectly
Video decoding acceleration Works perfectly
HDMI output Minor issues
Audio Internal speaker Works perfectly
Microphone Works perfectly
Audio out jack Works perfectly
Headphones mute speaker Works perfectly
Networking Ethernet Works perfectly
WiFi Works perfectly
BlueTooth Untested
ACPI Lid button Works perfectly
Power button Works perfectly
Brightness control Works perfectly
AC and battery Works perfectly
Power management Suspend to RAM Works perfectly
Suspend to disk Works perfectly
CPU frequency scaling Works perfectly
Other microSD card reader Works perfectly

Kernel

The minimal kernel version recommended for MicroPC is 5.2, because it’s the first version, which supports the integrated in MicroPC display.

The kernel config for version 5.2.1 is available here. Few notes regarding the kernel config:

  • It’s optimized for GPD MicroPC. Most options not required by this device are turned off. The total number of enabled options is 1043. You may need to enable additional options like filesystems or drivers for peripheral devices.
  • This config produces monolith kernel, which does not require any modules, firmwares or even a command line. But prior building this kernel you need install the firmware files, which are provided by these two packages:
    • sys-kernel/linux-firmware. In order to install only the firmware files which are relevant for MicroPC, enable these two USE flags: redistributable savedconfig and save this file as /etc/portage/savedconfig/sys-kernel/linux-firmware/linux-firmware.conf
    • net-wireless/wireless-regdb
  • Mitigation of Spectre and Meltdown vulnerabilities is disabled (CONFIG_PAGE_TABLE_ISOLATION). Consider for yourself what is more important for you: performance of security.
  • This config assumes that sda5 is the root partition and sda6 is the swap partition. If your partition layout is different, you will need to edit these parameters:
    • CONFIG_CMDLINE="root=/dev/sda5 fbcon=rotate:1 quiet"
    • CONFIG_PM_STD_PARTITION="/dev/sda6"

Booting the kernel

Since the described kernel does not require a command line, you can boot it directly from the EFI firmware. You no longer need to install and configure a bootloader.

mount /dev/sda1 /mnt/boot
mkdir /mnt/boot/EFI/Gentoo
cp arch/x86_64/boot/bzImage /mnt/boot/EFI/Gentoo/bzImage-5.2.1.efi
umount /mnt/boot
efibootmgr -c -L 'Gentoo' -l '\EFI\Gentoo\bzImage-5.2.1.efi'

After that you can make Gentoo the default boot option via editing BIOS setting Boot -> UEFI Hard Disk Drive BBS Priorities.

Input

There are various xorg input device drivers. libinput is one of them, and it’s the default driver in Gentoo. This driver works fine with MicroPC.

In order to use this driver, set the INPUT_DEVICES variable to ‘libinput’, see make.conf as example.

Keyboard

Down below you can see xorg.conf.d file for the keyboard.

10keyboard.conf

    Section "InputClass"
        Identifier          "keyboard-all"
        Driver              "libinput"
        Option              "XkbRules"                  "evdev"
        Option              "XkbModel"                  "pc105"
        Option              "XkbLayout"                 "us,ru"
        Option              "XkbVariant"                ",winkeys"
        Option              "XkbOptions"                "grp:alt_shift_toggle,terminate:ctrl_alt_bksp"
        MatchIsKeyboard     "on"
        MatchDevicePath     "/dev/input/event*"
    EndSection

Volume and Brightness up/down keys by default generate correct key symbols:

  • XF86AudioRaiseVolume and XF86AudioLowerVolume;
  • XF86MonBrightnessUp and XF86MonBrightnessDown;

One special keysymbol is added for the Power button – XF86Launch0. The button itself does not generate any keycode. It’s handled by ACPI subsystem, which generates proper key code for XF86Launch0. The .Xmodmap binds the special key code to XF86Launch0.

All we need to do is to assign proper actions to the symnames. The rc.xml is an example of such bindings. This configuration file has some additional key binding, which you may find interesting:

  • Alt+d– Toggles DPMS state of connected displays via xset. See dpms.sh for details.
  • Power shows an information dialog (tray.sh), which contains current time and date, battery status and level, brightness, CPU frequencies and governors, etc.

        16.08 Friday 18:40   
    MPD Stopped
    Battery: Discharging, 60%, 04:04:19 remaining
    Brightness: 100%
    Temp: CPU 46|46|46|46°C, SSD 39 C°C, WiFi 42°C
    Freq: 649MHz|1.44GHz|2.29GHz|2.29GHz, performance
    RAM: 92% free
    Network: wlan0, wireless is on

The fan switch is 100% hardware and does not generate a scancode, ACPI or udev event.
The keyboard backlit is also 100% hardware and does not require any software configurations.

Touchpad

Down below you can see xorg.conf.d file for the touchpad.

50touchpad.conf

    Section "InputClass"
      Identifier    "AMR-4630-XXX-0- 0-1023 USB KEYBOARD Mouse"
      Option        "AccelSpeed"             "1"
      Option        "ScrollMethod"           "button"
      Option        "ScrollButton"           "22"
      Option        "MiddleEmulation"        "on"
    EndSection

Using this config your can scroll by holding the middle mouse button.

Video

Kernel

The native orientation of the integrated display is portrait. Therefore the framebuffer console needs to be rotated. In order to configure correct orientation, add ‘fbcon=rotate:1’ to the kernel command line:

    CONFIG_CMDLINE="root=/dev/sda5 fbcon=rotate:1 i915.lvds_downclock=1 i915.i915_enable_fbc=1 i915.i915_enable_rc6=1 i915.enable_psr=1 quiet"

The following options improve power saving: i915.lvds_downclock=1 i915.i915_enable_fbc=1 i915.i915_enable_rc6=1 i915.enable_psr=1. I do not recommend enabling i915.enable_fbc or i915.enable_guc. The first one causes artifacts on the screen, the second one hangs the kernel.

portage configuration

The VIDEO_CARDS variable should be set to ‘intel i965’. The global USE should include ‘dri’, see make.conf as example.

Custom USE flags:

    x11-drivers/xf86-video-intel sna

xorg

Down below you can see xorg.conf.d files for Device and Monitor sections.

30device.conf

    Section "Device"
      Identifier    "Intel Graphics"
      Driver        "intel"
      Option        "AccelMethod"            "sna"
      Option        "TearFree"               "true"
      Option        "DRI"                    "3"
      Option        "Backlight"              "intel_backlight"
    EndSection

40monitor.conf

    Section "Monitor"
      Identifier    "DSI1"
      Option        "Rotate"                 "right"
      Option        "Primary"                "true"
      DisplaySize    75 133
    EndSection

    Section "Monitor"
      Identifier    "HDMI1"
      Option        "Disable"                 "true"
    EndSection

Few notes regarding these config files:

  • Backlight option is required to make the xbacklight utility work.
  • DisplaySize option sets correct DPI of the built-in LCD (245).
  • The external monitor is disabled by default, because the X-server incorrectly positions the external monitor during startup. This issue seems to be caused by the rotation of the internal monitor (X-server it sets the X-axis offset to 720 instead of 1280).

HDMI output

HDMI output is supported by intel driver. You can use video-out.sh utility to toggle the HDMI output (via xrandr). The utility installs the external screen to the right of built-in screen. See the source code of video-out.sh for details.

3D acceleration

DRI works fine with default parameters. glxgears shows approximately 2800 FPS.

The current driver xf86-video-intel-2.99.917 with mesa-19.0.8 supports OpenGL-4.5. See glxinfo for details.

Video decoding acceleration

Intel UHD Graphics 600 is able to decode a wide range of multimedia codecs [3]. The config parameters below describe how to enable hardware decoding via VA-API.

The global USE should include ‘vaapi’.

Custom USE flags:

    x11-libs/libva drm utils
    media-video/libva-utils drm

Unmask the following packages:

    x11-libs/libva ~amd64
    x11-libs/libva-intel-driver ~amd64
    media-video/libva-utils ~amd64

Besides libva, you need a media player, which supports VA-API. You can use ‘mpv’, which does the job pretty well. In this case, add the following config parameters to your mpv.conf

    vo=vaapi
    hwdec=vaapi-copy

You can check if hardware is configured properly by analyzing mpv output:

    Resuming playback. This behavior can be disabled with --no-resume-playback.
    Loading config '/home/vminko/.config/mpv/watch_later/302D20AF905DE13A6E3E80663E80F562'
    Playing: 28 panfilovtsev.mkv
     (+) Video --vid=1 (*) (h264 1920x804 24.000fps)
     (+) Audio --aid=1 --alang=rus (*) (dts 6ch 48000Hz)
    AO: [alsa] 48000Hz stereo 2ch float
    Using hardware decoding (vaapi-copy).                         <<<--- THIS
    VO: [vaapi] 1920x804 nv12
    AV: 00:56:36 / 02:00:38 (46%) A-V:  0.001
    Saving state.

or by viewing output of vainfo.

Sound

Supported by CONFIG_SND_HDA_INTEL. I recommend to compile alsa-lib with all plugins (ALSA_PCM_PLUGINS, see make.conf as example).

In general ALSA supports the Realtek ALC269 quite well: both internal speaker and mic work fine as well as headphones jacks. ALSA mutes the speaker when headphones jack is used.

Networking

Ethernet

Supported by CONFIG_R8169. Requires firmware rtl_nic/rtl8168h-2.fw. Configured via default gentoo net config. Here is an example of eth0 definition with static IP. See Gentoo Network Configuration for details.

ethtool may be used to detect whether ethernet cable is plugged or not.

WiFi

WiFi is also supported by kernel (CONFIG_IWLWIFI). The driver requires binary firmware iwlwifi-7265D-29.ucode.

WiFi connection can be configured via wpa_supplicant, here are config examples: wpa_supplicant.conf, net (preup function checks whether radio is enabled). See Wireless Networking for details.

The iwl driver supports power management, which is enabled by default. You can check whether power management is turned on using iwconfig:

    wlan0     IEEE 802.11  ESSID:"demo"
              Mode:Managed  Frequency:2.412 GHz  Access Point: AC:AF:B9:71:FB:1A   
              Bit Rate=72.2 Mb/s   Tx-Power=0 dBm   
              Retry short limit:7   RTS thr:off   Fragment thr:off
              Power Management:on                                          <<<--- THIS
              Link Quality=51/70  Signal level=-59 dBm  
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:9   Missed beacon:0

This file provides the temperature of the WiFi chip:

    /sys/devices/virtual/thermal/thermal_zone1/hwmon1/temp1_input

rfkill

MicroPC does not have a hardware rfkill switch. But you can configure software button using the rfkill tool. See toggle_rfkill.sh as example. Software rfkill toggles WiFi and Bluetooth connectivity.

ACPI

In order to handle ACPI events, you need to install the ACPI daemon and add it to the boot runlevel:

emerge -av acpid
rc-update add acpid boot

All ACPI events are configured in the default.sh. Here is a short description of the ACPI events handled by default.sh:

  • Power - Generates keycode 192 (XF86Launch0) via acpi_fakekey, which shows the system info panel. You can uncomment one line in the script to turns the system off instead.
  • Lid - Suspends to RAM if the display is not turned off via locked via dpms.sh. See lid.sh for details.
  • AC plug in/out - Switches cpufreq governor to performance when AC gets connected and to powersave when AC gets disconnected.

Besides the events handled in default.sh, acpid also catches the following ones:

  • jack/headphone plug|unplug
  • button/volumedown
  • button/volumeup
  • video/brightnessup
  • video/brightnessdown

All multimedia keys generate scancode and are described in the Input section. However, you can write a handler for the respective keyboard events. The main advantage of ACPI hot keys is that they're not dependent on WM (which handles multimedia keys) and work even in console and SDL programs.

You can use the acpi command to monitor the AC and battery information, as well as the temperature of the SoC.

    #acpi -abit
    Battery 0: Discharging, 50%, 03:21:25 remaining
    Battery 0: design capacity 3100 mAh, last full capacity 3290 mAh = 100%
    Adapter 0: off-line
    Thermal 0: ok, 45.0 degrees C
    Thermal 0: trip point 0 switches to mode critical at temperature 95.0 degrees C
    Thermal 0: trip point 1 switches to mode passive at temperature 95.0 degrees C
    Thermal 0: trip point 2 switches to mode active at temperature 65.0 degrees C

ACPI does not provide any information about Fan and Cooling. It looks like the Fan can only be controlled by hardware.

CPU frequency scaling

Supported by CONFIG_X86_INTEL_PSTATE The default governor can be selected via options CONFIG_CPU_FREQ_DEFAULT_GOV_*.

Install sys-power/cpupower packages in order to monitor or control frequency scaling:

    # cpupower frequency-info
    analyzing CPU 0:
      driver: intel_pstate
      CPUs which run at the same hardware frequency: 0
      CPUs which need to have their frequency coordinated by software: 0
      maximum transition latency:  Cannot determine or is not supported.
      hardware limits: 800 MHz - 2.40 GHz
      available cpufreq governors: performance powersave
      current policy: frequency should be within 800 MHz and 2.40 GHz.
                      The governor "performance" may decide which speed to use
                      within this range.
      current CPU frequency: Unable to call hardware
      current CPU frequency: 1.27 GHz (asserted by call to kernel)
      boost state support:
        Supported: yes
        Active: yes

Suspending

Suspend-to-RAM

Suspend-to-RAM (aka sleep or ACPI S3 state) is supported by CONFIG_SUSPEND and works flawlessly.

Suspend-to-disk

In order to use native Linux hibernator, you need to enable CONFIG_HIBERNATION and specify your swap partition either in CONFIG_PM_STD_PARTITION or in the resume kernel parameter.

ACPI subsystem in MicroPC does not generate an event when battery capacity changes. Therefore in order to perform automatic hibernation when battery capacity goes beyond critical level, we need a daemon monitoring the battery capacity level. One simple way to implement this is to use a cron daemon with a simple script checking the battery level.

You can use low_battery_handler.sh to check the battery level and hibernate when the battery level is less than or equal to 3%.

There are various cron implementations available in the Gentoo repository, which slightly differ in configuration. In case of dcron, do the following as root.

    emerge -av dcron
    rc-update add dcron boot
    crontab -e

Add the following line to opened cron configuration file:

    * * * * * /usr/local/bin/low_battery_handler.sh

That's it. Your MicroPC should now hibernate automatically on low battery.

Power Management Utilities

You can use pm-utils package (the power management utilities) in order to run user supplied scripts on suspend and resume. Additionally, you may be interested in the following:

Media card reader

Supported by CONFIG_MMC_SDHCI_PCI. The provided kernel config has also CONFIG_USB_STORAGE_REALTEK enabled, which implements additional power-saving features for Realtek card readers. However, it's not clear whether this driver supports the card reader from MicroPC (0bda:0316),

The benchmarks section contains some read/write tests of a microSD card.

Known issues

  • Kernel detects GPIO errors, which does not seem to affect any functions:

    [ 8629.303519] [drm:0xffffffff81454303] *ERROR* GPIO index 1 request failed (-2)
    [ 8629.599707] [drm:0xffffffff81454303] *ERROR* GPIO index 5 request failed (-2)
    [ 8629.720171] [drm:0xffffffff81454303] *ERROR* GPIO index 0 request failed (-2)
    [ 8629.928897] [drm:0xffffffff81454303] *ERROR* GPIO index 0 request failed (-2)
    [ 8629.933962] [drm:0xffffffff81454303] *ERROR* GPIO index 5 request failed (-2)
    [ 8629.954162] [drm:0xffffffff81454303] *ERROR* GPIO index 5 request failed (-2)
    [ 8629.984600] [drm:0xffffffff81454303] *ERROR* GPIO index 5 request failed (-2)
    [ 8630.133609] [drm:0xffffffff81454303] *ERROR* GPIO index 1 request failed (-2)

Benchmarks

Here are few relevant benchmarks:

Test conditions Results
Bootup (from EFI boot menu to X11 WM) 10 sec
Suspend-to-disk aka hibernate (linux-5.2.1, only X11 WM, no apps running) 4 sec
Resume from suspend-to-disk (from EFI boot menu, linux-5.2.1) 6 sec
Suspend-to-RAM (linux-5.2.1) 2 sec
Resume from suspend-to-RAM (linux-5.2.1) 2 sec
SSD read speed (TS256GMTS400S, hdparm) 498 MB/s
SSD write speed (TS256GMTS400S, dd, bs=1M) 341 MB/s
MicroSD card read speed (SanDisk Ultra 128Gb, hdparm) 86 MB/s
MicroSD card write speed (SanDisk Ultra 128Gb, dd, bs=1M) 18 MB/s
Quake 3 (1280x720, high quality, xf86-video-intel-2.99.917, mesa-19.0.9) 114 fps
glxgears (linux-5.2.1, xf86-video-intel-2.99.917, mesa-19.0.8) 2801 fps
Idle consumption (10W TDP, 10% brightness, no wireless) 2.1 W

History of changes

Sep 18 2019
Enabled power saving of Intel HDA and i915.
Changed meaning of the power button (display system info instead of halting the system).

Aug 24 2019
First public release.

Upgrading SSD in GPD MicroPC

SSD in GPD MicroPC is replaceable. So MicroPC owners can replace the default SSD (Biwin G6327) with a higher capacity SSD or with something more reliable. I decided to upgrade to Transcend 400S.

The upgrade is quite easy to perform: remove 5 screws from the back of the device, unclip the bottom panel and you are ready to replace the SSD.
Here is a detailed instruction in case you need it.

Transcend 400S is a bit faster than the default SSD, you can see the benchmark screenshots below. The temperature of Transcend 400S is usually around 40 °C when the fan is enabled and 45 °C when the fan is disabled.

If you would decide to use the official Windows 10 recovery firmware from GPD (GPD Micro PC WINDOWS 10 Pro Factory 20190320.rar), please note, that there is an error in this archive. MicroPC won’t boot from this image. In order to make it bootable, you need to rename /WINPE/EFI/Microsoft/Boot/BCD(1) to /WINPE/EFI/Microsoft/Boot/BCD.

GPD MicroPC arrived

Overall impression

MicroPC looks very robust. The build quality is quite impressive. Chinese companies definitely improve their skills. The keyboard is one of the most comfortable handheld keyboards I’ve ever used. The size of the device is significantly smaller than size of similar devices from UMPC era (see comparison photos below).

In general I really like the device. I can’t mention any disadvantages so far.

I did’t like the original GPD case, because it’s designed to fit much larger devices (GPD Pocket, probably). So I ended up using the FlipStart bag instead, because I have an extra one and the MicroPC fits perfectly.

Benchmarks

The performance of MicroPC is significantly higher than the performance of Microsoft Surface 3.

DOOM 3 benchmark (1280×720, graphic quality set to high, timedemo demo1)

Device FPS (1st run) FPS (2nd run) FPS (3rd run) Average FSB
GPD MicroPC 10W 39.5 44.6 47.0 43,7
Microsoft Surface 3 30.5 31.7 34.1 32,1

It’s also worth mentioning that Surface 3 is unable to sustain this perofrmance during long period of time. Without active cooling Surface 3 starts throttling and the performance decreases to 23-24 FPS.