第三部分:tslib和minigui的链接
完成了对 tslib 的交叉编译之后,
下一步的事情就是改写 MiniGUI 的 IAL 引擎。MiniGUI自带的 IAL 输入引擎中,有一个叫做 dummy.c。为了尽可能简单,在这里为简单起见就在其基础上稍作修改,使之符合我们的要求即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include "common.h"
#include "tslib.h"
#ifdef _DUMMY_IAL
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/kd.h>
#include "ial.h"
#include "dummy.h"
#ifndef _DEBUG
#define _DEBUG // for debugging
#endif
/* for storing data reading from /dev/touchScreen/0raw */
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_EVENT;
static unsigned char state [NR_KEYS];
static int mousex = 0;
static int mousey = 0;
static TS_EVENT ts_event;
static struct tsdev *ts;
/************************ Low Level Input Operations **********************/
/*
* Mouse operations -- Event
*/
static int mouse_update(void)
{
return 1;
}
static void mouse_getxy(int *x, int* y)
{
if (mousex < 0) mousex = 0;
if (mousey < 0) mousey = 0;
if (mousex > 639) mousex = 639;
if (mousey > 479) mousey = 479;
#ifdef _DEBUG
// printf ("mousex = %d, mousey = %d\n", mousex, mousey);
#endif
*x = mousex;
*y = mousey;
}
static int mouse_getbutton(void)
{
return ts_event.pressure;
}
#ifdef _LITE_VERSION
static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,
struct timeval *timeout)
#else
static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,
struct timeval *timeout)
#endif
{
struct ts_sample sample;
int ret = 0;
int fd;
fd_set rfds;
int e;
if (!in) {
in = &rfds;
FD_ZERO (in);
}
fd = ts_fd(ts);
if ((which & IAL_MOUSEEVENT) && fd >= 0) {
FD_SET (fd, in);
#ifdef _LITE_VERSION
if (fd > maxfd) maxfd = fd;
#endif
}
#ifdef _LITE_VERSION
e = select (maxfd + 1, in, out, except, timeout) ;
#else
e = select (FD_SETSIZE, in, out, except, timeout) ;
#endif
if (e > 0) {
// input events is coming
if (fd > 0 && FD_ISSET (fd, in)) {
FD_CLR (fd, in);
ts_event.x=0;
ts_event.y=0;
ret = ts_read(ts, &sample, 1);
if (ret < 0) {
perror("ts_read()");
exit(-1);
}
ts_event.x = sample.x;
ts_event.y = sample.y;
ts_event.pressure = (sample.pressure > 0 ? 4:0);
// if (ts_event.pressure > 0 &&
if((ts_event.x >= 0 && ts_event.x <= 639) &&
(ts_event.y >= 0 && ts_event.y <= 479)) {
mousex = ts_event.x;
mousey = ts_event.y;
// printf("ts_event.x is %d, ts_event.y is %d------------------------------------->\n",ts_event.x ,ts_event.y);
}
//#ifdef _DEBUG
// if (ts_event.pressure > 0) {
// printf ("mouse down: ts_event.x = %d, ts_event.y = %d,ts_event.pressure = %d\n",ts_event.x,ts_event.y,ts_event.pressure);
// }
//#endif
ret |= IAL_MOUSEEVENT;
return (ret);
}
}
else if (e < 0) {
return -1;
}
return (ret);
}BOOL InitDummyInput(INPUT* input, const char* mdev, const char* mtype)
{
char *ts_device = NULL;
if ((ts_device = getenv("TSLIB_TSDEVICE")) != NULL) {
// open touch screen event device in blocking mode
ts = ts_open(ts_device, 0);
} else {
#ifdef USE_INPUT_API
ts = ts_open("/dev/input/0raw", 0);
#else
ts = ts_open("/dev/touchscreen/ucb1x00", 0);
#endif
}
#ifdef _DEBUG
printf ("TSLIB_TSDEVICE is open!!!!!!!!!!!\n");
#endif
if (!ts) {
perror("ts_open()");
exit(-1);
}
if (ts_config(ts)) {
perror("ts_config()");
exit(-1);
}
input->update_mouse = mouse_update;
input->get_mouse_xy = mouse_getxy;
input->set_mouse_xy = NULL;
input->get_mouse_button = mouse_getbutton;
input->set_mouse_range = NULL;
input->wait_event = wait_event;
mousex = 0;
mousey = 0;
ts_event.x = ts_event.y = ts_event.pressure = 0;
return TRUE;
}
void TermDummyInput(void)
{
if (ts)
ts_close(ts);
}
#endif /* _DUMMY_IAL */
修改好minigui的引擎文件后就可以对minigui进行重新编译了,因为用到了 tslib 库,所以必须在编译的时候告诉 MiniGUI 到哪里去找到 tslib 相关的头文件和共享库文件。具体做法如下所示:
[root@root]# cd /root/cross/libminigui-1.3.3
[root@libminigui-1.3.3]# ./configure CC=arm-linux-gcc --build=i686-pc-linux --target=arm-linux --host=arm-linux --disable-galqvfb --disable-galecoslcd --
disable-vbfsupport --prefix=/usr/local/arm/3.4.1/arm-linux CFLAGS="-I/usr/local/arm/3.4.1/arm-linux/include -L/usr/local/arm/3.4.1/arm-linux/lib -lts"
如果在Fedora下编译的话只需要 make menuconfig,并在下面添加这么一句哈:
[root@ libminigui-1.3.3]# make
[root@ libminigui-1.3.3]# make install
这里说一下为什么要指定 CFLAGS 标志。其实,通过指定这个标志,告诉编译器应该到哪里去找 tslib 有关的头文件和共享文件, -lts则告诉链接器最后生成的 MiniGUI 的共享库文件最后要和 ts 库(ts 是 touchscreen 的缩写)链接。
按照在minigui编译中所说的文件复制方式将需要的文件复制到文件系统中。
如下:
●库文件
把 /usr/local/arm/3.4.1/arm-linux/lib 中相应的库拷到 /home/fp/nfs/lib 目录下去
下面是我拷的库文件:
libjpeg.a libmgext-1.3.so.3 libminigui.a libpng.so.2 libttf.a libz.so
libjpeg.la libmgext-1.3.so.3.0.0 libminigui.la libpng.so.2.1.0.10rc1 libttf.so libz.so.1
libjpeg.so libmgext.a libminigui.so libpopt.a libvcongui-1.3.so.3 libz.so.1.2.3
libjpeg.so.62 libmgext.la libm.so libpopt.la libvcongui-1.3.so.3.0.0 minigui
libjpeg.so.62.0.0 libmgext.so libm.so.6 libpopt.so libvcongui.a shared
libm-2.2.3.so libminigui-1.3.so.3 libpng.a libpopt.so.0 libvcongui.la
libm.a libminigui-1.3.so.3.0.0 libpng.so libpopt.so.0.0.0 libvcongui.so
其中一些 .a 的静态库是不需要拷过去的,另外要运行c程序还需要拷一些libc标准库进去,我图方便,直接将整个/usr/local/arm/3.4.1/arm-linux/lib考到/home/fp/nfs下面,呵,懒人的做法
OK,库文件准备完毕
●资源文件
下面把资源文件也拷过来,还记得吗,在前面 搭建 PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来
[Root]# cp –r –a /usr/local/lib/minigui /home/fp/nfs/lib/minigui 连目录一起拷过来,目录结构和主机一样
●配置文件
把配置文件也拷过来
[Root]# cp /usr/local/arm/3.4.1/arm-linux/etc/MiniGUI.cfg /home/fp/nfs/usr/local/etc/ 记住,保持目录结构的一致
修改 MiniGUI.cfg ,如下
[system]
# IAL engine
ial_engine=dummy // 这里修改,我用的是触摸屏,所以就用dummy肯定不会错
mdev=/dev/tp //解摸屏
mtype=none
[fbcon]
defaultmode=240x320-16bpp // 根据你的LCD大小自己设置,设置错误minigui 就启动不了
还有一点就是要将文件中的所有/usr/local/替换为/ 。
编译好了libminigui-1.3.3还需要重新编译综合实例mde-1.3.0
[root@root]# cd /root/cross/mde-1.3.0
[root@mde-1.3.0]# ./configure CC=arm-linux-gcc --build=i686-pc-linux --target=arm-linux --host=arm-linux CFLAGS="-I/usr/local/arm/3.4.1/arm-linux/include -L/usr/local/arm/3.4.1/arm-linux/lib -lts"
[root@ mde-1.3.0]# make
[root@ mde-1.3.0]# make install
编译完这两个,再把/usr/local/arm/3.4.1/arm-linux 下的lib文件夹复制到/nfs/下面,将/root/cross/mde-1.3.0下的实例文件夹复制到/nfs/demo/下面
重新上电,跑demo下的各种综合程序,这时tslib就已经能够为minigui服务了