When the kernel 2.6.26 is officially packaged in Debian, making the frame buffer work on the Eee PC will be more easy, but with the current 2.6.25 kernel package (as of July 17th, 2008,) some kernel changes are required, and also some packages (e.g. klibc) need to be recompiled to make it work. Some other changes are also needed to make dmcrypt and splashy both in initramfs work good. Let's start:

Frame buffer: uvesafb module

With the 2.6.25 Debian kernel, uvesafb isn't compiled by default. So, the first thing to do is to get the kernel source. You don't need to rebuild the whole package, just the module, but in any case, you will need a kernel build later to rebuild some other packages. Recompiling the kernel on your Eee PC requires a lot of free space and takes a long time. Therefore, we suggest you build it on another machine.

FixMe: revise the following instructions to use the same Debian kernel tree that would be used with module-assistant, if possible. This will simplify things.

apt-get install linux-source-2.6.25
cd /usr/src/
tar xfj linux-source-2.6.25.tar.bz2 
cd linux-source-2.6.25

Now copy your actual kernel config file under the source tree and start the kernel configuration menu:

cp /boot/config-2.6.25-2-686 .config 
make menuconfig

Now go to Device Driver -> Graphics support -> Support for frame buffer devices and select "Userspace VESA VGA graphics support" as module <M>.

Exit and save the kernel configuration.

Build your kernel. You don't need to rebuild the package, you just need to have a source tree compiled with this option enabled.

make

... and wait ... It's time for a coffee!

When the compilation is done, copy the uvesafb.ko module to your Eee PC. The module is under /usr/src/linux-source-2.6.25/driver/video/ and it is called uvesafb.ko.

cp driver/video/uvesafb.ko /lib/modules/`uname -r`/kernel/driver/video/
depmod -a

Eee PC resolution is 800x480 which isn't a standard VGA resolution so uvesafb doesn't support it. To make it work as expected, we also need to use 915resolution binary to make it recognize the right resolution. In sid, the package 915resolution was dropped because it is obsolete. It can't be installed because it conflicts with xserver-xorg-video-intel which is needed to make X work on the Eee PC.

The solution is to download the tarball package of 915resolution

cd /usr/src
wget http://www.geocities.com/stomljen/915resolution-0.5.3.tar.gz
tar xfz 915resolution-0.5.3.tar.gz
cd 915resolution-0.5.3

If you want, you can recompile it with a simple make. However, we don't need to compile it since inside the tarball there is a functional binary precompiled for us. Copy it somewhere in your path:

cp 915resolution /usr/sbin

Now you can test your framebuffer!

915resolution 5c 800 480 32
modprobe uvesafb mode=800x480-32@60

You will see now a fancy frame buffer working.

Put framebuffer initialization in initramfs

As I was saying before, some packages need to be recompiled to support the frame buffer in our initramfs. This is because uvesafb needs to be loaded in userspace with v86d, but to make v86d work in initramfs we need to have klibc compiled with a kernel compiled with uvesafb enabled.

So, lets recompile our packages:

cd /usr/src
apt-get source v86d libklibc
cd klibc-1.5.12

A little dirty hack to point klibc to the right kernel source: edit debian/rules with your favorite text editor, go to the line starting with pre-build:: and change this section to:

pre-build:: 
        if [ ! -e linux ]; then \
                rm -rf linux/include; \
                mkdir -p linux/include ;\
                ln -s /usr/src/linux-source-2.6.25/include/linux/ linux/include; \
                for x in /usr/src/linux-source-2.6.25/include/asm*; do \
                        ln -s $${x} linux/include; \
                done ;\
        fi ; \

Save and exit, and now rebuild the package:

debuild

and install the new packages:

cd ..
dpkg -i klibc-utils-1.5.12-1_i386.deb libklibc_1.5.12-1_i386.deb

It's time to rebuild also v86d.

cd v86d-0.1.5
vim debian/rules

Here we need a very little change, beneath the "config-stamp: configure" line, where there is a ./configure line, change it to:

           ./configure --with-klibc

Save and rebuild the package:

debuild

and install it:

cd ..
dpkg -i v86d_0.1.5-1_i386.deb

Now we have all we need for our initramfs. First of all, you need to install initramfs tools:

apt-get install initramfs-tools

and make some modification on our initramfs image.

My scripts are dirty and they aren't so well done, but they work. Feel free to rewrite those scripts however you prefer!

We need to:

To include uvesafb.ko, just add it to /etc/initramfs-tools/modules

echo uvesafb >> /etc/initramfs-tools/modules

To include 915resolution and v86d, we need to create a hook script, so, edit /etc/initramfs-tools/hooks/915resolution and put this in it:

#!/bin/sh

PREREQ=""
prereqs()
{
   echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
   prereqs
   exit 0
   ;;
esac

. /usr/share/initramfs-tools/hook-functions


copy_exec /usr/sbin/915resolution /sbin
copy_exec /sbin/v86d /sbin

We need also to get uvesafb loaded in the right way when needed, so we will create another script inside our initramfs. I don't like to use video=something in my kernel command line because I have the impression that the framebuffer script inside initramfs can break something in our hack, so I use another option. I've called it "fbhack".

Create the file /etc/initramfs-tools/scripts/init-top/framebuffer and put this inside:

#!/bin/sh

PREREQ=""
prereqs()
{
   echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
   prereqs
   exit 0
   ;;
esac

echo "FBHACK FOR EeePC"

for x in $(cat /proc/cmdline); do
    case $x in
      fbhack|video=*)
         echo "creating /dev/mem file"
         mknod /dev/mem c 1 1
         if [ -e /dev/zero ] ; then
            echo "Dev Zero Exists" 
         else
            mknod /dev/zero c 1 5
         fi
         if [ -e /dev/tty1 ] ; then
            echo "tty1 exists"
         else
            mknod /dev/tty1 c 4 1
         fi
         if [ -e /dev/console ] ; then
            echo "console exists"
         else
            mknod /dev/console c 5 1
         fi
         echo "Set 915resolution to 800x480"
         /sbin/915resolution 5c 800 480 32
         depmod -a
         #/sbin/modprobe fbcon
         echo "modprobe uvesafb"
         chk=`cat /proc/modules  | grep uvesafb`
         if [ "x$chk" != "x" ] ; then
            rmmod uvesafb
         fi
         /sbin/modprobe uvesafb mode=800x480-32@60
         echo "Done!"
      ;;
    esac
done

Now test if all is working. Rebuild your initramfs with:

update-initramfs -u -k `uname -r`

Edit your grub menu.lst, duplicate the kernel entry, and add fbhack to your kernel option, like this:

title    Debian GNU/Linux, kernel 2.6.25-2-686 fb
root     (hd0,0)
kernel      /vmlinuz root=/dev/mapper/rootfs ro  fbhack
initrd      /initrd.img

Reboot your system, select your "fb" kernel entry, and now the frame buffer should work from the earliest stage in initramfs and at the right resolution!

Splashy in initramfs with dmcrypt

Now it's time to install splashy. Simply perform:

apt-get install splashy

If you just rebuild your initramfs and you append the right parameters to your boot command line, splashy initially seems to work, but, since you have also an encrypted root file system, you can't insert your fs password. The result is you can't boot into your system. This is because the initramfs script cryptmount by default can't manage splashy at all. It uses askpass to get your password used by cryptsetup, but askpass doesn't work with splashy, at least in the way that splashy is managed by initramfs default script.

We will make some changes in both scripts to make it all work as we want.

Get the original splashy script and put it inside your initramfs:

cd /etc/initramfs-tools/scripts/init-top
cp /usr/share/initramfs-tools/scripts/init-top/splashy .

Create a new patch file called splashy.patch and put it inside this file:

--- splashy.old 2008-07-17 20:49:09.000000000 +0000
+++ splashy     2008-07-17 15:26:18.000000000 +0000
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-PREREQ=""
+PREREQ="framebuffer"
 prereqs()
 {
        echo "$PREREQ"
@@ -37,7 +37,7 @@
         nosplash)
             SPLASH=false
         ;;
-        vga=*|video=*)
+        vga=*|video=*|fbhack)
             FBMODESET=true
         ;;
     esac
@@ -46,9 +46,9 @@
 test $SPLASH = "true" || exit
 test $FBMODESET = "true" || exit
 
-depmod -a
-silent modprobe fbcon
-silent modprobe vesafb
+#depmod -a
+#silent modprobe fbcon
+#silent modprobe vesafb
 
 if [ -s /proc/fb ]; then
         while read fbno desc; do

Save the patch file, apply it to splashy and remove the patch file:

patch -p0 < splashy.patch
rm splashy.patch

Now we work on dmcrypt. We make some changes in order to let cryptsetup use splashy_update instead of askpass to get the root file system password.

Copy the original script:

cd /etc/initramfs-tools/scripts/local-top
cp /usr/share/initramfs-tools/scripts/local-top/cryptroot .
}}

Copy and paste this patch file inside cryptroot.patch:

{{{
--- cryptroot.old       2008-07-17 20:54:12.000000000 +0000
+++ cryptroot   2008-07-17 16:28:18.000000000 +0000
@@ -29,6 +29,8 @@
 {
        if [ -p /dev/.initramfs/usplash_outfifo ] && [ -x /sbin/usplash_write ]; then
                usplash_write "TEXT-URGENT $@"
+   elif [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then
+      /sbin/splashy_update "print $@"
        else
                echo "$@" >&2
        fi
@@ -224,16 +226,27 @@
                fi
 
                if [ -z "$cryptkeyscript" ]; then
-                       cryptkeyscript="/lib/cryptsetup/askpass"
+         if [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then
+            cryptkeyscript="/sbin/splashy_update"
+         else
+                          cryptkeyscript="/lib/cryptsetup/askpass"
+         fi
                        cryptkey="Enter passphrase to unlock the disk $cryptsources ($crypttarget): "
                fi
 
-
-               if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
-                    $cryptkeyscript "$cryptkey" | $cryptcreate --key-file=- ; then
-                       message "cryptsetup: cryptsetup failed, bad password or options?"
-                       continue
-               fi
+      if [ -x /sbin/splashy_update ] && [ ! -z "`pidof splashy`" ] ; then
+         if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
+               $cryptkeyscript "getpass $cryptkey" | $cryptcreate --key-file=- ; then
+            message "cryptsetup: cryptsetup failed, bad password or options?"
+            continue
+         fi
+      else
+         if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
+               $cryptkeyscript "$cryptkey" | $cryptcreate --key-file=- ; then
+            message "cryptsetup: cryptsetup failed, bad password or options?"
+            continue
+         fi
+      fi
 
                if [ ! -e "$NEWROOT" ]; then
                        message "cryptsetup: unknown error setting up device mapping"

Save it, apply it and remove the patch file:

patch -p0 < cryptroot.patch
rm cryptroot.patch

Now rebuild your initramfs:

update-initramfs -u -k `uname -r`

Re-edit the grub menu.lst and make these changes to the "fb" kernel entry in the kernel line:

title    Debian GNU/Linux, kernel 2.6.25-2-686 fb
root     (hd0,0)
kernel      /vmlinuz root=/dev/mapper/rootfs ro splash quiet video=uvesafb:800x480-32@60
initrd      /initrd.img

Finally, reboot!

You will now have your splashy and dmcrypt working from initramfs on your Eee PC!