video: parse the video-mode environment variable

Add function video_get_video_mode(), which parses the "video-mode" environment
variable and returns each of its components.  The format matches the video=
command-line option used for Linux:

	video-mode=<driver>:<xres>x<yres>-<depth>@<freq><,option=string>

	<driver> The video driver, ignored by U-Boot
	<xres> The X resolution (in pixels) to use.
	<yres> The Y resolution (in pixels) to use.
	<depth> The color depth (in bits) to use.
	<freq> The frequency (in Hz) to use.
	<options> A comma-separated list of device-specific options

Signed-off-by: Timur Tabi <timur@freescale.com>
This commit is contained in:
Timur Tabi 2011-03-21 16:38:49 -05:00 committed by Anatolij Gustschin
parent 74446b63dd
commit a5dbdc81ea
3 changed files with 86 additions and 0 deletions

View file

@ -28,3 +28,22 @@ The driver has been tested with the following configurations:
- MPC823FADS with AD7176 on a PAL TV (YCbYCr) - arsenio@tin.it
- GENIETV with AD7177 on a PAL TV (YCbYCr) - arsenio@tin.it
"video-mode" environment variable
===============================
The 'video-mode' environment variable can be used to enable and configure
some video drivers. The format matches the video= command-line option used
for Linux:
video-mode=<driver>:<xres>x<yres>-<depth>@<freq><,option=string>
<driver> The video driver name, ignored by U-Boot
<xres> The X resolution (in pixels) to use.
<yres> The Y resolution (in pixels) to use.
<depth> The color depth (in bits) to use.
<freq> The frequency (in Hz) to use.
<options> A comma-separated list of device-specific options
Example: video-mode=fslfb:1280x1024-32@60,monitor=dvi

View file

@ -1,6 +1,7 @@
/*
* (C) Copyright 2004
* Pierre Aubert, Staubli Faverges , <p.aubert@staubli.com>
* Copyright 2011 Freescale Semiconductor, Inc.
*
* See file CREDITS for list of people who contributed to this
* project.
@ -73,6 +74,8 @@
****************************************************************************/
#include <common.h>
#include <linux/ctype.h>
#include "videomodes.h"
const struct ctfb_vesa_modes vesa_modes[VESA_MODES_COUNT] = {
@ -206,3 +209,64 @@ int video_get_params (struct ctfb_res_modes *pPar, char *penv)
}
return bpp;
}
/*
* Parse the 'video-mode' environment variable
*
* Example: "video-mode=fslfb:1280x1024-32@60,monitor=dvi". See
* doc/README.video for more information on how to set the variable.
*
* @xres: returned value of X-resolution
* @yres: returned value of Y-resolution
* @depth: returned value of color depth
* @freq: returned value of monitor frequency
* @options: pointer to any remaining options, or NULL
*
* Returns 1 if valid values were found, 0 otherwise
*/
int video_get_video_mode(unsigned int *xres, unsigned int *yres,
unsigned int *depth, unsigned int *freq, const char **options)
{
char *p = getenv("video-mode");
if (!p)
return 0;
/* Skip over the driver name, which we don't care about. */
p = strchr(p, ':');
if (!p)
return 0;
/* Get the X-resolution*/
while (*p && !isdigit(*p))
p++;
*xres = simple_strtoul(p, &p, 10);
if (!*xres)
return 0;
/* Get the Y-resolution */
while (*p && !isdigit(*p))
p++;
*yres = simple_strtoul(p, &p, 10);
if (!*yres)
return 0;
/* Get the depth */
while (*p && !isdigit(*p))
p++;
*depth = simple_strtoul(p, &p, 10);
if (!*depth)
return 0;
/* Get the frequency */
while (*p && !isdigit(*p))
p++;
*freq = simple_strtoul(p, &p, 10);
if (!*freq)
return 0;
/* Find the extra options, if any */
p = strchr(p, ',');
*options = p ? p + 1 : NULL;
return 1;
}

View file

@ -86,3 +86,6 @@ extern const struct ctfb_vesa_modes vesa_modes[];
extern const struct ctfb_res_modes res_mode_init[];
int video_get_params (struct ctfb_res_modes *pPar, char *penv);
int video_get_video_mode(unsigned int *xres, unsigned int *yres,
unsigned int *depth, unsigned int *freq, const char **options);