The PC Engines Alix series were a popular x86 low power single board computers used in some hobby and science applications. These computers were used in various applications, among others, as unattended network nodes or routers back in their day. You could say they were a spiritual predecessor to the Raspberry Pi and it's clones of today.
I have a few of them and I find them very well designed and pleasant to work with. They are based on AMD Geode CPUs and use the Geode Companion Device as what is often referred to as the "chipset". I've done a bit of work on Geode based devices in the past, for example on the Winterm S10 computers. They are quite interesting systems.
I have four Alix computers in my collection so far. One is the Alix 3D (in the picture above). On the outside it has got a single Ethernet interface, a DC in and a serial port, as well as two USBs. The VGA port is not populated in my version. Inside there are two miniPCI slots dedicated for Wi-Fi cards. In it's day this computer would likely be used to build Wi-Fi access points or bridges, taking advantage of the two wireless cards. The system is stored on the CF card.
The other three are Alix 2C, an earlier design supporting up to 3 Ethernet interfaces, two miniPCI slots (for similar purposes as in the 3D) two USBs and a serial port. These were also network oriented, likely used to build router-access point combos. I have three of them, one has a 700MHz CPU, the other two 800MHz. Two of these came to me broken, I managed to fix one.
None of these computers has a VGA port. The 2C has none at all, and on the 3D it's optional and not populated on my unit. The VGA port however, is a mandatory part of the IBM PC specification. Nearly every OS for x86 PCs uses the VGA for it's interface, even if it displays a console. How did PC Engines get away with making a PC compatible machine with no graphics output capability?
The answer lies in the firmware. The Alix series have a very simple BIOS which translates text mode VGA interface into a serial console. This works surprisingly well, even for software which draws complicated interfaces like GNU GRUB. I think that the Alix firmware hooks the standard BIOS VGA routines and emulates them on the serial port. These are enabled as long as the OS does not initialize the serial port.
I've done some work on the Geodes regarding booting various OSes. Over the years I managed to boot (in easiest first order) MS-DOS (easy peasy, needs nothing, runs on everything), Linux (there are some quirks) and NetBSD (i had to disable some conflicting drivers).
On the Alix 2C I last had NetBSD/i386 9.3 running (above), which works nicely on the 700MHz Geode. If it hangs on disk init, you have to disable the viaide
driver in userconf. I think I used QEMU to install it to the CF card, as the Alix does not support USB boot.
For the Alix 3D, I decided to turn it into an SDR receiver. This is still a work in progress, I hope the 800MHz Geode will be able to run rtl_tcp
to stream the radio data to the LAN. For now I managed to build a simple Linux 6.6.22 system with lightweight musl-based userspace (which so far includes busybox and bash). On the image above you can see the system running bash on a HP serial terminal. Both the terminal and my PC's serial port have some issues running at 38400 baud, and corrupt characters when large blocks of data are transferred.
As you can see in the free -h
output, this system uses only 6MB of memory doing nothing. This is my personal best in terms of minimizing memory usage on Linux.
I've used buildroot to make the system. The config is available here. It boils down to:
i386
, variant AMD Geode
serial
to builtin modulesgrub.cfg
- add these two lines to the beginning of the file:serial --unit=0 --speed=38400 terminal_input serial; terminal_output serial
console=ttyS0,38400
to the kernel default cmdline (you can also add it in grub.cfg
)This script packs the full boot disk image into a disk.img
file
#!/bin/bash
IMAGE=disk.img
SIZE=2047248 # SECTORS
ROOTFS=output/images/rootfs.ext2
if [ ! -f $IMAGE ]; then
echo "[*] Creating $IMAGE..."
dd if=/dev/zero of=$IMAGE bs=512 count=$SIZE
echo "[*] Partitioning $IMAGE..."
/sbin/parted $IMAGE -s "mklabel msdos mkpart pri 64M 100%"
fi
echo "[*] Mounting $IMAGE..."
sudo losetup -P -f $IMAGE
LOOP=`sudo losetup -a | grep $(realpath $IMAGE) | cut -d: -f1 | head -n1`
echo "[i] Mounted $IMAGE as $LOOP."
echo -n "[*] Installing GRUB..."
sudo ./output/host/sbin/grub-bios-setup -b ./output/build/grub2-2.12/build-i386-pc/grub-core/boot.img -c ./output/images/grub.img -d . $LOOP
if [ $? -eq 0 ]; then echo "OK"; else echo "ERROR"; exit 1; fi
echo "[*] Copying rootfs"
sudo dd if=$ROOTFS of=${LOOP}p1 bs=512 status=progress
echo "[*] Detaching $LOOP"
sudo losetup -d $LOOP
echo "[i] $IMAGE stats:"
/sbin/fdisk -l $IMAGE