Wyse 3150SE: Linux 





With BIOS updated to v1.15 (which supports USB booting) I have successfully run:

  • Tiny Core 3.7
  • Tiny Core 4.0
  • DSL 4.4.10

These were installed on cheap unbranded 1GB pen drives using the USB Universal Installer - Easy as 1 2 3 from or the LinuxLive USB Creator (LiLi) from

Note: The USB boot times are sloooow. DSL boots in a little under 2 minutes, Tiny Core around 2 minutes 15 seconds. With Tiny Core it takes 24 seconds to load the kernel, 90 seconds to load the initrd file, and the remainder of the time to start up and run the initialisation scripts. The initrd file is ~9MB in size, so these timings (~10Mb/s) imply USB 1.1 speeds rather than 2.0 speeds. I wonder why?

Current Status (May 2010)

Work based on Tinycore Linux 2.7 with Linux kernel

  • Linux kernel boots and runs.
  • Frame buffer console works.
  • Graphics works (need to ensure VM86 is enabled as part of the kernel build!)
  • Booting via PXE.

"To Do" list:

  • Work out an easy way to reflash the WT3150SE with a linux+initrd replacement nk.bin.
  • Look at USB booting. (DSL works from a pen drive, but startup is slooooow)
  • Look at native flash support/use.

Having updated the BIOS to 1.15 the WT3150SE will boot from USB.

Trying the Wyse USB imaging tool results in error messages about the onboard memory.

Network Booting

The WT3150SE BIOS supports PXE (Pre eXecution Environment). If you want to know the full details about PXE then I suggest you download and read the specification or have a look at the wikipedia article. In essence you have a BIOS with an API that supports network operations such as UDP and FTP. In the first instance it will fetch a designated file (nominated by the DHCP server when it issues the IP address) and execute it. The file is downloaded to address 0x7C00, cannot be greater than 32K in size and is executed in real mode. This can then download other programs as required using the PXE API. This first downloaded program is often referred to as the NBP (Network Boot Program). As PXE is a standard we have a number of options...

Home-rolled NBP

My first step was to put a simple front-end on my hardware discovery program which prints out various details about the system environment it finds itself in. (Rebuilt to run at 0x7C00 and some preliminary code to switch into 32-bit protected mode). This showed that the GX2 processor/CS5535A combination is significantly different to the GX1/CS5530A used in many thin clients and the SC2200 used in the WT3125SE. Reading the Geode data sheet you find that system configuration is now controlled by a large set of MSRs (Machine Specific Registers). After a couple of tweaks to the program I was getting:

Memory size is 118MB
GX2 processor has no DeviceID registers
CPU info:
  0: Vendor ID string = Geode by NSC
  1: Family [5], Model [5], Step[2]
  2-4: Marketing name = Geode(TM) Integrated Processor by National Semi

Start and end of BIOS area...
000F0000: 24 58 50 52 03 15 00 0F 00 EB FF 00 00 EB FF 00 $XPR............
000F0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000FFFE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000FFFF0: EA 5B E0 00 F0 30 35 2F 32 34 2F 30 35 00 FC 00 .[...05/24/05...

Scanning for BIOS PIRQ table
Found PIR table @ 000FE100
 Version         = 1.0
 Size            = 80
 Router Bus      = 0
 Rtr Dev Func    = 15:0
 Exclusive IRQs  = 0x00
 Comp. PCI rout. = 0x100B:0x002B
 Miniport data   = 0x00000000

Entry bus device link IRQbmap link IRQbmap link IRQbmap link IRQbmap slot
  0    0   120      1 0x0800     2 0x0020     3 0x0400     4 0x0400   5
  1    0   104      4 0x0400     3 0x0400     2 0x0020     1 0x0800   1
  2    0   112      1 0x0800     2 0x0020     3 0x0400     4 0x0400   2

Network Interface:
  Device:Vendor ID    : 002B:100B
  IO base address     : 00000001
  Memory base address : 00006101
  IRQ register        : 0

With the older thin clients most of the work in getting a basic kernel to run was in sorting out the interrupts. We see from the above that the WT3150's BIOS does provide an IRQ routing table - which solves that particular problem.


There is a PXE version of Grub. I downloaded version 1.98 of grub from here. Then I did:


There were some brief instructions on building the PXE version on the grub wiki [was at, link now defunct when last checked]. As I hadn't installed grub on my system I used the following commands to generate a pxe boot image:

  ./grub-mkimage -d . --output=core.img --prefix="(pxe)/boot/grub" pxe pxecmd
  cat pxeboot.img core.img > grub2pxe
  mkdir ~/ftfp/boot
  mkdir ~/tftp/boot/grub
  cp *.mod *.lst ~/tftp/boot/grub/
  cp grub2pxe ~/tftp/bootp.bin

The -d . switch tells it to look in the current directory for some files rather than the usual install directory.

The last command matches up to my DHCP configuration that names the file bootp.bin as the one to be downloaded from the TFTP root directory.

Powering up/resetting the WT3150SE gave me a grub boot screen on its display. The next step was to set up a configuration file. This is very simple. I ended creating a file with four variants - essentially with and without a serial console and with and without starting X.

# Timeout for menu
set timeout=10

# Set default boot entry as Entry 0
set default=0

# Only difference between these options are the command line parameters

# Entry 0 - Load Linux kernel - Text console
menuentry "Text Console" {
    echo "Loading kernel..."
    linux (pxe)/boot/bzImage kmap=uk text console=tty0
    echo  "Loading initrd..."
    initrd (pxe)/boot/tinycore.gz
    echo  "Booting..."

# Entry 1 - Load Linux kernel - Text mode with Serial console
menuentry "Text Console + Serial" {
    echo "Loading kernel..."
    linux (pxe)/boot/bzImage kmap=uk text console=tty0 console=ttyS0,19200n8
    echo  "Loading initrd..."
    initrd (pxe)/boot/tinycore.gz
    echo  "Booting..."

# Entry 2 - Load Linux kernel - Graphics
menuentry "Graphics Console" {
    echo "Loading kernel..."
    linux (pxe)/boot/bzImage kmap=uk console=tty0
    echo  "Loading initrd..."
    initrd (pxe)/boot/tinycore.gz
    echo  "Booting..."

# Entry 3 - Load Linux kernel - Graphics and a Serial Console
menuentry "Graphics Console + Serial" {
    echo "Loading kernel..."
    linux (pxe)/boot/bzImage kmap=uk console=tty0 console=ttyS0,19200n8
    echo  "Loading initrd..."
    initrd (pxe)/boot/tinycore.gz
    echo  "Booting..."


There is a PXE version of the syslinux loader - see here. This option just boots and runs a Linux kernel and doesn't offer you the choices that you get with a Grub menu.

Still to be tried.

Linux Kernel

Being impatient I copied an existing WT3125SE bzImage file and tinycore.gz into the ~/tftp/boot/ directory and found I could boot and run Linux on the WT3150SE albeit with only a serial console. (At this point the monitor plugged into the WT3150SE just shows the three messages from grub).

Subsequently I built a kernel specifically for the 3150SE and had a running system with a working console. Once I found I also had to enable VM86 support in the kernel build I had an Xvesa graphical interface running as well.


Any comments? email me.    Last update March 2012