在S 3C 2410的6寸LCD驱动在linux2.6上的移植
----Figo 2007.11
我的LCD是12bit的640*480的TFT,硬件平台是阳初2410板子,在linux- 2.6.14 的移植结果如下:
1. 在mach-smdk2410.c中添加平台信息.主要是设置一个结构体.
添加头文件
#include <asm/arch/fb.h>
static struct s
3c
2410fb_mach_info smdk2410_lcd_platdata = {
.width= 640,
.height= 480,
.xres = {
.defval= 640,
.min= 640,
.max= 640,
},
.yres = {
.defval= 480,
.min= 480,
.max= 480,
},
.bpp = {
.defval= 16,
.min= 16,
.max= 16,
},
.regs = {
.lcdcon1= S
3C
2410_LCDCON1_TFT16BPP | S
3C
2410_LCDCON1_TFT | S
3C
2410_LCDCON1_CLKVAL(4),
.lcdcon2= S 3C 2410_LCDCON2_LINEVAL(479) | S 3C 2410_LCDCON2_VBPD(18) | S 3C 2410_LCDCON2_VFPD(10) | S 3C 2410_LCDCON2_VSPW(14),
.lcdcon3= S 3C 2410_LCDCON3_HOZVAL(639) | S 3C 2410_LCDCON3_HBPD(6) | S 3C 2410_LCDCON3_HFPD(15),
.lcdcon4= S 3C 2410_LCDCON4_HSPW(28) | S 3C 2410_LCDCON4_MVAL(13),
.lcdcon5= S 3C 2410_LCDCON5_FRM565 | S 3C 2410_LCDCON5_HWSWP | S 3C 2410_LCDCON5_INVVCLK|S 3C 2410_LCDCON5_INVVLINE|S 3C 2410_LCDCON5_INVVFRAME|S 3C 2410_LCDCON5_PWREN,
},
.gpcup= 0xFFFFFFFF,
.gpcup_mask= 0xFFFFFFFF,
.gpccon= 0xaaaaaaaa,
.gpccon_mask= 0xFFFFFFFF,
.gpdup= 0xFFFFFFFF,
.gpdup_mask= 0xFFFFFFFF,
.gpdcon= 0xaaaaaaaa,
.gpdcon_mask= 0xFFFFFFFF,
.lpcsel= 0x00,
};
这部分设置是关键,要针对自己的lcd修改.
然后,在smdk2410_map_io(void)中添加
set_s
3c
2410fb_info(&smdk2410_lcd_platdata);
2 上面的结构体中reg部分的赋值是非常重要的,其中
.lcdcon2= S 3C 2410_LCDCON2_LINEVAL(479) | S 3C 2410_LCDCON2_VBPD(18) | S 3C 2410_LCDCON2_VFPD(10) | S 3C 2410_LCDCON2_VSPW(14),
的作用更为明显,开始不是用这些值时总是出现问题,屏幕的上面一部分出现在屏幕的下面,这个问题的产生就是因为这行值没有取正确,按照上面的取值即可成功。但是出现了另一个问题,就是屏幕抖动得非常厉害,这是因为帧频率过低,可以调低.lcdcon1= S 3C 2410_LCDCON1_TFT16BPP | S 3C 2410_LCDCON1_TFT | S 3C 2410_LCDCON1_CLKVAL(4),中CLKVAL的值为1,抖动消失了。
这些寄存器的值在三星的说明书上看似并不影响LCD的显示,但是实际上却影响很大,如果屏幕的显示出了问题二其他方面找不到答案时应该好好从这些值上考虑,深入考虑这些寄存值的意义
3 去除10分钟左右自动关闭显示的程序(实验时可以这么做,我猜应该是节能作用,并未深究。)。
copy from《2410 lcd(ltv350)驱动在
2
.6
.14
下的移植经历》:
“按seigpao大侠的做法,注释掉drivers/char/vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示。“