James Bryant

【转载】FPGA(DE2)上uClinux的移植

0
阅读(1603)

摘要:

  在FPGA上移植最新版本的uClinux,本实验主要是在DE2上进行。

  历经一个多月的时间,终于在FPGA上移植了uClinux,从开学到现在,从找中文博客(无双学长的博客),由于版本的问题,加上uClinux更新的比较快,编译内核又是一个比较复杂的问题。最终还是,寻找wiki里面寻求最新的内核,最新的编译工具,最终终于找到问题的解决办法啦!不多说,开始我们的移植工作吧!如果有不明白的,可以直接看wiki里的英文步骤。

  DE2上安装uClinux有几种方法,这里,我用的是一台PC,使用Windows操作系统,並在VMWare安裝Linux。从VMware上安装Ubuntu的步骤在这里就不详细说啦!网上一大堆,再加上没有什么难度,就不多讲啦!这里,我就从安装uClinux开始吧!

一、安装BinaryToolchain

  1、对于Ubuntu的用户来说,在安装这些之前需要安装一些命令。

以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安装即可!由于我是初学者,就利用了第二种方法(简单)。

2、通过下面的命令下载编译好的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给我,我发给大家!

3、解压下载的BinaryToolchain(nios2gcc-20080203.tar.bz2)

可以将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的目录,就是解压后的结果。

  4、设置交叉gcc编译的路径

对于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

  5、检查cross gcc路径是否设置正确

echo $PATH

   出现下面的路径

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:use/local/src/opt/nios2/bin

6、检查cross gcc安装成功

  nios2-linux-uclibc-gcc -v

如果安装成功的话,就会出现下面的结果

  至此,你的cross gcc就安装成功啦!在这步安装的时候,基本上不会出现什么问题,如果有任何小问题的话,大家应该都能解决的。

二、编译uClinux内核以及生成uClinux镜像

1、下载uClinux内核源码

  这一步出现了很多的问题,由于有很多种内核源码,不知道该用哪种,首先,第一次出现的问题就是,我下载了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这位工程师表示感谢!

  2、解压nios2-linux-20100621.tar

  还是在use/local/src这个路径下,执行下面的命令解压nios2-linux-20100621.tar.

tar -C /usr/local/src -xvf nios2-linux-20100621.tar

  这样,就use/local/src下生成一个目录为nios2-linux的目录

3、配置内核

  进入内核目录。

  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成功之前,不要更改其他任何设置!(具体原因,也不知道为什么?)

4、根据sopc生成的ptf文件设置硬件makefile

  将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”

5、编译内核

  这里就没有什么可多说的啦,我在这步没有出现什么问题。执行下面的命令

  cd uClinux-dist

  make

  这步需要等待一下,有一定的时间。至此,内核就编译成功啦!

  最终在/use/local/src/nios2-linux/uClinux-dist/linux-2.6.x/arch/nios2/boot下生成镜像文件zImage

三、下载硬件sof文件和镜像文件

1、下载硬件到DE2

nios2-configure-sof (--cable x) DE2_NIOS.sof

2、下载镜像文件到DE2中

nios2-download -g (--cable x) zImage

3、启动uClinux

  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源码,最终总是有各种错误!还是不够冷静沉着,从这一点看来,还是静下心来时非常重要的,一个好的学习心情,一个好的学习方法是很重要的!

  将上面的步骤写下来,纪念一下吧,也算是一个工作量吧!呵呵!