MiniGUI-1.6.10在mini2440上的移植
经过不少周折,终于把MiniGUI-1.6.10在mini2440上移植成功了。不敢独享,特把详细的移植过程编辑成文档在此发布,希望对大家有所帮助。点击此处下载 ourdev_466934.pdf(文件大小:376K) (原文件名:MiniGUI-1.6.10在mini2440上的移植.pdf)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466949.jpg
(原文件名:port.jpg)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466950.jpg
(原文件名:port2.jpg)
相关的源码包:
点击此处下载 ourdev_466939.rar(文件大小:6.91M) (原文件名:MiniGUI-1.6.10.rar)
点击此处下载 ourdev_466940.rar(文件大小:3.46M) (原文件名:MiniGUI-1.6.10依赖库.rar)
点击此处下载 ourdev_466941.rar(文件大小:778K) (原文件名:qvfb-1.1.tar.gz.rar,下载后把.rar去掉)
相关资料:
点击此处下载 ourdev_466942.pdf(文件大小:2.75M) (原文件名:《MiniGUI 编程指南》V2.0.4 1.6.10.pdf)
点击此处下载 ourdev_466943.pdf(文件大小:833K) (原文件名:《MiniGUI 用户手册》V2.0.4_1.6.10 .pdf)
点击此处下载 ourdev_466944.pdf(文件大小:184K) (原文件名:Datasheet for MiniGUI V3.0.pdf)
点击此处下载 ourdev_466945.pdf(文件大小:2.03M) (原文件名:MiniGUI 技术白皮书 for V2.0.4_1.6.10 .pdf)
点击此处下载 ourdev_466946.pdf(文件大小:359K) (原文件名:MiniGUI 特性说明书 概要设计.pdf)
点击此处下载 ourdev_466947.pdf(文件大小:374K) (原文件名:minigui-datasheet-2.0-4c.pdf)
点击此处下载 ourdev_466948.rar(文件大小:205K) (原文件名:minigui-1_6_10在ARM上的移植.rar)
目前在mini2440开发板上测试通过,其实在其他开发板上也是类似,只是运行时配置文件可能有所不同而已。 占楼 好 听课 楼主顶你,能否上传视频演示?多谢 thank you very much 下面是配置文件,资源文件和我编译好的库文件,可以直接使用,不必亲自编译。
配置文件MiniGUI.cfg在修改后可以放在以下目录中的一个:
1--应用程序当前目录下的 MiniGUI.cfg 文件
2--用户主目录下的 .MiniGUI.cfg 文件
3--/usr/local/etc/MiniGUI.cfg
4--/etc/MiniGUI.cfg
点击此处下载 ourdev_467557.rar(文件大小:8K) (原文件名:MiniGUI.cfg)
资源文件放在/usr/local/lib/minigui目录中
点击此处下载 ourdev_467558.rar(文件大小:2.82M) (原文件名:minigui_res.tar.gz)
下面的压缩包包含MiniGUI运行和编译所需的全部库文件,是在Redhat9上使用arm-linux-gcc-3.3.2编译而成,可以直接放在放在/lib目录下。
点击此处下载 ourdev_467559.rar(文件大小:11.00M) (原文件名:minigui_all_lib.tar.gz)
下载后记得把文件名修改过来,上面所指的目录均为开发板上的根文件系统中的目录。 感谢分享,很详细的帮助。谢谢! 谢楼主,没下先顶了。 谢谢楼主 make 一下 mark mark 为什么只有mark?我费了一天的时间整理,都是经过试验的啊! 感谢楼主 大牛,还么时间搞这个,屏买回来弄2410 mark~ 感谢楼主 学习了^_^ 我也共享一个在EASYARM2200和SMARTARM2200上移植成功的MiniGUI for ecos吧!
其实没有LCD屏也可以玩各种GUI,利用虚拟桌面技术。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469645.gif
(原文件名:用SMARTARM2200玩魂斗罗1.gif)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469646.gif
(原文件名:用SMARTARM2200玩魂斗罗2.gif)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469647.gif
(原文件名:远程虚拟桌面技术.gif)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469648.gif
(原文件名:same游戏(MiniGUI版本).gif)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469649.gif
(原文件名:housekeeper游戏(MiniGUI版本).gif)
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_469650.gif
(原文件名:画图程序painter。可以用鼠标画任意线状图。.gif)
**************************
* 第九讲 图形用户接口GUI *
**************************
2007/02/25asdjf@163.comwww.armecos.com
有了操作系统、TCP/IP协议栈、文件系统,再加上GUI就比较全面了。本节讲述MiniGUI在ecos上的移植。
MiniGUI是一款开源的GUI中间件,它将鼠标、键盘等设备驱动抽象为输入抽象层IAL引擎,将各种显示设备驱动抽象成图形抽象层GAL引擎,用户基于MiniGUI接口开发的程序可以跨平台使用。本来,最新版本的MiniGUI已经支持ecos了,但我使用的是MiniGUI学习版软件(MiniGUI-STR),它是MiniGUI的精简版本,只支持Linux和uClinux操作系统,此外还缺少许多高级特性。我用的开发板是SMARTARM2200,LCD驱动可以直接拿来使用,但我要玩扫雷,需要自己写鼠标和键盘驱动,为此,在移植上下了一番功夫。
MiniGUI属于中间件,它屏蔽了各种操作系统平台的差异,目前可以在Linux、uClinux、ecos、VxWorks、ThreadX、uC/OS-II等操作系统上运行,可以配置成三种运行模式:
1、MiniGUI-Threads程序可以在不同线程中建立多个窗口,但所有窗口在同一个地址空间中运行。ecos、uC/OS-II、VxWorks就适合使用这种模式,根据MiniGUI作者的实际应用经验,ecos操作系统在一定程度上可以用来替代传统实时嵌入式操作系统。
2、MiniGUI-LiteC/S结构,每个程序是单独的进程,每个进程也可以建立多个窗口,适合于具有完整UNIX特性的嵌入式操作系统,例如:Linux。MiniGUI作者特别指出,要清楚嵌入式Linux/uClinux的方案并不是万能的。由于Linux/uClinux在实时性等方面的缺陷,使得它还不能用来开发对实时性、性能、成本等因素非常敏感的嵌入式产品。
3、MiniGUI-Standlone不需要多线程/多进程的支持,独立运行,有些操作系统,例如uClinux,因某种原因缺少线程库支持,或者发现其线程库存在缺陷时适用这种模式。(MiniGUI作者就为uClinux的库缺陷头疼不已,某些调用就是不能正确运行,没办法,想出这么一招解决问题,呵呵。)
现在,我们已经知道ecos使用MiniGUI-Threads运行模式,下面就可以动手移植了,不过在移植前很有必要了解一下MiniGUI的工程组织方式。MiniGUI工程(MiniGUI库本身及示例程序包)是通过GNU的Automake/Autoconf脚本组织的。现在的各种自由软件,如:Apache、MySQL等都是利用Automake/Autoconf实现自动配置和编译的。用户只需要./configure、make、install这三条命令就可以把程序或函数库编译并安装到系统中。其中,configure是自包含的,也就是说用户不需要安装Automake/Autoconf环境就可以直接运行,就象用rar生成的自解压文件解压时不需要rar软件一样。configure是用脚本语言写的,可以独立运行,只有开发者生成configure文件时才需要Automake/Autoconf环境。
也许上面的论述令你感到复杂,其实核心思想就是要得到各个目录下的Makefile文件和一个config.h配置头文件。Makefile文件描述了各个文件之间的依赖关系、编译规则、编译选项和配置参数。config.h使用宏定义的方法给出了具体的配置参数。知道这么多足够了,就是这么简单,如果你对工程组织方式不感兴趣,现在就可以跳过这一段。因为MiniGUI要运行在各种平台上,所以不可能写一个固定的Makefile和配置文件,为了能自动探测平台环境,自动生成Makefile和config.h,需要编写configure脚本,但是手工写configure脚本太累了,有人就发明了自动生成工具Autoconf。使用者只要书写config.h.in和Makefile.in就可以自动生成configure脚本,工作量减轻了不少。但是手工写.in文件还是嫌累,那么可以用Autoscan从源文件中抽取与函数调用和头文件有关的信息,生成configure.scan,以此为框架手写configure.in,避免疏漏,然后用Autoheader读入configure.in生成config.h.in。编写Makefile.am,使用Automake生成Makefile.in。通过这么一系列的自动化过程,开发人员只要写很少的代码就可以生成复杂的Makefile和自动化配置软件。综上,复杂化的原因是软件自动化配置引起的,好在我们只是针对SMARTARM2200板子上的ecos做MiniGUI移植,环境是固定的,第一次configure配置生成Makefile和config.h后只需关心这几个文件就行了。
首先,我们要准备ecos库,选择net模板(其支持posix兼容层),添加ROMFS和RAMFS包,为后面的编译工作准备*.h文件。
从学习版光盘中拷贝或者从www.minigui.com网站下载以下文件:
libminigui-str-1.6.2.tar 源程序库
minigui-res-str-1.6.tar 资源文件:图标、光标、BMP图片、字体库、输入法
mg-samples-str-1.6.2.tar 示例程序
mde-str-1.6.2.tar 小游戏:扫雷等
将以上文件解压缩到同一个目录下,如:/t。修改各个configure配置选项,为了避免每次重复输入,可以把命令写入build文件。
#!/bin/sh
rm config.cache config.status -f
ECOS_DIR=/tmp/untitled_install
CC=arm-elf-gcc \
CFLAGS="-g -D__ecos__ -DEMBED -I ${ECOS_DIR}/include -I /tmp/minigui_lib/include" \
LDFLAGS="-L ${ECOS_DIR}/lib -Ttarget.ld -nostdlib -L /tmp/minigui_lib/lib" \
./configure \
--prefix=/tmp/minigui_lib \
--build=i386-elf \
--host=arm-elf \
--target=arm-elf \
--with-osname=ecos
配置相应的头文件位置、库文件位置、编译前缀等。操作系统选择ecos。
然后运行make,根据出错情况修改源文件,主要是头文件没找到,函数不存在等错误。
如果头文件不存在就注释掉对应的include,没有getpwuid函数,直接用“/”目录替代,没有random和srandom函数就用下面的方法替代:
#definesrandomsrand
#definerandom rand
总之就是调试,然后发现问题逐一解决。没有想象中的复杂,MiniGUI组织得很好,基本上只是一些小改动,或者删除,或者调整配置,本来MiniGUI就支持ecos嘛!
然后加入GAL和IAL,刚开始调试程序先把图像显示出来再说,IAL先不移植,直接使用dummy驱动。其实也不用移植,SmartARM板子的LCD驱动已经写好了,拿来就能用。不过不符合ecos规范,还可以进一步优化,基于ecos的线程效率高些,命名规则和移植性好,多少改改吧。
为了运行MiniGUI应用程序,我们还需要准备文件系统和运行时配置文件以及资源文件。
一般,需要将这些文件存放到ROMFS文件系统里。我们配置的ecos支持romfs,ROMFS文件系统有两种实现方法:1、用程序头文件实现,作成数组放到H文件里,由编译器决定地址;2、用ROM映像实现,使用固定的flash地址。ecos提供了三个ROM文件系统制作工具:
mk_romfs.exe 将romfs目录转化成BIN
file2c.tcl 将BIN转化成H文件
gen 批处理,从目录直接生成H文件
先准备好文件目录:
/etc
MiniGUI.cfg MiniGUI运行时配置文件
/res
app MiniGUI应用程序资源
bmp BMP图片
cursor 光标图形
font 字体库
icon 图标
imetab 输入法
res资源文件直接由minigui-res-str-1.6安装,app应用程序资源由用户指定,MiniGUI.cfg中要配置相关项:
# GAL engine
gal_engine=commlcd 使用commlcd的LCD驱动图形引擎
# IAL engine
#ial_engine=dummy 使用dummy输入引擎,即无输入设备
ial_engine=pcsim 使用pcsim键盘鼠标仿真输入引擎
指定字体资源路径
fontfile0=/res/font/8x16-iso8859-1.bin
fontfile0=/res/font/Courier-rr-10-15.vbf
指定光标资源路径
cursorpath=/res/cursor/
指定图标资源路径
iconpath=/res/icon/
指定BMP图形资源路径
bitmappath=/res/bmp/
指定输入法资源路径
imetabpath=/res/imetab/
指定应用程序资源路径
apprespath=/res/app
其他没有写出的项使用缺省值或进行类似设置。这样MiniGUI就可以知道各种资源被保存到了什么地方,使用什么输入输出引擎等等信息,此信息是运行时才确定的。
在cygwin中使用$ mk_romfs -v ./romfs minigui.bin将romfs目录制作成ROMFS文件系统映像minigui.bin,
在redboot中用lo -b 0x81010000 -r -h 192.168.0.1 minigui.bin下载映像到RAM中,
在redboot中用fis create -b 0x81010000 -l 0x160000 minigui将RAM中的映像烧写到flash中,并命名为minigui,
用fis list查看到redboot把此映像自动分配到了0x80020000地址。
在程序中定义CYGNUM_FS_ROM_BASE_ADDRESS为0x80020000,就可以使用这个ROMFS了。
如果想用头文件的方式实现,只要用file2c.tcl就可以转换为C头文件,如下:
sh file2c.tcl minigui.bin miniguifs.h(或者直接用gen从目录生成H文件)
把这个头文件包含在C应用程序里,并将ROMFS挂装在这个数组上即可。不过这样每次更改目录/文件都要重新编译程序。
现在可以编译调试bomb程序了,可以看到液晶屏上显示出扫雷的图片,不过速度比较慢,刷屏的过程看得很清楚,可以看到一列一列摆放地雷的过程,不过这对于了解程序运行过程有好处。
图像显示正确后,就可以加入鼠标和键盘驱动了。一种方法是编写USB键盘和USB鼠标驱动;另一种是用PC机串口模拟。两种方法都支持,本讲只介绍后一种,另一个在USB host章节再说。
上位机
用PC机串口模拟鼠标键盘输入,上位机模拟程序用VC编写,在窗口内移动鼠标、按下/抬起按键或者有键盘输入时,模拟程序会从串口发送数据,格式为:
鼠标: 1LMRxxyy 0xxxxxxx0yyyyyyy
键盘: 11111111 0000000k0kkkkkkk
因为屏幕是240*320大小,所以用9位数就可以表示x、y坐标,L、M、R分别表示左中右按键情况,对应位为1表示按下,为0表示抬起,第一字节最高位为1,其他字节最高位为0,以便识别开始。键值用8位表示,第一字节为0xFF。
为了防止鼠标移出窗口,使用ClipCursor(&Rect)将鼠标限制在窗口内。
在CMainFrame::PreCreateWindow内修改窗口属性,使其显示240*320大小。
在OnLButtonDown/OnLButtonUp/OnRButtonDown/OnRButtonUp/OnMouseMove内记录鼠标位置和鼠标按键状态。
在OnCreate内打开串口,设置波特率等属性,创建一个50ms定时器。
在OnChar里判断输入键值。用GetKeyState函数查看指定虚拟键的状态,该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换)。
在OnTimer里定时向串口发送经过编码的鼠标和/或键盘信息。
下位机
MiniGUI等待鼠标键盘事件(中断),当发生事件时更新坐标值和/或读入键值。在ecos中使用select原语提供多个事件同时等待,select支持阻塞等待,等待期间不浪费系统资源。read原语使用非阻塞调用方式(non-blocking),因此ecos配置时要选:
serial device drivers
support non-blocking read and write calls
注意:因为占用了串口0,所以printf在后面就不能使用了,超级终端也要关闭,以免冲突。
使用open ("/dev/ser0", O_RDONLY|O_NONBLOCK)打开串口,read读串口,select等待事件,解码出x、y坐标,LMR状态和键盘键值,就能够实现MiniGUI输入引擎。因为窗口大小是240*320的,而且鼠标被锁定在窗口内,所以,可以不用看PC屏幕,直接参照LCD屏幕鼠标指针位置移动鼠标/键盘输入,实验证明,鼠标指针的反映是及时的,只是在初始化时有比较明显的延时。
执行示例程序painter,可以用鼠标画线,反映稍微有一点延迟,换个高速CPU就能解决问题。
所有的C文件都能编译通过后,就可以开始加到ecos组件仓库里了。去掉所有多余文件,只保留源文件、Makefile文件、config.h头文件,做个简单的CDL脚本,一个minigui模板,就可以开始编译库了。这样,MiniGUI就成了我们系统的一个组件,用的时候只要配置裁减一下就可以了,再也不必关心编译问题了。
MiniGUI模仿了Windows的消息驱动机制,对于理解Windows工作原理很有好处。MiniGUI的体积在嵌入式里有点偏大(有点偏向桌面系统的迹象),但经过裁减和在ecos上的移植,还是实用的轻量级GUI。加上BUG的不断减少,更多软件的加入(如浏览器等),MiniGUI还是值得使用的。 顶楼主!好资料啊 请问楼主:我现在用的ubuntu 9.04 linux操作系统,gcc的版本是4.43,可否编译Minigui? 当然可以。 看看 因为显卡驱动原因,我把redhat9内核从2.4升级到2.6了,不知道是不是配置选项没选好,出来的新内核不能挂载光驱和vfat,而且启动的时候,一些USB设备例如键盘鼠标报错,iptables出错,不知道楼主知不知道原因?
我手动挂载光驱模块也不行~
mount -t -iso9660 /dev/cdrom /mnt/cdrom报错
modprobe cdrom 也不行
mount -t vfat /dev/hdb6 /mnt/win 挂载fat32 失败
在2.4内核下面是好的~
ls -l /dev/cdrom
发现/dev/cdrom->/dev/hda 升级的主要原因是新ati显卡驱动要求内核至少是2.6的,升级后显卡倒是正常工作了,声卡却总是不能正常工作,我按照网上的方法加载alsa声卡模块,不管在2.4内核还是2.6内核底下都没有成功,在make driver的时候总是报错,问题多多啊~不知道楼主搭建的开发环境是怎么样的? 请问楼主;我在编译mg-samples-str-1.6.2 时出错,不知道怎么解决,错误如下:
t -f 'listbox.c' || echo './'`listbox.c
listbox.c: In function `fill_boxes':
listbox.c:146: `DIR' undeclared (first use in this function)
listbox.c:146: (Each undeclared identifier is reported only once
listbox.c:146: for each function it appears in.)
listbox.c:146: `dir' undeclared (first use in this function)
listbox.c:154: warning: implicit declaration of function `opendir'
listbox.c:157: warning: implicit declaration of function `readdir'
listbox.c:157: warning: assignment makes pointer from integer without a cast
listbox.c:162: dereferencing pointer to incomplete type
listbox.c:169: dereferencing pointer to incomplete type
listbox.c:173: dereferencing pointer to incomplete type
listbox.c:180: warning: implicit declaration of function `closedir'
make: *** Error 1
make: Leaving directory `/minigui/source/x86/mg-samples-str-1.6.2/src'
make: *** Error 1
请问楼主老大这是何原因引起的? 为什么这个‘DIR’没有定义?该如何处理? 好东西阿,真好需要,收藏了 mark 狂顶!!!!! 顶,mark mark 老大出来帮忙解决问题呀! mark 要学的太多了!!!!!!!!!! 强帖mark minigui 还是不错的。现在arm7下用的是ucgui,以后arm9了肯定要用minigui。先收起来。 mark mark LZ辛苦了,整理的非常的好!谢谢! mark XIEXIE.... 顶,好东西 mark mark mark 看看 楼主再移植QTE吧,我喜欢QT! 马克吐烟 楼主太好了,这么详细的文档 mark 真是好东西 顶一个,赞一个 mark mark 顶 吐血支持 ding!好样的。 LZ辛苦了。
挥泪感激~~ 顶 在 MARK MARK 请问LZ为何不移植minigui3.0高版本的? 楼上的你有3.0的代码吗? mark 最近对GUI感兴趣中。 学习个! mark mark very good. mark mark~ 楼主费心了,非常感谢你提供的资料~~~很齐全~~~ mark要用时,再看看 回复【27楼】jy6715
-----------------------------------------------------------------------
出现这种情况很大程度上是你之前的依赖库编译出现了问题 mark MARK MARK 回复【楼主位】superyongzhe 最后的骑士
-----------------------------------------------------------------------
dddddd MARK mark,以后学习 mark 有时间也搞一把! mark 好东西啊。怎么下载 记号 mark 再顶一把,我在Fedora12上实践了一下,非常好,移植文档写的非常详细 mark. 好东西,有空学习一下 顶了 mark 好东东 mark 好好记录一下 mark mark!~ mark 谢谢!好东西,先mark。