基于嵌入式Linux的图形界面显示系统的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于嵌入式Linux的图形界面显示系统的设计在系统这个IT产业的新领域,以其所具备的稳定、高效、易定制、易裁减、硬件支持广泛的特点,结合其免费、源码开放的特征。
使得Linux 在嵌入式操作系统中的地位越来越重要。
越来越多的嵌入式系统,包括PDA、、WAP 手机等等系统均要求提供全功能的 Web 扫瞄器。
这包括HTML 的支持、JavaScript 的支持,甚至包括 Java 虚拟机的支持。
而这一切都要求有一个高性能、高牢靠的 GUI 的支持。
这些系统普通不希翼建立在浩大累赘的、十分消耗系统资源的操作系统和 GUI 之上,比如 Windows 或 X Window。
但是,在浮现 Linux 系统之后 GUI 仍然是一个问题。
关键是 X Window 太过浩大和臃肿。
是专为无存储器管理单元的处理器定制的嵌入式Linux操作系统。
其内嵌的Microwindow 为嵌入式系统图形界面提供了良好的支持。
2 系统的组成结构
基于uClinux的嵌入式图形界面显示系统分为软件和硬件两大部分。
软件由uClinux、Framebuffer驱动程序和Microwindow三部分组成。
Motorola嵌入式CPU 5272、EPSON的13506 控制器和TRULY公司的MCT-G320240DNCW液晶显示屏组成图形界面显示硬件系统。
结构1所示。
硬件设计环境:开发板是Motorola 5272C3,uClinux内核版本号是
2.4.17。
3 Microwindow的架构
Microwindow是一种轻量级的GUI,具有轻型、占用资源少、高牢靠性的特点。
Microwindow 是一个十分适合于工业控制实时系统以及嵌入式系统的可定制的、小巧的图形用户界面支持系统。
Microwindow是一种分层设计的架构。
最底层是一组屏幕、鼠标/、键盘的抽象接口,不依靠任何特别的硬件。
中间层是可移植的图形引擎。
最高层是各种API,供图形应用程序调用。
目前有两种API,一种是ECMA APIW,其
次种是NANO-X APIS.。
这些API与win32和x window系统基本上兼容,使应用程序移植十分简单。
在uClinux下Microwindow最底层的SCREEN 抽象接口建立在linux framebuffer 设备基础上。
Framebuffer device 是对图形显示硬件设备的抽象,它代表视频硬件的帧缓存。
本文将重点研究uClinux下针对详细硬件环境如何设计其Framebuffer设备驱动程序。
4 Framebuffer设备驱动程序的设计
Linux下设备分为字符设备、块设备和网络设备接口三大类。
那么Framebuffer设备属于哪一类呢?刚开头设计时简单使人困窘。
其实对用法者而言,帧缓冲设备也就是Framebuffer device和名目/dev下的其他设备没有区分。
它是一个字符设备,用法主设备号29,次设备号用于帧缓冲设备之间的区别。
例如:0=/dev/fb0 First frame buffer
1=/dev/fb1 Second frame buffer
…
31=/dev/fb31 32nd frame buffer
0~31就是次设备号
帧缓冲驱动程序主要依赖四个数据结构。
这些结构定义在
include/linux/fb.h程序内。
它们分离是fb_info、
fb_var_screeninfo、fb_fix_screeninfo和fb_monospecs。
后三个结构可以在用户空间拜访,结构 fb_info只能在内核空间拜访。
结构 fb_fix_screeninfo定义了视频板卡硬件的某些固定的特性。
这些特性在硬件初始化时就被定义了以后不得修改。
在这个结构体中最重要的成员是smem_len和line_length。
前者指示显存的大小,后者提供了一个显示行的byte统计数,使显存指针很便利的移到下一显示行。
结构fb_var_screeninfo定义了视频硬件一些可变的特性。
这些特性在程序运行期间可以由应用程序动态转变。
因为篇幅有限在此只对这个结构体中主要的成员作出说明,具体说明请参见fb.h。
成员变量xres 和yres定义在显示屏上真切显示的辨别率。
而xres_virtual和
yres_virtual是虚拟辨别率,它们定义的是显存辨别率。
比如显示屏垂直辨别率是400,而虚拟辨别率是800。
这就意味着在显存中存储着800行显示行,但是每次只能显示400行。
但是显示哪400行呢?这就需要另外一个成员变量yoffset,当yoffset=0时,从显存0行开头显示400行,假如yoffset=30,就从显存31行开头显示400行。
在这四个结构中最重要的结构就是fb_info,它只能在内核空间拜访。
其内部定义了struct fb_ops,结构fb_ops成员就是由一系列Framebuffer 操作函数组成。
结构fb_monospecs在2.5.x内核下才会被采纳,在目前内核下不用法。
如前所述就用法者而言,帧缓冲设备和普通的字符设备没有区分。
因此写视频硬件的设备驱动程序就有两种挑选,一种是把视频硬件抽象成普通的字符设备,驱动程序的写法和普通的字符设备驱动类似。
其次种就是帧缓冲设备的驱动程序的编写。
第一种办法不规范,而且实现功能有限,故不倡导。
下面用与字符驱动程序类比的办法介绍如何编写帧缓冲驱动程序。
字符驱动程序用函数register_chrdev向内核注册设备。
register_chrdev需要三个参数,参数一是主设备号,参数二是对应与参数一主设备号的驱动程序名;参数三用来记下驱动程序实际执行操作的函数指针,它指向struct file_operation。
编写字符驱动程序的主要工作就是编写各个子函数并填写file_operation各个域。
当用户进程利用系统调用对设备文件举行操作时,系统通过设备文件的主设备号找到相应的设备驱动程序。
然后读取这个数据结构相应的操作函数指针,接着就把控制权交给这个函数。
这就是linux驱动程序工作原理。
帧缓冲设备驱动程序与此类似,其调用register_framebuffer注册一个framebuffer设备。
它惟独一个参数就是前面介绍的struct fb_info,其内部定义了结构成员fb_ops。
编写帧缓冲驱动程序主要就是编写
fb_ops各个成员函数。
与字符驱动设备不同的是帧缓冲驱动程序并不
实现ioctl调用。
帧缓冲驱动程序的初始化函数在
linux/drivers/video/fbmem.c中记下。
全部的帧缓冲驱动程序的ioct 调用由fbmem.c统一实现。
由fbmem.c按照当前正在工作的帧缓冲设备提供ioctl调用。
5 硬件的设计
5272是Motorola公司Coldfire系列嵌入式CPU,在Motorola公司嵌入式CPU中属于中低档产品。
低档不等于低效,在主频66M时可以达到63,临近MPC860的MIPS。
并且外围电路接口丰盛,在Coldfire系列
中集成度最高。
5272是一种32位同步数据地址总线,总线传输终止支持同步终止和异步终止。
在5272与外围器件总线传输周期中,利用TA信号可以在总线传输周期插入等待时钟周期。
实现总线传输的异步终止。
5272总线接口用法BS0~BS3四个信号显示当前总线周期数据总线宽度。
5272的I/O空间是内存映射的,所以没有特地的I/O地址空间。
由于5272没有MMU单元,所以5272的内存空间是物理地址挺直寻址。
液晶屏控制器是EPSON公司的13506。
这是一款LCD/CRT/TV图形控制器。
CPU接口广泛。
拥有16bit宽度的EDO显存接口,显存最大可达2Mbytes。
在16bpp的状况下最大辨别率可达640480。
支持虚拟显示,即显示图像尺寸可以大于屏幕实际尺寸。
下图是Coldfire 5272 CPU 与 EPSON13506之间的接口电路暗示图。
EPSON13506的CPU接口数据总线宽度是16位。
5272是大印第安字节序,当总线宽度是16位时,数据总线高16位有效。
EPSON13506 M/R 管脚用来控制当前读写是对显存的读写还是对13506 I/O寄存器的读
写,5272地址线A21对其举行控制。
这样在5272 CS6的地址空间中,地址21位是1就是显存的地址,为0就是13506 I/O寄存器的地址。
5272地址总线A0并未接到EPSON13506 AB0管脚上,这是因为在EPSON13506 CPU接口模式 Generic1状况下,EPSON13506 AB0管脚必需接高电平。
这样就无法实现对字节的寻址。
为了实现对字节的寻址,可以通过一片举行规律运算实现对相应管脚的挑选,实现字节寻址。
囫囵电路设计的重点难点在于对EPSON13506 CPU接口类型的深化理解,显存和LCD液晶屏的衔接比较容易,在这里就不再赘述。
6 结束语
目前越来越多嵌入式系统要求图形显示界面,特殊是在一些工业控制领域。
本系统已经胜利运用于色谱仪工作站上。
其友好的人机界面大大降低了仪表操作难度,简化了操作流程,提高了生产效率。