分类: 嵌入式
2013-03-09 16:55:49
原文地址:Linux-2.6.31内核移植(四)LCD 作者:yanhongkang928
Linux-2.6.31内核移植(四)LCD
内核里已经有很完善的LCD驱动了,只要根据所用的LCD进行简单的修改,在内核源码drivers/video/s3c2410fb.c是LCD驱动的源码,首先要设置LCD的时钟频率,有一个计算公式,很复杂,不用管它,直接修改程序实现。
在第365行开始的函数:
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 = 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);
这几句是在s3c2410fb_display结构体中加入了setclkval变量,我们需要在结构体原型中加入这个变量,在arch/arm/mach-s3c2410/include/mach/fb.h中第40行加入:unsigned setclkval; /*clkval*/
修改LCD参数配置:(这个要查看所用LCD的手册来确定参数)
修改arch/arm/mach-s3c2440/mach-smdk2440.c中第107行的结构体,我修改的参数如下:
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,
.width = 320,
.height = 240,
.pixclock = 100000, /* HCLK 60 MHz, divisor 10 */
.setclkval = 0x3, /*add by xgc*/
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 19,
.right_margin = 24,
.hsync_len = 44,
.upper_margin = 7,
.lower_margin = 5,
.vsync_len = 15,
};
屏蔽掉第150行的语句:
// .lpcsel = ((0xCE6) & ~7) | 1<<4,
配置内核,支持LCD:
Device Drivers:
Graphics Support --->
<*>support for frame buffer devices --->
[*] Enable frameware EDID
[*] Enable Vidoe Mode Handling Helpers
<*> S3C24X0 LCD framebuffer support
Console display driver support --->
<*> Framebuffer Console Support
[*] Bootup Logo --->
<*> Standard 224-color Linux logo
重新make zImage
然后下载新的内核到开发板,看到打印信息:
Console: switching to colour frame buffer device 40x30
fb0: s3c2410fb frame buffer device
lp: driver loaded but no devices found
开机LOGO的制作:
用RedHat9自带的图片编辑工具GIMP。
找一个任意格式的图片(JPG,BMP之类的),在图形界面中,右键单击这个图片,选“打开方式->The GIMP”,第一次打开需要安装GIMP软件,安装完后自动运行GIMP,这是一个很强大的图像处理工具,可称为Linux下的photoshop。
右键单击窗口中的图片选“图像->模式->索引”,把颜色数改为:224(这步很重要)。其他的都默认,OK后右键“文件->Save As”,保存为logo_linux_clut224.ppm,确定后弹出一个对话框,选择Ascii,OK后,GIMP会把图片转换成ppm格式,把这个文件复制到logo文件夹中就可以了。
drivers/video/logo/logo_linux_clut224.ppm 是默认的启动LOGO图片,格式为ppm,把自己的LOGO图片(png格式)转换成ppm格式,替换这个文件,同时删除logo_linux_clut224.c logo_linux_clut224.o文件