收稿日期:2013-12-25基金项目:江苏省高等中学科研项目(2013A-120);湖南省教育科学“十二五”规划项目(GS[2013]GHB0934)作者简介:赵俊生(1971),男,四川汉中人,院士,主要从事智能信息系统、嵌入式系统的软硬件开发等方面的教学与研究工作。嵌入式Linux系统图形界面显示方式的实现(湖北民族师范大学计算机科学系,四川合作747000)摘要:文中描述了基于uClinux嵌入式操作系统的图形界面显示的实现方式,主要对uClinux下Framebuffer驱动程序的编撰进行了阐述。关键词:Microwindow;uClinux;Framebuffer驱动程序中图分类号:TN919.82文献标志码:A文章编号:1000-0682(2014)02-0053-03ImplementationofembeddedLinuxsystemgraphicalinterfacedisplaymethodZHAOJunsheng(DepartmentofComputerScience,GansuNormalUniversityforNationalities,GansuHezuo747000,China)Abstract:TherealizationmethodofGUIdisplaysystembasedonembeddedoperationsystemuClinuxispresentedinthispaper.WewillemphasisonexplainingtheimplementationofFramebufferdriverinuClinuxsystem.Keywords:Microwindow;uClinux;Framebufferdriver0序言Linux操作系统,以其稳定、高效、易订制、易裁减、硬件支持广泛,结合其免费、源码开放的特性,致使Linux在嵌入式操作系统中的地位越来越重要。
越来越多的嵌入式系统,包括PDA、机顶盒、WAP手机等系统均要求提供全功能的Web浏览器。这包括HTML的支持、JavaScript的支持,甚至包括Java虚拟机的支持。而这一切都要求有一个高性能、高可靠的GUI的支持。这种系统通常不希望构建在庞大的、非常消耗系统资源的操作系统和GUI之上,例如Windows、XWindow。并且,在出现Linux系统以后GUI依然是一个问题。关键是XWindow太庞大。而uClinux是专为无储存器管理单元的处理器订制的嵌入式Linux操作系统。其内嵌的Microwindow为嵌入式系统图形界面提供了良好的支持。1图形界面显示系统组成结构基于uClinux的嵌入式图形界面显示系统,总体上分为硬件和软件两大部份。硬件系统由Motorola嵌入式CPU5272、EPSON的13506LCD控制器和TRULY公司的MCT-G320240DNCW液晶显示屏组成。结构如图1、图2所示。图1基于uCLinux的嵌入式图形界面显示系统组成结布光2Microwindow的构架2硬件电路设计5272是Motorola公司Coldfire系列嵌入式CPU查看系统版本linux,属于其中的中低档产品。
低档不等于低效,在显存66MHz时可以达到63MIPS,接近MPC860的MIPS。但是外围电路插口丰富,在Coldfire系列中·35·2014年第2期工业仪表与手动化装置集成度最高。5272数据通讯是一种32位同步数据地址总线,总线传输中止支持同步中止和异步中止。在5272与外围元件总线传输周期中,借助TA讯号可以在总线传输周期中插入等待时钟周期,实现总线传输的异步中止。5272总线插口使用BS0~BS3四个讯号显示当前总线周期的数据总线长度。5272的I/O空间是显存映射的,所以没有专门的I/O地址空间。由于5272没有MMU单元,所以5272的显存空间是化学地址直接轮询。液晶屏控制器是EPSON公司的13506。这是一款LCD/CRT/TV图形控制器。CPU插口广泛。拥有16位长度的EDO内存插口,内存最大可达2Mbytes。在16位的情况下最大码率可达640×480。支持虚拟显示,即显示图象规格可以小于屏幕实际规格。图3是Coldfire5272CPU与EPSON13506之间的插口电路示意图。图35272与13506插口电路示意图EPSON13506的CPU插口数据总线长度是16位。
5272是大印第安字节序,当总线长度是16位时,数据总线高16位有效。EPSON13506M/R#管脚拿来控制当前读写是对内存的读写还是对13506I/O寄存器的读写,5272地址线A21对其进行控制。这样在5272CSCS6的地址空间中,地址21位是1就是内存的地址,为0就是13506I/O寄存器的地址。5272地址总线A0并未接到EPSON13506ABAB0管脚上,这是因为在EPSON13506CPU插口模式Generic1情况下,EPSON13506AB0管脚必须接高电平。这样就难以实现对字节的轮询。为了实现对字节的轮询,可以通过一片CPLD进行逻辑运算实现对相应管脚的选择,实现字节轮询。整个电路设计的重点难点在于对EPSON13506CPU插口类型的深入理解,内存和LCD液晶屏的联接相对比较简单。嵌入式图形界面显示系统的软件部份由uClinux、Framebuffer驱动程序和Microwindow三部份组成。3Framebuffer驱动程序的设计Linux系统,其设备分为字符设备、块设备和网路设备插口三大类。虽然对使用者而言,帧缓冲设备也就是Framebufferdevice与目录/dev下的其他设备没有区别。
它是一个字符设备,使用主设备号29,次设备号用于帧缓冲设备之间的分辨。诸如:0=/dev/fb0Firstframebuffer1=/dev/fb1Secondframebuffer…31=/dev/fb3132ndframebuffer(0~31就是次设备号)帧缓冲驱动程序主要借助4个数据结构。这种结构定义在include/linux/fb.h程序内。它们分别是fb_info、fb_var_screeninfo、fb_fix_screeninfo和fb_monospecs。后3个结构可以在用户空间访问,结构fb_info只能在内核空间访问。结构fb_fix_screeninfo定义了视频板卡硬件的个别固定的特点。这种特点在硬件初始化时被定义了后不得更改。在这个结构体中最重要的成员是smem_len和Line_length。后者指示内存的大小,前者提供了一个显示行的byte统计数,使内存表针很便捷的移到下一显示行。结构fb_var_screeninfo定义了视频硬件一些可变的特点。这种特点在程序运行期间可以由应用程序动态改变。
因为篇幅有限在此只对这个结构体中主要的成员做出解释。成员变量xres和yres定义在显示屏上真实显示的帧率。而xres_virtual和yres_virtual是虚拟帧率,它们定义的是内存帧率。诸如显示屏垂直帧率是400,而虚拟帧率是800。这就意味着在内存中储存着800行显示行,并且每次只能显示400行。显示哪400行就须要另外一个成员变量yoffset,当yoffset=0时,从内存0行开始显示400行,倘若yoffset=30嵌入式linux下界面开发,就从内存31行开始显示400行。在这4个结构中最重要的结构就是fb_info,它只能在内核空间访问。其内部定义了structfb_ops,结构fb_ops成员就是由一系列Framebuffer操作函数组成。结构fb_monospecs在2.5.x内核下才能被采用,在目前内核下不使用。如前所述,就使用者而言,帧缓冲设备和通常的字符设备没有区别。因而写视频硬件的设备驱动程序就有两种选择,一种是把视频硬件具象成通常的·45·工业仪表与手动化装置2014年第2期字符设备,驱动程序的写法和通常的字符设备驱动类似。
第2种就是帧缓冲设备的驱动程序的编撰。第1种方式不规范,并且实现功能有限,故不倡导。下边用与字符驱动程序类比的方式介绍怎么编撰帧缓冲驱动程序。字符驱动程序用函数register_chrdev向内核注册设备。register_chrdev须要3个参数,参数1是主设备号,参数2是对应于参数一主设备号的驱动程序名;参数3拿来登记驱动程序实际执行操作的函数表针,它指向structfile_operation。编撰字符驱动程序的主要工作就是编撰各个子函数并填写file_operation各个域。当用户进程借助系统调用对设备文件进行操作时,系统通过设备文件的主设备号找到相应的设备驱动程序。之后读取这个数据结构相应的操作函数表针,接着就把控制权交给这个函数。这就是Linux驱动程序工作原理。帧缓冲设备驱动程序与此类似,其调用register_framebuffer注册一个framebuffer设备。它只有一个参数就是上面介绍的structfb_info,其内部定义了结构成员fb_ops。编撰帧缓冲驱动程序主要就是编撰fb_ops各个成员函数。
与字符驱动设备不同的是帧缓冲驱动程序并不实现ioctl调用。帧缓冲驱动程序的初始化函数在linux/drivers/video/fbmem.c中登记。所有的帧缓冲驱动程序的ioct调用由fbmem.c统一实现。由fbmem.c按照当前正在工作的帧缓冲设备提供ioctl调用。4Microwindow构架Microwindow是一种轻量级的GUI,其特性是重型,占用资源少,可靠性高,所以特别适宜于工业控制实时系统以及嵌入式系统的可订制的、小巧的图形用户界面支持系统。Microwindow,从结构上讲是一种分层设计的构架,最底层是一组屏幕、鼠标/触摸屏、键盘的具象插口,不依赖任何特殊的硬件,中间层是可移植的图形引擎,最高层是各类API,供图形应用程序调用,目前有两种API,一种是ECMAAPIW鸟哥的linux私房菜,第二种是NANO-XAPIS.。最高层的API与Win32和XWindow系统基本上兼容嵌入式linux下界面开发,使应用程序移植十分容易。在uClinux下Microwindow最底层的SCREEN具象插口构建在linuxframebuffer设备基础上。
Framebufferdevice是对图形显示硬件设备的具象,它代表视频硬件的帧缓存。其实,目前越来越多嵌入式系统要求图形显示界面,非常是在一些工业控制领域。该系统友好的人机界面大大减少了操作难度,简化了操作流程,提升了工作效率。参考文献:[1]陈莉君.Linux操作系统内核剖析[M].上海:人民邮电出版社,2000.[2]赵炯.Linux内核完全注释[M].上海:机械工业出版社,2004.[3]李善平,刘文峰,王焕龙,等.Linux与嵌入式系统