您的位置:首页 > 运维架构 > Linux

【Linux基础】Linux-2.6.30 _LCD 驱动移植

2013-09-20 19:06 302 查看
[align=left]LCD驱动和型号包括支持帧缓冲设备和支持S3C2410 LCD(好多时候S3C2440和S3C2410是一样驱动的,所以就没有为S3C2440另外给出)帧缓冲,3.5寸的NEC LCD。[/align]
在linux-2.6.30.4内核结构中对寄存器 lcdcon1-4 全部用函数进行了自动设置,Linux入门培训我们只需对
lcdcon5进行设置(重点在下面几个变量数值上)。
[align=left].left_margin [/align]
[align=left].right_margin [/align]
[align=left].hsync_len [/align]
[align=left].upper_margin [/align]
[align=left].lower_margin [/align]
[align=left].vsync_len [/align]
[align=left]上面变量主要是在内核源码drivers/video/s3c2410fb.c中定义,其与VSPW、VFPD、VBPD、HFPD等物理量之间的匹配关系也可以从drivers/video/s3c2410fb.c中找到。[/align]
[align=left][/align]
[align=left]VSPW :垂直同步信号的脉宽,单位为 1 行( Line )的时间。[/align]
VFPD:垂直同步信号的前肩,单位为 1 行( Line )的时间。

VBPD:垂直同步信号的后肩,单位为 1 行( Line )的时间。

LINEVAL :垂直显示尺寸 -1 ,即屏行宽 -1 。

[align=left]HBPD :水平同步信号的后肩,单位为 1VCLK 的时间。[/align]
HFPD : 水平同步信号的前肩, 单位为 1VCLK 的时间 。

HSPW : 水平同步信号的脉宽,单位为 1VCLK 的时间。

[align=left]HOZVAL :水平显示尺寸 -1 ,即屏列宽 -1 。[/align]
[align=left]时序图如图 15‑10[/align]



01.jpg (52.06 KB, 下载次数: 1)

下载附件
保存到相册
设为封面

Linux-2.6.30-LCD驱动移植

昨天 15:45 上传

[align=left]图 15‑10 3.5寸屏时序图[/align]
[align=left]因此根据时序关系可以确定3.5寸屏的变量值为[/align]
[align=left].left_margin = 21.[/align]
[align=left].right_margin = 39[/align]
[align=left].hsync_len = 31[/align]
[align=left].upper_margin = 13[/align]
[align=left].lower_margin = 16[/align]
[align=left].vsync_len = 4[/align]
[align=left]备注:如何计算出上面各种变量呢?如图 15‑11。[/align]



02.jpg (22.43 KB, 下载次数: 1)

下载附件
保存到相册
设为封面

Linux入门培训之驱动移植

昨天 15:49 上传

[align=left]例如 :[/align]
[align=left].left_margin = 21, 该值的计算是根据内核 LCD 寄存器取值的定义函数[/align]
[align=left]S3C2410_LCDCON3_HFPD(var->left_margin - 1) HFPD 的数据可以根据芯片厂[/align]
[align=left]商的说明手册来获取。[/align]
[align=left]可确定( left_margin – 1 )的值等于 20 ,即 left_margin 为 21.[/align]
[align=left]其它的变量类似。[/align]
[align=left]下面对相关结构体作如下修改。[/align]
[align=left]1 、在linux-2.6.30.4/arch/arm/mach-s3c2410/mach-smdk2410.c 中添加如下的LCD配置源码:[/align]
[align=left]#vi arch/arm/mach-s3c2410/mach-smdk2410.c[/align]
[align=left](1) 首先添加 LCD 头文件[/align]
[align=left]#include <mach/fb.h>[/align]
[align=left]然后添加以下代码:(注意:此段代码的位置,见后面的错误解决)[/align]
[align=left]/* LCD driver info */[/align]
[align=left]static struct s3c2410fb_display smdk2410_lcd_cfg __initdata = {[/align]
[align=left].lcdcon5 = S3C2410_LCDCON5_FRM565 |[/align]
[align=left]S3C2410_LCDCON5_INVVLINE |[/align]
[align=left]S3C2410_LCDCON5_INVVFRAME |[/align]
[align=left]S3C2410_LCDCON5_PWREN |[/align]
[align=left]S3C2410_LCDCON5_HWSWP,[/align]
[align=left].type = S3C2410_LCDCON1_TFT,[/align]
[align=left].width = 320,[/align]
[align=left].height = 240,[/align]
[align=left].pixclock = 170000, /* HCLK 60 MHz, divisor 10 */[/align]
[align=left].xres = 320,[/align]
[align=left].yres = 240,[/align]
[align=left].bpp = 16,[/align]
[align=left].left_margin = 21,[/align]
[align=left].right_margin = 39,[/align]
[align=left].hsync_len = 31,[/align]
[align=left].upper_margin = 16,[/align]
[align=left].lower_margin = 13,[/align]
[align=left].vsync_len = 4,[/align]
[align=left]};[/align]
[align=left]static struct s3c2410fb_mach_info smdk2410_fb_info __initdata = {[/align]
[align=left].displays = &smdk2410_lcd_cfg,[/align]
[align=left].num_displays = 1,[/align]
[align=left].default_display = 0,[/align]
[align=left]};[/align]
(3) 然后在 static void init smdk2410_init(void)
C语言入门初始化函数中添加
LCD 初始化
[align=left]功能。[/align]
[align=left]static void __init smdk2410_init(void)[/align]
[align=left]{[/align]
[align=left]s3c24xx_fb_set_platdata(&smdk2410_fb_info);[/align]
[align=left]s3c_i2c0_set_platdata(NULL);[/align]
[align=left]platform_add_devices(smdk2410_devices,ARRAY_SIZE(smdk2410_devices));[/align]
[align=left]smdk_machine_init();[/align]
[align=left]}[/align]
[align=left](4) 删除 arch/arm/mach-s3c2440/mach-smdk2440.c 中内容如下( 加粗部分 )[/align]
[align=left]static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {[/align]
[align=left].lcdcon5 = S3C2410_LCDCON5_FRM565 |[/align]
[align=left]S3C2410_LCDCON5_INVVLINE |[/align]
[align=left]S3C2410_LCDCON5_INVVFRAME |[/align]
[align=left]S3C2410_LCDCON5_PWREN |[/align]
[align=left]S3C2410_LCDCON5_HWSWP,[/align]
[align=left].type = S3C2410_LCDCON1_TFT,[/align]
[align=left].width = 240,[/align]
[align=left].height = 320,[/align]
[align=left].pixclock = 166667, /* HCLK 60 MHz, divisor 10 */[/align]
[align=left].xres = 240,[/align]
[align=left].yres = 320,[/align]
[align=left]. bpp = 16,[/align]
[align=left].left_margin = 20,[/align]
[align=left].right_margin = 8,[/align]
[align=left].hsync_len = 4,[/align]
[align=left].upper_margin = 8,[/align]
[align=left].lower_margin = 7,[/align]
[align=left].vsync_len = 4,[/align]
[align=left]};[/align]
[align=left]2 、自定义logo[/align]
[align=left](1)进入linux的kde图形界面,使用The GIMP 图像编辑器打开你想要的图像文件,依次选择图像->模式->索引颜色,将颜色改为224色;至于图片大小,不要大于显示器分辨率,最后将文件另存为ppm格式(ASCii码),C语言教程文件名为:logo_linux_clut224.ppm。[/align]
[align=left](2)把logo_linux_clut224.ppm 拷贝到 drivers/video/logo 下替换相应用 ppm 图片,并删除所生成的目标代码。[/align]
[align=left]#rm - fr drivers/video/logo/logo_linux_clut224.*[/align]
[align=left]#cp -r /mnt/hgfs/share/logo_linux_clut224.ppm drivers/video/logo[/align]
[align=left]3 、重新配置内核。[/align]
[align=left]在 make menuconfig 时,选中[/align]
[align=left]Device Drivers --->[/align]
[align=left]Graphics support --->[/align]
[align=left]< * > Support for frame buffer devices[/align]
[align=left][ * ] Bootup logo --->[/align]
[align=left][ * ] Standard 224-color Linux logo[/align]
[align=left]最后,编译[/align]
[align=left]make[/align]
[align=left]烧写到开发板上,重新启动即可以看到自定义的图像。[/align]
[align=left]可能出现如图 15‑12的出错:[/align]



03.jpg (30.43 KB, 下载次数: 1)

下载附件
保存到相册
设为封面

Linux入门之LCD驱动移植

昨天 15:53 上传

[align=left]图 15‑12 代码位置出错图[/align]
[align=left]分析与解决:[/align]
[align=left]在(2)中添加的/* LCD driver info */...一段代码的位置出错,导致“smdk2410_fb_info”没有声明而报错。此段代码应放于文件中调用smdk2410_lcd_cfg __initdata与smdk2410_fb_info __initdata函数的函数之前,否则编译出错。[/align]
4、如何将开机logo中的光标去除

[root@localhost linux-2.6.30.4]# vi drivers/video/console/fbcon.c
[align=left]将static void fb_flashcursor(struct work_struct *work)制作空函数[/align]
[align=left]static void fb_flashcursor(struct work_struct *work)[/align]
[align=left]{[/align]
[align=left]#if 0[/align]
[align=left]struct fb_info *info = container_of(work, struct fb_info, queue);[/align]
[align=left]struct fbcon_ops *ops = info->fbcon_par;[/align]
[align=left]struct display *p;[/align]
[align=left]struct vc_data *vc = NULL;[/align]
[align=left]int c;[/align]
[align=left]int mode;[/align]
[align=left]acquire_console_sem();[/align]
[align=left]if (ops && ops->currcon != -1)[/align]
[align=left]vc = vc_cons[ops->currcon].d;[/align]
[align=left]…………[/align]
[align=left]CM_ERASE : CM_DRAW;[/align]
[align=left]ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),[/align]
[align=left]get_color(vc, info, c, 0));[/align]
[align=left]release_console_sem();[/align]
[align=left]#endif[/align]
[align=left]}[/align]
[align=left]将static void fbcon_cursor(struct vc_data *vc, int mode)制成空函数[/align]
[align=left]static void fbcon_cursor(struct vc_data *vc, int mode)[/align]
[align=left]{[/align]
[align=left]#if 0[/align]
[align=left]struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];[/align]
[align=left]struct fbcon_ops *ops = info->fbcon_par;[/align]
[align=left]int y;[/align]
[align=left]int c = scr_readw((u16 *) vc->vc_pos);[/align]
[align=left]……………[/align]
[align=left]ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),[/align]
[align=left]get_color(vc, info, c, 0));[/align]
[align=left]vbl_cursor_cnt = CURSOR_DRAW_DELAY;[/align]
[align=left]#endif[/align]
[align=left]}[/align]
[align=left]logo显示程序流程分析,如图 15‑13[/align]



04.jpg (33.13 KB, 下载次数: 1)

下载附件
保存到相册
设为封面

Linux入门之驱动移植

昨天 15:55 上传

[align=left]系统正常启动后10分钟后LCD黑屏?[/align]
[align=left]解决方法:[/align]
[align=left]、修改LCD驱动,把关闭LCD控制器的函数变为空(不推荐)[/align]
[align=left]、修改drivers/char/vt.c中的blank_screen_t()函数,让其为空(在系统不需要使用关闭显示功能时推荐)[/align]
[align=left]、修改/drivers/char/vt.c中的blankinterval,让其为0(系统可能需要使用关闭显示功能,而且希望系统上电后正常状态下不会关闭显示时推荐)[/align]
[align=left]、修改用户程序,加入设置blankinterval的代码(推荐)[/align]
[align=left]修改结果为:触摸屏停留在显示你的图片上,有时会因为文件系统出问题而导致显示短暂,换个文件系统试试即可。[/align]
[align=left]本文转载于C语言入门,http://www.weicedu.com/thread-275836-1-1.html[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: