xref: /rk3399_rockchip-uboot/drivers/video/console_normal.c (revision 72cded9ec0dd8e36e17372687b0284044ac079a6)
1*72cded9eSSimon Glass /*
2*72cded9eSSimon Glass  * Copyright (c) 2015 Google, Inc
3*72cded9eSSimon Glass  * (C) Copyright 2001-2015
4*72cded9eSSimon Glass  * DENX Software Engineering -- wd@denx.de
5*72cded9eSSimon Glass  * Compulab Ltd - http://compulab.co.il/
6*72cded9eSSimon Glass  * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
7*72cded9eSSimon Glass  *
8*72cded9eSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
9*72cded9eSSimon Glass  */
10*72cded9eSSimon Glass 
11*72cded9eSSimon Glass #include <common.h>
12*72cded9eSSimon Glass #include <dm.h>
13*72cded9eSSimon Glass #include <video.h>
14*72cded9eSSimon Glass #include <video_console.h>
15*72cded9eSSimon Glass #include <video_font.h>		/* Get font data, width and height */
16*72cded9eSSimon Glass 
17*72cded9eSSimon Glass static int console_normal_set_row(struct udevice *dev, uint row, int clr)
18*72cded9eSSimon Glass {
19*72cded9eSSimon Glass 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
20*72cded9eSSimon Glass 	void *line;
21*72cded9eSSimon Glass 	int pixels = VIDEO_FONT_HEIGHT * vid_priv->line_length;
22*72cded9eSSimon Glass 	int i;
23*72cded9eSSimon Glass 
24*72cded9eSSimon Glass 	line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * vid_priv->line_length;
25*72cded9eSSimon Glass 	switch (vid_priv->bpix) {
26*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8
27*72cded9eSSimon Glass 	case VIDEO_BPP8: {
28*72cded9eSSimon Glass 		uint8_t *dst = line;
29*72cded9eSSimon Glass 
30*72cded9eSSimon Glass 		for (i = 0; i < pixels; i++)
31*72cded9eSSimon Glass 			*dst++ = clr;
32*72cded9eSSimon Glass 		break;
33*72cded9eSSimon Glass 	}
34*72cded9eSSimon Glass #endif
35*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16
36*72cded9eSSimon Glass 	case VIDEO_BPP16: {
37*72cded9eSSimon Glass 		uint16_t *dst = line;
38*72cded9eSSimon Glass 
39*72cded9eSSimon Glass 		for (i = 0; i < pixels; i++)
40*72cded9eSSimon Glass 			*dst++ = clr;
41*72cded9eSSimon Glass 		break;
42*72cded9eSSimon Glass 	}
43*72cded9eSSimon Glass #endif
44*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32
45*72cded9eSSimon Glass 	case VIDEO_BPP32: {
46*72cded9eSSimon Glass 		uint32_t *dst = line;
47*72cded9eSSimon Glass 
48*72cded9eSSimon Glass 		for (i = 0; i < pixels; i++)
49*72cded9eSSimon Glass 			*dst++ = clr;
50*72cded9eSSimon Glass 		break;
51*72cded9eSSimon Glass 	}
52*72cded9eSSimon Glass #endif
53*72cded9eSSimon Glass 	default:
54*72cded9eSSimon Glass 		return -ENOSYS;
55*72cded9eSSimon Glass 	}
56*72cded9eSSimon Glass 
57*72cded9eSSimon Glass 	return 0;
58*72cded9eSSimon Glass }
59*72cded9eSSimon Glass 
60*72cded9eSSimon Glass static int console_normal_move_rows(struct udevice *dev, uint rowdst,
61*72cded9eSSimon Glass 				     uint rowsrc, uint count)
62*72cded9eSSimon Glass {
63*72cded9eSSimon Glass 	struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
64*72cded9eSSimon Glass 	void *dst;
65*72cded9eSSimon Glass 	void *src;
66*72cded9eSSimon Glass 
67*72cded9eSSimon Glass 	dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * vid_priv->line_length;
68*72cded9eSSimon Glass 	src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * vid_priv->line_length;
69*72cded9eSSimon Glass 	memmove(dst, src, VIDEO_FONT_HEIGHT * vid_priv->line_length * count);
70*72cded9eSSimon Glass 
71*72cded9eSSimon Glass 	return 0;
72*72cded9eSSimon Glass }
73*72cded9eSSimon Glass 
74*72cded9eSSimon Glass static int console_normal_putc_xy(struct udevice *dev, uint x, uint y, char ch)
75*72cded9eSSimon Glass {
76*72cded9eSSimon Glass 	struct udevice *vid = dev->parent;
77*72cded9eSSimon Glass 	struct video_priv *vid_priv = dev_get_uclass_priv(vid);
78*72cded9eSSimon Glass 	int i, row;
79*72cded9eSSimon Glass 	void *line = vid_priv->fb + y * vid_priv->line_length +
80*72cded9eSSimon Glass 		x * VNBYTES(vid_priv->bpix);
81*72cded9eSSimon Glass 
82*72cded9eSSimon Glass 	for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
83*72cded9eSSimon Glass 		uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row];
84*72cded9eSSimon Glass 
85*72cded9eSSimon Glass 		switch (vid_priv->bpix) {
86*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8
87*72cded9eSSimon Glass 		case VIDEO_BPP8: {
88*72cded9eSSimon Glass 			uint8_t *dst = line;
89*72cded9eSSimon Glass 
90*72cded9eSSimon Glass 			for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
91*72cded9eSSimon Glass 				*dst++ = (bits & 0x80) ? vid_priv->colour_fg
92*72cded9eSSimon Glass 					: vid_priv->colour_bg;
93*72cded9eSSimon Glass 				bits <<= 1;
94*72cded9eSSimon Glass 			}
95*72cded9eSSimon Glass 			break;
96*72cded9eSSimon Glass 		}
97*72cded9eSSimon Glass #endif
98*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16
99*72cded9eSSimon Glass 		case VIDEO_BPP16: {
100*72cded9eSSimon Glass 			uint16_t *dst = line;
101*72cded9eSSimon Glass 
102*72cded9eSSimon Glass 			for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
103*72cded9eSSimon Glass 				*dst++ = (bits & 0x80) ? vid_priv->colour_fg
104*72cded9eSSimon Glass 					: vid_priv->colour_bg;
105*72cded9eSSimon Glass 				bits <<= 1;
106*72cded9eSSimon Glass 			}
107*72cded9eSSimon Glass 			break;
108*72cded9eSSimon Glass 		}
109*72cded9eSSimon Glass #endif
110*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32
111*72cded9eSSimon Glass 		case VIDEO_BPP32: {
112*72cded9eSSimon Glass 			uint32_t *dst = line;
113*72cded9eSSimon Glass 
114*72cded9eSSimon Glass 			for (i = 0; i < VIDEO_FONT_WIDTH; i++) {
115*72cded9eSSimon Glass 				*dst++ = (bits & 0x80) ? vid_priv->colour_fg
116*72cded9eSSimon Glass 					: vid_priv->colour_bg;
117*72cded9eSSimon Glass 				bits <<= 1;
118*72cded9eSSimon Glass 			}
119*72cded9eSSimon Glass 			break;
120*72cded9eSSimon Glass 		}
121*72cded9eSSimon Glass #endif
122*72cded9eSSimon Glass 		default:
123*72cded9eSSimon Glass 			return -ENOSYS;
124*72cded9eSSimon Glass 		}
125*72cded9eSSimon Glass 		line += vid_priv->line_length;
126*72cded9eSSimon Glass 	}
127*72cded9eSSimon Glass 
128*72cded9eSSimon Glass 	return 0;
129*72cded9eSSimon Glass }
130*72cded9eSSimon Glass 
131*72cded9eSSimon Glass struct vidconsole_ops console_normal_ops = {
132*72cded9eSSimon Glass 	.putc_xy	= console_normal_putc_xy,
133*72cded9eSSimon Glass 	.move_rows	= console_normal_move_rows,
134*72cded9eSSimon Glass 	.set_row	= console_normal_set_row,
135*72cded9eSSimon Glass };
136*72cded9eSSimon Glass 
137*72cded9eSSimon Glass U_BOOT_DRIVER(vidconsole_normal) = {
138*72cded9eSSimon Glass 	.name	= "vidconsole0",
139*72cded9eSSimon Glass 	.id	= UCLASS_VIDEO_CONSOLE,
140*72cded9eSSimon Glass 	.ops	= &console_normal_ops,
141*72cded9eSSimon Glass };
142