diff options
Diffstat (limited to 'drivers/video/cfb_console.c')
| -rw-r--r-- | drivers/video/cfb_console.c | 94 | 
1 files changed, 69 insertions, 25 deletions
| diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 19d061f6c..fc4ea7216 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 @@ -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); |