13438|3

6423

帖子

16

TA的资源

版主

楼主
 

QEMU模拟FriendlyArm的Mini2440开发板(转) [复制链接]

转自http://blog.chinaunix.net/uid-12617001-id-3766199.html

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 出处 、作者信息和本声明。否则将追究法律责任。

本篇博文是基于参加网上法国OpenWide公司 http://www.openwide.fr/ 举办的嵌入式Linux竞赛 (自由,免费报名,可以个人也可以组队)的经历(今年题目是在Mini2440上实现一个可触摸数字/模拟示波器)。第一阶段是在QEMU下模拟Mini2440开发板并运行编写的示波器图形软件(我是用Qt实现的)。第一阶段已经通过,获得了Mini2440开发板,目前正在参加第二阶段(截止11月底),奖品更丰厚哦。第一阶段晋级第二阶段的名单在这个链接可以看到 http://www.linuxembedded.fr/2012 ... tats-de-la-phase-1/ ,也有简易作品截图, 当然第一阶段的作品都还没太多完善,比较粗糙。本人水品有限,难免有遗漏或错误之处,本文用到的命令等我都检查过了,不过可能还是会有错误,欢迎指正与提出宝贵意见!

这篇博文中主要从以下几点进行叙述:
1、Mini2440开发板和QEMU模拟器简介
2、编译适配Mini2440的QEMU
3、Buildroot (2012.05)的使用
4、在QEMU中运行编译好的系统
      4.1、生成NAND镜像并初始化
      4.2、基于NFS启动
      4.3、基于NAND镜像启动
      4.4、强大的工具 -- Flashimg
5、附件 -- 竞赛第一阶段提交作品压缩包,内含 build.sh 完成全部编译启动工作

一、 Mini2440开发板和QEMU模拟器简介

德国FriendlyARM(国内译为”友善之臂“)公司推出的Mini2440开发板,一直以来为广大嵌入式爱好者所熟知,国内天嵌公司的TQ2440开发板就与其很类似(不过Mini2440可以移植Android系统,这点TQ2440似乎还没太多实做成功的文章,TQ6410倒是可以移植Android系统)。下面是Mini2440的简介:

http://www.quickembed.com/Tools/ ... EqLMCFSbMtAodqjYA3Q

http://www.arm9.net/mini2440.asp

目前虚拟机软件领域可谓“高手林立”,以下链接基本列出了所有流行虚拟机软件:

http://www.ewei.com/article/2146.jhtm

在如此众多的产品中VMWare自然不用说(不过最近推出的Windows Server 2012貌似有点撼动VMWare在虚拟机领域的霸主地位)。微软的老牌产品VirtualPC也相当不错,还有Bochs之类的。不过说到开源的虚拟机软件,必定要提一下QEMU,不错的速度,可以模拟至接近真实电脑,开放源代码,可以模拟众多的操作系统和平台。就连最近几年很火的Android生态系统也用到了QEMU虚拟机。下面是QEMU的简介:

http://tagche.blog.51cto.com/649757/274651
http://www.oschina.net/p/qemu/

本文所述的Mini2440是由QEMU模拟,基于Linux操作系统内核。

二、 编译适配Mini2440的QEMU

本文基于的开发环境是Ubuntu 10.04, 需要安装 git, 如果还没有git,请安装:

       

                   
  •                         $ sudo apt-get install git git-core
           

首先下载适配Mini2440的QEMU虚拟机,然后编译,安装QEMU:

       

                   
  •                         $ cd ~

                   
  •                         $ mkdir local
                   
  •                         $ git clone git://repo.or.cz/qemu/mini2440.git qemu
                   
  •                         $ cd qemu
                   
  •                         $ ./configure --target-list=arm-softmmu --prefix=$HOME/local
                   
  •                         $ make
                   
  •                         $ make install
           

此时QEMU可执行程序已经安装在 ~/local/bin 目录下了,为了方便使用,将其添加到环境变量里:

       

                   
  •                         $ export PATH=$HOME/local/bin:$PATH
           

验证一下正确安装与否:

$ qemu-system-arm --version
如果输出了QEMU的版本等信息,则安装成功。

三、 Buildroot (2012.05)的使用

一般说来,我们需要三样东西来正常启动一个嵌入式操作系统: 引导程序(bootloader),内核镜像和根文件系统镜像。那我们是不是接下来需要下载一个bootloader(比如u-boot,supervivi之类),编译之;下载任意版本的linux内核,编译之(当然要适配mini2440);一点一点生成自己的根文件系统,再制作成jffs2, yaffs2之类的格式呢?哦,对了,还有编译这三样东西的交叉编译工具链 Cross-compiler toolchain 要制作。

以前我也这样做过,很费时间(交叉编译工具链和根文件系统都是一点一点制作。。。)。虽然我们在制作根文件系统时是可以偷懒使用Busybox这样的“瑞士军刀”,但是还不够方便,有没有能一次过帮我们把交叉编译工具链和三样东西都生成出来,将懒惰进行到底的“青龙偃月刀”呢?答案是肯定的,就是 Buildroot,一款超好用的开源软件。

Ok,首先我们下载Buildroot,竞赛期间我用的版本是2012年5月的 (2012.05),当然大家可以下载更新的版本,Buildroot项目每三个月就有一个新版本。首先我们安装wget这个小工具,便于下载Buildroot:

$ sudo apt-get install wget

接着下载Buildroot:

       

                   
  •                         $ cd ~

                   
  •                         $ wget http://buildroot.org/downloads/buildroot-2012.05.tar.gz
                   
  •                         $ tar zxvf buildroot-2012.05.tar.gz
           

在让Buildroot为我们生成三个镜像前,需要对其进行一些配置。Mini2440开发板的基本所需配置已经集成在Buildroot里了(众多defconfig文件中的一个),省了不少功夫。在此基础上,我们只需再进行少许配置,就可以让Buildroot开工了。
我们选取mini2440_defconfig来生成我们的 .config 文件,再用 make menuconfig 进一步配置:

           
  •                 $ cd buildroot-2012.05
    $ make mini2440_defconfig
    $ make menuconfig

           
  •                
一个方便的配置窗口会跟着出现,是基于Kconfig的配置机制:
  
以下列出比较重要的几个编译选项,需要改动的几项用红色表示:

- Toolchains : 在Toolchains目录里,须要选取Linux内核版本的适配的编译链版本。默认是设置为 3.3.x。后面的Kernel(内核版本)我使用的是3.3.7,所以没问题,这里不用改也可以。当然也可以使用诸如 3.0.x这样的版本,只要跟之后的Kernel版本适配就好了。

- Bootloaders : 默认是U-boot, 也可以选用其他版本的Bootloader。本文就用默认的U-boot。

- Kernel : 默认是 3.0.4,因为之前Toolchains目录选择的是 3.3.x版本,所以这里须要改选,比如 3.3.7版本。

- Package Selection for the target : Busybox已经包含在里面了,我们也可以选择更多的项目,比如 Qt, EFL, directfb之类的图形库。在 Graphic libraries and application子目录里选择。

- Filesystem images : 本文中使用的是 jffs2格式的根文件系统(也是Buildroot默认的),因为之后要制作NAND镜像,所以需要配置成一个每页512字节和16字节的ECC的NAND类型。在 Flash Type这项,改为 NAND flash with 512B Page and 16 KB erasesize 。

这些都配置好之后,就可以请出我们最喜欢的命令了 -- make :

$ make

此时你可以倒杯茶,或者可以烤一只鸡。。。总之干点别的,让Buildroot忙活去吧。如果中间出现错误,一般是没装必要的东西,照错误提示安装就好,然后接着 make。 视电脑速度和网速而定,我的情况是大概30分钟后 make 完成。
如果一切顺利, make 结束后,在 buildroot-2012.05目录的 output/images/ 子目录下可以找到生成的三个文件:

- u-boot.bin : bootloader的镜像

- uImage : u-boot格式的(用mkimage命令生成的)Linux内核镜像

- rootfs.jffs2 : jffs2格式的根文件系统镜像

至此,Buildroot完成了他艰巨的任务,可以让他一边休息去了。我们进入下面的系统制作和启动部分。

四、在QEMU中运行编译好的系统

        4.1、生成NAND镜像并初始化
在开始前,先说一下: 如果你想要比较快捷的话,可以直接去看 4.4、强大的工具 -- Flashimg, 不需自己一点一点制作NAND文件来启动或通过NFS来启动。Flashimg是一个不错的软件,可以使用 内核镜像,bootloader镜像和根文件系统镜像 快速生成NAND或NOR文件。 由同样参加竞赛的法国人 Fabrice Jouhaud (别名 Yargil, 已经工作多年的嵌入式高手 ,去年的冠军,极为牛,人也非常好,有问必答,我觉得他来参加竞赛就是来帮助我们这些新手的)开发,共享在git 上面, http://gitorious.org/flashimg

NAND和NOR的区别,请参看:

http://www.91tech.net/Article/So ... em/200608/4147.html
http://forum.eet-cn.com/FORUM_POST_10003_1100023016_0.HTM

如果在QEMU里生成NAND的话,会花不少时间。所以我们可以利用闲置的内存(RAM) --  tmpfs

$ cd ~
$ mkdir nand
$ sudo mount -t tmpfs none nand/

我们接下来将从零开始生成一个NAND镜像文件。一般NAND的大小我们可以设定成64MB (NOR镜像文件一般设为2MB)。我们来做一下简单的计算: 要生成一个64MB的NAND,每个块是512字节,还要加上16字节的ECC,所以每个块是528字节。 总共需要的块数是 : (64 * 1024 * 1024) / 528 = 127100

用 dd 命令来生成一个NAND镜像:

$ dd if=/dev/zero of=nand/nand.bin bs=528 count=127100

我们现在有了一个NAND镜像文件了,接下来要使用u-boot来初始化它。我们需要首先将 Buildroot替我们生成的 u-boot.bin 文件拷贝到nand.bin 相同的文件夹下:
  
$ cp ~/buildroot-2012.05/output/images/u-boot.bin ~/nand/

启动U-boot以便进行NAND的初始化:

$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand/nand.bin

U-boot启动了,并且会显示一些Warning信息:

NAND: Bad block table not found for chip 0
Bad block table not found for chip 0
64 MiB
*** Warning - bad CRC or NAND, using default environment

别担心,显示这些信息很正常,因为我们的NAND文件还没初始化呢。接下来初始化:

MINI2440 # nand scrub
MINI2440 # nand createbbt
MINI2440 # reset

至此,我们的NAND文件已经准备好了。现在可以将其从tmpfs拷贝到电脑硬盘,然后卸载掉 tmpfs。

$ cp nand/nand.bin .
$ sudo umount nand/
$ rmdir nand

        4.2、基于NFS启动

这里插进一段用NFS启动的实做。在Ubuntu里安装NFS,请参看:

       

                   
  •                         http://www.linuxidc.com/Linux/2011-02/31947.htm

                   
  •                         http://os.51cto.com/art/201001/176511.ht
           

在嵌入式开发阶段,通常我们会操作一个挂载在NFS上的系统,这样更加方便,快捷, 无需每次都烧写NAND或NOR文件。接下来我们用NFS启动系统:

之前在 ~/buildroot-2012.05/output/images/  这个目录里,除了生成 rootfs.jffs2文件外,还生成了 rootfs.tar 文件,是根文件系统的压缩文件包。我们在 /srv 文件夹下新建一个 nfsroot文件夹以储存解压的根文件系统:

       

                   
  •                         $ sudo mkdir /srv/nfsroot/

                   
  •                         $ cd /srv/nfsroot/
                   
  •                         $ sudo tar xvf ~/buildroot-2012.05/output/images/rootfs.tar
           

接着需要在 /etc/exportfs 文件里增加以下一行,使NFS能认识 /srv/nfsroot/ 这个目录:

       

                   
  •                         /srv/nfsroot/ 192.168.42.0/24(rw,sync,no_root_squash,no_subtree_check)
           

使其生效:

       

                   
  •                         $ sudo exportfs -r
           

然后,我们生成并配置一个 tap0 接口:

       

                   
  •                         $ sudo tunctl -u $USER -t tap0

                   
  •                         $ sudo ifconfig tap0 192.168.42.1
           

现在我们已经可以来启动QEMU了,不过在此之前,还要将 uImage 也拷贝到HOME目录( nand.bin 已经在HOME目录了):

$ cd ~
$ cp ~/buildroot-2012.05/output/images/uImage .
Ok,我们启动QEMU+NFS:

$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -kernel uImage -net nic -net tap,ifname=tap0,script=no,downscript=no
MINI2440 # setenv bootargs root=/dev/nfs rw nfsroot=192.168.42.1:/srv/nfsroot/ ip=192.168.42.2
MINI2440 # bootm

输入Buildroot的密码,默认是root, 此时系统启动了,可以看到QEMU的窗口和可爱的Linux小企鹅。

        4.3、基于NAND镜像启动

因为以之前的4.1生成的nand.bin来继续生成最终版的nand.bin (还要往里面添加 u-boot.bin, uImage和rootfs.jffs2)过程太过繁琐且容易出错,在此我就不赘述了,可以参看网上的相关文章。我们直接进入4.4,用一个更强大的工具来生成最终版的 nand.bin 。更方便,且不容易出错。
      
        4.4、强大的工具 -- Flashimg

如前面4.1时提到的,flashimg是一个由网友 Fabrice Jouhaud 开发的软件,可以很快捷地生成NAND或NOR镜像文件。我们首先下载 flashimg:

$ cd ~
$ git clone git://gitorious.org/flashimg/flashimg.git

编译安装
$ cd flashimg
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

要生成NAND或NOR镜像文件,可以先把之前Buildroot替我们生成的三个文件 : u-boot.bin, uImage和rootfs.jffs2 拷贝到 flashimg文件夹下:
$ cp ~/buildroot-2012.05/output/images/rootfs.jffs2 ~/flashimg/rootfs.jffs2
$ cp ~/buildroot-2012.05/output/images/uImage ~/flashimg/uImage
$ cp ~/buildroot-2012.05/output/images/u-boot.bin ~/flashimg/u-boot.bin

生成NAND或NOR镜像文件:

$ ./flashimg -s 64M -t nand -f nand.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2 -z 512
$ ./flashimg -s 2M -t nor -f nor.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2

最后,启动系统,我们以NAND文件为例:

$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -usbdevice mouse

启动之后,还需要配置一下(其中 mini2440=3tb 是为了使屏幕分辨率成为320*240,横向显示。默认是 240*320,是竖着的)
MINI2440 # nboot kernel
MINI2440 # setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200 mini2440=3tb
MINI2440 # saveenv
MINI2440 # bootm

输入Buildroot的密码,默认是    root
我们再一次看到了亲切的小企鹅。

五、附件 -- 竞赛第一阶段提交作品压缩包,内含 build.sh 完成全部编译启动工作

我在附件里上传了压缩包,里面的 build.sh 文件,只要进入解压后的文件夹,运行

$ ./build.sh

就可以完成所有下载,编译,启动工作,不过在QEMU启动之后还要手动添加以下配置命令:
MINI2440 # nboot kernel  
MINI2440 # setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200 mini2440=3tb  
MINI2440 # saveenv  
MINI2440 # bootm

而且build.sh把我的第一阶段的作品(简易示波器,菜单栏下有各种操作。可以用鼠标操作,可以模拟4×4=16种波形混叠或独立显示,波形可以改变幅度和采样频率,简单的触发机制,可以保存成文件形式)也编译并集成到Linux系统里面了。启动Linux后,只要输入:

# cle2012 -qws

就可以运行示波器的简易程序了。当然这个程序是8月底完成的,还远远不够好。第二阶段要进行优化,增加更多功能,并在Mini2440开发板上能够触摸操作,接收实际的开发板产生的电信号或声音信号作为输入。 欢迎同样爱好嵌入式的朋友跟我联系,彼此学习,共同进步。

最新回复

楼主,您好!请问运行“$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand/nand.bin ”后未出现“ “NAND: Bad block table not found for chip 0 Bad block table not found for chip 0 64 MiB *** Warning - bad CRC or NAND, using default environment ” 而是“Supported machines are: beagle               Beagle board (OMAP3530) beaglexm             Beagle board XM (OMAP3630) collie               Collie PDA (SA-1110) nuri                 Samsung NURI board (Exynos4210) smdkc210             Samsung SMDKC210 board (Exynos4210) connex               Gumstix Connex (PXA255) verdex               Gumstix Verdex (PXA270) highbank             Calxeda Highbank (ECX-1000) integratorcp         ARM Integrator/CP (ARM926EJ-S) (default) mainstone            Mainstone II (PXA27x) musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S) n800                 Nokia N800 tablet aka. RX-34 (OMAP2420) n810                 Nokia N810 tablet aka. RX-44 (OMAP2420) n900                 Nokia N900 (OMAP3) sx1                  Siemens SX1 (OMAP310) V2 sx1-v1               Siemens SX1 (OMAP310) V1 overo                Gumstix Overo board (OMAP3530) cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310) realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S) realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore) realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8 realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9 akita                Akita PDA (PXA270) spitz                Spitz PDA (PXA270) borzoi               Borzoi PDA (PXA270) terrier              Terrier PDA (PXA270) lm3s811evb           Stellaris LM3S811EVB lm3s6965evb          Stellaris LM3S6965EVB tosa                 Tosa PDA (PXA255) versatilepb          ARM Versatile/PB (ARM926EJ-S) versatileab          ARM Versatile/AB (ARM926EJ-S) vexpress-a9          ARM Versatile Express for Cortex-A9 vexpress-a15         ARM Versatile Express for Cortex-A15 z2                   Zipit Z2 (PXA27x)” 请问是什么原因导致的呢?  详情 回复 发表于 2017-7-4 18:16
点赞 关注(5)
个人签名training

回复
举报

705

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
厉害!Linux开发好复杂啊
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主,您好!请问运行“$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand/nand.bin ”后未出现“
“NAND: Bad block table not found for chip 0
Bad block table not found for chip 0
64 MiB
*** Warning - bad CRC or NAND, using default environment ”
而是“Supported machines are:
beagle               Beagle board (OMAP3530)
beaglexm             Beagle board XM (OMAP3630)
collie               Collie PDA (SA-1110)
nuri                 Samsung NURI board (Exynos4210)
smdkc210             Samsung SMDKC210 board (Exynos4210)
connex               Gumstix Connex (PXA255)
verdex               Gumstix Verdex (PXA270)
highbank             Calxeda Highbank (ECX-1000)
integratorcp         ARM Integrator/CP (ARM926EJ-S) (default)
mainstone            Mainstone II (PXA27x)
musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
n900                 Nokia N900 (OMAP3)
sx1                  Siemens SX1 (OMAP310) V2
sx1-v1               Siemens SX1 (OMAP310) V1
overo                Gumstix Overo board (OMAP3530)
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
akita                Akita PDA (PXA270)
spitz                Spitz PDA (PXA270)
borzoi               Borzoi PDA (PXA270)
terrier              Terrier PDA (PXA270)
lm3s811evb           Stellaris LM3S811EVB
lm3s6965evb          Stellaris LM3S6965EVB
tosa                 Tosa PDA (PXA255)
versatilepb          ARM Versatile/PB (ARM926EJ-S)
versatileab          ARM Versatile/AB (ARM926EJ-S)
vexpress-a9          ARM Versatile Express for Cortex-A9
vexpress-a15         ARM Versatile Express for Cortex-A15
z2                   Zipit Z2 (PXA27x)”
请问是什么原因导致的呢?

点评

没有选定要支持的cpu吧,告诉你支持哪些处理器,你需要选择一个你想仿真的处理器  详情 回复 发表于 2017-7-4 18:40
 
 
 

回复

6423

帖子

16

TA的资源

版主

4
 
Vincent的 发表于 2017-7-4 18:16
楼主,您好!请问运行“$ qemu-system-arm -M mini2440 -serial stdio -mtdblock nand/nand.bin ”后未出现 ...

没有选定要支持的cpu吧,告诉你支持哪些处理器,你需要选择一个你想仿真的处理器
 
个人签名training
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表