Skip site navigation (1)Skip section navigation (2)
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>