Download presentation
Presentation is loading. Please wait.
1
主流嵌入式Linux下GUI解决方案 基本概念介绍 GUI (graphical user interfaces)
为用户提供界面友好的所见所得的操作环境. 主流解决方案 Qt/Embedded 图形库大而全,能够开发较为复杂的图形系统 Microwindows 项目规模较小、功能较为薄弱,缺乏等三方软件开发的支持 MiniGUI小巧、灵活,源码相对较少
2
基本概念 Qt Qt是Trolltech公司所开发的一个跨平台FrameWork环境 (一个运行的平台,有一堆常用的“库”) 多平台的C++图形用户界面应用程序框架 支持组件编程 (把系统分割成一些组件或设施的一种思想 ,修改项目代码的一些部分不会破坏整个系统 ) Trolltech 跨平台应用程序界面框架 (QT) 嵌入式Linux开发的应用程序平台,能够应用到PDA和各种移动设备(Qtopia) Qt/E Qt库开发商Trolltech公司开发的面向嵌入式系统的Qt版本 采用C++封装 丰富的控件资源 较好的可移植性
3
Qt/Embedded Qt/Embedded的底层图形引擎基于framebuffer framebuffer是一种驱动程序接口
计算机显示存储器的一部分,存放屏幕图像的内容。 framebuffer是一种驱动程序接口 将显示设备抽象为帧缓冲区 显示内存的一个映像 (用户) QWSserver 负责事件的服务分发
4
Qt/Embedded QPE(Qt Plamtop Environment) Qtopia平台组成 针对PDA软件的整体解决方案
底层的 GUI系统、Window Manager、Soft Keyboard 上层的PIM(个人信息管理器 )、浏览器 、多媒体 Qtopia是基于QT/Embedded开发的一个嵌入式的窗口系统和应用程序集 Qtopia平台组成 Qtopia 库(Qt/E,libqpe,libqtopia1,qtopiapim) Qtopia server/laucher 控制窗口系统 进程间通信 发起所有应用和其他核心任务的主要服务程序
5
系统平台介绍 系统平台软件结构图 引导装载程序vivi 设备驱动(包括帧缓存fb) 嵌入式Linux内核
文件系统yaffs(只读cramfs,需做修改) 基于QT/Embedded和Qtopia的用户图形界面以及应用程序 Driver Hardware Board vivi fb cramfs Arm linux kernel Qt/Embedded Qtopia Application
6
Qt/E 、Qtopia 构建GUI时用于 Qt开发的典型工具 tmake:跨平台的Makefile生成器
moc:用于Qt C++扩展的metra-object编译器 designer:用于设计窗口组建的应用程序, (*.ui文件) uic:从界面文件生成代码的用户界面编译器(*.cpp&*.h) qvfb(virtual frame buffer):X窗口用来运行和测试Qtopia应用程序的系统程序。即Qt的虚拟仿真窗口 。 qpe(Qtopia executable):用来处理所有的用户程序界面 所需要的包 tmake tmake-1.13.tar.gz:用来得到tmake工具 /bin: progen工具:生成.pro文件 tmake工具:组织生成Makefile
7
Qt/E 、Qtopia 所需要的包 qt-embedded-2.3.10.tar.gz:Qt的嵌入式版本。
/bin:模拟目标机器的qvfb后台程序,如moc 、qvfb 、uic /lib:qvfb上PC机模拟运行时需要加载的库文件 libqte.so* qt-x tar.gz:Qt的X11版本 /bin :在PC机器上的运行的开发工具和编译程序, 如desinger 、findtr 、moc 、uic等 /lib:源文件编译成PC机器X11环境下的共享联接库 libqt.so* qtopia-free tar.gz:官方网站提供的Qtopia免费版。 Qtopia是一个用Qt/Embedded开发的程序 :综合的应用程序平台和用户界面 e2fsprogs-1.38.tar.gz:为了得到qtopia所需的uuid.h和libuuid.so。
8
Qt/E 、Qtopia 建立本机Qtopia 虚拟平台 设定tmake的环境变量
export TMAKEPATH=/root/qtopia/tmake-1.13/lib/qws/linux-x86-g++ 指定tmake在生成Makefile时使用本机的编译器 注:环境变量的设置非常重要(指定路径、库、头文件) 编译qt-x11 目的:生成moc、uic、qvfb、designer 复制到qt-embedded\bin目录 export QTDIR=$PWD export PATH=$QTDIR/bin:$PATH(指定命令搜索路径 ) export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH(共享库路径 ) 配置qt-embedded编译选项 ./configure -system-jpeg -gif -no-xft -qconfig qpe -qvfb -depths 4,8,16,32 使Qtopia平台支持jpeg、gif格式的图形 指定Qt 嵌入式开发包(qconfig-local.h )生成虚拟缓冲帧工具qvfb,并支持4,8,16,32 位的显示颜色深度
9
Qt/E 、Qtopia 使用make命令编译qt-embedded,用来生成Qt库(libqte.so) 编译 e2fsprogs
库文件libuuid.so提供uuid支持 唯一字符串生成库 编译libjpeg、libpng 得到jpeg/png图形编码解码程序库libjpeg.so/ libpng .so qtoppia需要Qt/Embedded配置为支持jpeg、gif 配置并交叉编译Qtopia 生成应用程序以及桌面环境
10
Qt/E 、Qtopia qtopia目录结构
apps/Applications:应用程序桌面配置文件 apps/Games:游戏桌面配置文件 apps/Settings:系统设置桌面配置文件 bin:二进制可执行文件 configs:编译配置文件目录 doc和docs:qtopia的参考文档 etc:应用配置文件目录 include/qpe:与qtopia相关的头文件目录 inputmethods:输入法 library:qtopia部分源代码目录 pics:与应用相关的图片存放目录 plugins:各种插件目录,如mpeg3解码插件、输入法插件等 sounds:音频文件存放目录 taskbar:桌面程序的源代码(qpe的源代码)
11
Qt/E 、Qtopia 测试Qt/E桌面环境 有源文件progressbar.cpp
指定环境变量TMAKEPATH=…/qws/linux-x86-g++ 使QTDIR指向Qt/Embedded的安装路径以及库 progen –t app.t –o progressbar.pro(生成工程文件.pro) tmake -o Makefile hello.pro(生成Makefile文件) 使用LINUX系统自带的make进行整个程式的编译联接 生成二进制的可执行文件progressbar 运行qvfb来模拟Virtual framebuffer(指定模拟器长、宽)
12
Qt/E 、Qtopia 建立本机Qtopia 虚拟平台 测试Qt/E桌面环境 qvfb -width 640 -height 480 &
在qvfb上加载二进制文件,运行程式.如: ./progressbar -qws 在Virtual framebuffer 中实现Qtopia cd /root/qtopia/qtopia host/bin qvfb & sleep 10 ./qpe.sh qvfb:运行Qt 的虚拟缓冲帧工具 把显示结果输出到虚拟缓冲帧,出现桌面环境
13
Qt/E 、Qtopia qte/qtopia在2410s上的移植 软件环境 配置NFS(网络文件系统) 配置minicom
PC 机操作系统REDHAT LINUX 9.0 MINICOM ARM-LINUX 开发环境 配置NFS(网络文件系统) 使计算机系统通过网络访问其它计算机系统的目录和文件 远程访问控制 修改etc/export指定文件夹共享可访问 /root/share * (rw,sync,no_root_squash) 配置minicom 友好易用的串口通信程序 /etc/minirc.dfl中编辑系统范围的缺省值 建立arm-linux-gcc交叉编译环境 在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程 生成的编译工具在目录/usr/local/arm/2.95.3/bin 环境:与PC机不同的库函数和编译器 Host-〉交叉编译工具链 -〉源代码-〉二进制文件-〉目标板可执行
14
Qt/E 、Qtopia qte/qtopia在2410s上的移植 交叉编译e2fsprogs 交叉编译jpeg、libpng
./configure --enable-elf-shlibs 支持elf共享库(linux标准可执行程序格式 ) --host=arm-linux 指定目标机类型 --with-cc=/usr/local/arm/2.95.3/bin/arm-linux-gcc 指定编译器 --with-linker=/usr/local/arm/2.95.3/bin/arm-linux-ld 指定连接 --prefix=/usr/local/arm/2.95.3/arm-linux 指定安装路径 交叉编译jpeg、libpng 需要修改Makefile文件 交叉编译zlib 一个压缩解压程序库 提供库libz.so* 交叉编译tslib 是一个触摸屏的库,它提供诸如滤波、去抖、校准之类的功能,为不同的触摸屏提供了一个统一的接口 提供触摸屏共享库libts.so等 修改qte 交叉编译环境参数文件使其增加对触摸屏的支持
15
Qt/E 、Qtopia qte/qtopia在2410s上的移植 交叉编译Qt/Embedded 交叉编译qtopia
设定tmake的环境变量 export TMAKEPATH=/root/qtopia/tmake-1.13/lib/qws/linux-arm-g++ 指定交叉编译器 交叉编译Qt/Embedded ./configure -xplatform linux-arm-g++ -qconfig qpe -qvfb -thread -system-jpeg –tslib -system-zlib -system-libpng -gif -depths 4,8,16,32 -xplatform linux-arm-g++,表示需要交叉编译,编译的目标平台是linux-arm-g++。具体可查看XPLATFORM文件。 -qconfig qpe,表示这次编译是为了支持QPE(Qtopia),只会生成QPE所需要的库。 -qvfb,qvfb支持。如果是在开发板上运行,则不需要qvfb。 -thread,是否支持多线程。选择后会生成libqte-mt.so库(挺大的)。 生成库文件libqte.so * File命令检查库文件:file libqte.so libqte.so : ELF 32-bit LSB shared object, ARM, version 1 (ARM),not stripped 交叉编译qtopia
16
Qt/E 、Qtopia qte/qtopia在2410s上的移植 建立宿主机和开发板的通讯 执行 minicom
重启nfs /etc/rc.d/init.d/nfs start mount –t nfs –o nolock :/root/share /mnt/nfs 所需库文件copy到目标板的/usr/lib目录 所需其他文件copy到指定目录 使用tslib 修改目标机/etc/profile文件 export TSLIB_TSEVENTTYPE=H3600 对tslib中的设备结构体定义 基于src/ts_read_raw.c文件:查看触摸屏驱动程序数据结构,保证一致 typedef struct { unsigned short pressure; unsigned short x; unsigned short y; unsigned short pad; } TS_RET; 驱动程序提供给上层应用程序使用的信息,用来存储触摸屏的返回值
17
项目进度 触摸屏坐标确定 触摸屏本身有自己的指标分辨率, 比如2048*2048(即它
的坐标系),它和我们LCD显示屏的坐标系(比如大点的1024*768)是两个概念。 通过ADS控制器的SPI/I2C总线读取到的触摸屏的坐标信 息,是触摸屏(贴在LCD上面很像包装纸的一层薄膜)以它 本身坐标原点O(物理的固定的,4个边角的某一个)为参 考的坐标对(X,Y) 原理是两个电压值(Nx,Ny),根据触摸屏X,Y方向的参 考电压,做个线性比较,得到其坐标值(X,Y)
18
项目进度 触摸屏坐标确定 实际使用过程中, 唯一的参考定位是LCD屏的坐标系(x,y), tslib就是把两个2维线性坐标系通过几个样值的比较,对应转换, 即(X,Y)--->(x,y) (1)计算程序,调用LCD显示驱动程序,在LCD上打印几个光标,选择方便计算的,比如( x1,y1),(x2,y2)... (2) 触摸屏驱动程序应该还没有设计完成, 这里只需要做到其触摸屏控制器初始化函数、坐标数据读取函数和相应的点击中断程序工作就可以了。分别点击这些点,程序中读出这些点对应的触摸屏坐标值(X1,Y1),(X2,Y2)... (3) 这时候,就可以得到了两个坐标系的对应关系,具体就是代入程序中读到的采样值求解下面对应方程的6个系数(a,b,c,d,e,f): { x=aX+bY+c, y=eX+fY+g }
19
项目进度 tslib校正原理 触摸动作模拟鼠标动作 传统的鼠标:相对定位系统,只和前一次鼠标的位置坐标有关 触摸屏:绝对坐标系统
绝对坐标系统的特点:每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题: 漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。
20
项目进度 tslib校正原理 LCD坐标和触摸屏的物理坐标的比较
从触摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量、缩放因子都与LCD坐标不同
21
项目进度 tslib校正原理 使触摸屏坐标和LCD坐标一一对应,且以插件形式提供附加功能如滤波、防抖。 tslib的API接口
tsdev表示触摸屏设备 fd:打开触摸屏设备的文件描述符 list:指针,依次存放指向tslib插件的指针
22
项目进度 tslib校正原理 tslib的API接口 ts_sample存放按键消息 x,y:按键的坐标位置(以LCD坐标系为基准)
pressure:按键的轻重程度 tv:按键发生的时间
23
项目进度 tslib校正原理 tslib的函数
ts_open() 打开触摸屏设备 ts_config() 读取触摸屏配置文件并决定加载模块 variance: 限定点击力度方差 dejitter: 去除点击抖动 linear: 将触摸屏上的坐标转换成LCD的坐标 ts_close() 释放触摸屏设备及相关资源 ts_fd() 返回打开的触摸屏设备的文件描述符 ts_read() 从触摸屏设备读取采样点坐标 开发板上运行Calibrate程序,触摸屏上任何一点的坐标就可以在主机LCD屏上回显出来。于是,就采集到了4个角的物理坐标 假设是6.4英寸屏,640X480分辨率,则它们的像素坐标分别是(20,20)、(20,460)、(620,460)和(620,20)。 这样,使用待定系数法就可以算出坐标系之间的平移关系。比如: Vx = xFactor*Px + xOffset Vy = yFactor*Py + yOffset
24
Qt/E 、Qtopia qte/qtopia在2410s上的移植 使用tslib
export TSLIB_CONSOLEDEVICE=none tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty, export TSLIB_FBDEVICE=/dev/fb 指定帧缓冲设备 export TSLIB_TSDEVICE=/dev/touchscreen/0raw 指定触摸屏设备节点文件 export TSLIB_CALIBFILE=/etc/pointercal 指定触摸屏校准文件pintercal的存放位置 export TSLIB_CONFFILE=/etc/ts.conf 指定TSLIB配置文件的位置 export TSLIB_PLUGINDIR=$QTDIR/lib/ts 指定触摸屏插件所在路径 校准屏幕(5点校准) ./ts_calibrate 用户点击从ts驱动获得数据 屏上坐标位置 运行PDA ./qpe
Similar presentations