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