Minigui移植uClinux.docx
《Minigui移植uClinux.docx》由会员分享,可在线阅读,更多相关《Minigui移植uClinux.docx(21页珍藏版)》请在冰豆网上搜索。
![Minigui移植uClinux.docx](https://file1.bdocx.com/fileroot1/2022-11/27/b62415ff-228d-4a12-8650-d0f136e5b910/b62415ff-228d-4a12-8650-d0f136e5b9101.gif)
Minigui移植uClinux
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]#cdzlib-1.2.3
[user]#CC=nios2-linux-gnu-gccLDSHARED=〝nios2-linux-gnu-ld-shared〞./configure--prefix=/opt/nios2/--shared
[user]#make
[user]#su
[root]#makeinstall
[root]#exit
安装完后检查一下目录/usr/local/nios2/nios2-linux/[include,lib],假如include中没有zlib.h之类的头文件,lib中没有libz.so.1.2.3,那就自己手动拷到这些目录下去,记着拷的时候把所有的*.h 都需要拷过去,在拷库的时候用cp–alibz.*/…./lib 就行,要用上–a选项
4.安装png库
这个是用来显示png图形的,MiniGUI里很多图都是png的,如果没有这个库,你的MiniGUI将无法正常工作,切记切记!
库不要用最新的,最新的容易有问题,用这个老一点的就没问题了。
Libpng不提供有效的configure脚本,所以只好自己动手改Makefile文件了
[user]#cpscripts/makefile.linux Makefile //把Scripts下的一个makefile拷出
打开Makefile文件,修改以下部分
CC=nios2-linux-gnu-gcc //修改这里
#where"makeinstall"putslibpng.a,libpng.so*,png.handpngconf.h
prefix=/opt/nios2 //修改这里
#Wherethezliblibraryandincludefilesarelocated
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/opt/nios2/lib //修改这里
ZLIBINC=/opt/nios2/include //修改这里
[user]#make
[user]#su
[root]#makeinstall
[root]#exit
5.安装jpeg库
首先在本机上编译一下,主要是它的configure文件设计得有问题,得先用gcc编译一个dummy.c的文件,然后才能后面编译,不然的话就会出现libtool找不到之类的错误
[user]#./configure--enable-shared--enable-static
[user]#make
[user]#makeclean
[user]#./configure--prefix=/opt/nios2CC=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]#makeinstall
[root]#exit
6.安装libttf库
这个是TrueType字体的支持库,用来显示文字的。
注意:
MiniGUI的文档说只支持1.3.1版本的ttf库,不要把版本弄错了:
)
[user]#cdfreetype-1.3.1 //进到目录里去
[user]#mkdir–plibttf/extend //自己另外建立一个目录
[user]#cplib/* lib/arch/ansi/* libttf///把有用的东西拷出来
[user]#cplib/extend/* libttf/extend/ //把extend目录下的文件也拷出来
注意cp命令不要用–r选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了
[user]#cdlibttf
[user]#nios2-linux-gnu-gcc-c-fPIC-O2freetype.c//这个.c文件包括了其它所有的.c文件
[user]#nios2-linux-gnu-gcc-c-fPIC-O2-I./ extend/*.c //把extend下所有的.c文件全部编译
[user]#nios2-linux-gnu-gcc--shared-olibttf.so*.o //生成最后的动态链接库
[Root]#mkdir–p/usr/local/nios2/nios2-linux/include/freetype1/freetype
[Root]#cp*.hextend/*.h/usr/local/nios2/nios2-linux/include/freetype1/freetype
[Root]#cplibttf.so /usr/local/nios2/nios2-linux/lib
[root]#exit
7.编译libminigui
在libminigui-1.6.10/下创建一个脚本文件buildlib-linux-nios2,输入以下内容:
#!
/bin/sh
rmconfig.cacheconfig.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]#makeinstall
[user]#cd/home/szh/miniGUI/nios2/target
[user]#su
[root]#cp–alib/*/usr/local/nios2/nios2-linux/lib/
[root]#cp–ainclude/*/usr/local/nios2/nios2-linux/include/
[root]#cp–aetc/*/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]# tarzxfpopt-1.7.tar.gz
[user]#cdpopt-1.7
[user]#./configure--prefix=/usr/local/arm/2.95.3/arm-linux/--host=arm-linux--enable-shared--enable-static
[user]#make
[Root]#makeinstall
一切很顺利,搞定了。
交叉编译环境设置好了!
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]
#GALengine
gal_engine=fbcon //这里修改
#IALengine
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位色的支持,全选上吧,同时把VGATextOut选项勾掉,不要选它!
!
!
!
!
!
!
!
!
!
内核启动时就要激活FrameBuffer,不然minigui没法启动起来,激活的方法就是给它传内核参数vga=xxx之类的。
3.启动你的MiniGUI的图形界面
看看你的Windows操作系统,左下方是一个[开始]按钮,然后是任务条,MiniGUI也提供了类似的界面,这就是一个叫mginit的程序,它启动后就跟widnows的界面很像了,它就在mde包里面,还记得最初让你下载的那个程序包吗?
?
现在我们就来安装它!
!
:
)
[user]#tarzxfmde-1.3.0.tar.gz
[user]#cdmde-1.3.0
//我们先对mginit程序做一点小修改,呵
[user]# cdmginit;vimginit.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]#makeinstall
事实上证明,makeinstall,根本没用,它什么都没做,donothing
所以还是我们自己动手来做吧,呵
[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.oMakefile之类的全删除掉,保留可执行文件和相应的res目录下的资源
注意,保持目录的结构,mginit.rc文件不要删了,这个对mginit程序很重要
OK,最后一步了,修改配置文件
[Root]# vi /opt/rootfs/linuxrc文件
一般你配置嵌入式系统的时候都会有这个文件,用来执行一些系统的初始化工作,如果没有,就在你相应的初始化脚本(例如etc/inittab)中加入下面的语句
mknod/dev/ttyp5c35
mknod/dev/ptyp5c25
cd/usr/local/lib/shared/miniguiapps/mginit
./mginit
注意:
最后执行mginit命令的方式,先进入到它所在的目录,然后再执行,千万不要只写成
/usr/local/lib/shared/miniguiapps/mginit/mginit
因为mginit执行时在“当前目录”的res文件夹下搜索显示的资源,这种写法则“当前目录”为/根目录,所以会找不到res文件夹,于是显示错误
“Cannotcreatetaskbar!
”就退出了!
如果运行时显示没有mknod命令,请检查一下你的busybox的配置:
)
切记切记!
好了,一切成功了,现在放到你的板子上去试试吧:
)
[Root]#cd/opt
[Root]#mkcramfs rootfs root.cramfs 制作根文件系统镜像,把root.cramfs烧到你的板子里面就OK了,启动,就可以看到minigui的图形界面启动了:
)
注意:
因为你的minigui是按Lite模式编译的,如果必须mginit首先运行起来,你其它的程序(比如bomb,或是helloword)才能执行,如果mginit没有运行起来你就执行helloword的话,就会显示错误
“Cannotattachsharedresource!
”
4.为 minigui开发程序
环境配好了,现在是开发自己的程序了,呵呵,写个简单的Helloword程序
/*
**$Id:
helloworld.c,v1.72003/06/1307:
15:
49weiymExp$
**
**Listing2.1
**
**helloworld.c:
SampleprogramforMiniGUIProgrammingGuide
** ThefirstMiniGUIapplication.
**
**Copyright(C)2003FeynmanSoftware.
**
**License:
GPL
*/
#include
#include
#include
#include
#include
staticintHelloWinProc(HWNDhWnd,intmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;
switch(message){
caseMSG_PAINT:
hdc=BeginPaint(hWnd);
TextOut(hdc,100,100,"Hello,world!
");
EndPaint(hWnd,hdc);
return0;
caseMSG_CLOSE:
DestroyMainWindow(hWnd);
PostQuitMessage(hWnd);
return0;
}
returnDefaultMainWinProc(hWnd,message,wParam,lParam);
}
intMiniGUIMain(intargc,constchar*argv[])
{
MSGMsg;
HWNDhMainWnd;
MAINWINCREATECreateInfo;
#ifdef_LITE_VERSION
SetDesktopRect(0,0,1024,768);
#endif
CreateInfo.dwstyle=WS_VISIBLE|WS_BORDER|WS_CAPTION;
CreateInfo.dwExstyle=WS_EX_NONE;
CreateInfo.spCaption="Hello,world";
CreateInfo.hMenu=0;
CreateInfo.hCursor=GetSystemCursor(0);
CreateInfo.hIcon=0;
CreateInfo.MainWindowProc=HelloWinProc;
CreateInfo.lx=0;
CreateInfo.ty=0;
Cr