1.简化LCD时钟计算方法:

修改drivers/video/s3c2440fb.c文件365行左右的函数static void s3c2410fb_activate_var(struct fb_info *info)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
static void s3c2410fb_activate_var(struct fb_info *info)
{
struct s3c2410fb_info *fbi = info->par;
void __iomem *regs = fbi->io;
int type = fbi->regs.lcdcon1 & S3C2410_LCDCON1_TFT;
struct fb_var_screeninfo *var = &info->var;
//修改以下两行
struct s3c2410fb_mach_info *mach_info=fbi->dev->platform_data;
struct s3c2410fb_display *default_display=mach_info->displays+mach_info->default_display;
int clkdiv;
clkdiv = DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi, var->pixclock), 2);
dprintk("%s: var->xres = %d\n", __func__, var->xres);
dprintk("%s: var->yres = %d\n", __func__, var->yres);
dprintk("%s: var->bpp = %d\n", __func__, var->bits_per_pixel);
if (type == S3C2410_LCDCON1_TFT) {
s3c2410fb_calculate_tft_lcd_regs(info, &fbi->regs);
--clkdiv;
if (clkdiv < 0)
clkdiv = 0;
} else {
s3c2410fb_calculate_stn_lcd_regs(info, &fbi->regs);
if (clkdiv < 2)
clkdiv = 2;
}
//此处修改如下
//fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(clkdiv);
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(default_display->setclkval);
dprintk("new register set:\n");
dprintk("lcdcon[1] = 0x%08lx\n", fbi->regs.lcdcon1);
dprintk("lcdcon[2] = 0x%08lx\n", fbi->regs.lcdcon2);
dprintk("lcdcon[3] = 0x%08lx\n", fbi->regs.lcdcon3);
dprintk("lcdcon[4] = 0x%08lx\n", fbi->regs.lcdcon4);
dprintk("lcdcon[5] = 0x%08lx\n", fbi->regs.lcdcon5);
writel(fbi->regs.lcdcon1 & ~S3C2410_LCDCON1_ENVID,
regs + S3C2410_LCDCON1);
writel(fbi->regs.lcdcon2, regs + S3C2410_LCDCON2);
writel(fbi->regs.lcdcon3, regs + S3C2410_LCDCON3);
writel(fbi->regs.lcdcon4, regs + S3C2410_LCDCON4);
writel(fbi->regs.lcdcon5, regs + S3C2410_LCDCON5);
s3c2410fb_set_lcdaddr(info);
fbi->regs.lcdcon1 |= S3C2410_LCDCON1_ENVID,
writel(fbi->regs.lcdcon1, regs + S3C2410_LCDCON1);
}

修改arch/arm/mach-s3c2410/include/mach/fb.h文件的40行左右的结构体s3c2410fb_display如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct s3c2410fb_display {
unsigned type;
unsigned short width;
unsigned short height;
unsigned short xres;
unsigned short yres;
unsigned short bpp;
unsigned pixclock;
//修改下面一行
unsigned setclkval;
unsigned short left_margin;
unsigned short right_margin;
unsigned short hsync_len;
unsigned short upper_margin;
unsigned short lower_margin;
unsigned short vsync_len;
unsigned long lcdcon5;
};

2.添加多种LCD支持:

修改arch/arm/mach-s3c2440/mach-smdk2440.c文件107行左右的结构体s3c2410fb_display smdk2440_lcd_cfg __initdata如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
//修改以下
#if defined(CONFIG_FB_S3C24X0_T240320)
.width = 240,
.height = 320,
.pixclock = 100000,
.setclkval = 0x4,
.xres = 240,
.yres = 320,
.bpp = 16,
.left_margin = 3,
.right_margin = 6,
.hsync_len = 1,
.upper_margin = 2,
.lower_margin = 1,
.vsync_len = 1,
#elif defined(CONFIG_FB_S3C24X0_S320240)
.width = 320,
.height = 240,
.pixclock = 80000,
.setclkval = 0x3,
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 15,
.right_margin = 5,
.hsync_len = 8,
.upper_margin = 5,
.lower_margin = 3,
.vsync_len = 15,
#elif defined(CONFIG_FB_S3C24X0_W320240)
.width = 320,
.height = 240,
.pixclock = 80000,
.setclkval = 0x3,
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 28,
.right_margin = 24,
.hsync_len = 42,
.upper_margin = 6,
.lower_margin = 2,
.vsync_len = 12,
#elif defined(CONFIG_FB_S3C24X0_LCD480272)
.width = 480,
.height = 272,
.pixclock = 40000,
.setclkval = 0x4,
.xres = 480,
.yres = 272,
.bpp = 16,
.left_margin = 19,
.right_margin = 10,
.hsync_len = 30,
.upper_margin = 4,
.lower_margin = 2,
.vsync_len = 8,
#elif defined(CONFIG_FB_S3C24X0_TFT640480)
.width = 640,
.height = 480,
.pixclock = 40000,
.setclkval = 0x1,
.xres = 640,
.yres = 480,
.bpp = 16,
.left_margin = 40,
.right_margin = 67,
.hsync_len = 31,
.upper_margin = 5,
.lower_margin = 25,
.vsync_len = 1,
#elif defined(CONFIG_FB_S3C24X0_TFT800480)
.width = 800,
.height = 480,
.pixclock = 40000,
.setclkval = 0x1,
.xres = 800,
.yres = 480,
.bpp = 16,
.left_margin = 15,
.right_margin = 47,
.hsync_len = 95,
.upper_margin = 9,
.lower_margin = 5,
.vsync_len = 1,
#elif defined(CONFIG_FB_S3C24X0_TFT800600)
.width = 800,
.height = 600,
.pixclock = 40000,
.setclkval = 0x1,
.xres = 800,
.yres = 600,
.bpp = 16,
.left_margin = 15,
.right_margin = 47,
.hsync_len = 95,
.upper_margin = 9,
.lower_margin = 5,
.vsync_len = 1,
#endif
};

修改同一文件235行左右的结构体s3c2410fb_mach_info smdk2440_fb_info __initdata如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays = &smdk2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
#if 0
.gpccon = 0xaa940659,
.gpccon_mask = 0xffffffff,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa84aaa0,
.gpdcon_mask = 0xffffffff,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
#endif
//注释掉下面一行
// .lpcsel = ((0xCE6) & ~7) | 1<<4,
};

修改drivers/video/Kconfig文件1907到1986行左右如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 修改下面两行
config FB_S3C24X0
tristate "S3C24X0 LCD framebuffer support"
depends on FB && ARCH_S3C2410
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
---help---
Frame buffer driver for the built-in LCD controller in the Samsung
S3C2410 processor.
This driver is also available as a module ( = code which can be
inserted and removed from the running kernel whenever you want). The
module will be called s3c2410fb. If you want to compile it as a module,
say M here and read <file:Documentation/kbuild/modules.txt>.
If unsure, say N.
# 修改以下
choice
prompt "LCD select"
depends on FB_S3C24X0
help
S3C24x0 LCD size select
config FB_S3C24X0_S320240
boolean "3.5 inch 320x240 Samsung LCD"
depends on FB_S3C24X0
help
3.5 inch 320x240 Samsung LCD
config FB_S3C24X0_W320240
boolean "3.5 inch 320x240 WanXin or QiMei LCD"
depends on FB_S3C24X0
help
3.5 inch 320x240 WanXin or QiMei LCD
config FB_S3C24X0_T240320
boolean "3.5 inch 240X320 Toshiba LCD"
depends on FB_S3C24X0
help
3.5 inch 240x320 Toshiba LCD
config FB_S3C24X0_TFT480272
boolean "4.3 inch 480X272 TFT LCD"
depends on FB_S3C24X0
help
4.3 inch 480X272 TFT LCD
config FB_S3C24X0_TFT640480
boolean "VGA 640x480"
depends on FB_S3C24X0
help
VGA 640x480
config FB_S3C24X0_TFT800480
boolean "7 inch 800x480 LCD"
depends on FB_S3C24X0
help
7 inch 800x480 LCD
config FB_S3C24X0_TFT800600
boolean "10.4 inch 800x600 TFT LCD"
depends on FB_S3C24X0
help
10.4 inch 800x480 TFT LCD
config FB_S3C24X0_TFT1024768
boolean "VGA 1024x768"
depends on FB_S3C24X0
help
VGA 1024x768 TFT LCD
endchoice
# 修改以上
config FB_S3C2410_DEBUG
bool "S3C2410 lcd debug messages"
# 修改下面一行
depends on FB_S3C24X0
help
Turn on debugging messages. Note that you can set/unset at run time
through sysfs
}

修改drivers/video/Makefile文件116行左右如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
obj-$(CONFIG_FB_MAXINE) += maxinefb.o
obj-$(CONFIG_FB_METRONOME) += metronomefb.o
obj-$(CONFIG_FB_BROADSHEET) += broadsheetfb.o
obj-$(CONFIG_FB_S1D13XXX) += s1d13xxxfb.o
obj-$(CONFIG_FB_SH7760) += sh7760fb.o
obj-$(CONFIG_FB_IMX) += imxfb.o
obj-$(CONFIG_FB_S3C) += s3c-fb.o
# 修改下面一行
obj-$(CONFIG_FB_S3C24X0) += s3c2410fb.o
obj-$(CONFIG_FB_FSL_DIU) += fsl-diu-fb.o
obj-$(CONFIG_FB_COBALT) += cobalt_lcdfb.o
obj-$(CONFIG_FB_PNX4008_DUM) += pnx4008/
obj-$(CONFIG_FB_PNX4008_DUM_RGB) += pnx4008/
obj-$(CONFIG_FB_IBM_GXT4500) += gxt4500.o
obj-$(CONFIG_FB_PS3) += ps3fb.o
obj-$(CONFIG_FB_SM501) += sm501fb.o
obj-$(CONFIG_FB_XILINX) += xilinxfb.o