Message ID | 1346538565-1821-1-git-send-email-agust@denx.de |
---|---|
State | Superseded |
Delegated to: | Anatolij Gustschin |
Headers | show |
Hello Anatolij, > [U-Boot] [PATCH v2 3/6] video: cfb_console: logo can be positioned > via the splashpos variable > > From: Bastian Ruppert <Bastian.Ruppert@Sewerin.de> > > 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: Tom Rini <trini@ti.com> > CC: Stefano Babic <sbabic@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@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot Regards, Bastian.
Hello Bastian, On Wed, 5 Sep 2012 12:52:59 +0200 Bastian.Ruppert@sewerin.de wrote: ... > > + 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: Ah, indeed. Thanks for testing and catching it. > #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; OK. But please use else if (video_logo_ypos > 0) video_logo_height += video_logo_ypos; ... > Should i post a version 3 for this patch? Yes, please. Thanks, Anatolij
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 buffer address */ 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 sprintf(info, " %s", version_string);