Minigui移植uClinux
更新时间:2024-04-20 20:21:01 阅读量: 综合文库 文档下载
Minigui移植
1. 交叉编译环境
交叉编译环境安装在 ~/nios2-linux/toolchain-mmu/x86-linux2/bin/ 在 .bash_profile 文件中添加 PATH=$PATH:/home/szh/nios2-linux/toolchain-mmu/x86-linux2/bin:$HOME/bin [user]# source . bash_profile
2. 建立源码库
创建以下文件夹
/home/szh/miniGUI/nios2/ 将以下文件解压在该文件夹下 zlib-1.2.3.tar.tar
libpng-1.0.10rc1.tar.gz
jpegsrc.v6b.tar.gz
3. 安装 zlib 库,这个是后面的库的编译基础。
[user]# cd zlib-1.2.3
[user]# CC=nios2-linux-gnu-gcc LDSHARED=〝nios2-linux-gnu-ld -shared〞 ./configure --prefix=/opt/nios2/ --shared [user]# make [user]# su
[root]# make install [root]# exit
安装完后检查一下目录 /usr/local/nios2/nios2-linux/ [include,lib] ,假如 include 中没有 zlib.h 之类的头文件,lib 中没有 libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的 *.h 都需要拷过去,在拷库的时候用 cp –a libz.* /?./lib 就行,要用上 –a 选项
4. 安装 png 库
这个是用来显示 png 图形的,MiniGUI 里很多图都是 png 的,如果没有这个库,你的 MiniGUI 将无法正常工作,切记切记!库不要用最新的,最新的容易有问题,用这个老一点的就没问题了。
Libpng 不提供有效的 configure 脚本,所以只好自己动手改 Makefile 文件了
[user]# cp scripts/makefile.linux Makefile //把Scripts下的一个makefile 拷出
打开Makefile文件,修改以下部分
CC=nios2-linux-gnu-gcc //修改这里
# where \prefix=/opt/nios2 //修改这里
# Where the zlib library and include files are located #ZLIBLIB=/usr/local/lib #ZLIBINC=/usr/local/include
ZLIBLIB=/opt/nios2/lib //修改这里 ZLIBINC=/opt/nios2/include //修改这里 [user]# make [user]# su
[root]# make install [root]# exit
5. 安装jpeg库
首先在本机上编译一下,主要是它的 configure 文件设计得有问题,得先用 gcc 编译一个 dummy.c 的文件,然后才能后面编译,不然的话就会出现 libtool 找不到之类的错误
[user]# ./configure --enable-shared --enable-static [user]# make
[user]# make clean
[user]# ./configure --prefix=/opt/nios2 CC=nios2-linux-gnu-gcc --enable-shared --enable-static
[user]# make [user]# su
[root]# mkdir –p /opt/nios2/man/man1 [root]# mkdir –p /opt/nios2/ bin [root]# make install [root]# exit
6. 安装 libttf 库
这个是 TrueType 字体的支持库,用来显示文字的。 注意:MiniGUI 的文档说只支持 1.3.1 版本的 ttf 库,不要把版本弄错了 :)
[user]# cd freetype-1.3.1 // 进到目录里去
[user]# mkdir –p libttf/extend // 自己另外建立一个目录 [user]# cp lib/* lib/arch/ansi/* libttf/ // 把有用的东西拷出来
[user]# cp lib/extend/* libttf/extend/ // 把extend目录下的文件也拷出来
注意 cp 命令不要用 –r 选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了 [user]# cd libttf
[user]# nios2-linux-gnu-gcc -c -fPIC -O2 freetype.c // 这个.c文件包括了其它所有的.c 文件
[user]# nios2-linux-gnu-gcc -c -fPIC -O2 -I./ extend/*.c // 把 extend 下所有的 .c 文件全部编译
[user]# nios2-linux-gnu-gcc --shared -o libttf.so *.o // 生成最后的动态链接库 [Root]# mkdir –p /usr/local/nios2/nios2-linux/include/freetype1/freetype [Root]# cp *.h extend/*.h /usr/local/nios2/nios2-linux/include/freetype1/freetype [Root]# cp libttf.so /usr/local/nios2/nios2-linux/lib [root]# exit
7. 编译libminigui
在 libminigui-1.6.10/ 下创建一个脚本文件 buildlib-linux-nios2,输入以下内容:
#!/bin/sh
rm config.cache config.status -f
CC=nios2-linux-gnu-gcc \\ ./configure \\
--prefix=/home/szh/miniGUI/nios2/target \\ --build=i386-linux \\
--host=nios2-unknown-linux \\ --target=nios2-unknown-linux \\ --enable-shared \\ --enable-static \\ --with-osname=linux \\ --with-style=fashion \\ --disable-micemoveable \\ --disable-cursor \\ --enable-newgal \\ --enable-nativegal \\ --enable-galfbcon \\ --enable-fblin4l \\ --enable-textmode \\ --enable-dummyial \\ --enable-autoial \\ --enable-ads7846ial \\ --enable-nativeial \\ --disable-qvfbial \\
--disable-latin9support \\ --disable-big5support \\ --enable-ttfsupport \\ --enable-ttfcache \\ --disable-savebitmap \\ --enable-jpgsupport \\ --enable-pngsupport \\ --disable-imegb2312 \\ --disable-aboutdlg \\ --disable-savescreen \\ --enable-videoshadow \\ --enable-fixedmath \\
[user]# ./buildlib-linux-nios2 [user]# make
[user]# make install
[user]# cd /home/szh/miniGUI/nios2/target [user]# su
[root]# cp –a lib/* /usr/local/nios2/nios2-linux/lib/
[root]# cp –a include/* /usr/local/nios2/nios2-linux/include/ [root]# cp –a etc/* /usr/local/nios2/nios2-linux/etc/ [root]# exit
最后,安装 popt 库,这个库在编译 mde 程序时需要使用,不然编译没法通过 :)
http://gd.tuwien.ac.at/utils/rpm.org/dist/rpm-4.1.x/popt-1.7.tar.gz 我是从这里下载的
[user]# tar zxf popt-1.7.tar.gz [user]# cd popt-1.7 [user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static [user]# make
[Root]# make install
一切很顺利,搞定了。 交叉编译环境设置好了!
OK ,下面是把 minigui 移植到你的板子上去了。
我在 /opt 目录下建立了一个 rootfs 目录,即 /opt/rootfs ,用来建立我的嵌入式系统的根目录,现在我需要把 minigui 的库文件放到里面去,
建立目录
[Root]# mkdir –p /opt/rootfs/usr/local/[lib,etc]
把 /usr/local/arm/2.95.3/arm-linux/lib 中相应的库拷到 /opt/rootfs/usr/local/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 的静态库是不需要拷过去的,我图方便,一起拷了,呵,懒人的做法
同时修改 /opt/rootfs/etc/ld.so.conf ,在里面最后新加入一行 /usr/local/lib
然后执行 [Root] ldconfig –r /opt/rootfs //把 rootfs 当成根目录,执行
OK,库文件准备完毕
下面把资源文件也拷过来,还记得吗,在前面 搭建 PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来
[Root]# cp –r –a /usr/local/lib/minigui /opt/rootfs/usr/local/ 连目录一起拷过来,目录结构和主机一样
把配置文件也拷过来
[Root]# cp /usr/local/etc/MiniGUI.cfg /opt/rootfs/usr/local/etc/ 记住,保持目录结构的一致
修改 MiniGUI.cfg ,如下
[system] # GAL engine
gal_engine=fbcon //这里修改
# IAL engine
ial_engine=dummy // 这里修改,我不知道你会用什么触摸屏,所以就用dummy肯定不会错
mdev=/dev/touchscreen/0raw //解摸屏,如果前面是 dummy ,则这里改不改无所谓 mtype=none
[fbcon]
defaultmode=240x320-16bpp // 根据你的LCD大小自己设置,设置错误minigui 就启动不了
ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生
保存,退出。 OK ,你的板子上的系统也搭建完毕了,现在来让真正的图形界面跑起来!:)
注意:你Build 你的 嵌入式 Linux 内核时,在 Console 中一定要先上 FrameBuffer ,从4位色一直到 16 位色的支持,全选上吧,同时把 VGA TextOut 选项勾掉,不要选它!!!!!!!!!!
内核启动时就要激活 FrameBuffer ,不然 minigui 没法启动起来,激活的方法就是给它传内核参数 vga=xxx 之类的。
3.启动你的 MiniGUI 的图形界面
看看你的 Windows 操作系统,左下方是一个 [开始] 按钮,然后是 任务条 ,MiniGUI 也提供了类似的界面,这就是一个叫 mginit 的程序,它启动后就跟widnows的界面很像了,它就在 mde 包里面,还记得最初让你下载的那个程序包吗?? 现在我们就来安装它!!:)
[user]# tar zxf mde-1.3.0.tar.gz [user]# cd mde-1.3.0
//我们先对 mginit 程序做一点小修改,呵
[user]# cd mginit ; vi mginit.c
在 297 行处,把下面代码注释掉
/*************** AboutMiniGUI (); AboutMDE (); **************/ 保存,退出即可。
因为我们没有 触摸屏 现在,没法点它的 确认 按钮,所以把这些 About 信息去掉:)
好了,现在来编译吧,在mde-1.3.0 目录里
[user]# ./configure --prefix=/opt/rootfs/usr/local --host=arm-linux [user]# make
如果你发现 mginit 目录下的程序没有被编译,那就说明你的 libminigui 配置不正确,记住,你必须是配置为 Lite 模式,这个程序才会被编译
[user]# make install
事实上证明,make install,根本没用,它什么都没做,do nothing 所以还是我们自己动手来做吧,呵
[Root]# mkdir –p /opt/rootfs/usr/local/lib/shared/miniguiapps //建立了一个我们自己的目录,好长,呵
[Root]# cp –r –a mde-1.3.0/* /opt/rootfs/usr/local/lib/shared/miniguiapps
直接全部拷过去,然后到 /opt/rootfs/usr/local/lib/shared/miniguiapps 的各个程序目录下去,比如 mginit , bomb , painter 之类的,把不用的 .c .h .o Makefile 之类的全删除掉,保留 可执行文件和相应的 res 目录下的资源
注意,保持目录的结构,mginit.rc 文件不要删了,这个对mginit 程序很重要
OK,最后一步了,修改配置文件
[Root]# vi /opt/rootfs/linuxrc 文件
一般你配置嵌入式系统的时候都会有这个文件,用来执行一些系统的初始化工作,如果没有,就在你相应的初始化脚本(例如 etc/inittab)中加入下面的语句
mknod /dev/ttyp5 c 3 5 mknod /dev/ptyp5 c 2 5
cd /usr/local/lib/shared/miniguiapps/mginit ./mginit
注意:最后执行 mginit 命令的方式,先进入到它所在的目录,然后再执行,千万不要只写成
/usr/local/lib/shared/miniguiapps/mginit/mginit
因为 mginit 执行时在“当前目录”的res文件夹下搜索显示的资源,这种写法则“当前目录”为 / 根目录,所以会找不到 res 文件夹,于是显示错误 “ Can not create taskbar! ” 就退出了!
如果运行时显示没有 mknod 命令,请检查一下你的 busybox 的配置 :)
切记切记!
好了,一切成功了,现在放到你的板子上去试试吧:)
[Root]# cd /opt
[Root]# mkcramfs rootfs root.cramfs 制作根文件系统镜像,把 root.cramfs 烧到你的板子里面就OK了,启动,就可以看到 minigui 的图形界面启动了 :)
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误
“ Can not attach shared resource ! ”
4.为 minigui 开发程序
环境配好了,现在是开发自己的程序了,呵呵,写个简单的 Helloword 程序 /*
** $Id: helloworld.c,v 1.7 2003/06/13 07:15:49 weiym Exp $ **
** Listing 2.1 **
** helloworld.c: Sample program for MiniGUI Programming Guide ** The first MiniGUI application. **
** Copyright (C) 2003 Feynman Software. **
** License: GPL */
#include
#include
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
switch (message) { case MSG_PAINT:
hdc = BeginPaint (hWnd);
TextOut (hdc, 100, 100, \ EndPaint (hWnd, hdc); return 0;
case MSG_CLOSE:
DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; }
return DefaultMainWinProc(hWnd, message, wParam, lParam); }
int MiniGUIMain (int argc, const char* argv[]) {
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _LITE_VERSION
SetDesktopRect(0, 0, 1024, 768); #endif
CreateInfo.dwstyle = WS_VISIBLE | WS_BORDER | WS_CAPTION; CreateInfo.dwExstyle = WS_EX_NONE; CreateInfo.spCaption = \ CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0); CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc; CreateInfo.lx = 0; CreateInfo.ty = 0; CreateInfo.rx = 320; CreateInfo.by = 240;
CreateInfo.iBkColor = COLOR_lightwhite; CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID) return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) { TranslateMessage(&Msg); DispatchMessage(&Msg); }
MainWindowThreadCleanup (hMainWnd);
return 0; }
#ifndef _LITE_VERSION #include
首先在 PC 上编译,验证通过!
[user]# gcc -o helloword helloword.c -lminigui –lmgext
如果没有错误,运行 qvfb ,按前面说的设置好,然后执行 [user]# ./helloword
一切正常,没有错误,现在就要把它放到我们的 板子上去跑了
[user]# arm-linux-gcc –O2 –o helloword helloword.c –lminigui –lmgext
编译完后,把它烧到板子的某个目录下,就可以在 板子上跑了!
所以这里就是说,minigui 提供了让你在 PC 上就可以调试和运行程序的方法(使用qvfb ),等你保证程序正确了以后,只需要把它重新编译一下,放到板子上去就行了!
5.一些常见的问题
这几天遇到不一些问题,发现论坛上也基本上没人回答我,所以只好自己解决了,这里把一些问题写出来,方便有需要的人:
问题1:在板子上跑的程序都显示 can not find qvfb ? 之类,可是我只是想让它在板子上跑在 FrameBuffer 之上啊?
解决:在编译 libminigui 的时候,把
[ ] Use incore (built-in) resource //建议不要选这个,老有问题
[ ] NEWGAL engine on Qt Virtual FrameBuffer //建议不要选这个,不然老让你用qvfb
问题2:编译的时候老出现 unreferenced to vbf_Courier8x8() 之类的问题
解决:
[ ] Var bitmap font //千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误
问题3:一切都搞定了,可是执行 mginit() 的时候就崩溃了,把所有的寄存器值打印了出来,然后显示了个 Abort() 就退出了!
解决:
[ ] IME (GB2312) Intelligent Pinyin module //千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了
问题4: 为什么我执行 helloword 就显示 “Can not attach shared resource!”
解决:
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误
“ Can not attach shared resource ! ”
问题5:怎么把自己的程序加到 minigui 的 taskbar 上去,并且排在前面??
解决:
查看 mginit 目录下的 mginit.rc 文件,里面就是配置,我想你能看明白的 :)
问题6:为什么我的程序显示 can not find libminigui.so ??
解决:你是否忘了在 etc/ld.so.conf 中加入 /usr/local/lib ,并且执行 ldconfig 程序? 看前面说的方法
好了,就写这么多吧,希望对新手有所帮助!
Singlewolfyu (大漠孤狼) 写于 清华 FIT 4-305 2006-11-7
yuqiang0107@126.com
把我写的另一篇关于 IAL 校正的文章也归并到这个贴子里来,算是做个汇总吧,原贴可以在论坛中搜 singlewolfyu 的文章就可以找到,原贴里有一些我上传的附件,有兴趣可以去下载,这里就不上传了! 希望这篇文章能对大家有用!
带屏幕校正功能的 2410 的 IAL
作者:大漠孤狼 E-MAIL:yuqiang0107@126.com
前几天成功的把 MiniGUI 移植到板子上了,顺利的跑起来了。我用的是 SMDK2410 的 IAL 程序,可是还有一些问题,如下:
1:点在触摸屏上不动,可以见到 Cusor 在点的位置附近老是跳动,而且点的位置不准,
2:经常点 MiniGUI 的菜单或是按钮的时候,MiniGUI 没有反应,经printf 出来,发现菜单有时候收不到 MSG_COMMAND 消息,有时候能收到,就是说很不稳定 3:经常点击触摸屏的手离开后,Cursor 就消失了
经过调试后发现了原因,如下:
1:由于用的触摸屏是比较便宜的那种,所谓便宜没好货,触摸屏的采样很不稳定,我的屏是 3 寸屏,分辨率是 240x320 16-pp 的那种,可是我点击触摸屏从驱动读出来的值却是 900 多,800 多,而且还不是简单的线性关系,比如我点 X 轴 120 处,值为 400 ,我点X轴 239 处值为 900 ,晕死,如果用原来的 SMDK 2410 IAL 程序,根本无法正常工作
2:便宜屏还有个问题,就是在刚开始按触摸屏和快要放手时,这一头一尾两种情况下,采样值根本就是错误的,比如我按在 X 轴 120 处,刚开始得到的值是 230 ,然后是 250,400 ,401,398,403 ??402,100,101 ,这样的序号,可以看到,在刚开始和快结束时采到的值根本是错误的,这就是为什么我说“手一离开触摸屏,Cusor就消失”的原因为了,因为这时候 Cusor 跑到错误的坐标值上去了,当然就消失了
3:经常点 MiniGUI 的菜单却没有响应,其实还是上面 2 的原因,菜单的响应是当你的手离开触摸屏后,会产生一个 MSG_LBUTTONUP 消息,在这个消息中会调用 PtInRect()检查这时候的点击位置是否在菜单上,如果在的话,菜单就会触发一个 MSG_COMMAND 消息,于时菜单就会显示出来,其实 MiniGUI 中对所有的点击都是这样处理的。(自己看看 MiniGUI 的源代码就会明白了)。因为我的便宜屏在手快要离开触摸屏时得到的坐标是错误的,所以这时候 PtInRect() 就会返回错误的值,就好像我点在屏的别的地方了一样,所以这时候菜单根本得不到消息。
根据以上原因,我对 MiniGUI 1.3.3 版本中的 2410 的 IAL 程序进行了修改,使得它在我的 便宜屏 上一样可以正常工作。它提供了去抖动功能,就是点击时一头一尾那两下的不准确的值不能要,同时提供了一个方便的屏幕校准程序,你只需要做小小的修改就可以校准让它在你的 便宜屏 上很好的正常工作了。
新程序的使用方法:
在 2410.c 中定义了两个数组,如下
typedef struct mPoint { int x, y ; } mPOINT ;
static mPOINT ts_position[4]={ {940,926},{940,102},{96,104},{120,940} }; static mPOINT display_position[4]={ {0,0},{0,319},{239,319},{239,0} };
ts_position 意思为 TouchScreen 的 位置 display_position 意思为屏幕上显示的 位置
比如我前面说的,我的屏幕是 240x320 的,我点四个角 {0,0},{0,319},{239,319},{239,0} ,从触屏上读出来的数据分别为 {940,926},{940,102},{96,104},{120,940} ,填入这两个数就行
所以使用方法就是,你自己取四个点(其实只要3个点就够了,呵),点这四个点,得到相应的触摸屏读出来的值,把这些数据填到这两个数组中,OK,你的 触摸屏 就可以正常工作了 :)
后面附一个 readpos.c 的程序,你可以执行它,然后点击触摸屏,它会显示出触摸屏读出来的值。
程序: 2410_带触摸屏校正功能.c /*
** $Id: 2410.c,v 1.4 2003/11/21 12:15:37 weiym Exp $ **
** 2410.c: Low Level Input Engine for SMDK2410 Dev Board. **
** Copyright (C) 2003 Feynman Software. */ /*
** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. **
** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. **
** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include
#include \
#ifdef _SMDK2410_IAL
#include
#include
#include \#include \
typedef struct mPoint {
int x, y ; } mPOINT ;
static mPOINT ts_position[4]={ {940,926},{940,102},{96,104},{120,940}
};
static mPOINT display_position[4]={ {0,0},{0,319},{239,319},{239,0} };
typedef struct Matrix {
/* This arrangement of values facilitates * calculations within getDisplayPoint() */
int An, /* A = An/Divider */ Bn, /* B = Bn/Divider */ Cn, /* C = Cn/Divider */ Dn, /* D = Dn/Divider */ En, /* E = En/Divider */ Fn, /* F = Fn/Divider */ Divider ; } mMATRIX ;
static mMATRIX m_matrix;
int setCalibrationMatrix( mPOINT * display, mPOINT * screen, mMATRIX * matrix) ;
int getDisplayPoint( mPOINT * display, mPOINT * screen, mMATRIX * matrix ) ;
/* for data reading from /dev/ts */ typedef struct {
unsigned short pressure; unsigned short x; unsigned short y; unsigned short pad; } TS_EVENT;
static unsigned char state [NR_KEYS]; static int ts = -1; static int mousex = 0; static int mousey = 0; static TS_EVENT ts_event;
#undef _DEBUG
/************************ Low Level Input Operations **********************/ /*
* Mouse operations -- Event */
static int mouse_update(void)
{
return 1; }
static void mouse_getxy(int *x, int* y) {
#ifdef _DEBUG
printf (\#endif
if (mousex < 0) mousex = 0; if (mousey < 0) mousey = 0; if (mousex > 239) mousex = 239; if (mousey > 319) mousey = 319;
*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 {
fd_set rfds;
int retvalue = 0;
int e;
static int last_pressure=0;
if (!in) {
in = &rfds; FD_ZERO (in); }
if ((which & IAL_MOUSEEVENT) && ts >= 0) { FD_SET (ts, in); #ifdef _LITE_VERSION
if (ts > maxfd) maxfd = ts; #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) {
if (ts >= 0 && FD_ISSET (ts, in) ) { FD_CLR (ts, in); ts_event.x=0; ts_event.y=0;
read (ts, &ts_event, sizeof (TS_EVENT));
if(last_pressure==0) {
read(ts,&ts_event,sizeof(TS_EVENT)); read(ts,&ts_event,sizeof(TS_EVENT)); }
if (ts_event.pressure > 0 ) {
int new_x; int new_y;
mPOINT ts_point,display_point;
ts_point.x=ts_event.x; ts_point.y=ts_event.y;
getDisplayPoint(&display_point,&ts_point,&m_matrix);
new_x = display_point.x; new_y = display_point.y;
if(last_pressure==0 || (last_pressure>0 && abs(new_x-mousex)<7)) mousex=new_x;
if(last_pressure==0 || (last_pressure>0 && abs(new_y-mousey)<7)) mousey=new_y; /*
printf(\printf(\*/
}
#ifdef _DEBUG
if (ts_event.pressure > 0) {
printf (\down: ts_event.x = %d, ts_event.y = %d\\n\ts_event.x, ts_event.y); } #endif
ts_event.pressure = ( ts_event.pressure > 0 ? IAL_MOUSE_LEFTBUTTON : 0);
last_pressure=ts_event.pressure; /*
printf(\*/
retvalue |= IAL_MOUSEEVENT; } }
else if (e < 0) { return -1; }
return retvalue; }
BOOL Init2410Input (INPUT* input, const char* mdev, const char* mtype) {
ts = open (\ if (ts < 0) {
fprintf (stderr, \ return FALSE; }
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;
setCalibrationMatrix(&display_position,&ts_position,&m_matrix); return TRUE; }
void Term2410Input(void) {
if (ts >= 0)
close(ts); }
#endif /* _SMDK2410_IAL */
int setCalibrationMatrix( mPOINT * displayPtr, mPOINT * screenPtr, mMATRIX * matrixPtr) {
int retvalue = 0 ;
matrixPtr->Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
if( matrixPtr->Divider == 0 ) {
retvalue = -1 ; } else {
matrixPtr->An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -
((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
matrixPtr->Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) -
((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ;
matrixPtr->Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y +
(screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y +
(screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].y ;
matrixPtr->Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) -
((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ;
matrixPtr->En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) -
((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ;
matrixPtr->Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y +
(screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y +
(screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].y ; }
return( retvalue ) ;
} /* end of setCalibrationMatrix() */
int getDisplayPoint( mPOINT * displayPtr, mPOINT * screenPtr, mMATRIX * matrixPtr ) {
int retvalue = 0 ;
if( matrixPtr->Divider != 0 ) {
/* Operation order is important since we are doing integer */ /* math. Make sure you add all terms together before */ /* dividing, so that the remainder is not rounded off */ /* prematurely. */
displayPtr->x = ( (matrixPtr->An * screenPtr->x) + (matrixPtr->Bn * screenPtr->y) + matrixPtr->Cn
) / matrixPtr->Divider ;
displayPtr->y = ( (matrixPtr->Dn * screenPtr->x) + (matrixPtr->En * screenPtr->y) + matrixPtr->Fn
) / matrixPtr->Divider ; } else {
retvalue = -1 ; }
return( retvalue ) ;
} /* end of getDisplayPoint() */
Readpos.c 程序,帮助你读取触摸屏的值
#include
typedef struct {
unsigned short pressure; unsigned short x; unsigned short y; unsigned short pad; } TS_EVENT;
static TS_EVENT ts_event;
static int ts;
int main() {
ts = open (\ if (ts < 0) {
fprintf (stderr, \ return 0; }
while(1) {
if( read (ts, &ts_event, sizeof (TS_EVENT))) {
printf(\ } } }
正在阅读:
Minigui移植uClinux04-20
诊所年度工作总结格式03-26
生产部安全警示教育季培训教案05-11
传统时间序列分析10-10
第九章 德育06-19
高二物理寒假作业603-05
第九章02-18
小学六年级语文小升初备考办法(六年级小升初语文专项训练)03-30
《化工原理》(第三版)复习思考题及解答09-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 移植
- Minigui
- uClinux
- 口腔黏膜病学综合整理考试题库
- 2011届浙江省六校高三2月联考
- 生信实验 模拟卷(1)
- 宏观经济学
- 计算结构力学模拟题
- 四年级上册语文学科计划 doc
- 高中化学必修2《重要的有机化合物》精品教案
- 航天二期保温施工方案(修改)7 - 图文
- 2018届高三英语二轮复习专题三阅读理解第一讲细节理解题
- 2016年化学各地中考题分类汇编第12单元化学与生活
- XX竹林种植基地开发建设项目商业计划书
- 施工组织设计(1)
- 2013北林苗圃学重点
- 公司类客户(大型)信用等级评定管理办法
- 大容量注射剂,工艺验证方案
- 二次函数函数的存在性问题(相似三角形)
- 业务与服务支撑认证题库-传输专业(烽火带答案)
- 乳与乳制品营养成分分析
- 植物生理生化-作业题
- 聚乙烯大口径双壁波纹管项目可行性研究报告 - 图文