blob: a5f5c6da7bea2ff1cb87e684f102a809b26e6e2f [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Hannes Petermaier604c7d42015-03-27 08:01:38 +01002/*
3 * (C) Copyright 2015
4 * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
Hannes Petermaier604c7d42015-03-27 08:01:38 +01005 */
6
7#include <common.h>
8#include <lcd.h>
9#include <video_font.h> /* Get font data, width and height */
10
11static void lcd_putc_xy90(struct console_t *pcons, ushort x, ushort y, char c)
12{
13 int fg_color = lcd_getfgcolor();
14 int bg_color = lcd_getbgcolor();
15 int col, i;
16
17 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
18 (x+1) * pcons->lcdsizex -
19 y;
20
21 uchar msk = 0x80;
22 uchar *pfont = video_fontdata + c * VIDEO_FONT_HEIGHT;
23 for (col = 0; col < VIDEO_FONT_WIDTH; ++col) {
24 for (i = 0; i < VIDEO_FONT_HEIGHT; ++i)
25 *dst-- = (*(pfont + i) & msk) ? fg_color : bg_color;
26 msk >>= 1;
27 dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
28 }
29}
30
31static inline void console_setrow90(struct console_t *pcons, u32 row, int clr)
32{
33 int i, j;
34 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
35 pcons->lcdsizex -
36 row*VIDEO_FONT_HEIGHT+1;
37
38 for (j = 0; j < pcons->lcdsizey; j++) {
39 for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
40 *dst-- = clr;
41 dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
42 }
43}
44
45static inline void console_moverow90(struct console_t *pcons,
46 u32 rowdst, u32 rowsrc)
47{
48 int i, j;
49 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
50 pcons->lcdsizex -
51 (rowdst*VIDEO_FONT_HEIGHT+1);
52
53 fbptr_t *src = (fbptr_t *)pcons->fbbase +
54 pcons->lcdsizex -
55 (rowsrc*VIDEO_FONT_HEIGHT+1);
56
57 for (j = 0; j < pcons->lcdsizey; j++) {
58 for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
59 *dst-- = *src--;
60 src += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
61 dst += (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
62 }
63}
64static void lcd_putc_xy180(struct console_t *pcons, ushort x, ushort y, char c)
65{
66 int fg_color = lcd_getfgcolor();
67 int bg_color = lcd_getbgcolor();
68 int i, row;
69 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
70 pcons->lcdsizex +
71 pcons->lcdsizey * pcons->lcdsizex -
72 y * pcons->lcdsizex -
73 (x+1);
74
75 for (row = 0; row < VIDEO_FONT_HEIGHT; row++) {
76 uchar bits = video_fontdata[c * VIDEO_FONT_HEIGHT + row];
77
78 for (i = 0; i < VIDEO_FONT_WIDTH; ++i) {
79 *dst-- = (bits & 0x80) ? fg_color : bg_color;
80 bits <<= 1;
81 }
82 dst -= (pcons->lcdsizex - VIDEO_FONT_WIDTH);
83 }
84}
85
86static inline void console_setrow180(struct console_t *pcons, u32 row, int clr)
87{
88 int i;
89 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
90 (pcons->rows-row-1) * VIDEO_FONT_HEIGHT *
91 pcons->lcdsizex;
92
93 for (i = 0; i < (VIDEO_FONT_HEIGHT * pcons->lcdsizex); i++)
94 *dst++ = clr;
95}
96
97static inline void console_moverow180(struct console_t *pcons,
98 u32 rowdst, u32 rowsrc)
99{
100 int i;
101 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
102 (pcons->rows-rowdst-1) * VIDEO_FONT_HEIGHT *
103 pcons->lcdsizex;
104
105 fbptr_t *src = (fbptr_t *)pcons->fbbase +
106 (pcons->rows-rowsrc-1) * VIDEO_FONT_HEIGHT *
107 pcons->lcdsizex;
108
109 for (i = 0; i < (VIDEO_FONT_HEIGHT * pcons->lcdsizex); i++)
110 *dst++ = *src++;
111}
112
113static void lcd_putc_xy270(struct console_t *pcons, ushort x, ushort y, char c)
114{
115 int fg_color = lcd_getfgcolor();
116 int bg_color = lcd_getbgcolor();
117 int i, col;
118 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
119 pcons->lcdsizey * pcons->lcdsizex -
120 (x+1) * pcons->lcdsizex +
121 y;
122
123 uchar msk = 0x80;
124 uchar *pfont = video_fontdata + c * VIDEO_FONT_HEIGHT;
125 for (col = 0; col < VIDEO_FONT_WIDTH; ++col) {
126 for (i = 0; i < VIDEO_FONT_HEIGHT; ++i)
127 *dst++ = (*(pfont + i) & msk) ? fg_color : bg_color;
128 msk >>= 1;
129 dst -= (pcons->lcdsizex + VIDEO_FONT_HEIGHT);
130 }
131}
132
133static inline void console_setrow270(struct console_t *pcons, u32 row, int clr)
134{
135 int i, j;
136 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
137 row*VIDEO_FONT_HEIGHT;
138
139 for (j = 0; j < pcons->lcdsizey; j++) {
140 for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
141 *dst++ = clr;
142 dst += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
143 }
144}
145
146static inline void console_moverow270(struct console_t *pcons,
147 u32 rowdst, u32 rowsrc)
148{
149 int i, j;
150 fbptr_t *dst = (fbptr_t *)pcons->fbbase +
151 rowdst*VIDEO_FONT_HEIGHT;
152
153 fbptr_t *src = (fbptr_t *)pcons->fbbase +
154 rowsrc*VIDEO_FONT_HEIGHT;
155
156 for (j = 0; j < pcons->lcdsizey; j++) {
157 for (i = 0; i < VIDEO_FONT_HEIGHT; i++)
158 *dst++ = *src++;
159 src += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
160 dst += (pcons->lcdsizex - VIDEO_FONT_HEIGHT);
161 }
162}
163
164static void console_calc_rowcol_rot(struct console_t *pcons)
165{
166 if (pcons->lcdrot == 1 || pcons->lcdrot == 3)
167 console_calc_rowcol(pcons, pcons->lcdsizey, pcons->lcdsizex);
168 else
169 console_calc_rowcol(pcons, pcons->lcdsizex, pcons->lcdsizey);
170}
171
172void lcd_init_console_rot(struct console_t *pcons)
173{
174 if (pcons->lcdrot == 0) {
175 return;
176 } else if (pcons->lcdrot == 1) {
177 pcons->fp_putc_xy = &lcd_putc_xy90;
178 pcons->fp_console_moverow = &console_moverow90;
179 pcons->fp_console_setrow = &console_setrow90;
180 } else if (pcons->lcdrot == 2) {
181 pcons->fp_putc_xy = &lcd_putc_xy180;
182 pcons->fp_console_moverow = &console_moverow180;
183 pcons->fp_console_setrow = &console_setrow180;
184 } else if (pcons->lcdrot == 3) {
185 pcons->fp_putc_xy = &lcd_putc_xy270;
186 pcons->fp_console_moverow = &console_moverow270;
187 pcons->fp_console_setrow = &console_setrow270;
188 } else {
189 printf("%s: invalid framebuffer rotation (%d)!\n",
190 __func__, pcons->lcdrot);
191 return;
192 }
193 console_calc_rowcol_rot(pcons);
194}