1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1999 Michael Smith <msmith@freebsd.org> 5 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@freebsd.org> 6 * Copyright (c) 2005 Antony Mawer <antony@mawer.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * $FreeBSD$ 31 */ 32 33 #include <sys/param.h> 34 #include <sys/systm.h> 35 #include <sys/module.h> 36 #include <sys/kernel.h> 37 #include <sys/consio.h> 38 #include <sys/fbio.h> 39 40 #include <machine/pc/display.h> 41 42 #include <dev/fb/fbreg.h> 43 #include <dev/fb/splashreg.h> 44 #include <dev/syscons/syscons.h> 45 46 static int splash_on = FALSE; 47 48 static int txt_init(video_adapter_t *adp); 49 static int txt_end(video_adapter_t *adp); 50 static int txt_splash(video_adapter_t * adp, const int on); 51 52 /* These are rows by columns of the text-mode display device. */ 53 #define BIN_IMAGE_WIDTH 80 54 #define BIN_IMAGE_HEIGHT 25 55 56 static splash_decoder_t txt_decoder = { 57 .name = "splash_txt", 58 .init = txt_init, 59 .term = txt_end, 60 .splash = txt_splash, 61 .data_type = SPLASH_IMAGE, 62 }; 63 64 SPLASH_DECODER(splash_txt, txt_decoder); 65 66 static void 67 draw_text_splash(sc_softc_t *sc) 68 { 69 u_int x, y; 70 u_char ch, attr; 71 u_char *pdata = txt_decoder.data; 72 73 /* Init failed. */ 74 if (txt_decoder.data == NULL) 75 return; 76 for (y = 0; y < BIN_IMAGE_HEIGHT; y++) { 77 for (x = 0; x < BIN_IMAGE_WIDTH; x++) { 78 ch = *pdata++; 79 attr = *pdata++; 80 sc_vtb_putc(&sc->cur_scp->scr, 81 (y * sc->cur_scp->xsize) + x, 82 sc->scr_map[ch], (int)attr << 8); 83 } 84 } 85 } 86 87 static int 88 txt_init(video_adapter_t *adp) 89 { 90 91 /* Ensure that the image data exists. */ 92 if (txt_decoder.data == NULL || txt_decoder.data_size <= 0) { 93 printf("splash_txt: No ASCII bitmap file found\n"); 94 return (ENODEV); 95 } 96 return (0); 97 } 98 99 static int 100 txt_end(video_adapter_t *adp) 101 { 102 103 return (0); 104 } 105 106 static int 107 txt_splash(video_adapter_t *adp, const int on) 108 { 109 sc_softc_t *sc; 110 scr_stat *scp; 111 112 sc = sc_find_softc(adp, NULL); 113 if (sc == NULL) 114 return (EAGAIN); 115 scp = sc->cur_scp; 116 if (on) { 117 if (!splash_on) { 118 if (adp->va_info.vi_flags & V_INFO_GRAPHICS) 119 return EAGAIN; 120 /* Clear screen and set border colour. */ 121 sc_vtb_clear(&scp->scr, sc->scr_map[0x20], 122 (FG_LIGHTGREY | BG_BLACK) << 8); 123 (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1); 124 sc_set_border(scp, 0); 125 splash_on = TRUE; 126 /* Display the splash screen. */ 127 draw_text_splash(sc); 128 } 129 return (0); 130 } else { 131 /* The video mode will be restored by the caller. */ 132 splash_on = FALSE; 133 return (0); 134 } 135 } 136 137 138