主流嵌入式 linux 下 gui 解决方案

24
主主主主主 Linux 主 GUI 主主主主 主主主主主主 GUI (graphical user interfaces) 主主主主主主 (GUI), 主主主主主主 . 主主主主主主主主主主主主主主主主主主主 . 主主主主主主 Qt/Embedded 主主主主主主主主主主主主主主主主主主主 Microwindows 主主主主主主 主主主主主主主 主主主主主主主主主主主主 、, MiniGUI 主主 主主 , 主主主主主主

Upload: mckenzie-norton

Post on 13-Mar-2016

195 views

Category:

Documents


0 download

DESCRIPTION

主流嵌入式 Linux 下 GUI 解决方案. 基本概念介绍 GUI (graphical user interfaces) 图形用户界面  (GUI), 图形用户接口 . 为用户提供界面友好的所见所得的操作环境 .  主流解决方案 Qt/Embedded 图形库大而全,能够开发较为复杂的图形系统 Microwindows 项目规模较小、功能较为薄弱,缺乏等三方软件开发的支持 MiniGUI 小巧、灵活 , 源码相对较少. 基本概念. Qt - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 主流嵌入式 Linux 下 GUI 解决方案

主流嵌入式 Linux 下 GUI 解决方案 基本概念介绍

GUI (graphical user interfaces)图形用户界面 (GUI), 图形用户接口 .为用户提供界面友好的所见所得的操作环境 . 

主流解决方案 Qt/Embedded 图形库大而全,能够开发较为复杂的图形系统 Microwindows 项目规模较小、功能较为薄弱,缺乏等三方软件开发的支持 MiniGUI 小巧、灵活 , 源码相对较少

Page 2: 主流嵌入式 Linux 下 GUI 解决方案

基本概念 Qt

Qt 是 Trolltech 公司所开发的一个跨平台 FrameWork 环境 ( 一个运行的平台,有一堆常用的“库” ) 多平台的 C++ 图形用户界面应用程序框架 支持组件编程 (把系统分割成一些组件或设施的一种思想 ,修改项目代码的一些部分不会破坏整个系统 )

Trolltech 跨平台应用程序界面框架 (QT) 嵌入式 Linux 开发的应用程序平台,能够应用到 PDA 和各种移动设备 (Qtopia)

Qt/E Qt 库开发商 Trolltech 公司开发的面向嵌入式系统的 Qt 版本 采用 C++ 封装 丰富的控件资源 较好的可移植性

Page 3: 主流嵌入式 Linux 下 GUI 解决方案

Qt/Embedded Qt/E 实现结构

Qt/Embedded 的底层图形引擎基于 framebuffer 计算机显示存储器的一部分,存放屏幕图像的内容。 framebuffer 是一种驱动程序接口 将显示设备抽象为帧缓冲区 显示内存的一个映像 (用户)

QWSserver 负责事件的服务分发

Qt/Embedded

QWSServer- -图形事件服务

底层硬件平台

Framebuff er 输入设备驱动

Qt/Embedded应用程序

Li nux操作系统

Page 4: 主流嵌入式 Linux 下 GUI 解决方案

Qt/Embedded QPE ( Qt Plamtop Environment )

针对 PDA 软件的整体解决方案 底层的 GUI 系统、 Window Manager 、 Soft Keyboard 上层的 PIM (个人信息管理器 )、浏览器 、多媒体 Qtopia 是基于 QT/Embedded 开发的一个嵌入式的窗口系统和应用程序集

Qtopia 平台组成 Qtopia 库 (Qt/E,libqpe,libqtopia1,qtopiapim) Qtopia server/laucher

控制窗口系统进程间通信发起所有应用和其他核心任务的主要服务程序

Page 5: 主流嵌入式 Linux 下 GUI 解决方案

系统平台介绍 系统平台软件结构图

引导装载程序 vivi 设备驱动(包括帧缓存 fb ) 嵌入式 Linux 内核 文件系统 yaffs (只读 cramfs ,需做修改) 基于 QT/Embedded 和 Qtopia 的用户图形界面以及应用程序

Driver

Hardware Board

vivi

fb cramfs

Arm linux kernel 2.4.18

Qt/Embedded Qtopia

Application

Page 6: 主流嵌入式 Linux 下 GUI 解决方案

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

Page 7: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia 所需要的包

qt-embedded-2.3.10.tar.gz : Qt 的嵌入式版本。 /bin :模拟目标机器的 qvfb 后台程序 , 如 moc 、 qvfb 、 uic /lib : qvfb 上 PC 机模拟运行时需要加载的库文件 libqte.so*

qt-x11-2.3.2.tar.gz : Qt 的 X11 版本 /bin :在 PC 机器上的运行的开发工具和编译程序 ,如 desinger 、 findtr 、 moc 、 uic 等 /lib :源文件编译成 PC 机器 X11 环境下的共享联接库 libqt.so*

qtopia-free-2.1.1.tar.gz :官方网站提供的 Qtopia 免费版。Qtopia 是一个用 Qt/Embedded 开发的程序 :综合的应用程序平台和用户界面

e2fsprogs-1.38.tar.gz :为了得到 qtopia 所需的 uuid.h 和 libuuid.so 。

Page 8: 主流嵌入式 Linux 下 GUI 解决方案

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,1

6,32使 Qtopia 平台支持 jpeg 、 gif格式的图形 指定 Qt 嵌入式开发包( qconfig-local.h )生成虚拟缓冲帧工具 qvfb ,并支持 4 , 8 , 16 , 32 位的显示颜色深度

Page 9: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia 建立本机 Qtopia 虚拟平台

使用 make命令编译 qt-embedded ,用来生成 Qt 库 (libqte.so)

编译 e2fsprogs库文件 libuuid.so 提供 uuid 支持 唯一字符串生成库

编译 libjpeg 、 libpng得到 jpeg/png 图形编码解码程序库 libjpeg.so/ libpng .soqtoppia 需要 Qt/Embedded配置为支持 jpeg 、 gif

配置并交叉编译 Qtopia生成应用程序以及桌面环境

Page 10: 主流嵌入式 Linux 下 GUI 解决方案

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 的源代码)

Page 11: 主流嵌入式 Linux 下 GUI 解决方案

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 (指定模拟器长、宽)

Page 12: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia 建立本机 Qtopia 虚拟平台

测试 Qt/E桌面环境qvfb -width 640 -height 480 &在 qvfb 上加载二进制文件 , 运行程式 . 如 :

./progressbar -qws 建立本机 Qtopia 虚拟平台

在 Virtual framebuffer 中实现 Qtopiacd /root/qtopia/qtopia-2.1.1-host/bin

qvfb &sleep 10./qpe.sh 

qvfb :运行 Qt 的虚拟缓冲帧工具 把显示结果输出到虚拟缓冲帧,出现桌面环境

Page 13: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia qte/qtopia 在 2410s 上的移植

软件环境 PC 机操作系统 REDHAT LINUX 9.0 MINICOM ARM-LINUX 开发环境

配置 NFS (网络文件系统) 使计算机系统通过网络访问其它计算机系统的目录和文件 远程访问控制 修改 etc/export指定文件夹共享可访问 /root/share 192.168.0.* (rw,sync,no_root_squash)

配置minicom 友好易用的串口通信程序 /etc/minirc.dfl中编辑系统范围的缺省值

建立 arm-linux-gcc交叉编译环境 在某个主机平台上(比如 PC 上)用交叉编译器编译出可在其他平台上(比如 ARM上)运行的代码的过程 生成的编译工具在目录 /usr/local/arm/2.95.3/bin 环境:与 PC 机不同的库函数和编译器 Host-〉交叉编译工具链 -〉源代码 -〉二进制文件 -〉目标板可执行

Page 14: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia qte/qtopia 在 2410s 上的移植

交叉编译 e2fsprogs ./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-2.3.10交叉编译环境参数文件使其增加对触摸屏的支持

Page 15: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia qte/qtopia 在 2410s 上的移植

设定 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++ ,表示需要交叉编译,编译的目标平台是 linu

x-arm-g++ 。具体可查看 XPLATFORM 文件。 -qconfig qpe ,表示这次编译是为了支持 QPE ( Qtopia ) , 只会生成

QPE 所需要的库。 -qvfb , qvfb 支持。如果是在开发板上运行,则不需要 qvfb 。 -thread ,是否支持多线程。选择后会生成 libqte-mt.so 库(挺大的)。 生成库文件 libqte.so.2.3.10* File命令检查库文件: file libqte.so.2.3.10

libqte.so.2.3.10: ELF 32-bit LSB shared object, ARM, version 1 (ARM),not stripped

交叉编译 qtopia

Page 16: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia qte/qtopia 在 2410s 上的移植

建立宿主机和开发板的通讯 执行 minicom 重启 nfs /etc/rc.d/init.d/nfs start mount –t nfs –o nolock 192.168.0.155:/root/share /mnt/nfs 所需库文件 copy 到目标板的 /usr/lib 目录 所需其他文件 copy 到指定目录

qte/qtopia 在 2410s 上的移植 使用 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; 驱动程序提供给上层应用程序使用的信息,用来存储触摸屏的返回值

Page 17: 主流嵌入式 Linux 下 GUI 解决方案

项目进度触摸屏坐标确定

触摸屏本身有自己的指标分辨率, 比如 2048*2048 (即它的坐标系),它和我们 LCD 显示屏的坐标系(比如大点的 1024*768 )是两个概念。

通过 ADS 控制器的 SPI/I2C总线读取到的触摸屏的坐标信息,是触摸屏(贴在 LCD 上面很像包装纸的一层薄膜)以它本身坐标原点O (物理的固定的, 4 个边角的某一个)为参考的坐标对( X , Y ) 原理是两个电压值( Nx,Ny ) ,根据触摸屏 X , Y 方向的参考电压,做个线性比较,得到其坐标值( X , Y )

Page 18: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 触摸屏坐标确定

实际使用过程中, 唯一的参考定位是 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   }

Page 19: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 tslib校正原理

触摸动作模拟鼠标动作 传统的鼠标:相对定位系统,只和前一次鼠标的位置坐标有关 触摸屏:绝对坐标系统

绝对坐标系统的特点:每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。

Page 20: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 tslib校正原理

LCD坐标和触摸屏的物理坐标的比较

从触摸屏中读出的是点的物理坐标,其坐标轴的方向、 XY值的比例因子、偏移量、缩放因子都与 LCD坐标不同

Page 21: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 tslib校正原理

使触摸屏坐标和 LCD坐标一一对应,且以插件形式提供附加功能如滤波、防抖。 tslib 的 API 接口

tsdev表示触摸屏设备

fd:打开触摸屏设备的文件描述符 list:指针,依次存放指向 tslib插件的指针

Page 22: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 tslib校正原理

tslib 的 API 接口ts_sample 存放按键消息

x,y:按键的坐标位置(以 LCD坐标系为基准)pressure:按键的轻重程度tv:按键发生的时间

Page 23: 主流嵌入式 Linux 下 GUI 解决方案

项目进度 tslib校正原理

tslib 的函数 ts_open() 打开触摸屏设备 ts_config() 读取触摸屏配置文件并决定加载模块 variance: 限定点击力度方差 dejitter: 去除点击抖动 linear: 将触摸屏上的坐标转换成 LCD 的坐标 ts_close() 释放触摸屏设备及相关资源 ts_fd() 返回打开的触摸屏设备的文件描述符 ts_read() 从触摸屏设备读取采样点坐标

开发板上运行 Calibrate 程序,触摸屏上任何一点的坐标就可以在主机 LCD 屏上回显出来。于是,就采集到了 4 个角的物理坐标 假设是 6.4英寸屏, 640X480 分辨率,则它们的像素坐标分别是( 2

0,20 )、( 20,460 )、 (620,460) 和 (620,20) 。这样,使用待定系数法就可以算出坐标系之间的平移关系。比如: Vx = xFactor*Px + xOffset Vy = yFactor*Py + yOffset

Page 24: 主流嵌入式 Linux 下 GUI 解决方案

Qt/E 、 Qtopia qte/qtopia 在 2410s 上的移植

使用 tslib export TSLIB_CONSOLEDEVICE=none tslib 运行需要的控制台,这里就是 LCD 屏幕 , 设定控制台设备为 none ,否则默认为 /dev/tty, export TSLIB_FBDEVICE=/dev/fb0 指定帧缓冲设备 export TSLIB_TSDEVICE=/dev/touchscreen/0raw 指定触摸屏设备节点文件 export TSLIB_CALIBFILE=/etc/pointercal 指定触摸屏校准文件 pint

ercal 的存放位置 export TSLIB_CONFFILE=/etc/ts.conf 指定 TSLIB配置文件的位置 export TSLIB_PLUGINDIR=$QTDIR/lib/ts 指定触摸屏插件所在路径

校准屏幕( 5点校准) ./ts_calibrate 用户点击从 ts 驱动获得数据 屏上坐标位置

运行 PDA ./qpe