OpenBSD on PinePhone Pro: First Impression
August 15, 2023
Disclaimer #
OpenBSD does not support PinePhone Pro yet and there are real risks involved in running it on your PinePhone Pro now, as such, I do not recommand anyone to do that. You might fry your device due to unsupported power management IC and in a worse case the battery might catch fire due to unconfigured/untested charging safety features.
The purpose of this post is to document how to install OpenBSD on arm64 platforms not fully supported by OpenBSD, and much of this post is not PinePhone-specific, if you intend to follow what documented here, please be mindful about the risks and apply common sense.
Overview #
-
OpenBSD installer cannot be used on bare metal if you want to install OpenBSD to an sdcard, because of insufficiant hardware support. However, it’s possible to install OpenBSD to a virtual machine and then transfer the installed system to a SD card to boot from
-
This post assumes you have a PinePhone Pro running Mobian with KVM properly configured, and an sdcard to transfer the installed system to
-
As for now the only way to interact with the running system is via a serial console cable, wired and wireless network are not supported, same for screen, keyboard, and USB host mode
-
Jump to Support Status to see what work (not much)
Prepare Disk Image #
To make full use of the sdcard, we will create a disk image with size equal to our sdcard. We can find precise size of the sdcard with fdisk
on Mobian:
mobian$ echo p | sudo fdisk /dev/mmcblk1
A line similar to above should appear, showing the size of sdcard in bytes:
Disk /dev/mmcblk1: 29.72 GiB, 31914983424 bytes, 62333952 sectors
We can now create our disk image:
mobian$ qemu-img create -f qcow2 openbsd.vm.qcow2 31914983424
Bootstrap via virtual machine #
Installing OpenBSD on VM is relatively strightforward, get the minirootXX.img from OpenBSD mirror (at the moment I’m using miniroot73.img
), and follow instruction from my other post
Add support files #
A freshly installed OpenBSD/arm64 VM is not bootable on bare metal, to make it bootable, we will need:
- Device Tree Blob (DTB) for PinePhone Pro, which describes the hardware environment
- OpenBSD’s dtb package is compiled from Linux source tree, you can see how it is compiled here
- Support files for uboot, extracted from installer image
(I’m not sure if all the uboot files are needed, but it’s easy to extract them all)
This can be done from the VM we prepared:
Create mount point for operating on disk image #
vm# mkdir /mnt/{img,disk}
Prepare dtb and installer image #
vm# pkg_add dtb
vm# ftp https://cdn.openbsd.org/pub/OpenBSD/snapshots/arm64/miniroot73.img
Prepare and mount boot partition of installer image #
vm# vnconfig vnd0 miniroot73.img
vm# mount /dev/vnd0i /mnt/img/
Mount VM boot partition #
vm# mount /dev/sd0i /mnt/disk/
Copy files from installer boot partition to VM boot partition #
vm# cp -r /mnt/img/* /mnt/disk/
Copy DTB #
vm# cp /usr/local/share/dtb/arm64/rockchip/rk3399-pinephone-pro.dtb /mnt/disk/
Clean up #
vm# umount /mnt/disk/
vm# umount /mnt/img/
vm# vnconfig -u vnd0
Disable ohci #
ohci controller is not yet supported by OpenBSD on this device, and the existing driver can prevent the kernel from booting, before the root problem is addressed, we can disable ohci driver in kernel to workaround this.
vm# config -ef /bsd
ukc> find ohci
167 ohci* at pci* dev -1 function -1 flags 0x0
236 ohci* at apldc*|agintc*|ampintc*|qcdwusb*|imxsrc*|imxdwusb*|mvmdio*|rktcphy*|rkpinctrl*|rkgrf*|rkdwusb*|hidwusb*|amldwus
b*|syscon*|sxisyscon*|simplebus*|mainbus0 early 0 flags 0x0
413 ohci* at acpi0 addr -1 flags 0x0
ukc> disable 236
236 ohci* disabled
ukc> quit
Saving modified kernel.
vm# shutdown -hp now
Write image to SD card #
Make sure you VM is properly shutdown, and your sdcard is at /dev/mmcblk1
, then write the VM image to the sdcard.
mobian$ sudo qemu-img dd -f qcow2 -O raw if=openbsd.vm.qcow2 of=/dev/mmcblk1 bs=20M
Boot OpenBSD from Tow-boot #
To boot OpenBSD from the sdcard with Tow-boot:
- Insert sdcard into PinePhone Pro
- Then flip the DIP switch 6 (the rightmost, labeled Headphone) to enable serial access
- Connect a serial cable and open a console session, the example uses cu(1) since I’m using OpenBSD, but minicom can also work, towboot uses 115200 as baudrate but other u-boot build might differ
$ doas cu -s 115200 -l /dev/cuaU0
Something similar to the following output can help you confirm your serial connection is working:
U-Boot TPL 2021.10 (Oct 04 2021 - 15:09:26)
Channel 0: LPDDR4, 50MHz
BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
Channel 1: LPDDR4, 50MHz
BW=32 Col=10 Bk=8 CS0 Row=15 CS1 Row=15 CS=2 Die BW=16 Size=2048MB
256B stride
lpddr4_set_rate: change freq to 400000000 mhz 0, 1
lpddr4_set_rate: change freq to 800000000 mhz 1, 0
Trying to boot from BOOTROM
Returning to boot ROM...
- Repeatedly press ESC to trigger tow-boot’s boot menu, select
Boot from SD
Boot from eMMC
Boot from SD
Boot from USB
Boot from PXE
Boot from DHCP
Boot from (sf0)
Rescan USB
Firmware Console
Reboot
Shutdown
_
- Something silmilar to the following should indicate OpenBSD is booting, and a login prompt will appear soon
boot>
booting sd0a:/bsd: 10625552+2504232+292520+843464 [792195+91+1216848+729496]=0x13b2240
[ using 2739408 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
Copyright (c) 1995-2023 OpenBSD. All rights reserved. https://www.OpenBSD.org
OpenBSD 7.3-current (GENERIC.MP) #2182: Thu Jul 6 15:02:37 MDT 2023
deraadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/GENERIC.MP
real mem = 4088885248 (3899MB)
avail mem = 3883520000 (3703MB)
Support status #
Feature | State | Note |
---|---|---|
Screen | No | Screen lights up but no signal |
USB Host | No | USB port is not powered |
Built-in EMMC | Yes | sd1 at scsibus1 |
SD Card | Yes | sd0 at scsibus0 |
WIFI | No | bwfm0 at sdmmc0 needs brcmfmac43455-sdio.pine64,pinephone-pro.bin, loading this can lead to kernel crash |
Sensors | Partial | GPU/CPU temperature is reported by rktemp(4), no other sensor detected |
CPU | Yes | All 6 CPU cores are detected and run fine with MP kernel |
Power off | No | Cannot power down system |
Reboot | Yes | Reboot from OpenBSD works |
Modem/other usb devices | No | Internal USB bus doesn’t seem to work |
dmesg #
Full dmesg and other hardware info is available from PinePhone Pro installation report