]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/video/mpc8xx_lcd.c
2 * (C) Copyright 2001-2002
3 * Wolfgang Denk, DENX Software Engineering -- wd@denx.de
5 * SPDX-License-Identifier: GPL-2.0+
8 /************************************************************************/
10 /************************************************************************/
21 #include <linux/types.h>
22 #include <stdio_dev.h>
23 #if defined(CONFIG_POST)
30 /************************************************************************/
31 /* ** CONFIG STUFF -- should be moved to board config file */
32 /************************************************************************/
33 #ifndef CONFIG_LCD_INFO
34 #define CONFIG_LCD_INFO /* Display Logo, (C) and system info */
37 /*----------------------------------------------------------------------*/
38 #ifdef CONFIG_KYOCERA_KCS057QV1AJ
40 * Kyocera KCS057QV1AJ-G23. Passive, color, single scan.
42 #define LCD_BPP LCD_COLOR4
44 vidinfo_t panel_info
= {
45 640, 480, 132, 99, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
,
46 LCD_BPP
, 1, 0, 1, 0, 5, 0, 0, 0
47 /* wbl, vpw, lcdac, wbf */
49 #endif /* CONFIG_KYOCERA_KCS057QV1AJ */
50 /*----------------------------------------------------------------------*/
52 /*----------------------------------------------------------------------*/
53 #ifdef CONFIG_HITACHI_SP19X001_Z1A
55 * Hitachi SP19X001-. Active, color, single scan.
57 vidinfo_t panel_info
= {
58 640, 480, 154, 116, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
,
59 LCD_COLOR8
, 1, 0, 1, 0, 0, 0, 0, 0
60 /* wbl, vpw, lcdac, wbf */
62 #endif /* CONFIG_HITACHI_SP19X001_Z1A */
63 /*----------------------------------------------------------------------*/
65 /*----------------------------------------------------------------------*/
66 #ifdef CONFIG_NEC_NL6448AC33
68 * NEC NL6448AC33-18. Active, color, single scan.
70 vidinfo_t panel_info
= {
71 640, 480, 132, 99, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
72 3, 0, 0, 1, 1, 144, 2, 0, 33
73 /* wbl, vpw, lcdac, wbf */
75 #endif /* CONFIG_NEC_NL6448AC33 */
76 /*----------------------------------------------------------------------*/
78 #ifdef CONFIG_NEC_NL6448BC20
80 * NEC NL6448BC20-08. 6.5", 640x480. Active, color, single scan.
82 vidinfo_t panel_info
= {
83 640, 480, 132, 99, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
84 3, 0, 0, 1, 1, 144, 2, 0, 33
85 /* wbl, vpw, lcdac, wbf */
87 #endif /* CONFIG_NEC_NL6448BC20 */
88 /*----------------------------------------------------------------------*/
90 #ifdef CONFIG_NEC_NL6448BC33_54
92 * NEC NL6448BC33-54. 10.4", 640x480. Active, color, single scan.
94 vidinfo_t panel_info
= {
95 640, 480, 212, 158, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
96 3, 0, 0, 1, 1, 144, 2, 0, 33
97 /* wbl, vpw, lcdac, wbf */
99 #endif /* CONFIG_NEC_NL6448BC33_54 */
100 /*----------------------------------------------------------------------*/
102 #ifdef CONFIG_SHARP_LQ104V7DS01
104 * SHARP LQ104V7DS01. 6.5", 640x480. Active, color, single scan.
106 vidinfo_t panel_info
= {
107 640, 480, 132, 99, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
,
108 3, 0, 0, 1, 1, 25, 1, 0, 33
109 /* wbl, vpw, lcdac, wbf */
111 #endif /* CONFIG_SHARP_LQ104V7DS01 */
112 /*----------------------------------------------------------------------*/
114 #ifdef CONFIG_SHARP_16x9
116 * Sharp 320x240. Active, color, single scan. It isn't 16x9, and I am
117 * not sure what it is.......
119 vidinfo_t panel_info
= {
120 320, 240, 0, 0, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
,
121 3, 0, 0, 1, 1, 15, 4, 0, 3
123 #endif /* CONFIG_SHARP_16x9 */
124 /*----------------------------------------------------------------------*/
126 #ifdef CONFIG_SHARP_LQ057Q3DC02
128 * Sharp LQ057Q3DC02 display. Active, color, single scan.
133 vidinfo_t panel_info
= {
134 320, 240, 0, 0, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
135 3, 0, 0, 1, 1, 15, 4, 0, 3
136 /* wbl, vpw, lcdac, wbf */
138 #define CONFIG_LCD_INFO_BELOW_LOGO
139 #endif /* CONFIG_SHARP_LQ057Q3DC02 */
140 /*----------------------------------------------------------------------*/
142 #ifdef CONFIG_SHARP_LQ64D341
144 * Sharp LQ64D341 display, 640x480. Active, color, single scan.
146 vidinfo_t panel_info
= {
147 640, 480, 0, 0, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
148 3, 0, 0, 1, 1, 128, 16, 0, 32
149 /* wbl, vpw, lcdac, wbf */
151 #endif /* CONFIG_SHARP_LQ64D341 */
153 #ifdef CONFIG_SHARP_LQ065T9DR51U
155 * Sharp LQ065T9DR51U display, 400x240. Active, color, single scan.
157 vidinfo_t panel_info
= {
158 400, 240, 143, 79, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
,
159 3, 0, 0, 1, 1, 248, 4, 0, 35
160 /* wbl, vpw, lcdac, wbf */
162 #define CONFIG_LCD_INFO_BELOW_LOGO
163 #endif /* CONFIG_SHARP_LQ065T9DR51U */
165 #ifdef CONFIG_SHARP_LQ084V1DG21
167 * Sharp LQ084V1DG21 display, 640x480. Active, color, single scan.
169 vidinfo_t panel_info
= {
170 640, 480, 171, 129, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
,
171 3, 0, 0, 1, 1, 160, 3, 0, 48
172 /* wbl, vpw, lcdac, wbf */
174 #endif /* CONFIG_SHARP_LQ084V1DG21 */
176 /*----------------------------------------------------------------------*/
178 #ifdef CONFIG_HLD1045
180 * HLD1045 display, 640x480. Active, color, single scan.
182 vidinfo_t panel_info
= {
183 640, 480, 0, 0, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
184 3, 0, 0, 1, 1, 160, 3, 0, 48
185 /* wbl, vpw, lcdac, wbf */
187 #endif /* CONFIG_HLD1045 */
188 /*----------------------------------------------------------------------*/
190 #ifdef CONFIG_PRIMEVIEW_V16C6448AC
192 * Prime View V16C6448AC
194 vidinfo_t panel_info
= {
195 640, 480, 130, 98, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
, CONFIG_SYS_LOW
, CONFIG_SYS_HIGH
,
196 3, 0, 0, 1, 1, 144, 2, 0, 35
197 /* wbl, vpw, lcdac, wbf */
199 #endif /* CONFIG_PRIMEVIEW_V16C6448AC */
201 /*----------------------------------------------------------------------*/
203 #ifdef CONFIG_OPTREX_BW
205 * Optrex CBL50840-2 NF-FW 99 22 M5
207 * Hitachi LMG6912RPFC-00T
211 * 320x240. Black & white.
213 #define OPTREX_BPP 0 /* 0 - monochrome, 1 bpp */
214 /* 1 - 4 grey levels, 2 bpp */
215 /* 2 - 16 grey levels, 4 bpp */
216 vidinfo_t panel_info
= {
217 320, 240, 0, 0, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_HIGH
, CONFIG_SYS_LOW
,
218 OPTREX_BPP
, 0, 0, 0, 0, 0, 0, 0, 0, 4
220 #endif /* CONFIG_OPTREX_BW */
222 /************************************************************************/
223 /* ----------------- chipset specific functions ----------------------- */
224 /************************************************************************/
227 * Calculate fb size for VIDEOLFB_ATAG.
229 ulong
calc_fbsize (void)
232 int line_length
= (panel_info
.vl_col
* NBITS (panel_info
.vl_bpix
)) / 8;
234 size
= line_length
* panel_info
.vl_row
;
239 void lcd_ctrl_init (void *lcdbase
)
241 volatile immap_t
*immr
= (immap_t
*) CONFIG_SYS_IMMR
;
242 volatile lcd823_t
*lcdp
= &immr
->im_lcd
;
247 /* Initialize the LCD control register according to the LCD
248 * parameters defined. We do everything here but enable
252 lccrtmp
= LCDBIT (LCCR_BNUM_BIT
,
253 (((panel_info
.vl_row
* panel_info
.vl_col
) * (1 << LCD_BPP
)) / 128));
255 lccrtmp
|= LCDBIT (LCCR_CLKP_BIT
, panel_info
.vl_clkp
) |
256 LCDBIT (LCCR_OEP_BIT
, panel_info
.vl_oep
) |
257 LCDBIT (LCCR_HSP_BIT
, panel_info
.vl_hsp
) |
258 LCDBIT (LCCR_VSP_BIT
, panel_info
.vl_vsp
) |
259 LCDBIT (LCCR_DP_BIT
, panel_info
.vl_dp
) |
260 LCDBIT (LCCR_BPIX_BIT
, panel_info
.vl_bpix
) |
261 LCDBIT (LCCR_LBW_BIT
, panel_info
.vl_lbw
) |
262 LCDBIT (LCCR_SPLT_BIT
, panel_info
.vl_splt
) |
263 LCDBIT (LCCR_CLOR_BIT
, panel_info
.vl_clor
) |
264 LCDBIT (LCCR_TFT_BIT
, panel_info
.vl_tft
);
267 lccrtmp
|= ((SIU_LEVEL5
/ 2) << 12);
268 lccrtmp
|= LCCR_EIEN
;
271 lcdp
->lcd_lccr
= lccrtmp
;
272 lcdp
->lcd_lcsr
= 0xFF; /* Clear pending interrupts */
274 /* Initialize LCD controller bus priorities.
276 immr
->im_siu_conf
.sc_sdcr
&= ~0x0f; /* RAID = LAID = 0 */
278 /* set SHFT/CLOCK division factor 4
279 * This needs to be set based upon display type and processor
280 * speed. The TFT displays run about 20 to 30 MHz.
281 * I was running 64 MHz processor speed.
282 * The value for this divider must be chosen so the result is
283 * an integer of the processor speed (i.e., divide by 3 with
284 * 64 MHz would be bad).
286 immr
->im_clkrst
.car_sccr
&= ~0x1F;
287 immr
->im_clkrst
.car_sccr
|= LCD_DF
; /* was 8 */
289 /* Enable LCD on port D.
291 immr
->im_ioport
.iop_pdpar
|= 0x1FFF;
292 immr
->im_ioport
.iop_pddir
|= 0x1FFF;
294 /* Enable LCD_A/B/C on port B.
296 immr
->im_cpm
.cp_pbpar
|= 0x00005001;
297 immr
->im_cpm
.cp_pbdir
|= 0x00005001;
299 /* Load the physical address of the linear frame buffer
300 * into the LCD controller.
301 * BIG NOTE: This has to be modified to load A and B depending
302 * upon the split mode of the LCD.
304 lcdp
->lcd_lcfaa
= (ulong
)lcdbase
;
305 lcdp
->lcd_lcfba
= (ulong
)lcdbase
;
307 /* MORE HACKS...This must be updated according to 823 manual
308 * for different panels.
309 * Udi Finkelstein - done - see below:
310 * Note: You better not try unsupported combinations such as
311 * 4-bit wide passive dual scan LCD at 4/8 Bit color.
315 (panel_info
.vl_tft
? 8 :
316 (((2 - panel_info
.vl_lbw
) << /* 4 bit=2, 8-bit = 1 */
317 /* use << to mult by: single scan = 1, dual scan = 2 */
318 panel_info
.vl_splt
) *
319 (panel_info
.vl_bpix
| 1)))) >> 3; /* 2/4 BPP = 1, 8/16 BPP = 3 */
321 lcdp
->lcd_lchcr
= LCHCR_BO
|
322 LCDBIT (LCHCR_AT_BIT
, 4) |
323 LCDBIT (LCHCR_HPC_BIT
, lchcr_hpc_tmp
) |
326 lcdp
->lcd_lcvcr
= LCDBIT (LCVCR_VPW_BIT
, panel_info
.vl_vpw
) |
327 LCDBIT (LCVCR_LCD_AC_BIT
, panel_info
.vl_lcdac
) |
328 LCDBIT (LCVCR_VPC_BIT
, panel_info
.vl_row
) |
333 /*----------------------------------------------------------------------*/
335 #if LCD_BPP == LCD_COLOR8
337 lcd_setcolreg (ushort regno
, ushort red
, ushort green
, ushort blue
)
339 volatile immap_t
*immr
= (immap_t
*) CONFIG_SYS_IMMR
;
340 volatile cpm8xx_t
*cp
= &(immr
->im_cpm
);
341 unsigned short colreg
, *cmap_ptr
;
343 cmap_ptr
= (unsigned short *)&cp
->lcd_cmap
[regno
* 2];
345 colreg
= ((red
& 0x0F) << 8) |
346 ((green
& 0x0F) << 4) |
351 debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %02X%02X\n",
352 regno
, &(cp
->lcd_cmap
[regno
* 2]),
354 cp
->lcd_cmap
[ regno
* 2 ], cp
->lcd_cmap
[(regno
* 2) + 1]);
356 #endif /* LCD_COLOR8 */
358 /*----------------------------------------------------------------------*/
360 ushort
*configuration_get_cmap(void)
362 immap_t
*immr
= (immap_t
*)CONFIG_SYS_IMMR
;
363 cpm8xx_t
*cp
= &(immr
->im_cpm
);
364 return (ushort
*)&(cp
->lcd_cmap
[255 * sizeof(ushort
)]);
367 #if defined(CONFIG_MPC823)
368 void fb_put_byte(uchar
**fb
, uchar
**from
)
370 *(*fb
)++ = (255 - *(*from
)++);
374 #ifdef CONFIG_LCD_LOGO
375 #include <bmp_logo.h>
376 void lcd_logo_set_cmap(void)
380 immap_t
*immr
= (immap_t
*)CONFIG_SYS_IMMR
;
381 cpm8xx_t
*cp
= &(immr
->im_cpm
);
382 cmap
= (ushort
*)&(cp
->lcd_cmap
[BMP_LOGO_OFFSET
* sizeof(ushort
)]);
384 for (i
= 0; i
< BMP_LOGO_COLORS
; ++i
)
385 *cmap
++ = bmp_logo_palette
[i
];
389 void lcd_enable (void)
391 volatile immap_t
*immr
= (immap_t
*) CONFIG_SYS_IMMR
;
392 volatile lcd823_t
*lcdp
= &immr
->im_lcd
;
394 /* Enable the LCD panel */
395 immr
->im_siu_conf
.sc_sdcr
|= (1 << (31 - 25)); /* LAM = 1 */
396 lcdp
->lcd_lccr
|= LCCR_PON
;
399 /************************************************************************/
401 #endif /* CONFIG_LCD */