很多时候,做嵌入式往往需要大量的金钱来购买设备,并且带着这些电路板非常的不方便,那么有没有一种办法可以解决这个问题呢?这时就可以利用QEMU来模拟一个设备进行实验了。
1. 介绍
QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQEMU这个闭源的加速器,QEMU能模拟至接近真实电脑的速度。
简单的说,通过这个模拟器,对于做嵌入式的人来说,可以在pc仿真开发板的运行情况,不用每次都需要将程序下载到开发板,特别是调试驱动与编译内核这将节省大量的时间!
2.准备
首先下载2440的qemu
为什么要下载qemu,直接在ubuntu上apt-get install不行吗?
不行!下载后的不带这个2440
首先在git上下载代码
代码语言:javascript复制git clone git://repo.or.cz/qemu/mini2440.git qemu
下载完成后开始编译配置
代码语言:javascript复制./configure--target-list=arm-softmmu --prefix=/usr/local/qemu/mini244
make -j4
sudo make install
(其中--prefix=/usr/local/qemu/mini2440表示install的目录;make -j4表示4个目标同时构建,jobs=4,一般来说编译速度会更快些)
然后将bin路径添加到环境变量中方便使用qemu-system-arm
在这个目录中,有一个mini2440_start.sh的脚本
为了直接看到效果,这里直接采用韦东山老师的uboot,kernel和文件系统
关于文件系统,可以采用nfs文件系统进行相关的开发,十分的容易,以后介绍
3.flashimg
所以目前的文件系统是在在这些基础上进行的。
接着,采用一个工具进行制作,这个工具的就是flashimg工具
flashimg的官方网站访问不进去了!!!
然后就只能使用github了。
代码语言:javascript复制git@github.com:cailiwei/flashimg.git
下载完成后就可以进行编译
代码语言:javascript复制./autogen.sh
./configure
make
sudo make install
将文件转移到这里面,然后开始制作
现在采用的是nandflash,所以先采用这种方式
代码语言:javascript复制#!bin/bash
./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
如果要采用nor flash
代码语言:javascript复制flashimg -s 2M -t nor -f nor.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2
4.写脚本
又到了写脚本时间了
制作完成后,生成nand.bin 将生成的nand.bin转移到我们编译的2440的qemu之中
在这里面,我们最好不用自带的mini2440_start.sh
自己写一个start.sh
qemu-ifdown
代码语言:javascript复制#!/bin/sh
echo "Close tap!"
sudo ifconfig $1 192.168.31.196 down
qemu-ifup
代码语言:javascript复制#!/bin/sh
echo "Excuting qemu-ifup"
ifconfig $1 192.168.31.196
5. nfs文件系统
接下来开始搭建nfs方案了
代码语言:javascript复制sudo apt-get install nfs-kernel-server
之后修改/etc/exports
代码语言:javascript复制/home/bigmagic/work/zfjqemu/rootfs *(rw,sync,no_root_squash)
重启nfs
代码语言:javascript复制sudo /etc/init.d/nfs-kernel-server restart
6. 启动
编写好启动脚本后,直接运行
代码语言:javascript复制sudo sh start.sh
接着,输入nfs的启动参数
代码语言:javascript复制set bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.31.196:/home/bigmagic/work/fs_qtopia/,proto=tcp,nfsvers=,nolock ip=192.168.31.195:192.168.31.196::255.255.255.0 console=ttySAC,
然后保存参数
代码语言:javascript复制saveenv
然后输入nboot
代码语言:javascript复制nboot kernel
那么这个nboot命令是什么?
nboot是uboot指令--将nand flash中的内容加载到sdram中,比如"nboot 0x30000000 0 0x60000;bootm
0x30000000是拷到的sdram的地址,0是nand flash设备号,0x60000是内核在nand flash的地址。再通过bootm从0x30000000启动内核。
由于uImage的前64个字节是zImage的描述信息,所以do_nandboot能知道需要加载的kernel的size。
输入bootm开始启动内核!
打印下面的语句则成功
注意,这里的有一个地方就是文件系统
在fs_qtopia/etc/init.d/rcS
代码语言:javascript复制#!/bin/sh
ifconfig eth0 192.168.31.195
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
if [ ! -e /etc/pointercal ]
then
/bin/ts_cal.sh
fi
/bin/qpe.sh &
这里的ifconfig eth0 192.168.31.195需要改成开发板的ip地址
还需要修改一下串口
代码语言:javascript复制mknod -m console c
mknod -m null c
7.测试
刚进来就要校验触摸屏
启动完成后,输入
代码语言:javascript复制qpe.sh -&
8. 总结
这个qemu真的好用!
以后表示调试Linux都方便多了!再也不用下载程序到开发板这么麻烦了!