X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=common%2Fsplash.c;h=e7d847726d0bb1d5df9470be3f48ba22c86ee6d4;hb=04da42770b0cc3bea8841972bfc9568299ece826;hp=561d35b4e41f9072d84e430d028e92ec8aecd8c3;hpb=e72d344386bf80738fab7a6bd37cb321f443093a;p=oweals%2Fu-boot.git diff --git a/common/splash.c b/common/splash.c index 561d35b4e4..e7d847726d 100644 --- a/common/splash.c +++ b/common/splash.c @@ -21,18 +21,78 @@ */ #include +#include #include #include -__weak int splash_screen_prepare(void) +static struct splash_location default_splash_locations[] = { + { + .name = "sf", + .storage = SPLASH_STORAGE_SF, + .flags = SPLASH_STORAGE_RAW, + .offset = 0x0, + }, + { + .name = "mmc_fs", + .storage = SPLASH_STORAGE_MMC, + .flags = SPLASH_STORAGE_FS, + .devpart = "0:1", + }, + { + .name = "usb_fs", + .storage = SPLASH_STORAGE_USB, + .flags = SPLASH_STORAGE_FS, + .devpart = "0:1", + }, + { + .name = "sata_fs", + .storage = SPLASH_STORAGE_SATA, + .flags = SPLASH_STORAGE_FS, + .devpart = "0:1", + }, +}; + +#if defined(CONFIG_DM_VIDEO) && defined(CONFIG_VIDEO_LOGO) + +#include + +static int splash_video_logo_load(void) { + char *splashimage; + u32 bmp_load_addr; + + splashimage = env_get("splashimage"); + if (!splashimage) + return -ENOENT; + + bmp_load_addr = simple_strtoul(splashimage, 0, 16); + if (!bmp_load_addr) { + printf("Error: bad 'splashimage' address\n"); + return -EFAULT; + } + + memcpy((void *)bmp_load_addr, bmp_logo_bitmap, + ARRAY_SIZE(bmp_logo_bitmap)); + return 0; } +#else +static inline int splash_video_logo_load(void) { return -ENOSYS; } +#endif + +__weak int splash_screen_prepare(void) +{ + if (CONFIG_IS_ENABLED(SPLASH_SOURCE)) + return splash_source_load(default_splash_locations, + ARRAY_SIZE(default_splash_locations)); + + return splash_video_logo_load(); +} #ifdef CONFIG_SPLASH_SCREEN_ALIGN void splash_get_pos(int *x, int *y) { - char *s = getenv("splashpos"); + char *s = env_get("splashpos"); if (!s) return; @@ -52,17 +112,73 @@ void splash_get_pos(int *x, int *y) } #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ -#if defined(CONFIG_SPLASH_SCREEN) && defined(CONFIG_LCD) -int lcd_splash(ulong addr) +#if defined(CONFIG_DM_VIDEO) && !defined(CONFIG_HIDE_LOGO_VERSION) + +#ifdef CONFIG_VIDEO_LOGO +#include +#endif +#include +#include +#include + +void splash_display_banner(void) { + struct udevice *dev; + char buf[DISPLAY_OPTIONS_BANNER_LENGTH]; + int col, row, ret; + + ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &dev); + if (ret) + return; + +#ifdef CONFIG_VIDEO_LOGO + col = BMP_LOGO_WIDTH / VIDEO_FONT_WIDTH + 1; + row = BMP_LOGO_HEIGHT / VIDEO_FONT_HEIGHT + 1; +#else + col = 0; + row = 0; +#endif + + display_options_get_banner(false, buf, sizeof(buf)); + vidconsole_position_cursor(dev, col, 1); + vidconsole_put_string(dev, buf); + vidconsole_position_cursor(dev, 0, row); +} +#endif /* CONFIG_DM_VIDEO && !CONFIG_HIDE_LOGO_VERSION */ + +/* + * Common function to show a splash image if env("splashimage") is set. + * Is used for both dm_video and lcd video stacks. For additional + * details please refer to doc/README.splashprepare. + */ +#if defined(CONFIG_SPLASH_SCREEN) && defined(CONFIG_CMD_BMP) +int splash_display(void) +{ + ulong addr; + char *s; int x = 0, y = 0, ret; + s = env_get("splashimage"); + if (!s) + return -EINVAL; + + addr = simple_strtoul(s, NULL, 16); ret = splash_screen_prepare(); if (ret) return ret; splash_get_pos(&x, &y); - return bmp_display(addr, x, y); + ret = bmp_display(addr, x, y); + + /* Skip banner output on video console if the logo is not at 0,0 */ + if (x || y) + goto end; + +#if defined(CONFIG_DM_VIDEO) && !defined(CONFIG_HIDE_LOGO_VERSION) + splash_display_banner(); +#endif +end: + return ret; } #endif