尹凯
摘要:本文介绍了具有LVDS接口的LCD在嵌入式显示系统中的应用,详细讨论了与ARM处理器的接口电路设计和Linux驱动开发。
关键词:LVDS;LCD;帧缓冲
1.引言
LVDS接口的LCD具有传输数据快,功耗低等特点。LCD显示一幅画面称为一帧,对于画面中的所有RGB像素点,在Linux驱动中会有一段缓冲区与之对应,该缓冲区被称为帧缓冲。本文主要探讨了ARM处理器RGB数据的串行化输出和Linux帧缓冲驱动的配置操作。
2.硬件电路设计
2.1LCD接口信号定义
本系统使用的是三菱电子的6.5寸LCD模块AA065VE11,该模块显示分辨率为640×480,在接收端采用LVDS接口(使用的接口器件为THC63LVDF84B),支持单路6bit/8bit的RGB数据格式,管脚定义如下表所示。
2.2LVDS接口电路设计
在本设计中,使用的ARM处理器是MARVELL公司的PXA270,PXA270内置的LCD控制器的主要接口信号包括:
lLDD(17:0):数据总线,一次可传输4位、8位、16位或18位数据;
lL_PCLK_WR:像素时钟,主动模式下,像素时钟连续跳变;
lL_LCLK_A0:行扫描时钟,主动模式下,它是水平同步信号;
lL_FCLK_RD:帧扫描时钟,在主动模式下,它是垂直同步信號;
lL_BIAS:AC偏置,主动方式下,它是数据输出使能信号。
我们这里使用18bpp像素深度的数据格式,颜色模式为RGB666,此时LCD控制器数据总线与RGB信号的对应关系如下图所示。
对于LCD控制器输出的TTL电平信号,需要增加一个接口电路,实现TTL信号到LVDS差分信号的转换。这里使用TI公司的SN75LVDS83B串行器实现,硬件连接如下图所示。
其中LVDS信号由3组数据差分和1组时钟差分信号组成,每个数据通道传输6位数据。
3.Linux显示驱动开发
这里使用linux-2.6.35.9内核版本作为软件开发平台,该内核版本中已经包含了帧缓冲(Framebuffer)设备驱动的实现代码,主要由fbmem.c和pxafb.c文件组成。在fbmem.c文件中,实现了提供给上层应用程序调用的设备文件标准操作接口。在pxafb.c文件中,实现了对硬件设备的访问接口,根据传递的硬件参数信息,完成硬件设备的初始化和其他操作。我们只需要根据自己的硬件配置对内核中的现有代码进行裁剪、修改即可。
3.1LCD硬件参数计算
帧缓冲是Linux为显示设备提供的一个接口,它对LCD设备在显示一屏数据过程中的时序划分如下图所示。
其中各个参数的含义说明如下:
lxres:每行的像素点数;
lyres:屏幕的行数;
lhsync_len:水平同步信号的宽度,单位是像素时钟周期;
lleft_margin:水平同步信号结束到一行有效数据开始之间的无效点数;
lright_margin:一行有效数据结束到下一个水平同步信号开始之间的无效点数;
lvsync_len:垂直同步信号的宽度,单位是行数;
lupper_margin:垂直同步信号结束到一帧图像开始之间的无效行数;
llower_margin:一帧图像结束到下一个垂直同步信号开始之间的无效行数。
AA065VE11的工作模式为DE(DATA ENABLE)模式,其主要接口时序见下表所示。
1)像素时钟计算
根据表2中给出的DCLK信息,可以计算得到像素时钟如下:
pixclock = (1<<12) /((640+160)×(480+45)×60)= 39682;
其中像素时钟的单位是皮秒,60表示每秒显示60帧。
2)前后边沿计算
前后边沿是给水平、垂直同步信号往屏幕刷新数据所提供的预留时间,如果设置不当会造成显示图像的偏移。从表2给出的DENA信息可以得知,LCD设备扫描一行的空白像素点数是160个,扫描一屏的空白行数是45行。因为屏幕上显示的图像是连续的,所以可以得到一行总的空白像素点数满足如下等式:
right_margin + hsync_len + left_margin = 160;
可以得到一屏总的空白行数满足如下等式:
upper_margin + lower_margin + hsync_len = 45;
在驱动中配置LCD设备的硬件参数时,需要满足以上两个等式关系。
1.1Framebuffer驱动配置
a)修改板级文件
在内核目录arch/arm/mach-pxa/下的板级文件中添加LCD设备的初始化代码,主要改动如下:
1) 添加LCD控制器的管脚信息
static unsigned long pcm027_lcd_pin_config[] = { GPIO58_LCD_LDD_0, GPIO59_LCD_LDD_1, GPIO60_LCD_LDD_2, GPIO61_LCD_LDD_3, GPIO62_LCD_LDD_4, GPIO63_LCD_LDD_5, GPIO64_LCD_LDD_6, GPIO65_LCD_LDD_7, GPIO66_LCD_LDD_8, GPIO67_LCD_LDD_9, GPIO68_LCD_LDD_10, GPIO69_LCD_LDD_11, GPIO70_LCD_LDD_12, GPIO71_LCD_LDD_13, GPIO72_LCD_LDD_14, GPIO73_LCD_LDD_15, GPIO86_LCD_LDD_16, GPIO87_LCD_LDD_17, GPIO74_LCD_FCLK, //TFT vsync GPIO75_LCD_LCLK, //TFT hsync GPIO76_LCD_PCLK, GPIO77_LCD_BIAS, //TFT output-enable
};
2) 添加LCD设备的硬件参数
static struct pxafb_mode_info mitsubishi_aa065ve11_mode = { .pixclock = 39682, //picosecond .xres = 640, .yres = 480, .bpp = 18, .hsync_len = 0, .left_margin = 80, .right_margin = 80, .vsync_len = 0, .upper_margin = 25, .lower_margin = 20, .sync = 0,
};
static struct pxafb_mach_info mitsubishi_aa065ve11_info = { .modes = &mitsubishi_aa065ve11_mode, .num_modes = 1, .lcd_conn = LCD_COLOR_TFT_18BPP,
};
3) 注册平台设备和资源
static void __init pcm027_init_lcd(void)
{ pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm027_lcd_pin_config)); set_pxa_fb_info(&mitsubishi_aa065ve11_info);
}
b)修改内核配置
在内核配置中添加对framebuffer设备的支持。
Graphics support --->
<*>Support for frame buffer devices --->
<*>PXA LCD framebuffer support
Console display driver support --->
<*>Framebuffer Console support
3.2启动界面测试
系统加电开机后,LCD可以正常显示启动界面如下图所示。整个系统在运行过程中显示良好,性能稳定。
4.结束语
由于LVDS接口采用了低电压和低电流驱动方式,因此实现了低噪声和低功耗,这类接口的LCD适合集成度高以及高速传输等嵌入式应用场合。本文所介绍的软硬件开发方法,具有一定的参考价值。
参考文献
[1] Marvell Inc.Marvell PXA270 Processor Developers Manual, 2009
[2] Mitsubishi Electric Corp.AA065VE11 Technical Specification, 2011
[3] 王黎明.深入淺出XScale嵌入式系统.北京航空航天大学出版社, 2011