[U-Boot] [PATCH v2 3/6] video: cfb_console: logo can be positioned via the splashpos variable

Bastian.Ruppert at sewerin.de Bastian.Ruppert at sewerin.de
Wed Sep 5 12:52:59 CEST 2012


Hello Anatolij,

> [U-Boot] [PATCH v2 3/6] video: cfb_console: logo can be positioned
> via the splashpos variable
>
> From: Bastian Ruppert <Bastian.Ruppert at Sewerin.de>
>
> Extend the driver for placing the video/bmp logo as specified
> by "splashpos" environment variable.
>
> Signed-off-by: Bastian Ruppert <Bastian.Ruppert at Sewerin.de>
> Signed-off-by: Anatolij Gustschin <agust at denx.de>
> CC: Tom Rini <trini at ti.com>
> CC: Stefano Babic <sbabic at denx.de>
> ---
> v2:
>  - remove some ifdefs
>  - revise commit log
>  - adjust video_logo_height by video_logo_ypos and thus
>    fix return address for video console offset
>  - add BMP_ALIGN_CENTER case to logo_plot() for proper logo
>    offset calculation if "m" specifier is used in splashpos
>
>  drivers/video/cfb_console.c |   88 +++++++++++++++++++++++++++++
+------------
>  1 files changed, 63 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
> index 19d061f..81e5e08 100644
> --- a/drivers/video/cfb_console.c
> +++ b/drivers/video/cfb_console.c
> @@ -66,7 +66,11 @@
>   * 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
> @@ -369,6 +373,8 @@ static void *video_fb_address;   /* frame
bufferaddress */
>  static void *video_console_address;   /* console buffer start address */
>
>  static int video_logo_height = VIDEO_LOGO_HEIGHT;
> +static int video_logo_xpos;
> +static int video_logo_ypos;
>
>  static int __maybe_unused cursor_state;
>  static int __maybe_unused old_col;
> @@ -1488,8 +1494,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 +1611,61 @@ 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
> +       */
> +      video_logo_height += video_logo_ypos;
> +      return video_fb_address + video_logo_height * VIDEO_LINE_LEN;
> +   }
> +#endif

I have some trouble with this version when using splashpos = m,m .
In this case video_logo_ypos is 32767 (BMP_ALIGN_CENTER) here.
Following extension isworking for me:


#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


Should i post a version 3 for this patch?

>
>     sprintf(info, " %s", version_string);
>
> --
> 1.7.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Regards,

Bastian.



More information about the U-Boot mailing list