Merge branch 'master' of git://git.denx.de/u-boot-video
[oweals/u-boot.git] / drivers / video / cfb_console.c
index 409d4b7d1c05a15d35f736feb52613568cc2f5d2..6adce19984e65273521ac5eb1042d08fdac64cf4 100644 (file)
@@ -193,6 +193,11 @@ CONFIG_VIDEO_HW_CURSOR:         - Uses the hardware cursor capability of the
 #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
 #include <watchdog.h>
 #include <bmp_layout.h>
+
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+#define BMP_ALIGN_CENTER       0x7FFF
+#endif
+
 #endif
 
 /*****************************************************************************/
@@ -877,6 +882,18 @@ int video_display_bitmap (ulong bmp_image, int x, int y)
 
        padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
 
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+       if (x == BMP_ALIGN_CENTER)
+               x = max(0, (VIDEO_VISIBLE_COLS - width) / 2);
+       else if (x < 0)
+               x = max(0, VIDEO_VISIBLE_COLS - width + x + 1);
+
+       if (y == BMP_ALIGN_CENTER)
+               y = max(0, (VIDEO_VISIBLE_ROWS - height) / 2);
+       else if (y < 0)
+               y = max(0, VIDEO_VISIBLE_ROWS - height + y + 1);
+#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
+
        if ((x + width) > VIDEO_VISIBLE_COLS)
                width = VIDEO_VISIBLE_COLS - x;
        if ((y + height) > VIDEO_VISIBLE_ROWS)
@@ -1188,9 +1205,26 @@ static void *video_logo (void)
        ulong addr;
 
        if ((s = getenv ("splashimage")) != NULL) {
+               int x = 0, y = 0;
+
                addr = simple_strtoul (s, NULL, 16);
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+               if ((s = getenv ("splashpos")) != NULL) {
+                       if (s[0] == 'm')
+                               x = BMP_ALIGN_CENTER;
+                       else
+                               x = simple_strtol (s, NULL, 0);
+
+                       if ((s = strchr (s + 1, ',')) != NULL) {
+                               if (s[1] == 'm')
+                                       y = BMP_ALIGN_CENTER;
+                               else
+                                       y = simple_strtol (s + 1, NULL, 0);
+                       }
+               }
+#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
-               if (video_display_bitmap (addr, 0, 0) == 0) {
+               if (video_display_bitmap (addr, x, y) == 0) {
                        return ((void *) (video_fb_address));
                }
        }
@@ -1330,11 +1364,26 @@ static int video_init (void)
 
 /*****************************************************************************/
 
+/*
+ * Implement a weak default function for boards that optionally
+ * need to skip the video initialization.
+ */
+int __board_video_skip(void)
+{
+       /* As default, don't skip test */
+       return 0;
+}
+int board_video_skip(void) __attribute__((weak, alias("__board_video_skip")));
+
 int drv_video_init (void)
 {
        int skip_dev_init;
        device_t console_dev;
 
+       /* Check if video initialization should be skipped */
+       if (board_video_skip())
+               return 0;
+
        /* Init video chip - returns with framebuffer cleared */
        skip_dev_init = (video_init () == -1);