分类: LINUX
2009-07-07 18:48:01
第十步:移植MiniGUI到嵌入式文件系统中
1) 库文件
把 /usr/local/arm/
[root@localhost cross]# cp -ar /usr/local/arm/3.4.1/arm-linux/lib /nfs
去掉其中.a文件:
[root@localhost cross]# rm -rf /nfs/lib/*.a
OK,库文件准备完毕。
2)资源文件
下面把资源文件也拷过来,在前面搭建PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来:
[root@localhost cross]# cp -ar /usr/local/lib/minigui /nfs/lib/minigui
3)配置文件
将配置文件也拷过来:
因为/nfs/usr下没有目录,所以我们需新建目录:
[root@localhost cross]# mkdir -p /nfs/usr/local/etc
[root@localhost cross]# cp /usr/local/arm/3.4.1/arm-linux/etc/MiniGUI.cfg /nfs/usr/local/etc/
[root@localhost cross]# cd /nfs/usr/local/etc/
修改MiniGUI.cfg
[root@localhost etc]# gedit MiniGUI.cfg
[system]
# IAL engine
ial_engine=dummy // 这里修改,我用的是触摸屏,所以就用dummy肯定不会错
mdev=/dev/tp //触摸屏
mtype=none
[fbcon]
defaultmode=320x240-16bpp // 根据你的LCD大小自己设置
注意:需将文件中的所有/usr/local/替换为 /
ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生再将/root/cross/mde-
[root@localhost etc]# mkdir -p /nfs/demo
[root@localhost etc]# cp -ar /root/cross/mde-1.3.0 /nfs/demo/
保存,退出。 OK ,你的板子上的系统也搭建完毕了,现在可以在屏幕上显示图片了,但是还不可以用触摸屏进行控制。
tslib-
以上已经成功移植了MiniGUI,由于不能使用触摸屏来进行控制,这次将继续上次的移植。往4020上移植tslib大概方法是通过 tslib 来构建 MiniGUI 的输入引擎。tslib 是一个用于触摸屏设备的函数库,通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来。因为触摸屏的坐标和液晶显示屏之间的坐标并不是一一对应的, 所以,要让从触摸屏上得到的坐标正确转换为液晶显示屏上的坐标,需要经过一个转换过程。除此之外,tslib 还以插件的形式提供了一些附加的功能,比如去除点击触摸屏时的抖动等
第十五步:下载源文件并解压
从下载到/root/cross:
[root@localhost cross]# tar xjvf tslib-1.3.tar.bz2
[root@localhost cross]# cd tslib-1.3
第十六步:针对底层驱动修改配置信息
[root@localhost tslib-1.3]# ./autogen.sh (这步会生产configure文件)
[root@localhost tslib-1.3]# ./configure CC=arm-linux-gcc --build=i686-pc-linux --target=arm-linux --host=arm-linux --prefix=/usr/local/arm/3.4.1/arm-linux --enable-inputapi=no
第十七步:修改源码
1、 修改/root/cross/tslib-1.3 /plugins/Makefile里面LDFLAGS:
[root@localhost tslib-1.3]# cd plugins/
[root@localhost plugins]# gedit Makefile
将第143行的
LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)修改为:
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`(这个可是顿号)
2、 修改在/root/cross/tslib-1.3 /plugins/mousebuts.c 的mousebuts_read函数中一段代码:
[root@localhost plugins]# gedit mousebuts.c
将第67行到70行注释掉,第73行注释掉:
//if (t > 60) {
//dest->pressure = 1000;
//buts->fLeftBut = 0;
//} else {
dest->pressure = 0;
buts->fLeftBut = 2;
// }
否则以后运行minigui时对按钮的操作时,如果对一个按钮进行点击时,并把光标停在按钮的上面它就会不断的触发按钮的点击事件,这当然不是我们想要得到的结果。
3、 修改/root/cross/tslib-1.3 /src/ts_read_raw.c中的一段代码:
[root@localhost plugins]# cd ../src/
[root@localhost src]# gedit ts_read_raw.c
将第98行中的
char *defaulttseventtype="UCB1x00";改为
char *defaulttseventtype="H3600";
因为我的触摸屏驱动对应此结构。
4、 修改ts_read_raw.c
在197行后添加一行:ret=sizeof(*hevt); 结果如下:
#else
tseventtype = getenv("TSLIB_TSEVENTTYPE");
if(tseventtype==NULL) tseventtype=defaulttseventtype;
if( strcmp(tseventtype,"H3600") == 0) { /* iPAQ style h3600 touchscreen events */
hevt = alloca(sizeof(*hevt) * nr);
ret = read(ts->fd, hevt, sizeof(*hevt) * nr);
ret=sizeof(*hevt);
if(ret > 0) {
要添加红色的这句话,否则运行./ts_ts_calibrate 会出现以下错误:
/tests # ./ts_calibrate
enable_irq(1) unbalanced from c0132bdc
xres = 640, yres = 480
ts_read: No such file or directory
5、 修改tslib源码的tests/ts_calibrate.c的getxy函数中修改一些代码。如下:
[root@localhost src]# cd ../tests/
[root@localhost tests]# gedit ts_calibrate.c
在第59行处:
/* Read until we get a touch. */
do {
if (ts_read_raw(ts, &samp[0], 1) < 0) {
perror("ts_read");
close_framebuffer();
exit(1);
}
} while (samp[0].pressure > 0);
/* Now collect up to MAX_SAMPLES touches into the samp array. */
index = 0;
do {
if (index < MAX_SAMPLES-1)
index++;
if (ts_read_raw(ts, &samp[index], 1) < 0) {
perror("ts_read");
close_framebuffer();
exit(1);
}
} while (samp[index].pressure == 0);
printf("Took %d samples...\n",index);
发现tslib与minigui中对于压力参数的规定刚好相反,tslib规定samp[0].pressure> 0是按下,samp[0].pressure == 0是手松开而事实是相反的如果不改就会出现在运行./ts_calibrate程序时不能有效校准,这个一定得注意。
第十八步:编译与安装
[root@localhost tests]# cd ..
[root@localhost tslib-1.3]# make
[root@localhost tslib-1.3]# make install
第十九步:tslib移植到嵌入式文件系统上
ts.conf,应该把它复制到目标板环境变量TSLIB_CONFFILE指定的目录下:
[root@localhost tslib-1.3]# cd /usr/local/arm/3.4.1/arm-linux/etc/
[root@localhost etc]# cp ts.conf /nfs/etc/
将libts-0.0.so.0、libts -0.0.so.
[root@localhost etc]# cd ../lib
[root@localhost lib]# cp libts-0.0.so.0 libts-0.0.so.0.1.0 libts.so /nfs/lib/
[root@localhost lib]# mkdir -p /nfs/test
[root@localhost lib]# cp /usr/local/arm/3.4.1/arm-linux/bin/ts* /nfs/test
安装的时候你可能没有看到plugins目录,要在/usr/local/arm/3.4.1/arm-linux/share/ts/下找:
[root@localhost lib]# cp -r /usr/local/arm/3.4.1/arm-linux/share/ts/plugins /nfs
经过这四次拷贝就将tslib的相应库都拷全了,下面要配置文件系统的环境变量,这样程序才能到指定目录下去找库:
[root@localhost /]# cd /nfs/etc/
[root@localhost etc]# gedit profile
在里面添加以下环境变量:
export T_ROOT=/
export LD_LIBRARY_PATH=/lib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_TSDEVICE=/dev/tp
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/plugins
使有如下形式:
第二十步:生成校准文件pointercal
在目标板上运行校准程序校准屏幕(5点校准):
/test # ./ts_calibrate
板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在etc/下面。
ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从tp驱动获得的数据和屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。pointercal文件中包含了触摸屏的校准数据(calibration),正是由于该文件的存在,tslib 才能正确地在触摸屏坐标和液晶屏幕的坐标之间进行转换。