xref: /rk3399_rockchip-uboot/include/lcd.h (revision 8655b6f8603f12099e534a10f7840630b3e93026)
1fe8c2806Swdenk /*
2*8655b6f8Swdenk  * MPC823 and PXA LCD Controller
3fe8c2806Swdenk  *
4fe8c2806Swdenk  * Modeled after video interface by Paolo Scaffardi
5fe8c2806Swdenk  *
6fe8c2806Swdenk  *
7fe8c2806Swdenk  * (C) Copyright 2001
8fe8c2806Swdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
9fe8c2806Swdenk  *
10fe8c2806Swdenk  * See file CREDITS for list of people who contributed to this
11fe8c2806Swdenk  * project.
12fe8c2806Swdenk  *
13fe8c2806Swdenk  * This program is free software; you can redistribute it and/or
14fe8c2806Swdenk  * modify it under the terms of the GNU General Public License as
15fe8c2806Swdenk  * published by the Free Software Foundation; either version 2 of
16fe8c2806Swdenk  * the License, or (at your option) any later version.
17fe8c2806Swdenk  *
18fe8c2806Swdenk  * This program is distributed in the hope that it will be useful,
19fe8c2806Swdenk  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20fe8c2806Swdenk  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
21fe8c2806Swdenk  * GNU General Public License for more details.
22fe8c2806Swdenk  *
23fe8c2806Swdenk  * You should have received a copy of the GNU General Public License
24fe8c2806Swdenk  * along with this program; if not, write to the Free Software
25fe8c2806Swdenk  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
26fe8c2806Swdenk  * MA 02111-1307 USA
27fe8c2806Swdenk  */
28fe8c2806Swdenk 
29fe8c2806Swdenk #ifndef _LCD_H_
30fe8c2806Swdenk #define _LCD_H_
31fe8c2806Swdenk 
32*8655b6f8Swdenk extern char lcd_is_enabled;
33*8655b6f8Swdenk 
34*8655b6f8Swdenk extern int lcd_line_length;
35*8655b6f8Swdenk extern int lcd_color_fg;
36*8655b6f8Swdenk extern int lcd_color_bg;
37*8655b6f8Swdenk 
38*8655b6f8Swdenk /*
39*8655b6f8Swdenk  * Frame buffer memory information
40*8655b6f8Swdenk  */
41*8655b6f8Swdenk extern void *lcd_base;		/* Start of framebuffer memory	*/
42*8655b6f8Swdenk extern void *lcd_console_address;	/* Start of console buffer	*/
43*8655b6f8Swdenk 
44*8655b6f8Swdenk extern short console_col;
45*8655b6f8Swdenk extern short console_row;
46*8655b6f8Swdenk 
47*8655b6f8Swdenk #if defined CONFIG_MPC823
48*8655b6f8Swdenk /*
49*8655b6f8Swdenk  * LCD controller stucture for MPC823 CPU
50*8655b6f8Swdenk  */
51*8655b6f8Swdenk typedef struct vidinfo {
52*8655b6f8Swdenk 	ushort	vl_col;		/* Number of columns (i.e. 640) */
53*8655b6f8Swdenk 	ushort	vl_row;		/* Number of rows (i.e. 480) */
54*8655b6f8Swdenk 	ushort	vl_width;	/* Width of display area in millimeters */
55*8655b6f8Swdenk 	ushort	vl_height;	/* Height of display area in millimeters */
56*8655b6f8Swdenk 
57*8655b6f8Swdenk 	/* LCD configuration register */
58*8655b6f8Swdenk 	u_char	vl_clkp;	/* Clock polarity */
59*8655b6f8Swdenk 	u_char	vl_oep;		/* Output Enable polarity */
60*8655b6f8Swdenk 	u_char	vl_hsp;		/* Horizontal Sync polarity */
61*8655b6f8Swdenk 	u_char	vl_vsp;		/* Vertical Sync polarity */
62*8655b6f8Swdenk 	u_char	vl_dp;		/* Data polarity */
63*8655b6f8Swdenk 	u_char	vl_bpix;	/* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8 */
64*8655b6f8Swdenk 	u_char	vl_lbw;		/* LCD Bus width, 0 = 4, 1 = 8 */
65*8655b6f8Swdenk 	u_char	vl_splt;	/* Split display, 0 = single-scan, 1 = dual-scan */
66*8655b6f8Swdenk 	u_char	vl_clor;	/* Color, 0 = mono, 1 = color */
67*8655b6f8Swdenk 	u_char	vl_tft;		/* 0 = passive, 1 = TFT */
68*8655b6f8Swdenk 
69*8655b6f8Swdenk 	/* Horizontal control register. Timing from data sheet */
70*8655b6f8Swdenk 	ushort	vl_wbl;		/* Wait between lines */
71*8655b6f8Swdenk 
72*8655b6f8Swdenk 	/* Vertical control register */
73*8655b6f8Swdenk 	u_char	vl_vpw;		/* Vertical sync pulse width */
74*8655b6f8Swdenk 	u_char	vl_lcdac;	/* LCD AC timing */
75*8655b6f8Swdenk 	u_char	vl_wbf;		/* Wait between frames */
76*8655b6f8Swdenk } vidinfo_t;
77*8655b6f8Swdenk 
78*8655b6f8Swdenk extern vidinfo_t panel_info;
79*8655b6f8Swdenk 
80*8655b6f8Swdenk #elif defined CONFIG_PXA250
81*8655b6f8Swdenk /*
82*8655b6f8Swdenk  * PXA LCD DMA descriptor
83*8655b6f8Swdenk  */
84*8655b6f8Swdenk struct pxafb_dma_descriptor {
85*8655b6f8Swdenk 	u_long	fdadr;		/* Frame descriptor address register */
86*8655b6f8Swdenk 	u_long	fsadr;		/* Frame source address register */
87*8655b6f8Swdenk 	u_long	fidr;		/* Frame ID register */
88*8655b6f8Swdenk 	u_long	ldcmd;		/* Command register */
89*8655b6f8Swdenk };
90*8655b6f8Swdenk 
91*8655b6f8Swdenk /*
92*8655b6f8Swdenk  * PXA LCD info
93*8655b6f8Swdenk  */
94*8655b6f8Swdenk struct pxafb_info {
95*8655b6f8Swdenk 
96*8655b6f8Swdenk 	/* Misc registers */
97*8655b6f8Swdenk 	u_long	reg_lccr3;
98*8655b6f8Swdenk 	u_long	reg_lccr2;
99*8655b6f8Swdenk 	u_long	reg_lccr1;
100*8655b6f8Swdenk 	u_long	reg_lccr0;
101*8655b6f8Swdenk 	u_long	fdadr0;
102*8655b6f8Swdenk 	u_long	fdadr1;
103*8655b6f8Swdenk 
104*8655b6f8Swdenk 	/* DMA descriptors */
105*8655b6f8Swdenk 	struct	pxafb_dma_descriptor *	dmadesc_fblow;
106*8655b6f8Swdenk 	struct	pxafb_dma_descriptor *	dmadesc_fbhigh;
107*8655b6f8Swdenk 	struct	pxafb_dma_descriptor *	dmadesc_palette;
108*8655b6f8Swdenk 
109*8655b6f8Swdenk 	u_long	screen;		/* physical address of frame buffer */
110*8655b6f8Swdenk 	u_long	palette;	/* physical address of palette memory */
111*8655b6f8Swdenk 	u_int	palette_size;
112*8655b6f8Swdenk };
113*8655b6f8Swdenk 
114*8655b6f8Swdenk /*
115*8655b6f8Swdenk  * LCD controller stucture for PXA CPU
116*8655b6f8Swdenk  */
117*8655b6f8Swdenk typedef struct vidinfo {
118*8655b6f8Swdenk 	ushort	vl_col;		/* Number of columns (i.e. 640) */
119*8655b6f8Swdenk 	ushort	vl_row;		/* Number of rows (i.e. 480) */
120*8655b6f8Swdenk 	ushort	vl_width;	/* Width of display area in millimeters */
121*8655b6f8Swdenk 	ushort	vl_height;	/* Height of display area in millimeters */
122*8655b6f8Swdenk 
123*8655b6f8Swdenk 	/* LCD configuration register */
124*8655b6f8Swdenk 	u_char	vl_clkp;	/* Clock polarity */
125*8655b6f8Swdenk 	u_char	vl_oep;		/* Output Enable polarity */
126*8655b6f8Swdenk 	u_char	vl_hsp;		/* Horizontal Sync polarity */
127*8655b6f8Swdenk 	u_char	vl_vsp;		/* Vertical Sync polarity */
128*8655b6f8Swdenk 	u_char	vl_dp;		/* Data polarity */
129*8655b6f8Swdenk 	u_char	vl_bpix;	/* Bits per pixel, 0 = 1, 1 = 2, 2 = 4, 3 = 8, 4 = 16 */
130*8655b6f8Swdenk 	u_char	vl_lbw;		/* LCD Bus width, 0 = 4, 1 = 8 */
131*8655b6f8Swdenk 	u_char	vl_splt;	/* Split display, 0 = single-scan, 1 = dual-scan */
132*8655b6f8Swdenk 	u_char	vl_clor;	/* Color, 0 = mono, 1 = color */
133*8655b6f8Swdenk 	u_char	vl_tft;		/* 0 = passive, 1 = TFT */
134*8655b6f8Swdenk 
135*8655b6f8Swdenk 	/* Horizontal control register. Timing from data sheet */
136*8655b6f8Swdenk 	ushort	vl_hpw;		/* Horz sync pulse width */
137*8655b6f8Swdenk 	u_char	vl_blw;		/* Wait before of line */
138*8655b6f8Swdenk 	u_char	vl_elw;		/* Wait end of line */
139*8655b6f8Swdenk 
140*8655b6f8Swdenk 	/* Vertical control register. */
141*8655b6f8Swdenk 	u_char	vl_vpw;		/* Vertical sync pulse width */
142*8655b6f8Swdenk 	u_char	vl_bfw;		/* Wait before of frame */
143*8655b6f8Swdenk 	u_char	vl_efw;		/* Wait end of frame */
144*8655b6f8Swdenk 
145*8655b6f8Swdenk 	/* PXA LCD controller params */
146*8655b6f8Swdenk 	struct	pxafb_info pxa;
147*8655b6f8Swdenk } vidinfo_t;
148*8655b6f8Swdenk 
149*8655b6f8Swdenk extern vidinfo_t panel_info;
150*8655b6f8Swdenk 
151*8655b6f8Swdenk #endif /* CONFIG_MPC823 or CONFIG_PXA250 */
152*8655b6f8Swdenk 
153*8655b6f8Swdenk /* Video functions */
154*8655b6f8Swdenk 
155682011ffSwdenk #if defined(CONFIG_RBC823)
156682011ffSwdenk void	lcd_disable	(void);
157682011ffSwdenk #endif
158682011ffSwdenk 
159fe8c2806Swdenk 
160c3f4d17eSwdenk /* int	lcd_init	(void *lcdbase); */
161fe8c2806Swdenk void	lcd_putc	(const char c);
162fe8c2806Swdenk void	lcd_puts	(const char *s);
163fe8c2806Swdenk void	lcd_printf	(const char *fmt, ...);
164fe8c2806Swdenk 
165*8655b6f8Swdenk 
166*8655b6f8Swdenk /************************************************************************/
167*8655b6f8Swdenk /* ** BITMAP DISPLAY SUPPORT						*/
168*8655b6f8Swdenk /************************************************************************/
169*8655b6f8Swdenk #if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
170*8655b6f8Swdenk # include <bmp_layout.h>
171*8655b6f8Swdenk # include <asm/byteorder.h>
172*8655b6f8Swdenk #endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN */
173*8655b6f8Swdenk 
174*8655b6f8Swdenk /************************************************************************/
175*8655b6f8Swdenk /* ** LOGO DATA								*/
176*8655b6f8Swdenk /************************************************************************/
177*8655b6f8Swdenk #ifdef CONFIG_LCD_LOGO
178*8655b6f8Swdenk # include <bmp_logo.h>		/* Get logo data, width and height	*/
179fe8c2806Swdenk #endif
180*8655b6f8Swdenk 
181*8655b6f8Swdenk /*
182*8655b6f8Swdenk  *  Information about displays we are using. This is for configuring
183*8655b6f8Swdenk  *  the LCD controller and memory allocation. Someone has to know what
184*8655b6f8Swdenk  *  is connected, as we can't autodetect anything.
185*8655b6f8Swdenk  */
186*8655b6f8Swdenk #define CFG_HIGH	0	/* Pins are active high			*/
187*8655b6f8Swdenk #define CFG_LOW		1	/* Pins are active low			*/
188*8655b6f8Swdenk 
189*8655b6f8Swdenk #define LCD_MONOCHROME	0
190*8655b6f8Swdenk #define LCD_COLOR2	1
191*8655b6f8Swdenk #define LCD_COLOR4	2
192*8655b6f8Swdenk #define LCD_COLOR8	3
193*8655b6f8Swdenk #define LCD_COLOR16	4
194*8655b6f8Swdenk 
195*8655b6f8Swdenk /*----------------------------------------------------------------------*/
196*8655b6f8Swdenk #if defined(LCD_INFO_BELOW_LOGO)
197*8655b6f8Swdenk # define LCD_INFO_X		0
198*8655b6f8Swdenk # define LCD_INFO_Y		(BMP_LOGO_HEIGHT + VIDEO_FONT_HEIGHT)
199*8655b6f8Swdenk #elif defined(CONFIG_LCD_LOGO)
200*8655b6f8Swdenk # define LCD_INFO_X		(BMP_LOGO_WIDTH + 4 * VIDEO_FONT_WIDTH)
201*8655b6f8Swdenk # define LCD_INFO_Y		(VIDEO_FONT_HEIGHT)
202*8655b6f8Swdenk #else
203*8655b6f8Swdenk # define LCD_INFO_X		(VIDEO_FONT_WIDTH)
204*8655b6f8Swdenk # define LCD_INFO_Y		(VIDEO_FONT_HEIGHT)
205*8655b6f8Swdenk #endif
206*8655b6f8Swdenk 
207*8655b6f8Swdenk /* Default to 8bpp if bit depth not specified */
208*8655b6f8Swdenk #ifndef LCD_BPP
209*8655b6f8Swdenk # define LCD_BPP			LCD_COLOR8
210*8655b6f8Swdenk #endif
211*8655b6f8Swdenk #ifndef LCD_DF
212*8655b6f8Swdenk # define LCD_DF			1
213*8655b6f8Swdenk #endif
214*8655b6f8Swdenk 
215*8655b6f8Swdenk /* Calculate nr. of bits per pixel  and nr. of colors */
216*8655b6f8Swdenk #define NBITS(bit_code)		(1 << (bit_code))
217*8655b6f8Swdenk #define NCOLORS(bit_code)	(1 << NBITS(bit_code))
218*8655b6f8Swdenk 
219*8655b6f8Swdenk /************************************************************************/
220*8655b6f8Swdenk /* ** CONSOLE CONSTANTS							*/
221*8655b6f8Swdenk /************************************************************************/
222*8655b6f8Swdenk #if LCD_BPP == LCD_MONOCHROME
223*8655b6f8Swdenk 
224*8655b6f8Swdenk /*
225*8655b6f8Swdenk  * Simple black/white definitions
226*8655b6f8Swdenk  */
227*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK	0
228*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE	1	/* Must remain last / highest	*/
229*8655b6f8Swdenk 
230*8655b6f8Swdenk #elif LCD_BPP == LCD_COLOR8
231*8655b6f8Swdenk 
232*8655b6f8Swdenk /*
233*8655b6f8Swdenk  * 8bpp color definitions
234*8655b6f8Swdenk  */
235*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK	0
236*8655b6f8Swdenk # define CONSOLE_COLOR_RED	1
237*8655b6f8Swdenk # define CONSOLE_COLOR_GREEN	2
238*8655b6f8Swdenk # define CONSOLE_COLOR_YELLOW	3
239*8655b6f8Swdenk # define CONSOLE_COLOR_BLUE	4
240*8655b6f8Swdenk # define CONSOLE_COLOR_MAGENTA	5
241*8655b6f8Swdenk # define CONSOLE_COLOR_CYAN	6
242*8655b6f8Swdenk # define CONSOLE_COLOR_GREY	14
243*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE	15	/* Must remain last / highest	*/
244*8655b6f8Swdenk 
245*8655b6f8Swdenk #else
246*8655b6f8Swdenk 
247*8655b6f8Swdenk /*
248*8655b6f8Swdenk  * 16bpp color definitions
249*8655b6f8Swdenk  */
250*8655b6f8Swdenk # define CONSOLE_COLOR_BLACK	0x0000
251*8655b6f8Swdenk # define CONSOLE_COLOR_WHITE	0xffff	/* Must remain last / highest	*/
252*8655b6f8Swdenk 
253*8655b6f8Swdenk #endif /* color definitions */
254*8655b6f8Swdenk 
255*8655b6f8Swdenk #if defined(CONFIG_LCD_LOGO) && (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET)
256*8655b6f8Swdenk # error Default Color Map overlaps with Logo Color Map
257*8655b6f8Swdenk #endif
258*8655b6f8Swdenk 
259*8655b6f8Swdenk /************************************************************************/
260*8655b6f8Swdenk #ifndef PAGE_SIZE
261*8655b6f8Swdenk # define PAGE_SIZE	4096
262*8655b6f8Swdenk #endif
263*8655b6f8Swdenk 
264*8655b6f8Swdenk /************************************************************************/
265*8655b6f8Swdenk /* ** CONSOLE DEFINITIONS & FUNCTIONS					*/
266*8655b6f8Swdenk /************************************************************************/
267*8655b6f8Swdenk #if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO)
268*8655b6f8Swdenk # define CONSOLE_ROWS		((panel_info.vl_row-BMP_LOGO_HEIGHT) \
269*8655b6f8Swdenk 					/ VIDEO_FONT_HEIGHT)
270*8655b6f8Swdenk #else
271*8655b6f8Swdenk # define CONSOLE_ROWS		(panel_info.vl_row / VIDEO_FONT_HEIGHT)
272*8655b6f8Swdenk #endif
273*8655b6f8Swdenk 
274*8655b6f8Swdenk #define CONSOLE_COLS		(panel_info.vl_col / VIDEO_FONT_WIDTH)
275*8655b6f8Swdenk #define CONSOLE_ROW_SIZE	(VIDEO_FONT_HEIGHT * lcd_line_length)
276*8655b6f8Swdenk #define CONSOLE_ROW_FIRST	(lcd_console_address)
277*8655b6f8Swdenk #define CONSOLE_ROW_SECOND	(lcd_console_address + CONSOLE_ROW_SIZE)
278*8655b6f8Swdenk #define CONSOLE_ROW_LAST	(lcd_console_address + CONSOLE_SIZE \
279*8655b6f8Swdenk 					- CONSOLE_ROW_SIZE)
280*8655b6f8Swdenk #define CONSOLE_SIZE		(CONSOLE_ROW_SIZE * CONSOLE_ROWS)
281*8655b6f8Swdenk #define CONSOLE_SCROLL_SIZE	(CONSOLE_SIZE - CONSOLE_ROW_SIZE)
282*8655b6f8Swdenk 
283*8655b6f8Swdenk #if LCD_BPP == LCD_MONOCHROME
284*8655b6f8Swdenk # define COLOR_MASK(c)		((c)	  | (c) << 1 | (c) << 2 | (c) << 3 | \
285*8655b6f8Swdenk 				 (c) << 4 | (c) << 5 | (c) << 6 | (c) << 7)
286*8655b6f8Swdenk #elif LCD_BPP == LCD_COLOR8
287*8655b6f8Swdenk # define COLOR_MASK(c)		(c)
288*8655b6f8Swdenk #else
289*8655b6f8Swdenk # error Unsupported LCD BPP.
290*8655b6f8Swdenk #endif
291*8655b6f8Swdenk 
292*8655b6f8Swdenk /************************************************************************/
293*8655b6f8Swdenk 
294*8655b6f8Swdenk #endif	/* _LCD_H_ */
295