mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 10:26:10 +01:00 
			
		
		
		
	video console: implement multiple fonts configuration
This needed for unit testing different fonts. Configured fonts are placed in an array of fonts. First font is selected by default upon console probe. Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org> [agust: fixed build error when bmp logo disabled] Signed-off-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
		
				
					committed by
					
						 Anatolij Gustschin
						Anatolij Gustschin
					
				
			
			
				
	
			
			
			
						parent
						
							0e177d5a95
						
					
				
				
					commit
					39c1fa2c21
				
			| @@ -127,9 +127,11 @@ void splash_get_pos(int *x, int *y) | |||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <video_console.h> | #include <video_console.h> | ||||||
| #include <video_font.h> | #include <video_font.h> | ||||||
|  | #include <video_font_data.h> | ||||||
|  |  | ||||||
| void splash_display_banner(void) | void splash_display_banner(void) | ||||||
| { | { | ||||||
|  | 	struct video_fontdata __maybe_unused *fontdata = fonts; | ||||||
| 	struct udevice *dev; | 	struct udevice *dev; | ||||||
| 	char buf[DISPLAY_OPTIONS_BANNER_LENGTH]; | 	char buf[DISPLAY_OPTIONS_BANNER_LENGTH]; | ||||||
| 	int col, row, ret; | 	int col, row, ret; | ||||||
| @@ -138,9 +140,9 @@ void splash_display_banner(void) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| #ifdef CONFIG_VIDEO_LOGO | #if IS_ENABLED(CONFIG_VIDEO_LOGO) | ||||||
| 	col = BMP_LOGO_WIDTH / VIDEO_FONT_WIDTH + 1; | 	col = BMP_LOGO_WIDTH / fontdata->width + 1; | ||||||
| 	row = BMP_LOGO_HEIGHT / VIDEO_FONT_HEIGHT + 1; | 	row = BMP_LOGO_HEIGHT / fontdata->height + 1; | ||||||
| #else | #else | ||||||
| 	col = 0; | 	col = 0; | ||||||
| 	row = 0; | 	row = 0; | ||||||
|   | |||||||
| @@ -16,6 +16,21 @@ config VIDEO | |||||||
|  |  | ||||||
| if VIDEO | if VIDEO | ||||||
|  |  | ||||||
|  | config VIDEO_FONT_4X6 | ||||||
|  | 	bool "4 x 6 font size" | ||||||
|  | 	help | ||||||
|  | 	  Font for video console driver, 4 x 6 pixels. | ||||||
|  | 	  Provides character bitmap data in header file. | ||||||
|  | 	  When selecting multiple fonts, you may want to enable CMD_SELECT_FONT too. | ||||||
|  |  | ||||||
|  | config VIDEO_FONT_8X16 | ||||||
|  | 	bool "8 x 16 font size" | ||||||
|  | 	default y | ||||||
|  | 	help | ||||||
|  | 	  Font for video console driver, 8 x 16 pixels | ||||||
|  | 	  Provides character bitmap data in header file. | ||||||
|  | 	  When selecting multiple fonts, you may want to enable CMD_SELECT_FONT too. | ||||||
|  |  | ||||||
| config VIDEO_LOGO | config VIDEO_LOGO | ||||||
| 	bool "Show the U-Boot logo on the display" | 	bool "Show the U-Boot logo on the display" | ||||||
| 	default y if !SPLASH_SCREEN | 	default y if !SPLASH_SCREEN | ||||||
|   | |||||||
| @@ -9,8 +9,41 @@ | |||||||
| #include <video.h> | #include <video.h> | ||||||
| #include <video_console.h> | #include <video_console.h> | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
|  | #include <video_font.h> | ||||||
| #include "vidconsole_internal.h" | #include "vidconsole_internal.h" | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * console_set_font() - prepare vidconsole for chosen font. | ||||||
|  |  * | ||||||
|  |  * @dev		vidconsole device | ||||||
|  |  * @fontdata	pointer to font data struct | ||||||
|  |  */ | ||||||
|  | static int console_set_font(struct udevice *dev, struct video_fontdata *fontdata) | ||||||
|  | { | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | ||||||
|  | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  |  | ||||||
|  | 	debug("console_simple: setting %s font\n", fontdata->name); | ||||||
|  | 	debug("width: %d\n", fontdata->width); | ||||||
|  | 	debug("byte width: %d\n", fontdata->byte_width); | ||||||
|  | 	debug("height: %d\n", fontdata->height); | ||||||
|  |  | ||||||
|  | 	priv->fontdata = fontdata; | ||||||
|  | 	vc_priv->x_charsize = fontdata->width; | ||||||
|  | 	vc_priv->y_charsize = fontdata->height; | ||||||
|  | 	if (vid_priv->rot % 2) { | ||||||
|  | 		vc_priv->cols = vid_priv->ysize / fontdata->width; | ||||||
|  | 		vc_priv->rows = vid_priv->xsize / fontdata->height; | ||||||
|  | 		vc_priv->xsize_frac = VID_TO_POS(vid_priv->ysize); | ||||||
|  | 	} else { | ||||||
|  | 		vc_priv->cols = vid_priv->xsize / fontdata->width; | ||||||
|  | 		vc_priv->rows = vid_priv->ysize / fontdata->height; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| int check_bpix_support(int bpix) | int check_bpix_support(int bpix) | ||||||
| { | { | ||||||
| 	if (bpix == VIDEO_BPP8 && IS_ENABLED(CONFIG_VIDEO_BPP8)) | 	if (bpix == VIDEO_BPP8 && IS_ENABLED(CONFIG_VIDEO_BPP8)) | ||||||
| @@ -43,7 +76,7 @@ inline void fill_pixel_and_goto_next(void **dstp, u32 value, int pbytes, int ste | |||||||
| } | } | ||||||
|  |  | ||||||
| int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | ||||||
| 			 bool direction) | 			 struct video_fontdata *fontdata, bool direction) | ||||||
| { | { | ||||||
| 	int step, line_step, pbytes, bitcount, width_remainder, ret; | 	int step, line_step, pbytes, bitcount, width_remainder, ret; | ||||||
| 	void *dst; | 	void *dst; | ||||||
| @@ -61,17 +94,17 @@ int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | |||||||
| 		line_step = vid_priv->line_length; | 		line_step = vid_priv->line_length; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	width_remainder = VIDEO_FONT_WIDTH % 8; | 	width_remainder = fontdata->width % 8; | ||||||
| 	for (int row = 0; row < VIDEO_FONT_HEIGHT; row++) { | 	for (int row = 0; row < fontdata->height; row++) { | ||||||
| 		uchar bits; | 		uchar bits; | ||||||
|  |  | ||||||
| 		bitcount = 8; | 		bitcount = 8; | ||||||
| 		dst = *line; | 		dst = *line; | ||||||
| 		for (int col = 0; col < VIDEO_FONT_BYTE_WIDTH; col++) { | 		for (int col = 0; col < fontdata->byte_width; col++) { | ||||||
| 			if (width_remainder) { | 			if (width_remainder) { | ||||||
| 				bool is_last_iteration = (VIDEO_FONT_BYTE_WIDTH - col == 1); | 				bool is_last_col = (fontdata->byte_width - col == 1); | ||||||
|  |  | ||||||
| 				if (is_last_iteration) | 				if (is_last_col) | ||||||
| 					bitcount = width_remainder; | 					bitcount = width_remainder; | ||||||
| 			} | 			} | ||||||
| 			bits = pfont[col]; | 			bits = pfont[col]; | ||||||
| @@ -90,13 +123,13 @@ int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		*line += line_step; | 		*line += line_step; | ||||||
| 		pfont += VIDEO_FONT_BYTE_WIDTH; | 		pfont += fontdata->byte_width; | ||||||
| 	} | 	} | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_priv, | int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_priv, | ||||||
| 			   bool direction) | 			   struct video_fontdata *fontdata, bool direction) | ||||||
| { | { | ||||||
| 	int step, line_step, pbytes, bitcount = 8, width_remainder, ret; | 	int step, line_step, pbytes, bitcount = 8, width_remainder, ret; | ||||||
| 	void *dst; | 	void *dst; | ||||||
| @@ -115,21 +148,20 @@ int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_pri | |||||||
| 		line_step = -vid_priv->line_length; | 		line_step = -vid_priv->line_length; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	width_remainder = VIDEO_FONT_WIDTH % 8; | 	width_remainder = fontdata->width % 8; | ||||||
| 	for (int col = 0; col < VIDEO_FONT_BYTE_WIDTH; col++) { | 	for (int col = 0; col < fontdata->byte_width; col++) { | ||||||
| 		mask = 0x80; | 		mask = 0x80; | ||||||
| 		if (width_remainder) { | 		if (width_remainder) { | ||||||
| 			bool is_last_iteration = (VIDEO_FONT_BYTE_WIDTH - col == 1); | 			bool is_last_col = (fontdata->byte_width - col == 1); | ||||||
|  |  | ||||||
| 			if (is_last_iteration) | 			if (is_last_col) | ||||||
| 				bitcount = width_remainder; | 				bitcount = width_remainder; | ||||||
| 		} | 		} | ||||||
| 		for (int bit = 0; bit < bitcount; bit++) { | 		for (int bit = 0; bit < bitcount; bit++) { | ||||||
| 			dst = *line; | 			dst = *line; | ||||||
| 			for (int row = 0; row < VIDEO_FONT_HEIGHT; row++) { | 			for (int row = 0; row < fontdata->height; row++) { | ||||||
| 				u32 value = (pfont[row * VIDEO_FONT_BYTE_WIDTH] & mask) ? | 				u32 value = (pfont[row * fontdata->byte_width + col] | ||||||
| 							vid_priv->colour_fg : | 					     & mask) ? vid_priv->colour_fg : vid_priv->colour_bg; | ||||||
| 							vid_priv->colour_bg; |  | ||||||
|  |  | ||||||
| 				fill_pixel_and_goto_next(&dst, | 				fill_pixel_and_goto_next(&dst, | ||||||
| 							 value, | 							 value, | ||||||
| @@ -146,20 +178,5 @@ int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_pri | |||||||
|  |  | ||||||
| int console_probe(struct udevice *dev) | int console_probe(struct udevice *dev) | ||||||
| { | { | ||||||
| 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | 	return console_set_font(dev, fonts); | ||||||
| 	struct udevice *vid_dev = dev->parent; |  | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev); |  | ||||||
|  |  | ||||||
| 	vc_priv->x_charsize = VIDEO_FONT_WIDTH; |  | ||||||
| 	vc_priv->y_charsize = VIDEO_FONT_HEIGHT; |  | ||||||
| 	if (vid_priv->rot % 2) { |  | ||||||
| 		vc_priv->cols = vid_priv->ysize / VIDEO_FONT_WIDTH; |  | ||||||
| 		vc_priv->rows = vid_priv->xsize / VIDEO_FONT_HEIGHT; |  | ||||||
| 		vc_priv->xsize_frac = VID_TO_POS(vid_priv->ysize); |  | ||||||
| 	} else { |  | ||||||
| 		vc_priv->cols = vid_priv->xsize / VIDEO_FONT_WIDTH; |  | ||||||
| 		vc_priv->rows = vid_priv->ysize / VIDEO_FONT_HEIGHT; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return 0; |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,8 +16,10 @@ | |||||||
| static int console_set_row(struct udevice *dev, uint row, int clr) | static int console_set_row(struct udevice *dev, uint row, int clr) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	void *line, *dst, *end; | 	void *line, *dst, *end; | ||||||
| 	int pixels = VIDEO_FONT_HEIGHT * vid_priv->xsize; | 	int pixels = fontdata->height * vid_priv->xsize; | ||||||
| 	int ret; | 	int ret; | ||||||
| 	int i; | 	int i; | ||||||
| 	int pbytes; | 	int pbytes; | ||||||
| @@ -26,7 +28,7 @@ static int console_set_row(struct udevice *dev, uint row, int clr) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| 	line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * vid_priv->line_length; | 	line = vid_priv->fb + row * fontdata->height * vid_priv->line_length; | ||||||
| 	dst = line; | 	dst = line; | ||||||
| 	pbytes = VNBYTES(vid_priv->bpix); | 	pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	for (i = 0; i < pixels; i++) | 	for (i = 0; i < pixels; i++) | ||||||
| @@ -44,14 +46,16 @@ static int console_move_rows(struct udevice *dev, uint rowdst, | |||||||
| 			     uint rowsrc, uint count) | 			     uint rowsrc, uint count) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	void *dst; | 	void *dst; | ||||||
| 	void *src; | 	void *src; | ||||||
| 	int size; | 	int size; | ||||||
| 	int ret; | 	int ret; | ||||||
|  |  | ||||||
| 	dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * vid_priv->line_length; | 	dst = vid_priv->fb + rowdst * fontdata->height * vid_priv->line_length; | ||||||
| 	src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * vid_priv->line_length; | 	src = vid_priv->fb + rowsrc * fontdata->height * vid_priv->line_length; | ||||||
| 	size = VIDEO_FONT_HEIGHT * vid_priv->line_length * count; | 	size = fontdata->height * vid_priv->line_length * count; | ||||||
| 	ret = vidconsole_memmove(dev, dst, src, size); | 	ret = vidconsole_memmove(dev, dst, src, size); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| @@ -64,10 +68,13 @@ static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | ||||||
| 	struct udevice *vid = dev->parent; | 	struct udevice *vid = dev->parent; | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	int x, linenum, ret; | 	int x, linenum, ret; | ||||||
| 	void *start, *line; | 	void *start, *line; | ||||||
| 	uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_CHAR_PIXEL_BYTES; | 	uchar *pfont = fontdata->video_fontdata + | ||||||
|  | 			(u8)ch * fontdata->char_pixel_bytes; | ||||||
|  |  | ||||||
| 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | ||||||
| 		return -EAGAIN; | 		return -EAGAIN; | ||||||
| @@ -79,7 +86,7 @@ static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | ||||||
| 		return -EAGAIN; | 		return -EAGAIN; | ||||||
|  |  | ||||||
| 	ret = fill_char_vertically(pfont, &line, vid_priv, NORMAL_DIRECTION); | 	ret = fill_char_vertically(pfont, &line, vid_priv, fontdata, NORMAL_DIRECTION); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| @@ -87,7 +94,7 @@ static int console_putc_xy(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| 	return VID_TO_POS(VIDEO_FONT_WIDTH); | 	return VID_TO_POS(fontdata->width); | ||||||
| } | } | ||||||
|  |  | ||||||
| struct vidconsole_ops console_ops = { | struct vidconsole_ops console_ops = { | ||||||
| @@ -101,4 +108,5 @@ U_BOOT_DRIVER(vidconsole_normal) = { | |||||||
| 	.id		= UCLASS_VIDEO_CONSOLE, | 	.id		= UCLASS_VIDEO_CONSOLE, | ||||||
| 	.ops		= &console_ops, | 	.ops		= &console_ops, | ||||||
| 	.probe		= console_probe, | 	.probe		= console_probe, | ||||||
|  | 	.priv_auto	= sizeof(struct console_simple_priv), | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -16,17 +16,19 @@ | |||||||
| static int console_set_row_1(struct udevice *dev, uint row, int clr) | static int console_set_row_1(struct udevice *dev, uint row, int clr) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	void *start, *dst, *line; | 	void *start, *dst, *line; | ||||||
| 	int i, j; | 	int i, j; | ||||||
| 	int ret; | 	int ret; | ||||||
|  |  | ||||||
| 	start = vid_priv->fb + vid_priv->line_length - | 	start = vid_priv->fb + vid_priv->line_length - | ||||||
| 		(row + 1) * VIDEO_FONT_HEIGHT * pbytes; | 		(row + 1) * fontdata->height * pbytes; | ||||||
| 	line = start; | 	line = start; | ||||||
| 	for (j = 0; j < vid_priv->ysize; j++) { | 	for (j = 0; j < vid_priv->ysize; j++) { | ||||||
| 		dst = line; | 		dst = line; | ||||||
| 		for (i = 0; i < VIDEO_FONT_HEIGHT; i++) | 		for (i = 0; i < fontdata->height; i++) | ||||||
| 			fill_pixel_and_goto_next(&dst, clr, pbytes, pbytes); | 			fill_pixel_and_goto_next(&dst, clr, pbytes, pbytes); | ||||||
| 		line += vid_priv->line_length; | 		line += vid_priv->line_length; | ||||||
| 	} | 	} | ||||||
| @@ -41,19 +43,21 @@ static int console_move_rows_1(struct udevice *dev, uint rowdst, uint rowsrc, | |||||||
| 				   uint count) | 				   uint count) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	void *dst; | 	void *dst; | ||||||
| 	void *src; | 	void *src; | ||||||
| 	int j, ret; | 	int j, ret; | ||||||
|  |  | ||||||
| 	dst = vid_priv->fb + vid_priv->line_length - | 	dst = vid_priv->fb + vid_priv->line_length - | ||||||
| 		(rowdst + count) * VIDEO_FONT_HEIGHT * pbytes; | 		(rowdst + count) * fontdata->height * pbytes; | ||||||
| 	src = vid_priv->fb + vid_priv->line_length - | 	src = vid_priv->fb + vid_priv->line_length - | ||||||
| 		(rowsrc + count) * VIDEO_FONT_HEIGHT * pbytes; | 		(rowsrc + count) * fontdata->height * pbytes; | ||||||
|  |  | ||||||
| 	for (j = 0; j < vid_priv->ysize; j++) { | 	for (j = 0; j < vid_priv->ysize; j++) { | ||||||
| 		ret = vidconsole_memmove(dev, dst, src, | 		ret = vidconsole_memmove(dev, dst, src, | ||||||
| 					VIDEO_FONT_HEIGHT * pbytes * count); | 					fontdata->height * pbytes * count); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			return ret; | 			return ret; | ||||||
| 		src += vid_priv->line_length; | 		src += vid_priv->line_length; | ||||||
| @@ -68,10 +72,13 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | ||||||
| 	struct udevice *vid = dev->parent; | 	struct udevice *vid = dev->parent; | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	int x, linenum, ret; | 	int x, linenum, ret; | ||||||
| 	void *start, *line; | 	void *start, *line; | ||||||
| 	uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_CHAR_PIXEL_BYTES; | 	uchar *pfont = fontdata->video_fontdata + | ||||||
|  | 			(u8)ch * fontdata->char_pixel_bytes; | ||||||
|  |  | ||||||
| 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | ||||||
| 		return -EAGAIN; | 		return -EAGAIN; | ||||||
| @@ -80,7 +87,7 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	start = vid_priv->fb + linenum * vid_priv->line_length - x * pbytes; | 	start = vid_priv->fb + linenum * vid_priv->line_length - x * pbytes; | ||||||
| 	line = start; | 	line = start; | ||||||
|  |  | ||||||
| 	ret = fill_char_horizontally(pfont, &line, vid_priv, FLIPPED_DIRECTION); | 	ret = fill_char_horizontally(pfont, &line, vid_priv, fontdata, FLIPPED_DIRECTION); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| @@ -89,20 +96,22 @@ static int console_putc_xy_1(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| 	return VID_TO_POS(VIDEO_FONT_WIDTH); | 	return VID_TO_POS(fontdata->width); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static int console_set_row_2(struct udevice *dev, uint row, int clr) | static int console_set_row_2(struct udevice *dev, uint row, int clr) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	void *start, *line, *dst, *end; | 	void *start, *line, *dst, *end; | ||||||
| 	int pixels = VIDEO_FONT_HEIGHT * vid_priv->xsize; | 	int pixels = fontdata->height * vid_priv->xsize; | ||||||
| 	int i, ret; | 	int i, ret; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
|  |  | ||||||
| 	start = vid_priv->fb + vid_priv->ysize * vid_priv->line_length - | 	start = vid_priv->fb + vid_priv->ysize * vid_priv->line_length - | ||||||
| 		(row + 1) * VIDEO_FONT_HEIGHT * vid_priv->line_length; | 		(row + 1) * fontdata->height * vid_priv->line_length; | ||||||
| 	line = start; | 	line = start; | ||||||
| 	dst = line; | 	dst = line; | ||||||
| 	for (i = 0; i < pixels; i++) | 	for (i = 0; i < pixels; i++) | ||||||
| @@ -119,17 +128,19 @@ static int console_move_rows_2(struct udevice *dev, uint rowdst, uint rowsrc, | |||||||
| 			       uint count) | 			       uint count) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	void *dst; | 	void *dst; | ||||||
| 	void *src; | 	void *src; | ||||||
| 	void *end; | 	void *end; | ||||||
|  |  | ||||||
| 	end = vid_priv->fb + vid_priv->ysize * vid_priv->line_length; | 	end = vid_priv->fb + vid_priv->ysize * vid_priv->line_length; | ||||||
| 	dst = end - (rowdst + count) * VIDEO_FONT_HEIGHT * | 	dst = end - (rowdst + count) * fontdata->height * | ||||||
| 		vid_priv->line_length; | 		vid_priv->line_length; | ||||||
| 	src = end - (rowsrc + count) * VIDEO_FONT_HEIGHT * | 	src = end - (rowsrc + count) * fontdata->height * | ||||||
| 		vid_priv->line_length; | 		vid_priv->line_length; | ||||||
| 	vidconsole_memmove(dev, dst, src, | 	vidconsole_memmove(dev, dst, src, | ||||||
| 			   VIDEO_FONT_HEIGHT * vid_priv->line_length * count); | 			   fontdata->height * vid_priv->line_length * count); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| @@ -139,10 +150,13 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | ||||||
| 	struct udevice *vid = dev->parent; | 	struct udevice *vid = dev->parent; | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	int linenum, x, ret; | 	int linenum, x, ret; | ||||||
| 	void *start, *line; | 	void *start, *line; | ||||||
| 	uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_CHAR_PIXEL_BYTES; | 	uchar *pfont = fontdata->video_fontdata + | ||||||
|  | 			(u8)ch * fontdata->char_pixel_bytes; | ||||||
|  |  | ||||||
| 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | ||||||
| 		return -EAGAIN; | 		return -EAGAIN; | ||||||
| @@ -151,7 +165,7 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	start = vid_priv->fb + linenum * vid_priv->line_length + x * pbytes; | 	start = vid_priv->fb + linenum * vid_priv->line_length + x * pbytes; | ||||||
| 	line = start; | 	line = start; | ||||||
|  |  | ||||||
| 	ret = fill_char_vertically(pfont, &line, vid_priv, FLIPPED_DIRECTION); | 	ret = fill_char_vertically(pfont, &line, vid_priv, fontdata, FLIPPED_DIRECTION); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| @@ -160,21 +174,23 @@ static int console_putc_xy_2(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| 	return VID_TO_POS(VIDEO_FONT_WIDTH); | 	return VID_TO_POS(fontdata->width); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int console_set_row_3(struct udevice *dev, uint row, int clr) | static int console_set_row_3(struct udevice *dev, uint row, int clr) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	void *start, *dst, *line; | 	void *start, *dst, *line; | ||||||
| 	int i, j, ret; | 	int i, j, ret; | ||||||
|  |  | ||||||
| 	start = vid_priv->fb + row * VIDEO_FONT_HEIGHT * pbytes; | 	start = vid_priv->fb + row * fontdata->height * pbytes; | ||||||
| 	line = start; | 	line = start; | ||||||
| 	for (j = 0; j < vid_priv->ysize; j++) { | 	for (j = 0; j < vid_priv->ysize; j++) { | ||||||
| 		dst = line; | 		dst = line; | ||||||
| 		for (i = 0; i < VIDEO_FONT_HEIGHT; i++) | 		for (i = 0; i < fontdata->height; i++) | ||||||
| 			fill_pixel_and_goto_next(&dst, clr, pbytes, pbytes); | 			fill_pixel_and_goto_next(&dst, clr, pbytes, pbytes); | ||||||
| 		line += vid_priv->line_length; | 		line += vid_priv->line_length; | ||||||
| 	} | 	} | ||||||
| @@ -189,17 +205,19 @@ static int console_move_rows_3(struct udevice *dev, uint rowdst, uint rowsrc, | |||||||
| 			       uint count) | 			       uint count) | ||||||
| { | { | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	void *dst; | 	void *dst; | ||||||
| 	void *src; | 	void *src; | ||||||
| 	int j, ret; | 	int j, ret; | ||||||
|  |  | ||||||
| 	dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * pbytes; | 	dst = vid_priv->fb + rowdst * fontdata->height * pbytes; | ||||||
| 	src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * pbytes; | 	src = vid_priv->fb + rowsrc * fontdata->height * pbytes; | ||||||
|  |  | ||||||
| 	for (j = 0; j < vid_priv->ysize; j++) { | 	for (j = 0; j < vid_priv->ysize; j++) { | ||||||
| 		ret = vidconsole_memmove(dev, dst, src, | 		ret = vidconsole_memmove(dev, dst, src, | ||||||
| 					 VIDEO_FONT_HEIGHT * pbytes * count); | 					fontdata->height * pbytes * count); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			return ret; | 			return ret; | ||||||
| 		src += vid_priv->line_length; | 		src += vid_priv->line_length; | ||||||
| @@ -214,10 +232,13 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | 	struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); | ||||||
| 	struct udevice *vid = dev->parent; | 	struct udevice *vid = dev->parent; | ||||||
| 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | 	struct video_priv *vid_priv = dev_get_uclass_priv(vid); | ||||||
|  | 	struct console_simple_priv *priv = dev_get_priv(dev); | ||||||
|  | 	struct video_fontdata *fontdata = priv->fontdata; | ||||||
| 	int pbytes = VNBYTES(vid_priv->bpix); | 	int pbytes = VNBYTES(vid_priv->bpix); | ||||||
| 	int linenum, x, ret; | 	int linenum, x, ret; | ||||||
| 	void *start, *line; | 	void *start, *line; | ||||||
| 	uchar *pfont = video_fontdata + (u8)ch * VIDEO_FONT_CHAR_PIXEL_BYTES; | 	uchar *pfont = fontdata->video_fontdata + | ||||||
|  | 			(u8)ch * fontdata->char_pixel_bytes; | ||||||
|  |  | ||||||
| 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | 	if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) | ||||||
| 		return -EAGAIN; | 		return -EAGAIN; | ||||||
| @@ -226,7 +247,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	start = vid_priv->fb + linenum * vid_priv->line_length + y * pbytes; | 	start = vid_priv->fb + linenum * vid_priv->line_length + y * pbytes; | ||||||
| 	line = start; | 	line = start; | ||||||
|  |  | ||||||
| 	ret = fill_char_horizontally(pfont, &line, vid_priv, NORMAL_DIRECTION); | 	ret = fill_char_horizontally(pfont, &line, vid_priv, fontdata, NORMAL_DIRECTION); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 	/* Add a line to allow for the first pixels writen */ | 	/* Add a line to allow for the first pixels writen */ | ||||||
| @@ -234,7 +255,7 @@ static int console_putc_xy_3(struct udevice *dev, uint x_frac, uint y, char ch) | |||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
|  |  | ||||||
| 	return VID_TO_POS(VIDEO_FONT_WIDTH); | 	return VID_TO_POS(fontdata->width); | ||||||
| } | } | ||||||
|  |  | ||||||
| struct vidconsole_ops console_ops_1 = { | struct vidconsole_ops console_ops_1 = { | ||||||
| @@ -260,6 +281,7 @@ U_BOOT_DRIVER(vidconsole_1) = { | |||||||
| 	.id	= UCLASS_VIDEO_CONSOLE, | 	.id	= UCLASS_VIDEO_CONSOLE, | ||||||
| 	.ops	= &console_ops_1, | 	.ops	= &console_ops_1, | ||||||
| 	.probe	= console_probe, | 	.probe	= console_probe, | ||||||
|  | 	.priv_auto	= sizeof(struct console_simple_priv), | ||||||
| }; | }; | ||||||
|  |  | ||||||
| U_BOOT_DRIVER(vidconsole_2) = { | U_BOOT_DRIVER(vidconsole_2) = { | ||||||
| @@ -267,6 +289,7 @@ U_BOOT_DRIVER(vidconsole_2) = { | |||||||
| 	.id	= UCLASS_VIDEO_CONSOLE, | 	.id	= UCLASS_VIDEO_CONSOLE, | ||||||
| 	.ops	= &console_ops_2, | 	.ops	= &console_ops_2, | ||||||
| 	.probe	= console_probe, | 	.probe	= console_probe, | ||||||
|  | 	.priv_auto	= sizeof(struct console_simple_priv), | ||||||
| }; | }; | ||||||
|  |  | ||||||
| U_BOOT_DRIVER(vidconsole_3) = { | U_BOOT_DRIVER(vidconsole_3) = { | ||||||
| @@ -274,4 +297,5 @@ U_BOOT_DRIVER(vidconsole_3) = { | |||||||
| 	.id	= UCLASS_VIDEO_CONSOLE, | 	.id	= UCLASS_VIDEO_CONSOLE, | ||||||
| 	.ops	= &console_ops_3, | 	.ops	= &console_ops_3, | ||||||
| 	.probe	= console_probe, | 	.probe	= console_probe, | ||||||
|  | 	.priv_auto	= sizeof(struct console_simple_priv), | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -6,14 +6,18 @@ | |||||||
|  * (C) Copyright 2023 Dzmitry Sankouski <dsankouski@gmail.com> |  * (C) Copyright 2023 Dzmitry Sankouski <dsankouski@gmail.com> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <video_font.h>		/* Get font data, width and height */ |  | ||||||
|  |  | ||||||
| #define VIDEO_FONT_BYTE_WIDTH	((VIDEO_FONT_WIDTH / 8) + (VIDEO_FONT_WIDTH % 8 > 0)) |  | ||||||
| #define VIDEO_FONT_CHAR_PIXEL_BYTES	(VIDEO_FONT_HEIGHT * VIDEO_FONT_BYTE_WIDTH) |  | ||||||
|  |  | ||||||
| #define FLIPPED_DIRECTION 1 | #define FLIPPED_DIRECTION 1 | ||||||
| #define NORMAL_DIRECTION 0 | #define NORMAL_DIRECTION 0 | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * struct console_simple_priv - Private data for this driver | ||||||
|  |  * | ||||||
|  |  * @video_fontdata	font graphical representation data | ||||||
|  |  */ | ||||||
|  | struct console_simple_priv { | ||||||
|  | 	struct video_fontdata *fontdata; | ||||||
|  | }; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Checks if bits per pixel supported. |  * Checks if bits per pixel supported. | ||||||
|  * |  * | ||||||
| @@ -41,6 +45,7 @@ void fill_pixel_and_goto_next(void **dstp, u32 value, int pbytes, int step); | |||||||
|  * @param pfont		a pointer to character font data. |  * @param pfont		a pointer to character font data. | ||||||
|  * @param line		a pointer to pointer to framebuffer. It's a point for upper left char corner |  * @param line		a pointer to pointer to framebuffer. It's a point for upper left char corner | ||||||
|  * @param vid_priv	driver private data. |  * @param vid_priv	driver private data. | ||||||
|  |  * @fontdata		font graphical representation data | ||||||
|  * @param direction	controls character orientation. Can be normal or flipped. |  * @param direction	controls character orientation. Can be normal or flipped. | ||||||
|  * When normal:               When flipped: |  * When normal:               When flipped: | ||||||
|  *|-----------------------------------------------| |  *|-----------------------------------------------| | ||||||
| @@ -59,7 +64,7 @@ void fill_pixel_and_goto_next(void **dstp, u32 value, int pbytes, int step); | |||||||
|  * @returns 0, if success, or else error code. |  * @returns 0, if success, or else error code. | ||||||
|  */ |  */ | ||||||
| int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | ||||||
| 			 bool direction); | 			 struct video_fontdata *fontdata, bool direction); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Fills 1 character in framebuffer horizontally. |  * Fills 1 character in framebuffer horizontally. | ||||||
| @@ -68,6 +73,7 @@ int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | |||||||
|  * @param pfont		a pointer to character font data. |  * @param pfont		a pointer to character font data. | ||||||
|  * @param line		a pointer to pointer to framebuffer. It's a point for upper left char corner |  * @param line		a pointer to pointer to framebuffer. It's a point for upper left char corner | ||||||
|  * @param vid_priv	driver private data. |  * @param vid_priv	driver private data. | ||||||
|  |  * @fontdata		font graphical representation data | ||||||
|  * @param direction	controls character orientation. Can be normal or flipped. |  * @param direction	controls character orientation. Can be normal or flipped. | ||||||
|  * When normal:               When flipped: |  * When normal:               When flipped: | ||||||
|  *|-----------------------------------------------| |  *|-----------------------------------------------| | ||||||
| @@ -84,7 +90,7 @@ int fill_char_vertically(uchar *pfont, void **line, struct video_priv *vid_priv, | |||||||
|  * @returns 0, if success, or else error code. |  * @returns 0, if success, or else error code. | ||||||
|  */ |  */ | ||||||
| int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_priv, | int fill_char_horizontally(uchar *pfont, void **line, struct video_priv *vid_priv, | ||||||
| 			   bool direction); | 			   struct video_fontdata *fontdata, bool direction); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * console probe function. |  * console probe function. | ||||||
|   | |||||||
| @@ -7,10 +7,23 @@ | |||||||
| #ifndef _VIDEO_FONT_ | #ifndef _VIDEO_FONT_ | ||||||
| #define _VIDEO_FONT_ | #define _VIDEO_FONT_ | ||||||
|  |  | ||||||
| #ifdef CONFIG_VIDEO_FONT_4X6 | #include <video_font_data.h> | ||||||
|  |  | ||||||
|  | #if defined(CONFIG_VIDEO_FONT_4X6) | ||||||
| #include <video_font_4x6.h> | #include <video_font_4x6.h> | ||||||
| #else | #endif | ||||||
|  | #if defined(CONFIG_VIDEO_FONT_8X16) | ||||||
| #include <video_font_8x16.h> | #include <video_font_8x16.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | static struct video_fontdata __maybe_unused fonts[] = { | ||||||
|  | #if defined(CONFIG_VIDEO_FONT_8X16) | ||||||
|  | 	FONT_ENTRY(8, 16, 8x16), | ||||||
|  | #endif | ||||||
|  | #if defined(CONFIG_VIDEO_FONT_4X6) | ||||||
|  | 	FONT_ENTRY(4, 6, 4x6), | ||||||
|  | #endif | ||||||
|  | 	{/* list terminator */} | ||||||
|  | }; | ||||||
|  |  | ||||||
| #endif /* _VIDEO_FONT_ */ | #endif /* _VIDEO_FONT_ */ | ||||||
|   | |||||||
| @@ -38,15 +38,12 @@ __END__; | |||||||
|    MSBit to LSBit = left to right. |    MSBit to LSBit = left to right. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef _VIDEO_FONT_DATA_ | #ifndef _VIDEO_FONT_4X6_ | ||||||
| #define _VIDEO_FONT_DATA_ | #define _VIDEO_FONT_4X6_ | ||||||
|  |  | ||||||
| #define VIDEO_FONT_CHARS	256 | #include <video_font_data.h> | ||||||
| #define VIDEO_FONT_WIDTH	4 |  | ||||||
| #define VIDEO_FONT_HEIGHT	6 |  | ||||||
| #define VIDEO_FONT_SIZE		(VIDEO_FONT_CHARS * VIDEO_FONT_HEIGHT) |  | ||||||
|  |  | ||||||
| static unsigned char video_fontdata[VIDEO_FONT_SIZE] = { | static unsigned char video_fontdata_4x6[VIDEO_FONT_SIZE(256, 4, 6)] = { | ||||||
|  |  | ||||||
| 	/*{*/ | 	/*{*/ | ||||||
| 		/*   Char 0: ' '  */ | 		/*   Char 0: ' '  */ | ||||||
|   | |||||||
| @@ -9,13 +9,9 @@ | |||||||
| #ifndef _VIDEO_FONT_8X16 | #ifndef _VIDEO_FONT_8X16 | ||||||
| #define _VIDEO_FONT_8X16 | #define _VIDEO_FONT_8X16 | ||||||
|  |  | ||||||
| #define VIDEO_FONT_CHARS	256 | #include <video_font_data.h> | ||||||
| #define VIDEO_FONT_WIDTH	8 |  | ||||||
| #define VIDEO_FONT_HEIGHT	16 |  | ||||||
| #define VIDEO_FONT_SIZE		(VIDEO_FONT_CHARS * VIDEO_FONT_HEIGHT) |  | ||||||
|  |  | ||||||
| static unsigned char __maybe_unused video_fontdata[VIDEO_FONT_SIZE] = { |  | ||||||
|  |  | ||||||
|  | static unsigned char video_fontdata_8x16[VIDEO_FONT_SIZE(256, 8, 16)] = { | ||||||
| 	/* 0 0x00 '^@' */ | 	/* 0 0x00 '^@' */ | ||||||
| 	0x00, /* 00000000 */ | 	0x00, /* 00000000 */ | ||||||
| 	0x00, /* 00000000 */ | 	0x00, /* 00000000 */ | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								include/video_font_data.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								include/video_font_data.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | /* SPDX-License-Identifier: GPL-2.0+ */ | ||||||
|  | /* | ||||||
|  |  * (C) Copyright 2023 Dzmitry Sankouski <dsankouski@gmail.com> | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _VIDEO_FONT_DATA_ | ||||||
|  | #define _VIDEO_FONT_DATA_ | ||||||
|  | #define VIDEO_FONT_BYTE_WIDTH(width)	((width / 8) + (width % 8 > 0)) | ||||||
|  | #define VIDEO_FONT_CHAR_PIXEL_BYTES(width, height)	(height * VIDEO_FONT_BYTE_WIDTH(width)) | ||||||
|  | #define VIDEO_FONT_SIZE(chars, width, height)	(chars * VIDEO_FONT_CHAR_PIXEL_BYTES(width, height)) | ||||||
|  |  | ||||||
|  | struct video_fontdata { | ||||||
|  | 	const char *name; | ||||||
|  | 	int width; | ||||||
|  | 	int height; | ||||||
|  | 	int byte_width; | ||||||
|  | 	int char_pixel_bytes; | ||||||
|  | 	unsigned char *video_fontdata; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define FONT_ENTRY(_font_width, _font_height, _width_x_height) \ | ||||||
|  | {	\ | ||||||
|  | 	.name = #_width_x_height,	\ | ||||||
|  | 	.width = _font_width,		\ | ||||||
|  | 	.height = _font_height,		\ | ||||||
|  | 	.byte_width = VIDEO_FONT_BYTE_WIDTH(_font_width),	\ | ||||||
|  | 	.char_pixel_bytes = VIDEO_FONT_CHAR_PIXEL_BYTES(_font_width, _font_height),	\ | ||||||
|  | 	.video_fontdata = video_fontdata_##_width_x_height,	\ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* _VIDEO_FONT_DATA_ */ | ||||||
		Reference in New Issue
	
	Block a user