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

本文介绍在Linux-2.6.30.4内核环境下,针对3.5寸NEC LCD屏幕进行驱动移植的过程,包括配置关键参数、自定义开机Logo、去除光标及解决LCD黑屏等问题。
LCD驱动和型号包括支持帧缓冲设备和支持S3C2410 LCD(好多时候S3C2440和S3C2410是一样驱动的,所以就没有为S3C2440另外给出)帧缓冲,3.5寸的NEC LCD。
在linux-2.6.30.4内核结构中对寄存器 lcdcon1-4 全部用函数进行了自动设置,Linux入门培训我们只需对 lcdcon5进行设置(重点在下面几个变量数值上)。
.left_margin
.right_margin
.hsync_len
.upper_margin
.lower_margin
.vsync_len
上面变量主要是在内核源码drivers/video/s3c2410fb.c中定义,其与VSPW、VFPD、VBPD、HFPD等物理量之间的匹配关系也可以从drivers/video/s3c2410fb.c中找到。
VSPW :垂直同步信号的脉宽,单位为 1 行( Line )的时间。
VFPD:垂直同步信号的前肩,单位为 1 行( Line )的时间。
VBPD:垂直同步信号的后肩,单位为 1 行( Line )的时间。
LINEVAL :垂直显示尺寸 -1 ,即屏行宽 -1 。
HBPD :水平同步信号的后肩,单位为 1VCLK 的时间。
HFPD : 水平同步信号的前肩, 单位为 1VCLK 的时间 。
HSPW : 水平同步信号的脉宽,单位为 1VCLK 的时间。
HOZVAL :水平显示尺寸 -1 ,即屏列宽 -1 。
时序图如图 15‑10

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

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

Linux-2.6.30-LCD驱动移植

昨天 15:45 上传

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

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

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

Linux入门培训之驱动移植

昨天 15:49 上传

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

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

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

Linux入门之LCD驱动移植

昨天 15:53 上传

图 15‑12 代码位置出错图
分析与解决:
在(2)中添加的/* LCD driver info */...一段代码的位置出错,导致“smdk2410_fb_info”没有声明而报错。此段代码应放于文件中调用smdk2410_lcd_cfg __initdata与smdk2410_fb_info __initdata函数的函数之前,否则编译出错。
4、如何将开机logo中的光标去除
[root@localhost linux-2.6.30.4]# vi drivers/video/console/fbcon.c
将static void fb_flashcursor(struct work_struct *work)制作空函数
static void fb_flashcursor(struct work_struct *work)
{
#if 0
struct fb_info *info = container_of(work, struct fb_info, queue);
struct fbcon_ops *ops = info->fbcon_par;
struct display *p;
struct vc_data *vc = NULL;
int c;
int mode;
acquire_console_sem();
if (ops && ops->currcon != -1)
vc = vc_cons[ops->currcon].d;
…………
CM_ERASE : CM_DRAW;
ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
release_console_sem();
#endif
}
将static void fbcon_cursor(struct vc_data *vc, int mode)制成空函数
static void fbcon_cursor(struct vc_data *vc, int mode)
{
#if 0
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
struct fbcon_ops *ops = info->fbcon_par;
int y;
int c = scr_readw((u16 *) vc->vc_pos);
……………
ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
get_color(vc, info, c, 0));
vbl_cursor_cnt = CURSOR_DRAW_DELAY;
#endif
}
logo显示程序流程分析,如图 15‑13

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

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

Linux入门之驱动移植

昨天 15:55 上传

系统正常启动后10分钟后LCD黑屏?
解决方法:
、修改LCD驱动,把关闭LCD控制器的函数变为空(不推荐)
、修改drivers/char/vt.c中的blank_screen_t()函数,让其为空(在系统不需要使用关闭显示功能时推荐)
、修改/drivers/char/vt.c中的blankinterval,让其为0(系统可能需要使用关闭显示功能,而且希望系统上电后正常状态下不会关闭显示时推荐)
、修改用户程序,加入设置blankinterval的代码(推荐)
修改结果为:触摸屏停留在显示你的图片上,有时会因为文件系统出问题而导致显示短暂,换个文件系统试试即可。
本文转载于C语言入门,http://www.weicedu.com/thread-275836-1-1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值