Configuring the boot splash screens

From Openmoko

Jump to: navigation, search

There are three boot screens (also called splashes or splash screens) as of 13 Nov. 2007. The U-Boot splash is displayed until the kernel takes over. Presumably the kernel will eventually display a splash while it boots. When userspace initializes, psplash displays a splash. Finally X displays a splash when it starts.


U-Boot Splash

Werner's README states the following:

"The splash image is a raw dump of the 480x640x16 frame buffer, with RGB
5:6:5 organization and HWSWP = 1. To save a lot of space and to greatly
improve speed, we gzip the raw dump."

So what you have to do to create your U-boot splashscreen is

  1. create your splash-file with the dimensions 480x640 (in 16bit preferrably) and save it in png format
  2. get the necessary tools for converting it
    • get the conversion script
      • download the Perl script kindly provided by Werner Almesberger
      • make it executable with `chmod u+x`
    • Optionally: have a look at the README file. It should contain the most up-to-date info from Werner himself.
    • Make sure to have netpbm installed.
      • Check your ${PATH} for pngtopnm and pbmtorgb3 executables.
      • If those programs are missing, check whether rle-support is enabled for netpbm.
    • If you don't have Dfu-util already, get it here.
  3. convert the png-file
    • execute `./ yourfancynewsplashscreen.png | gzip -9 > bootscreen.splash`
      • Make sure you redirect the output! The perl-script shoves the splash-data to stdout.
      • -pnm makes the pngtopnm-executable dispensable and eats a generic pnm-/pbm-file - gimp can export to them, for example.
      • If you omit the png-file, will be looking for a file named System_boot.png
      • -32 will create a 480x640x32 frame buffer
    ( I have no idea if that's supported (???) )
      • -swap causes some XOR operation performed in the end of the image creation.
    ( Some kind of inverting? Option for different edianness? )
  4. upload your new bootscreen.splash ( you need alt-name: splash )
    • if you don't know how to do that: check the instructions found here
  5. IMPORTANT! check the exact size of your splash-file (e.g. ls -l or du -b)
    Explanation: The flash-partition reserved for the splash image (dubbed splash) is 655360 Bytes (0xa0000) in size; per default u-boot only reads 20480 (0x5000) of those, though.
    • Essentially, this leaves you with 3 choices:
      • Make a splash image that's gzip'd smaller than 20480 Bytes. This is somewhat boring, as it imposes limits to your creativity.
      • Turn off the read-limit, so u-boot scans the whole splash-partition before commencing boot. This would mean a little longer time till the image is actually displayed. And I mean: little.
      • Or tailor the read size to the size of your splash.
        • If it's smaller than the pre-defined 0x5000 Bytes, u-boot is done with reading sooner.
        • If it's bigger than the 0x5000 Bytes, you will have to adapt it or your image won't be displayed correctly.
    So, if you do (need) to edit the size:
  6. Start your u-boot. And make sure you're in NAND (as opposed to NOR).
    (You do that by pressing PWR briefly before pressing AUX - keep them both pressed until the u-boot appears.)
    • Now select USB-Console, plugin your USB-cable and start the tty-console of your choice
    e.g. `screen /dev/ttyACM0`
    • for the GTA01:
      setenv splashimage nand read.e 0x32000000 splash 0x5000\; unzip 0x32000000 0x33d00000 0x96000
    • for the GTA02:
      setenv splashimage nand read.e 0x32000000 splash 0x5000\; unzip 0x32000000 0x8800000 0x96000
    In those commands, replace the 0x5000 with the size of your choice - or omit it altogether. The minimum size you have to put is the size of your splash-file - or you will receive garbage.
    Also consider that this is a basic terminal; input is not exactly like on the shells you're used to.

See also

This ticket has recent explanations: 1735.

Linux kernel

To Do


You need to recompile psplash, because the picture is hardcoded. There is a script in the source for psplash for making a new header file. On Ubuntu, you need the libgtk2.0-dev package to run the script. my_image.png HAND mv my_image-img.h psplash-hand-img.h

Then add your custom header to the OpenEmbedded recipe (, or rebuild psplash by hand.

X splash

The X server accepts a -root-ppm option, which takes a plain old (raw) ppm file. Replace /usr/share/pixmaps/xsplash-vga.ppm on the phone or in OpenEmbedded.

With more gory details, /etc/X11/Xserver ends with the lines:

# start off server in conventional location.                               
ARGS="$ARGS -dpi 285 -screen 480x640 -hide-cursor -root-ppm
/usr/share/pixmaps/jsplash-vga.ppm vt1"                                    
#ARGS="$ARGS -dpi 285 -screen 480x640 -hide-cursor vt1"                    
exec xinit /etc/X11/Xsession -- $XSERVER $DISPLAY $ARGS $* >/tmp/x.log 2>&1

The '-root-ppm' is the static splash screen.  

Following that, Xsession starts enlightenment, passing it $E_PROFILE as defined in /etc/enlightenment/default_profile.

E splash

/usr/share/enlightenment/data/init contains one or more .edj files that each define an animated splash init that appears next, and until enlightenment finishes loading.  The .edj file used is determined by $E_PROFILE.  So if default_profile contains E_PROFILE='-profile illume' then enlightenment will try to start up with illume_init.edj for the splash (the 'cylon' animated blip, or various other animations depending on image) and will try to use /usr/share/enlightenment/data/themes/illume.edj as the theme for illume.  If it's E_PROFILE='-profile fso' then it looks for fso_init.edj splash and fso.edj theme, etc.

See also

Personal tools