基于LVDS接口的LCD显示系统设计

2021-07-12 17:16尹凯
电子乐园·下旬刊 2021年4期

尹凯

摘要:本文介绍了具有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