347 lines
8.3 KiB
C
347 lines
8.3 KiB
C
/* lcd-panel.h
|
|
$Id$
|
|
|
|
written by Marc Singer
|
|
18 Jul 2005
|
|
|
|
Copyright (C) 2005 Marc Singer
|
|
|
|
-----------
|
|
DESCRIPTION
|
|
-----------
|
|
|
|
Only one panel may be defined at a time.
|
|
|
|
The pixel clock is calculated to be no greater than the target.
|
|
|
|
Each timing value is accompanied by a specification comment.
|
|
|
|
UNITS/MIN/TYP/MAX
|
|
|
|
Most of the units will be in clocks.
|
|
|
|
USE_RGB555
|
|
|
|
Define this macro to configure the AMBA LCD controller to use an
|
|
RGB555 encoding for the pels instead of the normal RGB565.
|
|
|
|
LPD9520, LPD79524, LPD7A400, LPD7A404-10, LPD7A404-11
|
|
|
|
These boards are best approximated by 555 for all panels. Some
|
|
can use an extra low-order bit of blue in bit 16 of the color
|
|
value, but we don't have a way to communicate this non-linear
|
|
mapping to the kernel.
|
|
|
|
*/
|
|
|
|
#if !defined (__LCD_PANEL_H__)
|
|
# define __LCD_PANEL_H__
|
|
|
|
#if defined (MACH_LPD79520)\
|
|
|| defined (MACH_LPD79524)\
|
|
|| defined (MACH_LPD7A400)\
|
|
|| defined (MACH_LPD7A404)
|
|
# define USE_RGB555
|
|
#endif
|
|
|
|
struct clcd_panel_extra {
|
|
unsigned int hrmode;
|
|
unsigned int clsen;
|
|
unsigned int spsen;
|
|
unsigned int pcdel;
|
|
unsigned int revdel;
|
|
unsigned int lpdel;
|
|
unsigned int spldel;
|
|
unsigned int pc2del;
|
|
};
|
|
|
|
#define NS_TO_CLOCK(ns,c) ((((ns)*((c)/1000) + (1000000 - 1))/1000000))
|
|
#define CLOCK_TO_DIV(e,c) (((c) + (e) - 1)/(e))
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_SHARP_LQ035Q7DB02_HRTFT
|
|
|
|
/* Logic Product Development LCD 3.5" QVGA HRTFT -10 */
|
|
/* Sharp PN LQ035Q7DB02 w/HRTFT controller chip */
|
|
|
|
#define PIX_CLOCK_TARGET (6800000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "3.5in QVGA (LQ035Q7DB02)",
|
|
.xres = 240,
|
|
.yres = 320,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 16,
|
|
.right_margin = 21,
|
|
.upper_margin = 8, // line/8/8/8
|
|
.lower_margin = 5,
|
|
.hsync_len = 61,
|
|
.vsync_len = NS_TO_CLOCK (60, PIX_CLOCK),
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IPC | (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#define HAS_LCD_PANEL_EXTRA
|
|
|
|
static struct clcd_panel_extra lcd_panel_extra = {
|
|
.hrmode = 1,
|
|
.clsen = 1,
|
|
.spsen = 1,
|
|
.pcdel = 8,
|
|
.revdel = 7,
|
|
.lpdel = 13,
|
|
.spldel = 77,
|
|
.pc2del = 208,
|
|
};
|
|
|
|
#endif
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_SHARP_LQ057Q3DC02
|
|
|
|
/* Logic Product Development LCD 5.7" QVGA -10 */
|
|
/* Sharp PN LQ057Q3DC02 */
|
|
/* QVGA mode, V/Q=LOW */
|
|
|
|
/* From Sharp on 2006.1.3. I believe some of the values are incorrect
|
|
* based on the datasheet.
|
|
|
|
Timing0 TIMING1 TIMING2 CONTROL
|
|
0x140A0C4C 0x080504EF 0x013F380D 0x00000829
|
|
HBP= 20 VBP= 8 BCD= 0
|
|
HFP= 10 VFP= 5 CPL=319
|
|
HSW= 12 VSW= 1 IOE= 0
|
|
PPL= 19 LPP=239 IPC= 1
|
|
IHS= 1
|
|
IVS= 1
|
|
ACB= 0
|
|
CSEL= 0
|
|
PCD= 13
|
|
|
|
*/
|
|
|
|
/* The full horozontal cycle (Th) is clock/360/400/450. */
|
|
/* The full vertical cycle (Tv) is line/251/262/280. */
|
|
|
|
#define PIX_CLOCK_TARGET (6300000) /* -/6.3/7 MHz */
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "5.7in QVGA (LQ057Q3DC02)",
|
|
.xres = 320,
|
|
.yres = 240,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 11,
|
|
.right_margin = 400-11-320-2,
|
|
.upper_margin = 7, // line/7/7/7
|
|
.lower_margin = 262-7-240-2,
|
|
.hsync_len = 2, // clk/2/96/200
|
|
.vsync_len = 2, // line/2/-/34
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_SHARP_LQ64D343
|
|
|
|
/* Logic Product Development LCD 6.4" VGA -10 */
|
|
/* Sharp PN LQ64D343 */
|
|
|
|
/* The full horozontal cycle (Th) is clock/750/800/900. */
|
|
/* The full vertical cycle (Tv) is line/515/525/560. */
|
|
|
|
#define PIX_CLOCK_TARGET (28330000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "6.4in QVGA (LQ64D343)",
|
|
.xres = 640,
|
|
.yres = 480,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 32,
|
|
.right_margin = 800-32-640-96,
|
|
.upper_margin = 32, // line/34/34/34
|
|
.lower_margin = 540-32-480-2,
|
|
.hsync_len = 96, // clk/2/96/200
|
|
.vsync_len = 2, // line/2/-/34
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_SHARP_LQ10D368
|
|
|
|
/* Logic Product Development LCD 10.4" VGA -10 */
|
|
/* Sharp PN LQ10D368 */
|
|
|
|
#define PIX_CLOCK_TARGET (28330000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "10.4in VGA (LQ10D368)",
|
|
.xres = 640,
|
|
.yres = 480,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 21,
|
|
.right_margin = 15,
|
|
.upper_margin = 34,
|
|
.lower_margin = 5,
|
|
.hsync_len = 96,
|
|
.vsync_len = 16,
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_SHARP_LQ121S1DG41
|
|
|
|
/* Logic Product Development LCD 12.1" SVGA -10 */
|
|
/* Sharp PN LQ121S1DG41, was LQ121S1DG31 */
|
|
|
|
/* Note that with a 99993900 Hz HCLK, it is not possible to hit the
|
|
* target clock frequency range of 35MHz to 42MHz. */
|
|
|
|
/* If the target pixel clock is substantially lower than the panel
|
|
* spec, this is done to prevent the LCD display from glitching when
|
|
* the CPU is under load. A pixel clock higher than 25MHz
|
|
* (empirically determined) will compete with the CPU for bus cycles
|
|
* for the Ethernet chip. However, even a pixel clock of 10MHz
|
|
* competes with Compact Flash interface during some operations
|
|
* (fdisk, e2fsck). And, at that speed the display may have a visible
|
|
* flicker. */
|
|
|
|
/* The full horozontal cycle (Th) is clock/832/1056/1395. */
|
|
|
|
#define PIX_CLOCK_TARGET (20000000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "12.1in SVGA (LQ121S1DG41)",
|
|
.xres = 800,
|
|
.yres = 600,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 89, // ns/5/-/(1/PIX_CLOCK)-10
|
|
.right_margin = 1056-800-89-128,
|
|
.upper_margin = 23, // line/23/23/23
|
|
.lower_margin = 44,
|
|
.hsync_len = 128, // clk/2/128/200
|
|
.vsync_len = 4, // line/2/4/6
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_HITACHI
|
|
|
|
/* Hitachi*/
|
|
/* Submitted by Michele Da Rold <michele.darold@ecsproject.com> */
|
|
|
|
#define PIX_CLOCK_TARGET (49000000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "Hitachi 800x480",
|
|
.xres = 800,
|
|
.yres = 480,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 88,
|
|
.right_margin = 40,
|
|
.upper_margin = 32,
|
|
.lower_margin = 11,
|
|
.hsync_len = 128,
|
|
.vsync_len = 2,
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IPC | TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
#if defined CONFIG_FB_ARMCLCD_AUO_A070VW01_WIDE
|
|
|
|
/* AU Optotronics A070VW01 7.0 Wide Screen color Display*/
|
|
/* Submitted by Michele Da Rold <michele.darold@ecsproject.com> */
|
|
|
|
#define PIX_CLOCK_TARGET (10000000)
|
|
#define PIX_CLOCK_DIVIDER CLOCK_TO_DIV (PIX_CLOCK_TARGET, HCLK)
|
|
#define PIX_CLOCK (HCLK/PIX_CLOCK_DIVIDER)
|
|
|
|
static struct clcd_panel lcd_panel = {
|
|
.mode = {
|
|
.name = "7.0in Wide (A070VW01)",
|
|
.xres = 480,
|
|
.yres = 234,
|
|
.pixclock = PIX_CLOCK,
|
|
.left_margin = 30,
|
|
.right_margin = 25,
|
|
.upper_margin = 14,
|
|
.lower_margin = 12,
|
|
.hsync_len = 100,
|
|
.vsync_len = 1,
|
|
.vmode = FB_VMODE_NONINTERLACED,
|
|
},
|
|
.width = -1,
|
|
.height = -1,
|
|
.tim2 = TIM2_IPC | TIM2_IHS | TIM2_IVS
|
|
| (PIX_CLOCK_DIVIDER - 2),
|
|
.cntl = CNTL_LCDTFT | CNTL_WATERMARK,
|
|
.bpp = 16,
|
|
};
|
|
|
|
#endif
|
|
|
|
#undef NS_TO_CLOCK
|
|
#undef CLOCK_TO_DIV
|
|
|
|
#endif /* __LCD_PANEL_H__ */
|