Arch Linux on the Yoga Book
I have a Yoga Book - the only laptop that I’ve actively wanted at launch - and with its release now in the dim and distant past of 2016 its really showing the age of its hardware, so I’ve decided after some deliberation to attempt to get a working Linux stack running on it.
There were two versions of the laptop at launch, one running Windows 10 and the other running Android, and while they may appear similer externally, they are very different internally.
Mine is the Windows 10 edition, so runs a fairly normal EFI boot configuration and can run USB ISOs, and has the following specification:
Feature | Details |
---|---|
Operating System | Windows 10 Anniversary Edition |
CPU | 1.44GHz Intel Atom x5-Z8550 (quad-core, 2MB cache, up to 2.4GHz with Turbo Boost) |
Graphics | Intel HD Graphics 400 |
RAM | 4GB (LPDDR3) |
Screen | 10.1-inch FHD (1,920 x 1,200 resolution), IPS touchscreen |
Storage | 64GB flash storage (expandable by up to 128GB via microSD) |
Ports | microUSB, microHDMI, 3.5mm audio jack |
Battery | 8,500mAh |
Connectivity | 802.11ac Wi-Fi (2.4 & 5GHz), optional 4G radio, Bluetooth 4.0 |
Camera | 2MP front-facing webcam with fixed focus; 8MP rear camera with auto-focus |
Weight | 1.52 pounds (690g) |
Size | 10.1 x 6.72 x 0.38-inches (256.6 x 170.8 x 0.96mm; W x D x H) |
Its ludicrously slim as compared to laptops of the time, and performed well enough that I used to present my lectures directly from the thing, plugging in via a micro-HDMI port to connect up to a projector.
It has the usual touch screen input, which is handy for when you’re using it in ‘tablet mode’ with the keyboard folded all the way back, but the truly odd thing about the hardware is the keyboard/touchpad/digitizer combination input area.
This is placed where the keyboard would be on a traditional laptop, but instead is a full-size touch panel, with electroluminescent[1] (EL) lines and glyphs to indicate the virtual key areas.
It also has a mode switch (also a sort of touch keypad) which toggles the EL panel off, and converts the entire area to a Wacom[2] style digitizer, compatible with any electromagnetic resonance (EMR)[3] pen as an input.
However, provided that I can get this machine to boot, I should be OK on the hardware otherwise, as it uses fairly common components for everyhing except the input layer.
Booting!
So, armed with a Manjaro Linux[4] bootable USB I attempted to get past the EFI loader aaand… nothing. Zip. Zero.
Just a black screen, not even the legendary blinking cursor of death for GRUB-based boot systems.
Undeterred, I threw Alpine Linux[^5] at it, aaaand nothing.
At this point I was beginning to think that I’d need some kind of magic to get into a bootloader, but then I tried Puppy Linux[^6], knowing that it is famously light on resources and runs on a wide variety of older hardware just fine; and success! Kinda!
Well, its running at least!
I could get past the GRUB stage, and get the kernel loaded. Early boot messages seemed to be scrolling, and then it dropped to this mess.
So this is promising, as it shows that Linux in some variation is capable of booting into some form of runtime.
Puppy linux has a ‘safe mode’ terminal-only boot mode, and I figured, why not give it a go, as I could read the GRUB prompt just fine, so I can toy with linux boot args and get to a terminal-only framebuffer maybe?
From prodding a USB attached keyboard (actually a USB-OTG adapter to a USB hub with built-in ethernet, because this thing has no ports whatsoever!) I could see that I was getting characters on a terminal, and the right kind of output vaguely presented itself on the screen.
Typing ping 8.8.8.8
resulted in the usual 1 line per second return, so I was pretty confident that the system was booted, and running Bash, but the video config was horribly mangled.
At this point I was pretty disappointed, as I had expected to see something for a bare framebuffer boot, but after some thought I figured it would be worth trying bare Arch Linux (from which Manjaro is based) and slowly bringing components up bit by bit.
It worked! Arch ran out of the box just fine - and I was presented with the usual install/recovery environment on the live USB, allowing me to finally install a full system onto the micro-SD card I had in the laptop.
While I had a running system, I took a prod around to see what devices actually came up as, and they’re listed here for the curious:
[john@yoga-book ~]$ lspci -tv
-[0000:00]-+-00.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SoC Transaction Register
+-02.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller
+-03.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Imaging Unit
+-0a.0 Intel Corporation Device 22d8
+-0b.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Power Management Controller
+-14.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series USB xHCI Controller
+-1a.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Trusted Execution Engine
+-1c.0-[01]----00.0 Broadcom Inc. and subsidiaries BCM4356 802.11ac Wireless Network Adapter
\-1f.0 Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCU
[john@yoga-book ~]$ lsusb -tv
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
ID 1d6b:0003 Linux Foundation 3.0 root hub
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/7p, 480M
ID 1d6b:0002 Linux Foundation 2.0 root hub
[john@yoga-book ~]$ hwinfo --short
cpu:
Intel(R) Atom(TM) x5-Z8550 CPU @ 1.44GHz, 2400 MHz
Intel(R) Atom(TM) x5-Z8550 CPU @ 1.44GHz, 2400 MHz
Intel(R) Atom(TM) x5-Z8550 CPU @ 1.44GHz, 2400 MHz
Intel(R) Atom(TM) x5-Z8550 CPU @ 1.44GHz, 2400 MHz
mouse:
/dev/input/mice HDP0001:00 2ABB:8102
/dev/input/mice Goodix Capacitive TouchScreen
graphics card:
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller
network:
wlp1s0 Broadcom BCM4356 802.11ac Wireless Network Adapter
network interface:
wlp1s0 Ethernet network interface
lo Loopback network interface
disk:
/dev/mmcblk0 Disk
/dev/mmcblk0boot0 Disk
/dev/mmcblk1 Disk
/dev/mmcblk0boot1 Disk
partition:
/dev/mmcblk0p1 Partition
/dev/mmcblk0p2 Partition
/dev/mmcblk0p3 Partition
/dev/mmcblk0p4 Partition
/dev/mmcblk1p1 Partition
/dev/mmcblk1p2 Partition
usb controller:
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series USB xHCI Controller
bios:
BIOS
bridge:
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCI Express Port #1
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series PCU
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series SoC Transaction Register
hub:
Linux Foundation 2.0 root hub
Linux Foundation 3.0 root hub
memory:
Main Memory
unknown:
FPU
DMA controller
PIC
Keyboard controller
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Imaging Unit
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Trusted Execution Engine
Intel Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Series Power Management Controller
Intel Unclassified device
Serial controller
Device Status
The following is just a kind of checklist for me to keep track of what is working, and what still needs attention.
- [x] Boot (EFI)
- [x] From USB
- [x] From uSD
- [ ] From SSD
- [x] WiFi
- [ ] Bluetooth
- Audio
- [ ] Speakers
- [ ] 3.5mm Jack
- [ ] HDMI Output
- Video
- [x] Terminal shells
- [x] X11
- [x] Screen Rotation
- [ ] Display Brightness
- [ ] uHDMI Output
- Input
- [ ] Trackpad
- [ ] Keyboard (virtual)
- [x] Touch Screen
- [x] USB
- [x] USB-OTG
- [x] USB Ethernet