|
经过几天的痛苦挣扎,我终于在skyeye下看到了我们项目的开发的软件的GUI界面,秉承GPL精神,在此将我这几天移植的经历简述一下。
所用试验平台:
skyeye 0.8.6 + testsuit 2.3 + minigui 1.3.3 + busybox 1.1.3
虚拟硬件平台为EP7312
解释下:
1. 为什么用 0.8.6,因为刚开始我用最近的版本,发现编译出来的ep7312的armlinux内核没法跑,总是停留在一个set start addrees to 。。。的地方就不动了,这个问题搞我很恼火,网上也没人给出解决的办法,于是我就是索性退回去,选择了在minigui指导书上推荐的0.8.6版本。奇怪的是,我的内核竟然在这个版本上面可以跑,于是我就一直用这个旧的版本。(后面,实际上,我自己的内核由于遇到添加LCD和TS驱动无法编译的问题,就直接拿了testsuit中的ep7312的内核,该内核与我的配置是一致的)
2.为什么用busybox,干嘛不直接更改testsuit中现成的romfs,我开始就是这个方法,可是我把它挂载在一个目录,然后把该目录下所有东西拷到另一个目录,再将该目录打包成romfs.img,可以同样的一套根文件系统,我用这个新的img去引导,系统起来后,却总是提示找不到console,很是邪门。于是我就索性按照minigui指导书上的用了busybox,我选的是 1.1.3,不要选1.00, bug太多。
3.第一次配置时,最好去minigui网站上下一本学习指导,可以对照的写一些配置文件。
下面切入正题………………
第一步:安装skyeye,网上有0.8.6的下载,注意这个版本的安装方法和新版的不同,具体的看它的readme。
第二步:准备linux系统,安装arm-linux交叉编译工具,去skyeye的网上下载linux-2.4.13-patched-for-EP7312以及armlinux4skyeye-v0.2.3,前者是armlinx内核源码,后者是针对minigui试验指导书上提到的ep7312的LCD和TS的驱动程序,在本试验中,我们也是选用的这个平台。
第三步:准备系统内核,我开始选择的是自己编译,后面发现一旦加入了虚拟终端和fb后,编译总是过不去,其实testsuit里面有一个带lcd支持的ep7312的内核,就在其根目录下的linux/ep7312/目录下,在用户目录下新建一个minitest的目录,将内核vmlinux,skyeye.conf拷贝到里面。
第四步:准备根文件系统,下载busybox 1.1.3,编译完后,在用户目录下建立目录minitest/romfs,执行- make PREFIX=~/minitest/romfs install
复制代码 将文件系统目录安装到romfs目录下,然后其他的操作按照minigui试验指导书做,这个过程中还要几点不一样的地方需要说明:
(1).在根文件下的/dev建立设备文件时候与指导书有所不同,具体的按照下面的建立:
(2).inittab文件的第66行前面添加ttyAM0,否则启动后会提示无法打开tty(不是什么大碍,也不会影响使用,但看起来总是不爽),改后为- ttyAM0::askfirst:-/bin/sh。
复制代码 (3)在编译busybox时候在build options里面的CFLAGS option里面要添加你的armlinux的头文件目录,如-I/usr/src/armlinux/include/,否则在编译如mount这样一些命令的时候会报错。
(4)编译时候,ls,cat,mount,mkdir,umount,hostname这几个命令是必须选的,因为在启动rcS文件中会用到这些命令,shell的格式建议选ash,还有在shell选项中把tab自动完成也要选上。
所有工作搞定后,可以执行如下命令- genromfs -d romfs -f romfs.img
复制代码 制做根文件系统镜像,更改skyeye.conf文件,将原来开启LCD的那行代码注释掉,重新写一行(为了和0.8.6的skyeye兼容),将文件镜像那一栏的size该为0x00800000,我本机的skyeye.conf内容如下:
- cpu: arm720t
- mach: ep7312
- lcd: state=on <------这行自己加
- mem_bank: map=M, type=R, addr=0x0, size=0xC0000
- mem_bank: map=M, type=R, addr=0x000C0000, size=0x00800000, file=./romfs.img <----size大小要更改
- mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000
- mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
复制代码
如果这一切都没有问题,就可以执行引导我们的系统了:- skyeye vmlinux
- target sim
- load
- run
复制代码 好了,相信以上的步骤都是比较简单的,很多人都可以搞定,这里就不多说了,下面进入我认为是最难搞的一个阶段:移植minigui到skyeye,这里,我们分为两个阶段来进行:
第一个阶段,测试个最简单的helloworld的移植,看能否出来窗口;
第二个阶段,移植复杂的窗口程序(如果有项目的例子更好)
在进入这两个阶段之前,需要先配置minigui,下面是我的libminigui的配置文件build-ep7312:- #!/bin/sh
- rm config.cache config.status -f
- CC=arm-linux-gcc \
- CFLAGS=-I/home/wolf/embeded/linux-2.4.13/include/ \
- ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ \
- --build=i686-linux\
- --host=arm-unknown-linux \
- --target=arm-unknown-linux \
- --enable-static \
- --disable-jpgsupport \
- --disable-cursor \
- --disable-micemoveable \
- --disable-galqvfb \
- --enable-nativegal \
- --enable-mc68x328ial \ <-----此处的ial是针对testsuit的ep7312的,一定要选择
- --enable-dummyial \
- --disable-qvfbial \
- --disable--nativeial \
- --disable-latin9support \
- --disable-big5support \
- --disable-imegb2312 \
- --disable-savebitmap \
复制代码 由于开始配置jpeg程序总是出错,有一次还把我的系统搞崩了,于是我关掉了jpeg支持(呵呵我就是这样的人,遇到困难不会面对,如果有搞定这个jpeg库配置的人,请告诉我一声,谢谢!)
执行上面的配置文件- ./build-ep7312
- make
- sudo make insall
复制代码 同时把在mg-res里面的config.linux 的res的安装目录也改成/usr/local/arm/2.95.3/arm-linux/ ,执行编辑/etc/ld.so.conf文件添加一行- /usr/local/arm/2.95.3/arm-linux/lib
复制代码 执行刷新库文件目录,这样就配置好了minigui的库。
为了测试这个库是否安装成功,我们开始编译helloworld例子程序。在用户目录下建立目录minitest/src 将minigui自带的例子程序里面的 helloworld.c 拷贝到其目录下,将里面的如下代码- #ifdef _LITE_VERSION
- SetDesktopRect(0, 0, 1024, 768
- #endif
复制代码 更改为:- #ifdef _LITE_VERSION
- SetDesktopRect(0, 0, 320, 240);
- #endif
复制代码 执行:- arm-linux-gcc -O2 -o helloworld helloworld.c -lminigui -pthread -lm -static
复制代码 如果成功,则说明前面的libminigui配置成功。
下面配置在根文件系统里面的minigui配置和资源文件。
在minitest下建立目录tmp,将testsuit对于我们用的内核的根文件系统镜像挂载到这个目录下,然后将里面的etc/MiniGUI.cfg, ur/拷贝到romfs目录下,更改MiniGUI.cfg里面的fbcon配置改为:- [fbcon]
- defaultmode=320x240-8bpp
复制代码 然后将我们刚才编译好的helloworld程序拷贝到bin/目录下,重新打包生成romfs.img文件,运行skyeye,进入系统后执行如果前面配置正确的话,会成功看到lcd里面出来一个窗口,如图所示:
针对这个移植有有要补充下:
minigui我们选择的是静态编译,我开始也是安装minigui指导书上说的动态编译,可以放到文件系统里面,启动执行后,总是提示:
./bin/helloworld No such file,改了权限也没用,后来怀疑是没有找到该文件运行需要的动态库,于是我将其依赖的库拷到lib/下面,还建立一个指向其的链接(这都是照指导书上做的),最后还是不行,于是我就估计可能是选的这个内核对动态编译的文件不感冒,所以改成了静态编译。
如果你能够看到上面的界面的话,那么恭喜你,你已经掌握了本实验中的8成的知识了,你也在本实验中基本成功了,你下面要做的就是,把你自己写的minigui程序(记住:一定要在pc环境下编译通过的)移植到skyeye上面的,当然硬件平台目前只能是ep7312的,其他的我没有试过。
我下面的工作是将项目中写的minigui程序移植到了skyeye下面,这里有个技巧与大家分享下:那就是在本机上如果有图片需要加载的话,你可以用相对路径,比如"bkgnd.bmp",可是在嵌入式linux里面似乎不行,调试了几次总是打不开bmp文件,后来把路径改成绝对路径“/bin/autopro/ bkgnd.bmp”就可以了,下面是我最终的GUI界面:
以上是我移植minigui到skyeye上的一点经验,第一次写这种东西,可能语言组织的不太好。
我的邮箱是[email protected],欢迎搞嵌入成的朋友一起来交流经验!!
[ 本帖最后由 hoarywolf 于 2007-12-5 08:59 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|