Date: Sat, 30 Jan 2010 02:37:47 +1100 From: Antony Mawer <lists@mawer.org> To: stable@freebsd.org Subject: [patch] New splash_txt module - support for ASCII splash(4) boot screens Message-ID: <ea2d4a5b1001290737n487dc114n8fc8564f38981e1e@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] Hi all, I recently dusted off an old patch I put together years ago which adds a new splash_txt decoder module for the splash(4) boot splash screen. The module allows you to use a binary-format ASCII drawing (80x25) as a boot splash screen rather than the graphical modes offered by splash_bmp and splash_pcx. We have been and still are using it, but I finally got around to adding the relevant changes to the splash(4) man page and putting together some examples for wider testing. If it seems of use to others it would be nice if someone would be interested in committing it at some stage. In case the list eats the patch, you can grab a copy of it here: http://www.mawer.org/freebsd/splash_txt.patch To give you an idea of what it looks like, here is a screenshot of a quick generic FreeBSD splash screen I put together: http://www.mawer.org/freebsd/splash_txt.png If you'd like to try it for yourself then the process to build it should be something like this: 1. Download the attached patch 2. Create the required folders before applying the patch -- cd /usr/src && mkdir sys/modules/splash/txt 3. Apply the patch -- patch < splash_txt.patch 4. Build the module -- cd sys/modules/splash/txt && make && make install Once that's completed, you can configure it by adding the following to loader.conf: splash_txt_load="YES" bitmap_load="YES" bitmap_name="/boot/freebsd.bin" I have uploaded a sample boot splash screen at http://www.mawer.org/freebsd/freebsd.bin . The files can be produced using TheDraw and saving in its Binary file format, which consists of a sequence of 2 byte pairs. The first byte in a pair is the character to draw on the screen, and the second is the colour/display attributes to draw the character with. If anyone else would like to try this out and has any feedback, or if someone thinks it may be of interest to integrate into the tree please let me know ... -- Antony [-- Attachment #2 --] --- /dev/null 2010-01-30 10:00:00.000000000 +1100 +++ sys/dev/fb/splash_txt.c 2010-01-30 09:07:28.000000000 +1100 @@ -0,0 +1,139 @@ +/*- + * Copyright (c) 1999 Michael Smith <msmith@freebsd.org> + * Copyright (c) 1999 Kazutaka YOKOTA <yokota@freebsd.org> + * Copyright (c) 2005 Antony Mawer <antony@mawer.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/module.h> +#include <sys/kernel.h> +#include <sys/consio.h> +#include <sys/fbio.h> + +#include <machine/pc/display.h> + +#include <dev/fb/fbreg.h> +#include <dev/fb/splashreg.h> +#include <dev/syscons/syscons.h> + +static int splash_on = FALSE; + +static int txt_init(video_adapter_t *adp); +static int txt_end(video_adapter_t *adp); +static int txt_splash(video_adapter_t *adp, int on); + +/* These are rows by columns of the text-mode display device */ +#define BIN_IMAGE_WIDTH 80 +#define BIN_IMAGE_HEIGHT 25 + +static splash_decoder_t txt_decoder = { + "splash_txt", txt_init, txt_end, txt_splash, SPLASH_IMAGE, +}; + +SPLASH_DECODER(splash_txt, txt_decoder); + + +static void +draw_text_splash(sc_softc_t *sc) +{ + int x, y; + u_char ch, attr; + u_char *pdata = (u_char *)txt_decoder.data; + + /* Init failed */ + if (txt_decoder.data == NULL) + return; + + for (y=0; y < BIN_IMAGE_HEIGHT; y++) { + for (x=0; x < BIN_IMAGE_WIDTH; x++) { + ch = pdata[0]; + pdata++; + attr = pdata[0]; + pdata++; + + sc_vtb_putc(&sc->cur_scp->scr, + (y * sc->cur_scp->xsize) + x, + sc->scr_map[ch], + (int)attr << 8); + } + } +} + +static int +txt_init(video_adapter_t *adp) +{ + // Ensure that the image data exists + if ((txt_decoder.data == NULL) || (txt_decoder.data_size <= 0)) { + printf("splash_txt: No ASCII bitmap file found\n"); + return ENODEV; + } + + return 0; +} + +static int +txt_end(video_adapter_t *adp) +{ + return 0; +} + +static int +txt_splash(video_adapter_t *adp, int on) +{ + sc_softc_t *sc; + scr_stat *scp; + + sc = sc_find_softc(adp, NULL); + if (sc == NULL) + return EAGAIN; + scp = sc->cur_scp; + + if (on) { + if (!splash_on) { + if (adp->va_info.vi_flags & V_INFO_GRAPHICS) + return EAGAIN; + + /* Clear screen and set border colour */ + sc_vtb_clear(&scp->scr, sc->scr_map[0x20], + (FG_LIGHTGREY | BG_BLACK) << 8); + (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1); + sc_set_border(scp, 0); + splash_on = TRUE; + + /* Display the splash screen */ + draw_text_splash(sc); + } + return 0; + } else { + /* the video mode will be restored by the caller */ + splash_on = FALSE; + return 0; + } +} + + diff -Nru sys/modules/splash.old/Makefile sys/modules/splash/Makefile --- sys/modules/splash.old/Makefile 2010-01-30 08:41:47.000000000 +1100 +++ sys/modules/splash/Makefile 2010-01-30 08:43:08.000000000 +1100 @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/modules/splash/Makefile,v 1.3.56.1.2.1 2009/10/25 01:10:29 kensmith Exp $ -SUBDIR= bmp pcx +SUBDIR= bmp pcx txt .include <bsd.subdir.mk> diff -Nru sys/modules/splash.old/txt/Makefile sys/modules/splash/txt/Makefile --- sys/modules/splash.old/txt/Makefile 1970-01-01 10:00:00.000000000 +1000 +++ sys/modules/splash/txt/Makefile 2010-01-30 08:43:35.000000000 +1100 @@ -0,0 +1,6 @@ +.PATH: ${.CURDIR}/../../../dev/fb + +KMOD= splash_txt +SRCS= splash_txt.c + +.include <bsd.kmod.mk> --- share/man/man4/splash.4.old 2010-01-30 08:44:22.000000000 +1100 +++ share/man/man4/splash.4 2010-01-30 09:12:28.000000000 +1100 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD: src/share/man/man4/splash.4,v 1.28.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $ .\" -.Dd January 15, 2006 +.Dd January 30, 2010 .Dt SPLASH 4 .Os .Sh NAME @@ -74,6 +74,13 @@ ZSoft PCX decoder. This decoder currently only supports version 5 8-bpp single-plane images. +.It Pa splash_txt.ko +TheDraw binary ASCII drawing file decoder. +Displays a text-mode 80x25 ASCII drawing, such as that produced by +the Binary save format in TheDraw. This format consists of a sequence +of two byte pairs representing the 80x25 display, where the first byte +is the ASCII character to draw and the second byte indicates the +colors/attributes to use when drawing the character. .El .Pp The @@ -214,6 +221,16 @@ necessary to load the VESA module. Just load the bitmap file and the splash decoder module as in the first example above. +.Pp +To load a binary ASCII drawing and display this while booting, include the +following into your +.Pa /boot/loader.conf +: +.Bd -literal -offset indent +splash_txt_load="YES" +bitmap_load="YES" +bitmap_name="/boot/splash.bin" +.Ed .\".Sh DIAGNOSTICS .Sh CAVEATS Both the splash screen and the screen saver work with @@ -251,6 +268,15 @@ based on the .Pa splash_bmp code. +The +.Pa splash_txt +module was written by +.An Antony Mawer Aq antony@mawer.org +based on the +.Pa splash_bmp +code, with some additional inspiration from the +.Pa daemon_saver +code. .Sh BUGS If you load a screen saver while another screen saver has already been loaded, the first screen saver will not be automatically unloaded
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ea2d4a5b1001290737n487dc114n8fc8564f38981e1e>
