What is it? ----------- The framebuffer splash is a kernel feature that allows displaying a background picture on selected consoles. What do I need to get it to work? --------------------------------- To get fb splash up-and-running you will have to: 1) get a copy of splashutils [1] or a similar program 2) get some splash themes 3) build the kernel helper program 4) build your kernel with the FB_SPLASH option enabled. To get fbsplash operational right after fbcon initialization is finished, you will have to include a theme and the kernel helper into your initramfs image. Please refer to splashutils documentation for instructions on how to do that. [1] The splashutils package can be downloaded from: http://dev.gentoo.org/~spock/projects/splashutils/ The userspace helper -------------------- The userspace splash helper (by default: /sbin/splash_helper) is called by the kernel whenever an important event occurs and the kernel needs some kind of job to be carried out. Important events include console switches and video mode switches (the kernel requests background images and configuration parameters for the current console). The splash helper must be accessible at all times. If it's not, fbsplash will be switched off automatically. It's possible to set path to the splash helper by writing it to /proc/sys/kernel/fbsplash. ***************************************************************************** The information below is mostly technical stuff. There's probably no need to read it unless you plan to develop a userspace helper. The splash protocol ------------------- The splash protocol defines a communication interface between the kernel and the userspace splash helper. The kernel side is responsible for: * rendering console text, using an image as a background (instead of a standard solid color fbcon uses), * accepting commands from the user via ioctls on the fbsplash device, * calling the userspace helper to set things up as soon as the fb subsystem is initialized. The userspace helper is responsible for everything else, including parsing configuration files, decompressing the image files whenever the kernel needs it, and communicating with the kernel if necessary. The splash protocol specifies how communication is done in both ways: kernel->userspace and userspace->helper. Kernel -> Userspace ------------------- The kernel communicates with the userspace helper by calling it and specifying the task to be done in a series of arguments. The arguments follow the pattern: All commands defined in splash protocol v2 have the following parameters: virtual console framebuffer number theme Splash protocol v1 specified an additional 'fbsplash mode' after the framebuffer number. Splash protocol v1 is deprecated and should not be used. Splash protocol v2 specifies the following commands: getpic ------ The kernel issues this command to request image data. It's up to the userspace helper to find a background image appropriate for the specified theme and the current resolution. The userspace helper should respond by issuing the FBIOSPLASH_SETPIC ioctl. init ---- The kernel issues this command after the fbsplash device is created and the fbsplash interface is initialized. Upon receiving 'init', the userspace helper should parse the kernel command line (/proc/cmdline) or otherwise decide whether fbsplash is to be activated. To activate fbsplash on the first console the helper should issue the FBIOSPLASH_SETCFG, FBIOSPLASH_SETPIC and FBIOSPLASH_SETSTATE commands, in the above-mentioned order. When the userspace helper is called in an early phase of the boot process (right after the initialization of fbcon), no filesystems will be mounted. The helper program should mount sysfs and then create the appropriate framebuffer, fbsplash and tty0 devices (if they don't already exist) to get current display settings and to be able to communicate with the kernel side. It should probably also mount the procfs to be able to parse the kernel command line parameters. Note that the console sem is not held when the kernel calls splash_helper with the 'init' command. The splash helper should perform all ioctls with origin set to FB_SPLASH_IO_ORIG_USER. modechange ---------- The kernel issues this command on a mode change. The helper's response should be similar to the response to the 'init' command. Note that this time the console sem is held and all ioctls must be performed with origin set to FB_SPLASH_IO_ORIG_KERNEL. Userspace -> Kernel ------------------- Userspace programs can communicate with fbsplash via ioctls on the fbsplash device. These ioctls are to be used by both the userspace helper (called only by the kernel) and userspace configuration tools (run by the users). The splash helper should set the origin field to FB_SPLASH_IO_ORIG_KERNEL when doing the appropriate ioctls. All userspace configuration tools should use FB_SPLASH_IO_ORIG_USER. Failure to set the appropriate value in the origin field when performing ioctls from the kernel helper will most likely result in a console deadlock. FB_SPLASH_IO_ORIG_KERNEL instructs fbsplash not to try to acquire the console semaphore. Not surprisingly, FB_SPLASH_IO_ORIG_USER instructs it to acquire the console sem. The framebuffer splash provides the following ioctls (all defined in linux/fb.h): FBIOSPLASH_SETPIC description: loads a background picture for a virtual console argument: struct fb_splash_iowrapper*; data: struct fb_image* notes: If called for consoles other than the current foreground one, the picture data will be ignored. If the current virtual console is running in a 8-bpp mode, the cmap substruct of fb_image has to be filled appropriately: start should be set to 16 (first 16 colors are reserved for fbcon), len to a value <= 240 and red, green and blue should point to valid cmap data. The transp field is ingored. The fields dx, dy, bg_color, fg_color in fb_image are ignored as well. FBIOSPLASH_SETCFG description: sets the fbsplash config for a virtual console argument: struct fb_splash_iowrapper*; data: struct vc_splash* notes: The structure has to be filled with valid data. FBIOSPLASH_GETCFG description: gets the fbsplash config for a virtual console argument: struct fb_splash_iowrapper*; data: struct vc_splash* FBIOSPLASH_SETSTATE description: sets the fbsplash state for a virtual console argument: struct fb_splash_iowrapper*; data: unsigned int* values: 0 = disabled, 1 = enabled. FBIOSPLASH_GETSTATE description: gets the fbsplash state for a virtual console argument: struct fb_splash_iowrapper*; data: unsigned int* values: as in FBIOSPLASH_SETSTATE Info on used structures: Definition of struct vc_splash can be found in linux/console_splash.h. It's heavily commented. Note that the 'theme' field should point to a string no longer than FB_SPLASH_THEME_LEN. When FBIOSPLASH_GETCFG call is performed, the theme field should point to a char buffer of length FB_SPLASH_THEME_LEN. Definition of struct fb_splash_iowrapper can be found in linux/fb.h. The fields in this struct have the following meaning: vc: Virtual console number. origin: Specifies if the ioctl is performed as a response to a kernel request. The splash helper should set this field to FB_SPLASH_IO_ORIG_KERNEL, userspace programs should set it to FB_SPLASH_IO_ORIG_USER. This field is necessary to avoid console semaphore deadlocks. data: Pointer to a data structure appropriate for the performed ioctl. Type of the data struct is specified in the ioctls description. ***************************************************************************** Credit ------ Original 'bootsplash' project & implementation by: Volker Poplawski , Stefan Reinauer , Steffen Winterfeldt , Michael Schroeder , Ken Wimer . Fbsplash, splash protocol design, current implementation & docs by: Michal Januszewski