《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于Framebuffer的MCU-LCD驱动设计
基于Framebuffer的MCU-LCD驱动设计
2014年微型机与应用第17期
梁小鸥1,谭 珏2
1.广东工程职业技术学院,广东 广州 510663; 2.广州海格通信集团股份有限公司,广东 广州 510663
摘要: Framebuffer在Linux的显示设备上起着一个抽象的而又相当重要的作用。随着技术的发展,诸多MCU-LCD嵌入式设备需要支持更多的上层应用二次开发及更友好的UI界面,但是由于MCU-LCD是在早期单片机中使用,对采用了Framebuffer架构的内核支持不太好。对Framebuffer自身的框架及MCU-LCD的硬件接口进行了分析和研究,根据Framebuffer的架构并结合MCU-LCD自身的特点,在比较了RGB与MCU优劣的基础上,设计了支持Linux帧缓冲的MCU-LCD设备驱动程序结果,实现了内核Framebuffer对MCU-LCD的支持。实际应用表明,该设计对于传统的MCU-LCD同样也能与Framebuffer较好地结合,满足更友好的界面开发需求。
Abstract:
Key words :

  摘 要: Framebuffer在Linux的显示设备上起着一个抽象的而又相当重要的作用。随着技术的发展,诸多MCU-LCD嵌入式设备需要支持更多的上层应用二次开发及更友好的UI界面,但是由于MCU-LCD是在早期单片机中使用,对采用了Framebuffer架构的内核支持不太好。对Framebuffer自身的框架及MCU-LCD的硬件接口进行了分析和研究,根据Framebuffer的架构并结合MCU-LCD自身的特点,在比较了RGB与MCU优劣的基础上,设计了支持Linux帧缓冲的MCU-LCD设备驱动程序结果,实现了内核Framebuffer对MCU-LCD的支持。实际应用表明,该设计对于传统的MCU-LCD同样也能与Framebuffer较好地结合,满足更友好的界面开发需求。

  关键词液晶显示;帧缓冲;驱动程序;RGB-LCD接口;MCU-LCD接口

  在嵌入式的主流 LCD屏中主要支持两大类硬件接口,一种是常见的RGB接口,另外一种是MCU接口。MCU-LCD因最早针对单片机的领域使用而得名。它在中低端手机中大量使用,其主要特点是价格便宜。MCU-LCD接口的标准术语是Interface 80,因此在很多文档中用I80来指MCU-LCD屏[1]。

  MCU-LCD屏与RGB-LCD屏主要区别在于显存的位置不同。RGB-LCD的显存是由系统内存充当的,因此其大小只受限于系统内存的大小,这样 RGB-LCD可以做出较大尺寸。比如现在4.3英寸只能算入门级;而MID中7英寸、10英寸的屏都开始大量使用。但是MCU-LCD在设计之初只考虑单片机的内存较小、资源受到限制,因此把显存内置在LCD模块内部,然后软件通过专门显示命令来更新显存。这样一来,MCU屏往往不能做得很大,同时显示更新速度也比RGB- LCD慢。MCU-LCD同RGB- LCD异同如表1所示。

002.jpg

  随着显示技术和嵌入式技术的发展以及Linux在嵌入式系统中的普及,RGB-LCD越来越流行,在内核驱动中,有诸多RGB-LCD的驱动实例及相关文档可以参考。由于MCU-LCD是在早期单片机中使用,因此内核对其支持不是太好,特别是采用了Framebuffer架构的内核。

1 MCU-LCD接口

  MCU接口中包括I80。I80全称为8080并口协议,是由Intel公司提出的。除8080接口协议外,还有摩托罗拉的6800接口协议,两者的不同在于控制器,8080通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作。很多MCU或者LCD模块外部接口一般采用并行方式,并行接口常见接线方式如图1所示。

001.jpg

  1.1 8080模式

  8080模式接口信号通常有:/RES(复位线),DB0~DB7(双向数据线),D/I(数据/指令选择线,1:数据读写,0:命令读写),CS(片选信号线,如果有多片组合,可有多条片选信号线),/WR(MPU向LCD写入数据控制线),/RD(MPU从LCD读入数据控制线)。

  1.2 6800模式

  6800模式支持可选择的总线宽度8/9/16/18 bit(默认为8 bit),其实际设计思想与I80一样,主要区别就是该模式的总线控制读写信号组合在一个引脚(/WR)上,并增加了一个锁存信号(E)。

2 基于Framebuffer的MCU-LCD接口驱动设计

  2.1 Framebuffer架构

  Framebuffer是LCD对应的一种HAL,提供了显示设备的抽象描述,它把显存抽象为一种设备。应用程序通过定义好的接口可以访问显卡,而不需要知道底层的任何操作,操作可以直接反映到显示设备中[2]。

  Framebuffer驱动程序的数据结构主要包括4个部分:fb_info、fb_ops、fb_var_screen和fb_fix_screen。fb_info结构体是帧缓冲设备中最重要的数据结构,包括了帧缓冲设备属性和操作的完整性属性。fb_ops结构体中的成员变量为指向底层操作的函数指针。fb_var_screen结构体记录用户可以修改的显示控制器参数,fb_fix_screen记录用户不可修改的显示控制器参数。Framebuffer对应的驱动及其具体实现在linux/driver/video目录下[3]。

  2.2 MCU-LCD驱动开发

  MCU-LCD存在黑白、4级灰度、16级灰色、256色、4 096色的STN液晶屏蔽,同时也存在黑白、4级灰度、16级灰度、256色、64K的TFT液晶显示屏[3-4]。不同的灰度等级或者色彩度对应不同的数据总线宽度。此处以16位数据总线宽度为例,6800的驱动与8080接口的驱动一致。

  首先在/driver/video目录下增加mcu-lcd_fb.c文件。在Linux驱动中,通过设备的名称与驱动的名称进行匹配,从而调用xx_probe函数,所以在mcu-lcd-fb.c中首先添加mcu-lcd-fb_probe函数。此函数用于完成对LCD设备的初始、分配显示缓冲区及注册Framebuffer驱动。对LCD设备的初始化工作包括对相应设备的寄存器相关配置工作的初始化和对fb_fix_screen中的固定硬件参数进行设置,同时对fb_var_screen中可变的参数进行配置。分配显示缓冲区则需要根据液晶显示屏的分辨率、像素点的宽度进行计算,从而得到所需要的内存空间大小。之后调用内核的API函数,注册一个Framebuffer驱动[5-7]。

  接下来声明MCU-LCD的fb_ops。

  static struct fb_op mcu_lcd_ops = {

  .owner = THIS_MODULE,

  .fb_check_var = mcu_lcd_check_var,

  .fb_set_par = mcu_lcd_set_par,

  .fb_setcolreg = mcu_lcd_setcolreg,

  .fb_blank = mcu_lcd_blank,

  .fb_open = mcu_lcd_open,

  .fb_release = mcu_lcd_release,

  .fb_copyarea = cfb_copyarea,

  .fb_fillrect = cfb_fillrect,

  .fb_imageblit = cfb_imageblit,

  };

  mcu_lcd _check_var函数确认LCD显示屏的可变参数。mcu_lcd_set_par对硬件参数进行配置。mcu_lcd_setcolreg对LCD寄存器进行设置,设置其显示模式和颜色数。在MCU-LCD初始化以后,只需要对LCD显示屏中的GRAM写入相应的数据,LCD就会根据写入的数据显示相关的信息。在此函数中,使用伪画板,将需要显示的数据放在伪画板中进行暂时的保存。不同于RGB模式下的LCD屏,此时无需再对LCD寄存器进行相应的设置。cfb_copyarea、cfb_fillrect、cfb_imageblit则是调用Linux系统自带的3个函数,用于对图片显示、矩形填充及区域拷贝进行操作。在mcu_lcd_open函数中,则是在打开Framebuffer设备文件时进行操作。由于MCU-LCD没有时钟线对显示屏进行刷新操作,因此在mcu_lcd_open函数中启动一个内核线程。设置好内核线程执行的频率,类似于LCD屏的刷新率。当内核线程进行调度时,启动CPU中内存地址间的DMA传输控制,对LCD内存写入数据来进行刷新操作[8-10]。

  Linux在嵌入式技术的发展过程中起着越来越重要的作用。Framebuffer在Linux的UI上起着抽象而又相当重要的作用。以前的诸多嵌入式设备随着技术的发展需要进行功能及安全方面的扩展,MCU-LCD也需要支持更多的上层应用二次开发及更友好的UI界面,如QT、MiniGui等。本文通过实现支持MCU-LCD的Framebuffer驱动,从而支持了MCU-LCD对嵌入式领域更好的扩展。

  在Framebuffer机制的基础上,基于MCU-LCD这种在过去单片机时代较为通用的显示设备,实现了嵌入式平台下的Linux驱动程序设计,很好地解决了通用的MCU接口的LCD驱动实现。该设计为一些流行的嵌入式图形库如QT、MiniGUI的移植工作提供了基础,对界面的二次开发具有良好的指导意义。

参考文献

  [1] 李瑛,魏廷存,张盛兵. 手机用TFT彩色液晶显示驱动芯片的可配置接口电路设计[J].微电子学与计算机,2006, (5):46-49.

  [2] 冯国进.嵌入式Linux驱动程序设计从入门到精通 [M].北京:清华大学出版社,2008.

  [3] 张策,孙绪刚.基于Frambuffer的LCD驱动设计 [J].计算机工程与设计,2009,30(23):5372-5375.

  [4] 纪宁宁,孙灵燕. S3C2410A驱动RGB接口TFT LCD的研究 [J].液晶与显示,2008,23(1):96-98.

  [5] 常赟杰,张位勇.Frambuffer的LCD驱动程序设计 [J].电脑编程技巧与维护,2009,15(4):18-19.

  [6] 鲁宝宏,郭磊,魏世民.嵌入式Linux平台下LCD驱动的开发与实现[J].电子技术,2008,45(9):28-30.

  [7] 苏哲欣,刘鸿飞,薛晓.基于嵌入式Linux的LCD驱动分析与实现[J].工业控制计算机,2009,22(2):29-30.

  [8] 孙俊喜.LCD驱动电路、驱动程序设计及典型应用[M].北京:人民邮电出版社,2009.

  [9] 李春燕.Linux内核的嵌入式系统裁减以及LCD驱动的实现[J].电脑知识与技术,2008,1(1) :29-37.

  [10]张伽伟,周安栋,罗勇. ARM11嵌入式系统Linux下 LCD的驱动设计[J].液晶与显示,2011,26(5):660-664.


此内容为AET网站原创,未经授权禁止转载。