专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »嵌入式开发 » microwindows:基于Microwindows的嵌入式Linux轻量级图形应用库的.. »正文

microwindows:基于Microwindows的嵌入式Linux轻量级图形应用库的..

来源: 发布时间:星期四, 2008年12月11日 浏览:26次 评论:0

tHCfbaiducukNBM      嵌入式Linux系统很多应用领域诸如消费类电子产品、测量控制设备等图形用户界面不仅在技术上是软件系统设计个重点而且在商业上也关系到用户对该产品接受程度

tHCfbaiducukNBM       根据产品功能低高端不同定位系统设计对图形用户界面要求也不同般大致可以分为单进程方式轻量级图形界面和多任务窗口系统图形用户界面GUI前者主要用于低端信息终端和工业控制系统后者主要用于PDA、机顶盒、DVD/VCD播放机、WAP手机等产品中
   

tHCfbaiducukNBM      目前在Linux操作系统中般可将图形应用库粗略地分为三个不同层次层次是图形基础设施它们本身没有提供相应应用编程接口而是集成在操作系统中或采用某种封装形式用作其他高级图形或者应用基本较典型有X Window、SVGALib、framebuffer(帧缓冲)和LibGGI等;第二层次是高级它们提供了大量应用编程接口较典型有Xlib、GDK、GTK+、QT、SDL、OpenGL、PEG和DirectFB等;第三层次多任务窗口系统图形用户界面GUI较典型有Microwindows、OpenGUI、Qt/Embedded和MiniGUI等
   

tHCfbaiducukNBM       在低端嵌入式系统中 由于用户图形界面仅仅需要用到些简单画点、画线、图片显示和中西文输入/显示等同时考虑到成本、占资源大小和稳定性等诸多因素因此在对Microwindows进行相应裁减基础上进行应用图形库设计

tHCfbaiducukNBM      1 Microwindows分层结构
  

tHCfbaiducukNBM      Microwindows是个著名开放源码嵌入式GUI软件专门用于小型嵌入式设备上开发高性能图形应用和多任务窗口系统它用C语言实现可移植性好能够在嵌入式Linux上运行目前它不仅可以在支持Framebuffer32位嵌入式Linux系统上运行还可以在SVGALib库上运行甚至可以被移植到16位ELKS和实模式MSDOS上
  

tHCfbaiducukNBM       Microwindows采用分层结构设计共有三层(见图1)底层驱动层是面向基本图形输出和键盘、鼠标或触摸屏驱动中通过相应数据结构就能访问实际硬件设备;中间引擎层提供底层硬件抽象接口个可移植图形引擎提供点线绘制、区域填充、多边形绘制、裁减和RGB颜色模式使用等;最高应用层分别提供兼容于X Window 和Windows CE(Win32子集)API同时提供窗口管理
 

Microwindows分层结构模型

tHCfbaiducukNBM       底层驱动层也叫设备与平台相关层功能是将系统与设备和操作系统平台具体细节屏蔽起来它通过实际设备驱动接口或者OS系统来与硬件设备交互这些硬件设备主要包括屏幕、鼠标和键盘等我们使用设备对象(device object)概念来描述类设备个对象描述了类实际设备属性和方法比如屏幕设备对象就描述了其各种属性(屏幕尺寸、分辨率、像素深度、像素格式、逻辑显存首地址等)和基本方法(打开和关闭显示器、设置调色板、返回屏幕属性、读写像素点等)

tHCfbaiducukNBM       最底层实际上是以设备对象方式为中间层提供了个抽象设备驱动界面Microwindows在这层中对屏幕、鼠标、触摸屏和键盘等设备分别定义了个对应数据结构其中屏幕设备驱动结构体SCREENDEVICE指定了诸如设备大小、硬件使用图形模式等底层显示情况以及打开、关闭、画点线等方法;键盘设备驱动结构体KBDDEVICE定义打开、关闭和读取键值等方法; 屏幕信息结构体MWSCREENINFO和位图信息结构体MWIMAGEINFO是两个常用结构体用以取得当前打开显示屏幕和位图长、宽、位色等属性值
   

tHCfbaiducukNBM       中间引擎层也叫设备与平台无关层功能是提供个可以为各种应用层共享与设备无关核心图形引擎其中主要工作就是实现各种图形和输入设备功能对于中间层它向下看到是各类设备对象向上则是要提供个抽象核心图形界面使得上面应用层对它所使用到底是什么设备对象不用去理会当运行在Linux系统中时Microwindows提供所有绘图都是通过底层屏幕驱动Framebuffer或SVGALib来实现它支持行绘制、区域填充、剪切以及RGB颜色模型控制字体显示等
  

tHCfbaiducukNBM       最高层即应用层功能是按照应用具体要求为应用提供适当应用层用户界面当应用不需要窗口系统时候用户自定义图形界面将十分简单甚至可以什么都不做而直接使用中间层提供抽象核心界面(本文讨论图形应用库就是基于该原理来构建)如果用户需要完善多任务窗口系统则可以使用抽象核心界面来实现其应用编程接口(API)以及窗口和消息机制等Microwindows实现了MicrosoftWin32/WinCE图形显示接口(GDI)和Xlib(XWindows)接口两种API以适应不同应用环境其中前者应用于所有Windows CE和Win32应用用于设计类Win32图形用户界面GUI;后者就像Nano-X应用于所有Linux X插件集最底层这样可让Linux图形员X接口开发图形应用
   

tHCfbaiducukNBM       显然Microwindows分层设计使得其能够在需要时候易于改写和定制能够运行在任何支持FramebuferLinux系统(2.2以上版本内核)中这些特点使得Microwindows在嵌入式系统设计中应用十分广泛

tHCfbaiducukNBM       2 图形应用库设计
   

tHCfbaiducukNBM      尽管Microwindwos已经提供了个全功能可视化图形用户界面开发工具但是由它生成代码量很大在某些类低端嵌入式Linux系统中不适合

tHCfbaiducukNBM      因此设计个面向低端、非窗口管理基本图形应用库就显得非常重要它占用较少磁盘空间和较少内存开销旨在为嵌入式系统构建基本图形用户界面提供编程接口基本图形应用库设计思路是以Microwindows驱动层和独立图形引擎层为核心将它们抽取出来不再采用分层结构最后构建个尽可能小、满足绘图、显示、中文输入等功能轻量级图形应用库

tHCfbaiducukNBM      该图形应用库类似于Turboc C支持灰度/彩色LCD和PS/2键盘屏幕驱动支持1/2/4/8/l6/32bpp能进行相应中西文输入和显示;具有强大绘图功能包括画线、区域填充、画多边形、剪贴和图形模块等显然由于图形库以framebufer为基础无需特殊操作系统或图形系统支持能很好在嵌入式Linux系统上运行具有较好移植性、易使用性、稳定性
   

tHCfbaiducukNBM       这里基于Linux2.4.19和Microwindows0.89进行讨论主要难点:是将Microwindows层次打乱后如何进行代码重构用最少代码实现最有效功能二是提供中文显示和中文输入支持

tHCfbaiducukNBM       2.1 结构重构

tHCfbaiducukNBM       (1)底层驱动层
   

tHCfbaiducukNBM      整个系统核心是键盘和屏幕数据结构它们在Linux系统中都是被当作文件来进行访问其C代码主要在src/drivers和src/engine目录下
   

tHCfbaiducukNBM      键盘是通过fd=open("/dev/tty"O_NONBLOCK)打开利用ioctl来进行操作涉及到文件有kbd_ttyscan.c(提供键盘打开、关闭等支持)
   

tHCfbaiducukNBM       屏幕驱动是基于Linux内核中framebuffer这要求在编译内核时候选择支持framebuffer编译参数选项它是通过fd=open(env="/dev/fb0")打开用SCREENDEVICE指针PSD指向这片显存然后对这片显存根据屏幕不同位色设置情况为中间引擎层提供相应图形操作支持包括画点线、图片显示、屏幕拷贝以及中西文字显示等等其涉及到文件较多类型定义与声明头文件有fb.h、genfont.h和genmem.hC代码文件有src_fb.c(提供基本framebuffer打开和关闭等支持)、fb*.c(*为2、4、8、16、24、32提供对应不同灰度级别和不同位色屏幕支持)、genmem.c(提供显存分配)和genfont.c(提供中西文字体显示支持)

tHCfbaiducukNBM     (2)中间引擎层
   

tHCfbaiducukNBM      这层是在底层驱动层提供设备对象支持下完成图形在实虚屏之间转换(以PSD指针作为参数来进行)实现各种图形功能(以Gd...为开头)相关类型定义与声明头文件有目录下mwtypes.h、swap.h和winkbd.hC代码主要有src/engine目录下devarc.c(提供弧线和椭圆绘制支持)、devclip.c(提供剪贴支持)、devdraw.c(提供基本绘图支持)、devfont.c(提供字体字库支持)、devimage(提供图片绘制拷贝支持)、devkbd.c(提供键盘控制支持)、devrgn.c(提供区域操作动态分配支持)和devpal*.c(*为1、2、4、8提供调色板支持)
   

tHCfbaiducukNBM      在分析完驱动层和引擎层后将它们相关文件放在同个目录下利用gcc编译器编译链接生成目标文件然后用ar归档命令即可生成库文件(动态库和静态库)只需要将这个库文件提交给二次开发人员即可进行图形应用开发

tHCfbaiducukNBM     2.2 中文支持
  

tHCfbaiducukNBM     在嵌入式Linux应用系统中控制台驱动和Framebuffer驱动处理都是以单字节为基础所以需要进行中文化改造

tHCfbaiducukNBM     (1)中文显示支持
   

tHCfbaiducukNBM      这里采用16×16点阵GB2312字库字模文件hzk.bin存放在/font/chinese目录下对于个需要显示首先判断其是属于哪种编码集如果是ASCII码Microwindows提供GdText进行显示;如果是汉字则根据其机内码得到区位码计算该汉字字模在字模文件中偏移量读出该汉字字模底层DrawPixel像素点并显示这个汉字

tHCfbaiducukNBM      (2)中文输入支持
   

tHCfbaiducukNBM      由于Microwindows对输入法没有任何支持所以这块几乎所有代码都需要重新编写目前只提供GB2312字库拼音输入方法且只能逐字输入(见图2)同时也默认字模文件hzk.bin存放在/fonts/chinese目录下

tHCfbaiducukNBM    先定义个拼音结构体:
struct PY_index
{ char PY[6];//拼音韵母
char *PY_mb;//对应汉字机内码
};
   

tHCfbaiducukNBM       然后根据GB2312字库和汉字声母、韵母定义拼音输入法查询码表查询码表分两部分部分是二级索引表它将每个拼音和汉字对应起来:
stmct PY_index PY_index_a[5]={
{"","阿啊呵腌嗄锕吖"},
……
{"i","爱哀挨碍埃癌艾唉矮哎皑蔼隘暖霭捱嗳瑷嫒锿嗌砹”},
{"o""奥澳傲熬敖凹袄懊坳嗷拗鏖骜鳌翱岙廒遨獒聱媪螯鏊"}};
……
strucet PY_index PY_index_z[36]={{"a","杂扎砸咋咂匝拶"},
{"ai","在再载灾仔宰哉栽崽甾"),
{"an","咱赞暂攒簪糌瓒拶昝趱錾"),
……
{"un","尊遵樽鳟撙“},
{"uo","作做坐座左昨琢佐凿撮柞嘬怍胙唑笮阼祚酢"}};
street PY_index PY_index_end [1] = {{"",
PY_mb_space}
};
  

tHCfbaiducukNBM      其中PY_mb_space为常量0xffff它用于两个地方是ivu三个字母不能作为声母所以它们没有对应汉字这里就以0xffff来约定;二是表示拼音表结束
 

中文拼音输入法流程图

tHCfbaiducukNBM      第二部分是级索引表它将26个首字母(即声母)和其韵母对应起来:
street PY_index code *code PY_index_headletter[27]=
{
PY_index_a,
PY_index_b,

tHCfbaiducukNBMPY_index_z,
PY_ index_end
};
    有了上面定义两个索引表就可以进行汉字输入了

tHCfbaiducukNBM     3 结论
  

tHCfbaiducukNBM       图形应用库提供了图形系统化、键盘操作、区域块拷贝、中西文输入显示、基本图形绘制等共计40多个API功能很好满足了低端嵌入式Linux系统图形应用开发需要该图形应用库只有70多KB大小占用资源少性能稳定很好满足了低端信息终端和控制系统等嵌入式Linux产品设计需要 目前已经成功应用于嵌入式税控收款机(pos)、自动柜员机(ATM)等嵌入式产品中

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: