1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 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 31 #include <sys/param.h> 32 #include <sys/systm.h> 33 #include <sys/module.h> 34 #include <sys/kernel.h> 35 #include <sys/consio.h> 36 #include <sys/fbio.h> 37 38 #include <machine/pc/display.h> 39 40 #include <dev/fb/fbreg.h> 41 #include <dev/fb/splashreg.h> 42 #include <dev/syscons/syscons.h> 43 44 static int splash_on = FALSE; 45 46 static int txt_init(video_adapter_t *adp); 47 static int txt_end(video_adapter_t *adp); 48 static int txt_splash(video_adapter_t * adp, const int on); 49 50 /* These are rows by columns of the text-mode display device. */ 51 #define BIN_IMAGE_WIDTH 80 52 #define BIN_IMAGE_HEIGHT 25 53 54 static splash_decoder_t txt_decoder = { 55 .name = "splash_txt", 56 .init = txt_init, 57 .term = txt_end, 58 .splash = txt_splash, 59 .data_type = SPLASH_IMAGE, 60 }; 61 62 SPLASH_DECODER(splash_txt, txt_decoder); 63 64 static void 65 draw_text_splash(sc_softc_t *sc) 66 { 67 u_int x, y; 68 u_char ch, attr; 69 u_char *pdata = txt_decoder.data; 70 71 /* Init failed. */ 72 if (txt_decoder.data == NULL) 73 return; 74 for (y = 0; y < BIN_IMAGE_HEIGHT; y++) { 75 for (x = 0; x < BIN_IMAGE_WIDTH; x++) { 76 ch = *pdata++; 77 attr = *pdata++; 78 sc_vtb_putc(&sc->cur_scp->scr, 79 (y * sc->cur_scp->xsize) + x, 80 sc->scr_map[ch], (int)attr << 8); 81 } 82 } 83 } 84 85 static int 86 txt_init(video_adapter_t *adp) 87 { 88 89 /* Ensure that the image data exists. */ 90 if (txt_decoder.data == NULL || txt_decoder.data_size <= 0) { 91 printf("splash_txt: No ASCII bitmap file found\n"); 92 return (ENODEV); 93 } 94 return (0); 95 } 96 97 static int 98 txt_end(video_adapter_t *adp) 99 { 100 101 return (0); 102 } 103 104 static int 105 txt_splash(video_adapter_t *adp, const int on) 106 { 107 sc_softc_t *sc; 108 scr_stat *scp; 109 110 sc = sc_find_softc(adp, NULL); 111 if (sc == NULL) 112 return (EAGAIN); 113 scp = sc->cur_scp; 114 if (on) { 115 if (!splash_on) { 116 if (adp->va_info.vi_flags & V_INFO_GRAPHICS) 117 return EAGAIN; 118 /* Clear screen and set border colour. */ 119 sc_vtb_clear(&scp->scr, sc->scr_map[0x20], 120 (FG_LIGHTGREY | BG_BLACK) << 8); 121 (*vidsw[adp->va_index]->set_hw_cursor)(adp, -1, -1); 122 sc_set_border(scp, 0); 123 splash_on = TRUE; 124 /* Display the splash screen. */ 125 draw_text_splash(sc); 126 } 127 return (0); 128 } else { 129 /* The video mode will be restored by the caller. */ 130 splash_on = FALSE; 131 return (0); 132 } 133 } 134 135 136