"Das U-Boot" Source Tree
at master 193 lines 4.3 kB view raw
1/* 2 * Copyright (C) 2013, Boundary Devices <info@boundarydevices.com> 3 * 4 * See file CREDITS for list of people who contributed to this 5 * project. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of 10 * the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., http://www.fsf.org/about/contact/ 20 * 21 */ 22 23#include <display_options.h> 24#include <env.h> 25#include <splash.h> 26#include <video.h> 27#include <vsprintf.h> 28#include <linux/kernel.h> 29 30static struct splash_location default_splash_locations[] = { 31 { 32 .name = "sf", 33 .storage = SPLASH_STORAGE_SF, 34 .flags = SPLASH_STORAGE_RAW, 35 .offset = 0x0, 36 }, 37 { 38 .name = "mmc_fs", 39 .storage = SPLASH_STORAGE_MMC, 40 .flags = SPLASH_STORAGE_FS, 41 .devpart = "0:1", 42 }, 43 { 44 .name = "mmc_raw", 45 .storage = SPLASH_STORAGE_MMC, 46 .flags = SPLASH_STORAGE_RAW, 47 .devpart = "0:1", 48 }, 49 { 50 .name = "usb_fs", 51 .storage = SPLASH_STORAGE_USB, 52 .flags = SPLASH_STORAGE_FS, 53 .devpart = "0:1", 54 }, 55 { 56 .name = "sata_fs", 57 .storage = SPLASH_STORAGE_SATA, 58 .flags = SPLASH_STORAGE_FS, 59 .devpart = "0:1", 60 }, 61}; 62 63#ifdef CONFIG_VIDEO_LOGO 64 65#include <bmp_logo_data.h> 66 67static int splash_video_logo_load(void) 68{ 69 char *splashimage; 70 ulong bmp_load_addr; 71 72 splashimage = env_get("splashimage"); 73 if (!splashimage) 74 return -ENOENT; 75 76 bmp_load_addr = hextoul(splashimage, 0); 77 if (!bmp_load_addr) { 78 printf("Error: bad 'splashimage' address\n"); 79 return -EFAULT; 80 } 81 82 memcpy((void *)bmp_load_addr, bmp_logo_bitmap, 83 ARRAY_SIZE(bmp_logo_bitmap)); 84 85 return 0; 86} 87#else 88static inline int splash_video_logo_load(void) { return -ENOSYS; } 89#endif 90 91__weak int splash_screen_prepare(void) 92{ 93 if (CONFIG_IS_ENABLED(SPLASH_SOURCE)) 94 return splash_source_load(default_splash_locations, 95 ARRAY_SIZE(default_splash_locations)); 96 97 return splash_video_logo_load(); 98} 99 100void splash_get_pos(int *x, int *y) 101{ 102 char *s = env_get("splashpos"); 103 104 if (!CONFIG_IS_ENABLED(SPLASH_SCREEN_ALIGN) || !s) 105 return; 106 107 if (s[0] == 'm') 108 *x = BMP_ALIGN_CENTER; 109 else 110 *x = simple_strtol(s, NULL, 0); 111 112 s = strchr(s + 1, ','); 113 if (s != NULL) { 114 if (s[1] == 'm') 115 *y = BMP_ALIGN_CENTER; 116 else 117 *y = simple_strtol(s + 1, NULL, 0); 118 } 119} 120 121#if CONFIG_IS_ENABLED(VIDEO) && !CONFIG_IS_ENABLED(HIDE_LOGO_VERSION) 122 123#ifdef CONFIG_VIDEO_LOGO 124#include <bmp_logo.h> 125#endif 126#include <dm.h> 127#include <video_console.h> 128#include <video_font.h> 129#include <video_font_data.h> 130 131void splash_display_banner(void) 132{ 133 struct video_fontdata __maybe_unused *fontdata = fonts; 134 struct udevice *dev; 135 char buf[DISPLAY_OPTIONS_BANNER_LENGTH]; 136 int col, row, ret; 137 138 ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &dev); 139 if (ret) 140 return; 141 142#if IS_ENABLED(CONFIG_VIDEO_LOGO) 143 col = BMP_LOGO_WIDTH / fontdata->width + 1; 144 row = BMP_LOGO_HEIGHT / fontdata->height + 1; 145#else 146 col = 0; 147 row = 0; 148#endif 149 150 display_options_get_banner(false, buf, sizeof(buf)); 151 vidconsole_position_cursor(dev, col, 1); 152 vidconsole_put_string(dev, buf); 153 vidconsole_position_cursor(dev, 0, row); 154} 155#endif /* CONFIG_VIDEO && !CONFIG_HIDE_LOGO_VERSION */ 156 157/* 158 * Common function to show a splash image if env("splashimage") is set. 159 * For additional details please refer to doc/README.splashprepare. 160 */ 161int splash_display(void) 162{ 163 ulong addr; 164 char *s; 165 int x = 0, y = 0, ret; 166 if (!CONFIG_IS_ENABLED(SPLASH_SCREEN)) 167 return -ENOSYS; 168 s = env_get("splashimage"); 169 if (!s) 170 return -EINVAL; 171 172 addr = hextoul(s, NULL); 173 ret = splash_screen_prepare(); 174 if (ret) 175 return ret; 176 177 splash_get_pos(&x, &y); 178 179 if (CONFIG_IS_ENABLED(BMP)) 180 ret = bmp_display(addr, x, y); 181 else 182 return -ENOSYS; 183 184 /* Skip banner output on video console if the logo is not at 0,0 */ 185 if (x || y) 186 goto end; 187 188#if CONFIG_IS_ENABLED(VIDEO) && !CONFIG_IS_ENABLED(HIDE_LOGO_VERSION) 189 splash_display_banner(); 190#endif 191end: 192 return ret; 193}