2 * (C) Copyright 2001-2015
3 * DENX Software Engineering -- wd@denx.de
4 * Compulab Ltd - http://compulab.co.il/
5 * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com
7 * SPDX-License-Identifier: GPL-2.0+
12 #include <video_font.h> /* Get font data, width and height */
13 #if defined(CONFIG_LCD_LOGO)
17 static struct console_t cons
;
19 void lcd_set_col(short col
)
24 void lcd_set_row(short row
)
29 void lcd_position_cursor(unsigned col
, unsigned row
)
31 cons
.curr_col
= min_t(short, col
, cons
.cols
- 1);
32 cons
.curr_row
= min_t(short, row
, cons
.rows
- 1);
35 int lcd_get_screen_rows(void)
40 int lcd_get_screen_columns(void)
45 static void lcd_putc_xy0(struct console_t
*pcons
, ushort x
, ushort y
, char c
)
47 int fg_color
= lcd_getfgcolor();
48 int bg_color
= lcd_getbgcolor();
50 fbptr_t
*dst
= (fbptr_t
*)pcons
->fbbase
+
54 for (row
= 0; row
< VIDEO_FONT_HEIGHT
; row
++) {
55 uchar bits
= video_fontdata
[c
* VIDEO_FONT_HEIGHT
+ row
];
56 for (i
= 0; i
< VIDEO_FONT_WIDTH
; ++i
) {
57 *dst
++ = (bits
& 0x80) ? fg_color
: bg_color
;
60 dst
+= (pcons
->lcdsizex
- VIDEO_FONT_WIDTH
);
64 static inline void console_setrow0(struct console_t
*pcons
, u32 row
, int clr
)
67 fbptr_t
*dst
= (fbptr_t
*)pcons
->fbbase
+
68 row
* VIDEO_FONT_HEIGHT
*
71 for (i
= 0; i
< (VIDEO_FONT_HEIGHT
* pcons
->lcdsizex
); i
++)
75 static inline void console_moverow0(struct console_t
*pcons
,
76 u32 rowdst
, u32 rowsrc
)
79 fbptr_t
*dst
= (fbptr_t
*)pcons
->fbbase
+
80 rowdst
* VIDEO_FONT_HEIGHT
*
83 fbptr_t
*src
= (fbptr_t
*)pcons
->fbbase
+
84 rowsrc
* VIDEO_FONT_HEIGHT
*
87 for (i
= 0; i
< (VIDEO_FONT_HEIGHT
* pcons
->lcdsizex
); i
++)
91 static inline void console_back(void)
93 if (--cons
.curr_col
< 0) {
94 cons
.curr_col
= cons
.cols
- 1;
95 if (--cons
.curr_row
< 0)
99 cons
.fp_putc_xy(&cons
,
100 cons
.curr_col
* VIDEO_FONT_WIDTH
,
101 cons
.curr_row
* VIDEO_FONT_HEIGHT
, ' ');
104 static inline void console_newline(void)
106 const int rows
= CONFIG_CONSOLE_SCROLL_LINES
;
107 int bg_color
= lcd_getbgcolor();
112 /* Check if we need to scroll the terminal */
113 if (++cons
.curr_row
>= cons
.rows
) {
114 for (i
= 0; i
< cons
.rows
-rows
; i
++)
115 cons
.fp_console_moverow(&cons
, i
, i
+rows
);
116 for (i
= 0; i
< rows
; i
++)
117 cons
.fp_console_setrow(&cons
, cons
.rows
-i
-1, bg_color
);
118 cons
.curr_row
-= rows
;
123 void console_calc_rowcol(struct console_t
*pcons
, u32 sizex
, u32 sizey
)
125 pcons
->cols
= sizex
/ VIDEO_FONT_WIDTH
;
126 #if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
127 pcons
->rows
= (pcons
->lcdsizey
- BMP_LOGO_HEIGHT
);
128 pcons
->rows
/= VIDEO_FONT_HEIGHT
;
130 pcons
->rows
= sizey
/ VIDEO_FONT_HEIGHT
;
134 void __weak
lcd_init_console_rot(struct console_t
*pcons
)
139 void lcd_init_console(void *address
, int vl_cols
, int vl_rows
, int vl_rot
)
141 memset(&cons
, 0, sizeof(cons
));
142 cons
.fbbase
= address
;
144 cons
.lcdsizex
= vl_cols
;
145 cons
.lcdsizey
= vl_rows
;
146 cons
.lcdrot
= vl_rot
;
148 cons
.fp_putc_xy
= &lcd_putc_xy0
;
149 cons
.fp_console_moverow
= &console_moverow0
;
150 cons
.fp_console_setrow
= &console_setrow0
;
151 console_calc_rowcol(&cons
, cons
.lcdsizex
, cons
.lcdsizey
);
153 lcd_init_console_rot(&cons
);
155 debug("lcd_console: have %d/%d col/rws on scr %dx%d (%d deg rotated)\n",
156 cons
.cols
, cons
.rows
, cons
.lcdsizex
, cons
.lcdsizey
, vl_rot
);
159 void lcd_putc(const char c
)
161 if (!lcd_is_enabled
) {
175 case '\t': /* Tab (8 chars alignment) */
179 if (cons
.curr_col
>= cons
.cols
)
188 cons
.fp_putc_xy(&cons
,
189 cons
.curr_col
* VIDEO_FONT_WIDTH
,
190 cons
.curr_row
* VIDEO_FONT_HEIGHT
, c
);
191 if (++cons
.curr_col
>= cons
.cols
)
196 void lcd_puts(const char *s
)
198 if (!lcd_is_enabled
) {
210 void lcd_printf(const char *fmt
, ...)
213 char buf
[CONFIG_SYS_PBSIZE
];
216 vsprintf(buf
, fmt
, args
);
222 static int do_lcd_setcursor(cmd_tbl_t
*cmdtp
, int flag
, int argc
,
225 unsigned int col
, row
;
228 return CMD_RET_USAGE
;
230 col
= simple_strtoul(argv
[1], NULL
, 10);
231 row
= simple_strtoul(argv
[2], NULL
, 10);
232 lcd_position_cursor(col
, row
);
237 static int do_lcd_puts(cmd_tbl_t
*cmdtp
, int flag
, int argc
,
241 return CMD_RET_USAGE
;
249 setcurs
, 3, 1, do_lcd_setcursor
,
250 "set cursor position within screen",
251 " <col> <row> in character"
255 lcdputs
, 2, 1, do_lcd_puts
,
256 "print string on lcd-framebuffer",