video: cfb_console: logo can be positioned via the splashpos variable
authorBastian Ruppert <Bastian.Ruppert@Sewerin.de>
Thu, 13 Sep 2012 22:29:01 +0000 (22:29 +0000)
committerTom Rini <trini@ti.com>
Mon, 1 Oct 2012 17:02:13 +0000 (10:02 -0700)
Extend the driver for placing the video/bmp logo as specified
by "splashpos" environment variable.

Signed-off-by: Bastian Ruppert <Bastian.Ruppert@Sewerin.de>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
CC: Stefano Babic <sbabic@denx.de>
Signed-off-by: Tom Rini <trini@ti.com>
drivers/video/cfb_console.c

index 19d061f6cbec31615c3193f59a27895f203e959f..fc4ea7216cb067e905ad79e87797c3abe2560a44 100644 (file)
  * CONFIG_CONSOLE_TIME       - display time/date in upper right
  *                             corner, needs CONFIG_CMD_DATE and
  *                             CONFIG_CONSOLE_CURSOR
- * CONFIG_VIDEO_LOGO         - display Linux Logo in upper left corner
+ * CONFIG_VIDEO_LOGO         - display Linux Logo in upper left corner.
+ *                             Use CONFIG_SPLASH_SCREEN_ALIGN with
+ *                             environment variable "splashpos" to place
+ *                             the logo on other position. In this case
+ *                             no CONSOLE_EXTRA_INFO is possible.
  * CONFIG_VIDEO_BMP_LOGO      - use bmp_logo instead of linux_logo
  * CONFIG_CONSOLE_EXTRA_INFO  - display additional board information
  *                             strings that normaly goes to serial
@@ -1480,6 +1484,9 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 
 
 #ifdef CONFIG_VIDEO_LOGO
+static int video_logo_xpos;
+static int video_logo_ypos;
+
 void logo_plot(void *screen, int width, int x, int y)
 {
 
@@ -1488,8 +1495,21 @@ void logo_plot(void *screen, int width, int x, int y)
        int ycount = video_logo_height;
        unsigned char r, g, b, *logo_red, *logo_blue, *logo_green;
        unsigned char *source;
-       unsigned char *dest = (unsigned char *) screen +
-               ((y * width * VIDEO_PIXEL_SIZE) + x * VIDEO_PIXEL_SIZE);
+       unsigned char *dest;
+
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+       if (x == BMP_ALIGN_CENTER)
+               x = max(0, (VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH) / 2);
+       else if (x < 0)
+               x = max(0, VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH + x + 1);
+
+       if (y == BMP_ALIGN_CENTER)
+               y = max(0, (VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT) / 2);
+       else if (y < 0)
+               y = max(0, VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT + y + 1);
+#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
+
+       dest = (unsigned char *)screen + (y * width  + x) * VIDEO_PIXEL_SIZE;
 
 #ifdef CONFIG_VIDEO_BMP_LOGO
        source = bmp_logo_bitmap;
@@ -1592,42 +1612,66 @@ static void *video_logo(void)
        char info[128];
        int space, len;
        __maybe_unused int y_off = 0;
+       __maybe_unused ulong addr;
+       __maybe_unused char *s;
 
-#ifdef CONFIG_SPLASH_SCREEN
-       char *s;
-       ulong addr;
-
-       s = getenv("splashimage");
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+       s = getenv("splashpos");
        if (s != NULL) {
-               int x = 0, y = 0;
+               if (s[0] == 'm')
+                       video_logo_xpos = BMP_ALIGN_CENTER;
+               else
+                       video_logo_xpos = simple_strtol(s, NULL, 0);
 
-               addr = simple_strtoul(s, NULL, 16);
-#ifdef CONFIG_SPLASH_SCREEN_ALIGN
-               s = getenv("splashpos");
+               s = strchr(s + 1, ',');
                if (s != NULL) {
-                       if (s[0] == 'm')
-                               x = BMP_ALIGN_CENTER;
+                       if (s[1] == 'm')
+                               video_logo_ypos = BMP_ALIGN_CENTER;
                        else
-                               x = simple_strtol(s, NULL, 0);
-
-                       s = strchr(s + 1, ',');
-                       if (s != NULL) {
-                               if (s[1] == 'm')
-                                       y = BMP_ALIGN_CENTER;
-                               else
-                                       y = simple_strtol(s + 1, NULL, 0);
-                       }
+                               video_logo_ypos = simple_strtol(s + 1, NULL, 0);
                }
+       }
 #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
-               if (video_display_bitmap(addr, x, y) == 0) {
+#ifdef CONFIG_SPLASH_SCREEN
+       s = getenv("splashimage");
+       if (s != NULL) {
+
+               addr = simple_strtoul(s, NULL, 16);
+
+
+               if (video_display_bitmap(addr,
+                                       video_logo_xpos,
+                                       video_logo_ypos) == 0) {
                        video_logo_height = 0;
                        return ((void *) (video_fb_address));
                }
        }
 #endif /* CONFIG_SPLASH_SCREEN */
 
-       logo_plot(video_fb_address, VIDEO_COLS, 0, 0);
+       logo_plot(video_fb_address, VIDEO_COLS,
+                 video_logo_xpos, video_logo_ypos);
+
+#ifdef CONFIG_SPLASH_SCREEN_ALIGN
+       /*
+        * when using splashpos for video_logo, skip any info
+        * output on video console if the logo is not at 0,0
+        */
+       if (video_logo_xpos || video_logo_ypos) {
+               /*
+                * video_logo_height is used in text and cursor offset
+                * calculations. Since the console is below the logo,
+                * we need to adjust the logo height
+                */
+               if (video_logo_ypos == BMP_ALIGN_CENTER)
+                       video_logo_height += max(0, (VIDEO_VISIBLE_ROWS - \
+                                                    VIDEO_LOGO_HEIGHT) / 2);
+               else if (video_logo_ypos > 0)
+                       video_logo_height += video_logo_ypos;
+
+               return video_fb_address + video_logo_height * VIDEO_LINE_LEN;
+       }
+#endif
 
        sprintf(info, " %s", version_string);