This article won't go into the mere details of system installation et. al. but describes our major learnings only. You'll find tons of information online on how to install OpenBSD on these boards. For the record, we have installed OpenBSD 5.9 on apu1d4 with 4GB RAM and T40E CPU using a 16 GB mSATA SSD with Phison S9 controller. The modem we bought is a Huawei EM770w (3G/GPS/HSPA Mini PCI Express Card). Please find the full dmesg here.

LEDs

The APU has three LEDs at its front but we found all three non-functional on plain OpenBSD. The first one lights up as soon as the board gets power, but you won't be able to control the LEDs at all. There is PoC code floating around to add them to gpioctl(8) but we didn't feel like hacking the GPIO system, which, according to some posts we found online, needs some major overhaul. Out of scope. We live without custom LED controls.

/dev/speaker

To our surprise, /dev/speaker allowed us to make the board issue custom beep sequences, by simply sending 'letters' to it (see spkr(4)). It's great for a headless system and checking a certain status, e.g. whether your system booted successfully, established an ssh tunnel etc. Especially when the LEDs won't work either, for example:

echo "MLo2e#..c#.e..e#.." > /dev/speaker

Push Button

One thing I constantly miss with Alix/APU is the lack of a supported hardware button. It would quit all discussions on how to cleanly shut down a headless system immediately. This time we fixed it. We bought a push button which fits exactly one of the two holes at the back of the enclosure. Of course, you waste one hole that you could use for a second external antenna. Once you solder the push button to the ready-to-use cables, connect them to J2 PWR and you're done. OpenBSD 5.9 nicely supports all required ACPI power states.

Modem (3G)

The Huawai modem is fully recognized by OpenBSD. In order to bring it online, we configured the modem as follows (Swisscom network):

/etc/ppp/peers/em770w:

cuaU0
connect "/usr/sbin/chat -v -f /etc/ppp/swisscom-chat"
nocrtscts
xonxoff
:0.0.0.2
noipdefault
ipcp-accept-local
defaultroute
novj
nobsdcomp
novjccomp
nopcomp
noaccomp
noauth
nomagic
persist

/etc/ppp/swisscom-chat:

TIMEOUT 10
REPORT CONNECT
ABORT BUSY
ABORT 'NO CARRIER'
ABORT ERROR
'' ATZ OK AT&F OK
AT+CGDCONT=1,"IP","gprs.swisscom.ch" OK
ATD*99***1# CONNECT

/etc/ppp/ppp.conf:

default:
 set log Phase Chat LCP IPCP CCP tun command connect
 set device /dev/cuaU0
 set speed 384000

swisscom:
 set phone "*99#"
 set timeout 0
 set ifaddr 192.168.0.199/0 10.0.0.0/0 255.255.255.0 0.0.0.0
 set dial "ABORT ERROR ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5\
	"" ATZ OK_ATZ_OK AT+CGDCONT=1,\\"IP\\",\\"gprs.swisscom.ch\\" OK \\dATD\\TT 40 CONNECT"
 add default HISADDR
 enable dns
 disable ipv6cp pred1 mppe

tcpdump(8)

For our specific purpose we'd like to capture traffic ideally endlessly. Which means, as long as there is enough disk space available on our externally connected USB hard drive. However, we learned the OpenBSD tcpdump(8) command would lack the -C flag present on the upstream version, in order to rotate the output files. Without that feature, we would simply run in the max file size limit of our FAT32 formatted hard drive (4GB). Hence, we had to come up with an ugly workaround, to imitate the rotation mechanism by a custom script.

This work has been primarily done by Lukas Heusser as part of his apprenticeship project. Many thanks to his valuable work!