diff options
| author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-05-09 09:09:04 +0200 | 
|---|---|---|
| committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-08-19 01:56:51 +0200 | 
| commit | 8353d25b01b31c2c3d50bb58e504370ac1fce320 (patch) | |
| tree | 2f16f9af7395a9b011e4e139f91b20bb3d3c6762 | |
| parent | d80aa5107b2ad95ba3ebd7bfa7c781b9f20064e6 (diff) | |
Add support for user-selectable test patterns
The only currently supported test pattern is the SMPTE color bars.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
| -rw-r--r-- | fbdev.c | 96 | 
1 files changed, 72 insertions, 24 deletions
| @@ -50,6 +50,10 @@ enum fb_fill_mode {  	FB_FILL_VIRTUAL = 2,  }; +enum fb_fill_pattern { +	FB_PATTERN_SMPTE = 0, +}; +  /* -----------------------------------------------------------------------------   * FB information display   */ @@ -589,8 +593,8 @@ static int fb_pan(struct device *dev, unsigned int x, unsigned int y)  	 (((b) >> (8 - (var)->blue.length)) << (var)->blue.offset))  static void -fb_fill_rgb16(struct device *dev, unsigned int xoffset, unsigned int yoffset, -	      unsigned int xres, unsigned int yres) +fb_fill_smpte_rgb16(struct device *dev, unsigned int xoffset, +		    unsigned int yoffset, unsigned int xres, unsigned int yres)  {  	const uint16_t colors_top[] = {  		FB_MAKE_COLOR(&dev->var_info, 192, 192, 192),	/* grey */ @@ -659,8 +663,8 @@ struct fb_color24 {  	{ .value = FB_MAKE_COLOR(var, r, g, b) }  static void -fb_fill_rgb24(struct device *dev, unsigned int xoffset, unsigned int yoffset, -	      unsigned int xres, unsigned int yres) +fb_fill_smpte_rgb24(struct device *dev, unsigned int xoffset, +		    unsigned int yoffset, unsigned int xres, unsigned int yres)  {  	const struct fb_color24 colors_top[] = {  		FB_MAKE_COLOR24(&dev->var_info, 192, 192, 192),	/* grey */ @@ -724,8 +728,8 @@ fb_fill_rgb24(struct device *dev, unsigned int xoffset, unsigned int yoffset,  }  static void -fb_fill_rgb32(struct device *dev, unsigned int xoffset, unsigned int yoffset, -	      unsigned int xres, unsigned int yres) +fb_fill_smpte_rgb32(struct device *dev, unsigned int xoffset, +		    unsigned int yoffset, unsigned int xres, unsigned int yres)  {  	const uint32_t colors_top[] = {  		FB_MAKE_COLOR(&dev->var_info, 192, 192, 192),	/* grey */ @@ -787,15 +791,42 @@ fb_fill_rgb32(struct device *dev, unsigned int xoffset, unsigned int yoffset,  }  /* - * fb_fill - Fill the frame buffer with an SMPTE test pattern + * fb_fill_smpte - Fill the frame buffer with an SMPTE test pattern + * @dev: FB device + * @xoffset: Horizontal offset, in pixels + * @yoffset: Vertical offset, in pixels + * @xres: Horizontal size, in pixels + * @yres: Vertical size, in pixels + * + * Fill the display (when mode is FB_FILL_DISPLAY) or virtual frame buffer area + * (when mode is FB_FILL_VIRTUAL) with an SMPTE color bars pattern. + */ +static void +fb_fill_smpte(struct device *dev, unsigned int xoffset, unsigned int yoffset, +	      unsigned int xres, unsigned int yres) +{ +	switch (dev->var_info.bits_per_pixel) { +	case 16: +		return fb_fill_smpte_rgb16(dev, xoffset, yoffset, xres, yres); +	case 24: +		return fb_fill_smpte_rgb24(dev, xoffset, yoffset, xres, yres); +	case 32: +		return fb_fill_smpte_rgb32(dev, xoffset, yoffset, xres, yres); +	} +} + +/* + * fb_fill - Fill the frame buffer with a test pattern   * @dev: FB device   * @mode: Fill mode + * @pattern: Test pattern   *   * Fill the display (when mode is FB_FILL_DISPLAY) or virtual frame buffer area - * (when mode is FB_FILL_VIRTUAL) with an SMPTE color bars pattern. Only RGB16, - * RGB24 and RGB32 on true color visuals are supported. + * (when mode is FB_FILL_VIRTUAL) with the test pattern specified by the pattern + * parameter. Only RGB16, RGB24 and RGB32 on true color visuals are supported.   */ -static void fb_fill(struct device *dev, enum fb_fill_mode mode) +static void +fb_fill(struct device *dev, enum fb_fill_mode mode, enum fb_fill_pattern pattern)  {  	unsigned int xoffset, yoffset;  	unsigned int xres, yres; @@ -806,7 +837,13 @@ static void fb_fill(struct device *dev, enum fb_fill_mode mode)  		return;  	} -	printf("Filling frame buffer with SMPTE test pattern\n"); +	if (dev->var_info.bits_per_pixel != 16 && +	    dev->var_info.bits_per_pixel != 24 && +	    dev->var_info.bits_per_pixel != 32) { +		printf("Error: display depth %u bpp not supported.\n", +			dev->var_info.bits_per_pixel); +		return; +	}  	if (mode == FB_FILL_DISPLAY) {  		xoffset = dev->var_info.xoffset; @@ -820,16 +857,13 @@ static void fb_fill(struct device *dev, enum fb_fill_mode mode)  		yres = dev->var_info.yres_virtual;  	} -	switch (dev->var_info.bits_per_pixel) { -	case 16: -		return fb_fill_rgb16(dev, xoffset, yoffset, xres, yres); -	case 24: -		return fb_fill_rgb24(dev, xoffset, yoffset, xres, yres); -	case 32: -		return fb_fill_rgb32(dev, xoffset, yoffset, xres, yres); +	switch (pattern) { +	case FB_PATTERN_SMPTE: +		printf("Filling frame buffer with SMPTE test pattern\n"); +		return fb_fill_smpte(dev, xoffset, yoffset, xres, yres); +  	default: -		printf("Error: display depth %u bpp not supported.\n", -			dev->var_info.bits_per_pixel); +		printf("Error: unsupported test pattern %u.\n", pattern);  		break;  	}  } @@ -847,13 +881,16 @@ static void usage(const char *argv0)  	printf("-F, --format bpp		Set the number of bits per pixel\n");  	printf("-h, --help			Show this help screen\n");  	printf("-p, --pan x,y			Pan the display to position (x,y)\n"); +	printf("-P, --pattern name		Test pattern name\n");  	printf("-r, --resolution wxh		Set the display resolution to width x height\n");  	printf("-v, --virtual wxh		Set the display virtual resolution to width x height\n");  	printf("-w, --wait-vsync[=screen]	Wait for VSync on the given screen\n");  	printf("\n");  	printf("Support fill modes are:\n"); -	printf("display		Fill the displayed frame buffer only\n"); -	printf("virtual		Fill the whole virtual frame buffer\n"); +	printf(" display	Fill the displayed frame buffer only\n"); +	printf(" virtual	Fill the whole virtual frame buffer\n"); +	printf("Support test pattern are:\n"); +	printf(" smpte		SMPTE color bars\n");  	printf("Supported blanking modes are:\n");  	printf(" off		Blanking off, screen active\n");  	printf(" on		Blanked, HSync on,  VSync on\n"); @@ -868,6 +905,7 @@ static struct option opts[] = {  	{"format", 1, 0, 'F'},  	{"help", 0, 0, 'h'},  	{"pan", 1, 0, 'p'}, +	{"pattern", 1, 0, 'P'},  	{"resolution", 1, 0, 'r'},  	{"virtual", 1, 0, 'v'},  	{"wait-vsync", 2, 0, 'w'}, @@ -943,6 +981,7 @@ int main(int argc, char *argv[])  	int blank = 0;  	enum fb_fill_mode fill_mode = FB_FILL_NONE; +	enum fb_fill_pattern fill_pattern = FB_PATTERN_SMPTE;  	bool do_format = false;  	unsigned int bpp = 0; @@ -963,7 +1002,7 @@ int main(int argc, char *argv[])  	int c;  	opterr = 0; -	while ((c = getopt_long(argc, argv, "b:f::F:hp:r:v:w::", opts, NULL)) != -1) { +	while ((c = getopt_long(argc, argv, "b:f::F:hp:P:r:v:w::", opts, NULL)) != -1) {  		switch (c) {  		case 'b': @@ -1002,6 +1041,15 @@ int main(int argc, char *argv[])  				return 1;  			}  			break; +		case 'P': +			if (strcmp(optarg, "smpte") == 0) +				fill_pattern = FB_PATTERN_SMPTE; +			else { +				printf("Invalid test pattern `%s'\n", optarg); +				printf("Run %s -h for help.\n", argv[0]); +				return 1; +			} +			break;  		case 'r':  			do_resolution = true;  			if (fb_size_parse(optarg, &xres, &yres) < 0) { @@ -1049,7 +1097,7 @@ int main(int argc, char *argv[])  		fb_set_resolution(&dev, xres, yres, xres_virtual, yres_virtual);  	if (fill_mode != FB_FILL_NONE) -		fb_fill(&dev, fill_mode); +		fb_fill(&dev, fill_mode, fill_pattern);  	if (do_pan)  		fb_pan(&dev, pan_x, pan_y); | 
