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