MiniGUI的帧缓冲、图形引擎及输入引擎

清理硬盘时发现有几篇2011年整理的博客躺在那里,删了怪可惜的,发上来保存一下~~

年代久远,已经过时,仅作参考用途~~~


FrameBuffer:

帧缓冲是一种驱动程序接口。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像,将其映射到进程地址空间后,可以直接进行读写操作,而且写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由FrameBuffer设备驱动来完成的。但FrameBuffer本身不具备任何运算数据的能力,好比只是一个暂时存放水的水池,CPU将运算后的结果放到这个水池,水池再将结果流到显示器。中间不会对数据进行处理。应用程序也可以直接读写这个水池的内容。在这种机制下,尽管FrameBuffer需要真正的显卡驱动的支持,但所有显示任务都由CPU完成,因此CPU负担很重。

FrameBuffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以对于应用程序而言,如果希望在FrameBuffer之上进行图形编程,还需要自己动手完成其他许多工作。

 

图形引擎及输入引擎:

在MiniGUI0.3.xx的开发过程中,引入了图形和输入抽象层(Graphics and Input Abstract Layer, GAL & IAL)的概念。抽象层的概念类似Linux内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序接口。利用这种抽象接口,我们可以将MiniGUI非常方便地移植到其他POSIX系统上,只需要根据我们的抽象层接口实现新的图形引擎和输入引擎即可。一般而言,基于Linux的嵌入式系统内核会提供FrameBuffer支持,这样MiniGUI已有的FBCON图形引擎可以运行在一般的PC上,也可以运行在特定的嵌入式系统上。因此,通常我们不需要开发针对特定嵌入式设备的图形引擎,而只要使用FBCON图形引擎即可。同时,MiniGUI还提供了Shadow, CommLCD等应用于不同场合的图形引擎。

但相比图形来讲,将MiniGUI的底层输入与上层相隔显得更为重要。在基于Linux的嵌入式系统中,图形引擎可以通过FrameBuffer而获得,而输入设备的处理却没有统一的接口。在PC上,我们通常使用键盘和鼠标,而在嵌入式系统上,可能只有触摸屏和为数不多的几个键。在这种情况下,提供一个抽象的输入层,就显得格外重要。

 

MiniGUI提供的图形引擎:

1.  Shadow

该引擎的主要功能是:提供对异步更新图形设备的支持,比如无法直接访问FrameBuffer等的情况。用来在NEWGAL之上支持低于8位色的显示模式。目前提供了对QVFB各种显示模式的支持。

2.  MLShadow

    该引擎是实现了了在机顶盒、PMP等产品方案中提供多个显示层,以完成累死硬件提供的图形层叠加功能,自动实现层之间的透明、半透明的显示。该引擎的主要功能是:可以实现多个虚拟图层之间的透明或者半透明叠加,可以将Shadow引擎作为真实引擎,以实现对下于8位色的支持以及实现屏幕旋转的支持。

3.  pc_xvfb

    该引擎的主要功能是:使用同一的启动参数,使MiniGUI可以在初始化时自动启动该xvfb程序。使用统一的共享内存对象键值,是的不论采用qvfb(Qt vfb)还是wvfb(Window vfb)还是gvfb(Gtk+ vfb)程序,都可以让pc_xvfb输入引擎使用同样的键值来获取帧缓冲区的系统共享内存对象。使用统一的关到/Unix socket对象及输入数据传输协议,使得不论采用qvfb还是wvfb还是gvfb程序,都可以让pc_xvfb输入引擎使用同样的机制获得用户在窗口中的输入数据。

4.  rtos_xvfb

借助rtos_xvfb引擎,可将MiniGUI运行在摸个已有的RTOS图形系统之上,比如uC/GUI、Gtk+、Tilcon等。其原理如下:

由rtos_xvfb程序模块创建窗口,分配虚拟帧缓冲区,然后以线程方式启动MiniGUI程序,MiniGUI程序在虚拟缓冲区中绘制,按约定的规范使用环形缓冲区存放rtos_xvfb引擎产生的输入数据,MiniGUI的rtos_xvfb输入引擎提供相关接口。

xVFBAllocVirtualFrameBuffer/xVFBFreeVirtualFrameBuffer      //创建/销毁虚拟帧缓冲区的接口

xVFBCreateEventBuffer/xVFBDestroyEventBuffer                        //创建/释放环形缓冲区的接口

xVFBNotifyNewEvent             //用于向环形缓冲区放入输入事件,并通知rtos_xvfb引擎读取的函数接口

5.  CommLCD

    该引擎的主要功能是为各种操作系统提供可直接访问LCD FrameBuffer设备的支持

 

 

MiniGUI提供的输入引擎:

1.      Comm IAL

MiniGUI为传统嵌入式操作系统提供了Common输入引擎(comm),使用该引擎可以很方便地实现对键盘、鼠标或触摸屏等输入设备的支持。

使用该引擎时,需要根据操作系统或底层驱动由客户自己为MiniGUI实现以下5个函数接口:

int __comminput_init(void);                                                                   //初始化输入设备

void __comminput_deinit(void);                                                             //释放输入设备

int __comminput_ts_getdata(short *x, short*y, short *button);          //返回当前鼠标或触摸屏信息

int __comminput_kb_getdata(short *key, short*status);                      //返回键盘输入信息

int __comminput_wait_for_input(void);                                                //返回输入事件类型

2.      Custom IAL

MiniGUI 3.0专业版和标准版的输入和输出引擎都是飞漫软件定制实现的,如果我们需要自己定制IAL的话,可以使用MiniGUI提供的custom-ial库自定义ial引擎接口的实现。按照下面的方法编写好IAL源代码后,要讲该源代码编译生成一个ial库,最后将实例、minigui库和ial库一起编译,才可以生成正确的可执行文件。Custom输入引擎在customial.h中给我们提供了定制键盘和鼠标消息处理的接口,我们只要实现下面的接口,就可以实现对相关消息的处理了:

BOOL InitCustomInput(INPUT *input, constchar *mdev, const char *mtype);

Void TermCustomInput(void);


你可能感兴趣的:(MiniGUI,coding)