利用tslib为MiniGui提供触摸屏的IAL引擎简介:
GAL(Graphic Abstract Layer,图形抽象层)和 IAL(Input Abstract Layer,输入抽象层)是 MiniGUI 的两个基础设施,MiniGUI 的高度可移植性在很大程度上也是由于这两个接口提供了独立于硬件的抽象能力。但是 GAL 和 IAL 并不是生来就存在的,它们也需要通过底层代码来实现,通常把实现这两个接口的底层代码称之为“图形引擎”和“输入引擎”。GAL和 IAL 与 MiniGUI 的关系,就好比驱动程序与操作系统的关系一样。那么,为什么本文只提 IAL 引擎的实现而不提 GAL 引擎的实现呢?原因是这样的:Linux 系统提供了一种基础设施——FrameBuffer,通过这个设施,Linux 下的图形输出有了统一的接口。FrameBuffer既在桌面系统中存在,也大量的存在于基于 Linux 的嵌入式系统中。由于 MiniGUI 可以通过 FrameBuffer 获得统一的图形引擎接口,因此其适应性大大提高,也就很少需要再为MiniGUI 编写 GAL 驱动层了。但是对于输入而言,由于 Linux 没有提供统一的接口,因此常常为MiniGUI 编写 IAL 驱动层。
MiniGUI 的 IAL 接口定义
首先来看看 MiniGUI 中的 IAL 接口是如何定义的(见 libminigui-1.3.3/src/include/ial.h)
typedef struct tagINPUT
{
char* id;
// Initialization and termination
BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype);
void (*term_input) (void);
// Mouse operations
int (*update_mouse) (void);
void (*get_mouse_xy) (int* x, int* y);
void (*set_mouse_xy) (int x, int y);
int (*get_mouse_button) (void);
void (*set_mouse_range) (int minx, int miny, int maxx, int maxy);
void (*suspend_mouse) (void);
int (*resume_mouse) (void);
// Keyboard operations
int (*update_keyboard) (void);
const char* (*get_keyboard_state) (void);
void (*suspend_keyboard) (void);
int (*resume_keyboard) (void);
void (*set_leds) (unsigned int leds);
// Event
#ifdef _LITE_VERSION
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,
struct timeval *timeout);
#else
int (*wait_event) (int which, fd_set *in, fd_set *out, fd_set *except,
struct timeval *timeout);
#endif
char mdev [MAX_PATH + 1];
}INPUT;
MiniGUI 通过一个 INPUT 结构体来表示一个输入引擎。下面简要介绍一下后面将会用到的 INPUT 结构体的各个成员。
id 输入引擎的名称;
init_input 输入引擎的初始化函数;
term_input 输入引擎的终止函数;
update_mouse 更新鼠标位置;
get_mouse_button 获取鼠标按键值;
wait_event 等待输入事件到来,可以是键盘,也可以是鼠标。
指针 cur_input 是一个全局变量,用来指向 MiniGUI 所用的输入引擎。所有获取键盘消息或者鼠标按键消息的操作都是通过该指针来完成的。另外,在 INPUT 结构体中定义的实际上都是一些函数指针,在 MiniGUI 启动的时候,MiniGUI 将会自动根据配置文件MiniGUI.cfg 中的配置信息来决定应该将哪些函数的入口地址赋给这些指针。也就是说,将函数指针指向具体函数的工作是在 init_input()函数中完成的。
由于本章只用到触摸屏输入,而不会用到键盘,因此,只需为鼠标相关的函数指针赋值即可。通常的做法都是在 init_input()中打开鼠标设备(比如/dev/mouse),然后为 INPUT 结构中的某些函数指针赋予相应的函数入口地址。此后,当 MiniGUI 要获取鼠标或者键盘消息时,实际上是通过 INPUT 结构体中的函数指针调用相应的函数。
参考文献:
全文还参考了其他网络上的tslib编译方法,在此就不一一列出。
此文本应该一次全部列出的(我用word都排好版了),不过限于Baidu空间过于垃圾。老是限制字数,排版也存在问题,只能分成了几个小的片段,希望不要吓到你,虽然写了这么多,其实也没多少。耐心点,慢慢来就ok
转载注明出处:http://hi.baidu.com/luv%5Fresplendent/modify/blog/482b842d97687832349bf7df