在FPGA上移植最新版本的uClinux,本实验主要是在DE2上进行。
历经一个多月的时间,终于在FPGA上移植了uClinux,从开学到现在,从找中文博客(无双学长的博客),由于版本的问题,加上uClinux更新的比较快,编译内核又是一个比较复杂的问题。最终还是,寻找wiki里面寻求最新的内核,最新的编译工具,最终终于找到问题的解决办法啦!不多说,开始我们的移植工作吧!如果有不明白的,可以直接看wiki里的英文步骤。
DE2上安装uClinux有几种方法,这里,我用的是一台PC,使用Windows操作系统,並在VMWare安裝Linux。从VMware上安装Ubuntu的步骤在这里就不详细说啦!网上一大堆,再加上没有什么难度,就不多讲啦!这里,我就从安装uClinux开始吧!
以root进入终端或者以普通用户进入。
sudo apt-get install git-core git-gui make gcc ncurses-dev bison flex gawk gettext ccache zlib1g-dev libx11-dev
texinfo liblzo2-dev pax-utils uboot-mkimage corkscrew
这里的sudo是普通用户需要加上的,如果是root用户的话,就不需要啦!
安装这个交叉环境,是为了将C语言翻译成嵌入式语言,有两个办法,第一个就是下载源码以及编译工具,自己来编译;第二个方法就是利用Altera公布的一个编译好的BinaryToolchain安装即可!由于我是初学者,就利用了第二种方法(简单)。
wget http://www.niosftp.com/pub/gnutools/nios2gcc-20080203.tar.bz2 或者
ftp://ftp.altera.com/outgoing/nios2gcc-20080203.tar.bz2 或者
http://sopc.et.ntust.edu.tw/pub/gnutools/nios2gcc-20080203.tar.bz2 或者
ftp://sopc.et.ntust.edu.tw/pub/gnutools/nios2gcc-20080203.tar.bz2 或者
在这里要重点提醒一下,由于我们是在中国的服务器,有很多的ftp,网址都是被屏蔽啦,只有个别的几个好用的。如果大家没有下载到的话,可以Email给我,我发给大家!
可以将nios2gcc-20080203.tar.bz2放在一个单独的位置,便于系统文件干净整洁!在这里,我是用root进入Ubuntu的,所以我将nios2gcc-20080203.tar.bz2放在/usr/local/src里面。
打开终端,下面命令进入/usr/local/src.
cd /usr/local/src
解压nios2gcc-20080203.tar.bz2
tar jxvf nios2gcc-20080203.tar.bz2
这样,就在use/local/src下生成一个opt的目录,就是解压后的结果。
对于Ubuntu的用户来说,开启终端是要重新加载profile这个文件,所以我们需要更改这个文件。打开profile文件,还是在use/local/src路径下
gedit ~/.profile
加上cross gcc的路径,在最后面加上如下语句
export PATH=$PATH:/usr/local/src/opt/nios2/bin
如下图所示
当你更改profile文件之后,需要重新logout以及login,在这里,我们可以用下面一个命令,让profile文件生效。
source ~/.profile
echo $PATH
出现下面的路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:use/local/src/opt/nios2/bin
nios2-linux-uclibc-gcc -v
如果安装成功的话,就会出现下面的结果
至此,你的cross gcc就安装成功啦!在这步安装的时候,基本上不会出现什么问题,如果有任何小问题的话,大家应该都能解决的。
这一步出现了很多的问题,由于有很多种内核源码,不知道该用哪种,首先,第一次出现的问题就是,我下载了http://www.uclinux.org/pub/uClinux/dist/里面的内核,编译了很多次都没有成功。最终,我找到了问题的根源,我仔细阅读了wiki里的说明,发现了这样一句话:The releases from uclinux.org does not apply to the procedures described here。就是说,这里的方法不适合uClinux.org里面的内核,看到这句话,我当时就崩溃了,终于明白了是什么原因啦!
好了,我去下载适合wiki里面方法的内核啦,可是问题又出现啦,该死的中国服务器。
下面的命令是下载nios2ftp里面的内核源码。
wget http://www.niosftp.com/pub/linux/nios2-linux-20090929.tar
可惜,我在执行这条命令的时候,是下载不了,经过在Altera论坛上查找相关信息之后,发现,这就是中国的服务器的问题啦,没有办法。我又仔细的找解决的办法。之后,我找到了一个网址,可以下载最新的内核,这里,要非常感谢hippo这位工程师啊!为我们解决了很多问题。
通过下面的网址下载最新的内核。
http://www.niosftp.com/pub/linux/nio...x-20100621.tar或者http://sopc.et.ntust.edu.tw/pub/linu...x-20100621.tar或者ftp://sopc.et.ntust.edu.tw/pub/linux...x-20100621.tar
经过3天的下载,终于将这个nios2-linux-20100621.tar下载成功啦,这个花费我太多的时间!这里再次对hippo这位工程师表示感谢!
还是在use/local/src这个路径下,执行下面的命令解压nios2-linux-20100621.tar.
tar -C /usr/local/src -xvf nios2-linux-20100621.tar
这样,就use/local/src下生成一个目录为nios2-linux的目录
进入内核目录。
cd nios2-linux
cd uClinux-dist
执行下面的命令,配置内核。
make menuconfig
这里不出什么问题的话,就会进入内核配置的界面,我在配置的时候出现了一个小小的问题,说是KEY_MAX没有定义,于是我就google了一下,一位好心人士给我解决了,是缺少一个命令。
执行下面的命令就可消除以上的问题。
apt-get install libncurses5-dev
好了,就进入了内核配置目录啦!
内核的配置就比较简单啦,首先选择Vendor里面,选择Altera,下面就自动选择nios2啦!接着进入下一个选项,用户库等配置,我们选择第一个Default all Setting,之后,就exit,exit,yes,就ok啦!
在这里,特别需要提醒的是,在第一次boot成功之前,不要更改其他任何设置!(具体原因,也不知道为什么?)
将sopc生成的ptf文件拷贝到当前的/use/local/src目录下
执行一下命令,设置硬件的makefile
make vendor_hwselect SYSPTF=/use/local/src/system_0.ptf
这里又出现一个问题了,就是说nios2-linux-gun-gcc命令找不到,咋一看,还以为是交叉环境没有安装好呢,但是仔细来看,发现,这个和nios2-linux-uclibc-gcc还是有区别,这是什么原因呢?最终在google上找到问题的解决办法!
http://www.alteraforum.com/forum/showthread.php?t=23549
上面是问题的解决办法,大家不明白的可以进里面慢慢看看!我这里稍微解释一下。里面说,有两种branch,一种是trunk,一种是test-nios2,而uClinux是安装在test-nios2 branch下的,所以呢,需要转到test-nios2 branch目录下,没有办法啊,执行下面的命令转到test-nios2 branch下。
cd linux-2.6
git checkout test-nios2
cd uClinux-dist
git checkout test-nios2
如果成功的话,就会出现“Now Switching to test-nios2 branch”
这里就没有什么可多说的啦,我在这步没有出现什么问题。执行下面的命令
cd uClinux-dist
make
这步需要等待一下,有一定的时间。至此,内核就编译成功啦!
最终在/use/local/src/nios2-linux/uClinux-dist/linux-2.6.x/arch/nios2/boot下生成镜像文件zImage
nios2-configure-sof (--cable x) DE2_NIOS.sof
nios2-download -g (--cable x) zImage
nios2-terminal (--cable x)
括号中选择的选项,是如果你安装了多个下载线的情况下,就指定下载线即可!
至此,uClinux在FPGA上的移植就成功,就会出现下面的东西啦!
Using cable "USB-Blaster [USB 2-1.2]", device 1, instance 0x00
Pausing target processor: OK
Initializing CPU cache (if present)
OK
Downloaded 1272KB in 7.7s (165.1KB/s)
Verified OK
Starting processor at address 0x00500000
# nios2-terminal
nios2-terminal: connected to hardware target using JTAG UART on cable
nios2-terminal: "USB-Blaster [USB 2-1.2]", device 1, instance 0
nios2-terminal: (Use the IDE stop button or Ctrl-C to terminate)
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.6.26-rc6 (hippo@darkstar) (gcc version 3.4.6) #2 PREEMPT Mon Jun 16 14:30:09 CST 2008
uClinux/Nios II
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 8128
Kernel command line:
PID hash table entries: 128 (order: 7, 512 bytes)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory available: 30136k/2333k RAM, 0k/0k ROM (1552k kernel code, 781k data)
Mount-cache hash table entries: 512
net_namespace: 180 bytes
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 1, 8192 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
TCP reno registered
NET: Registered protocol family 1
io scheduler noop registered
io scheduler deadline registered (default)
ttyJ0 at MMIO 0x8009340 (irq = 8) is a Altera JTAG UART
console [ttyJ0] enabled
ttyS0 at MMIO 0x8008e00 (irq = 7) is a Altera UART
dm9000 Ethernet Driver, V1.30
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
Freeing unused kernel memory: 572k freed (0x1b8000 - 0x246000)
Shell invoked to run file: /etc/rc
Command: hostname uClinux
Command: mount -t proc proc /proc
Command: mount -t sysfs sysfs /sys
Command: mount -t usbfs none /proc/bus/usb
mount: mounting none on /proc/bus/usb failed: No such file or directory
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: ifconfig lo 127.0.0.1
Command: route add -net 127.0.0.0 netmask 255.0.0.0 lo
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|
For further information check:
http://www.uclinux.org/
Execution Finished, Exiting
Sash command shell (version 1.1.1)
/>
看到上面的东西,说明你移植成功啦,应该来说,很开心啦吧!是啊,移植了快有一个月啦!看到成功当然开心啦,在这里,也学到了很多东西。其实也走了很多歪路,首先是没有仔细阅读wiki里面的内容,总是下载org官网的uClinux-dist源码,最终总是有各种错误!还是不够冷静沉着,从这一点看来,还是静下心来时非常重要的,一个好的学习心情,一个好的学习方法是很重要的!
将上面的步骤写下来,纪念一下吧,也算是一个工作量吧!呵呵!