Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336403
  • 博文数量: 92
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 960
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-21 19:38
文章分类

全部博文(92)

文章存档

2010年(71)

2009年(21)

我的朋友

分类: 嵌入式

2010-04-08 16:51:00

Linux-2.6.31内核移植(四)LCD

内核里已经有很完善的LCD驱动了,只要根据所用的LCD进行简单的修改,在内核源码drivers/video/s3c2410fb.cLCD驱动的源码,首先要设置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

找一个任意格式的图片(JPGBMP之类的),在图形界面中,右键单击这个图片,选打开方式->The GIMP,第一次打开需要安装GIMP软件,安装完后自动运行GIMP,这是一个很强大的图像处理工具,可称为Linux下的photoshop

右键单击窗口中的图片选图像->模式->索引,把颜色数改为:224(这步很重要)。其他的都默认,OK后右键文件->Save As,保存为logo_linux_clut224.ppm,确定后弹出一个对话框,选择AsciiOK后,GIMP会把图片转换成ppm格式,把这个文件复制到logo文件夹中就可以了。

drivers/video/logo/logo_linux_clut224.ppm 是默认的启动LOGO图片,格式为ppm,把自己的LOGO图片(png格式)转换成ppm格式,替换这个文件,同时删除logo_linux_clut224.c logo_linux_clut224.o文件

 

阅读(1456) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~