基于嵌入式Linux变压器监测终端LCD驱动程序的设计
2013-12-12赵江东姚有峰马小陆
赵江东 姚有峰 马小陆
(1皖西学院基础实验中心,安徽 六安 237012)(2安徽工业大学电气信息学院,安徽 马鞍山 243002)
引言
随着电力系统自动化的发展,用户对配电变压器监测终端系统的人机界面的要求也越来越高,显示器是主要的人机交互设备,但由于传统的CRT显示器体积过于庞大等缺点,难以应用到配电自动化的设备中[1]。LCD作为新一代的显示设备,它能够显示字符、汉字及图形,并且具有功耗低、体积小、重量轻及超薄等许多优点,可满足配电变压器监测终端系统人机界面日益提高的性能要求[2]。当前市场上的变压器监测终端系统设计多是基于嵌入式技术,硬件采用性价比非常高的ARM处理器,软件采用嵌入式Linux操作系统,这使得变压器监测终端具有高精度的数据处理和强大的数据管理等优点。本文将阐述在嵌入式Linux变压器监测终端平台上液晶显示屏的驱动程序的设计方法。
1 TFT-LCD工作原理
TFT-LCD是作为STN-LCD的换代显示器,它具有响应速度快、分辨率高及色彩丰富等优点,当前正取代STN-LCD,被广泛运用到便携式计算机、摄录像机及工业控制仪表等实际产品中。TFT-LCD的显示原理如图1所示。
图1 TFT-LCD显示原理
TFT是一个场效应管结构,它的栅极电流小,LCD的行和列数的增加是不会使驱动的电压变高,故TFT-LCD可以制作成高分辨率的显示器。当TFT导通的时候,源极和漏极的电阻较小;当TFT被关断的时候,源极和漏极的电阻很大,它近似于开路。显示驱动的时候,某一时刻只会有一行的像素被选中,这行的TFT被导通,其它行的像素TFT处于关断状态。TFT-LCD的色彩丰富,能够做到真彩显示,因此其应用非常广泛。
2 Linux下LCD驱动接口
Linux2.2内核之后的版本中出现一种驱动接口,即Framebuffer。该接口提供了一种在硬件设备上处理图像的方法。Framebuffer代表视频的硬件设备,可使应用软件利用其定义来确定界面访问图像的硬件设备[3]。这样能使应用程序在不知道任何的硬件底层驱动内容。在Linux系统下LCD驱动的接口框图如图2所示。
图2 Linux系统下LCD驱动的接口框图
Framebuffer的实现可以分为两个方面:一是对LCD和相关部件的初始化;二是对画面的缓冲区读写,具体的代码是read、write、lseek等相关系统调用接口。Framebuffer的完整驱动程序即是这两个方面的具体实现,在Linux的发行版本中,包含大量设备驱动程序的源码,例如drivers/video下提供了多种显卡Framebuffer的程序,这样省去了上层程序的工作,只要针对所用到的LCD模块类型及接口时序修改其驱动程序中和底层相关的代码,就可以得到需要的LCD驱动程序。
Linux为了便于开发Framebuffer程序,使用了层次结构。fbmem.c(内核源码driver/video目录下)源码位于该设备驱动程序的中心位置。它为上层的用户空间提供了系统调用接口,同时也可以为下层特定硬件提供驱动接口,底层硬件驱动需要用该接口向内核注册。下面是fbmem.c的一些主要数据结构。
fb_info为帧缓冲设备定义的驱动层接口,其定义在内核源码include/linux/fb.h文件中。不仅包含底层函数,也包含与设备有关的数据。每个帧缓冲的设备中都有一个fb_info的结构体与之相对应。它的重要成员有node、fb_var_screeninfo和fbops。node表示特定的Framebuffer,同时也是一个Framebuffer设备的次设备号;fb_var_screeninfo记录了可以修改显示器控制参数的内容;fb_ops提供了底层驱动的接口。与在编写字符设备驱动程序一样,需要填写一个file_operations结构体,然后使用register_chrdev()注册file_operations。而编写Framebuffer驱动代码时,要填写fb_ops结构体的相关成员。
综上可见,在Linux下Framebuffer的编程框图如图3所示。
图3 Linux下Framebuffer的编程框图
3 LCD驱动程序设计
3.1 硬件结构图
本文中使用的LCD型号为LQ080V3DG01,是由日本夏普生产的TFT-LCD,基于ARM920T的微处理器S3C2410和LCD液晶模块的连接图如图4所示。
图4 S3C2410和LQ080V3DG01连接图
从S3C的LCD控制器引出来的信号线有24根数据线和部分控制线。如果使用256色LCD,则只需要其中低8位的数据线。这些线是经过74HC245模块隔离后连接到LCD模块,在接256色屏时由这个芯片完成电平的转换。此外LCD信号线驱动74HC245的电源是可以选择的。S3C2410可以安装5寸的伪彩屏和8寸的真彩屏,其连接原理图如图5所示。
3.2 驱动程序设计
根据LCD驱动原理和以上硬件结构图,LCD驱动程序设计代码如下:
3.2.1 LCD 屏参数初始化[4][5]
图5 S3C2410与LQ080V3DG01连接原理图
3.2.2 Linux 系统 LCD 初始化
在Linux中对LCD模块初始化代码如下:
3.2.3 头文件添加
在内核/include/asm-arm/arch-s3c2410目录下创建zjd.h文件,内容如下:
3.2.4 配置和编译内核
配置界面如图6所示:
图6 内核配置LCD模块
选择其驱动如下[6][7]:
将重新制作zImage烧写到系统中,再次启动 linux2.6.14以后就可以在LCD上显示图形。
4 结论
随着电力系统自动化水平的日益提高,用户对配电变压器监测终端系统的人机界面的要求也越来越高,根据嵌入式Linux下配电变压器监测终端的特点和Linux2.6内核驱动程序接口Framebuffer的工作原理,针对特定TFT-LCD屏详细阐述了驱动程序的设计步骤,最后针对配电变压器监测终端系统实验平台中的核心单元S3C2410处理器进行了驱动程序的测试验证。测试结果表明LCD驱动程序的内核机制极大地优化了嵌入式系统友好界面设计,为嵌入式LCD模块的应用提供了更广泛的应用领域。
[1]陶维青,马小陆.基于 430 单片机的新型配电变压器远方终端的开发[J].继电器,2005,(19):66-67.
[2]邱涛.一种基于Linux的车载多功能系统的设计与实现[D].重庆:重庆大学,2009.
[3]王春波.GPS/GPRS车载终端的设计与实现[D].成都:电子科技大学,2008.
[4]谭周文.基于ARM和Linux的超高频读写器设计与实现[D].长沙:湖南大学,2008.
[5]刘志栋.基于嵌入式Linux系统的夫琅和费衍射实验仪的开发与研制[D].长春:吉林大学,2008.
[6]李静.基于嵌入式平台的目标识别研究[D].桂林:桂林电子科技大学,2009.
[7]韦东山.嵌入式 Linux 应用开发完全手册[M].北京:人民邮电出版社,2008:158.