硬件条件:友晶DE0开发板
软件条件:WIN XP,quartus11.0,VMware6.0.2,红帽企业版5,uClinux-dist-20070130.tar(2.6.0内核源文件),uClinux-dist-20070130-nios2-02.diff(内核补丁),nios2gcc.tar(交叉编译器)。
交叉编译环境的建立
首先安装虚拟机软件VMware,选择红帽企业版5作为操作系统。安装完成后,选中虚拟计算机,点击VM->settings,如图:
在弹出窗里选择CD-ROM
选择Use ISO image,然后选择红帽企业版5所在的目录,然后点击ok。然后给虚拟计算机上电,安装红帽系统。
重新启动虚拟机后,对操作系统进行简单的配置。在配置后,运行VM->Install VM Tools,然后鼠标就可以随意在Linux和Windows之间切换了。
利用U盘在Windows 和虚拟机Linux之间传递数据,具体做法如下:在linux界面上点击鼠标激活linux,然后插入U盘,这时候linux系统识别U盘,就可以进行操作了。然后直接拔下U盘,回到windows界面点击鼠标激活窗口,再插入U盘,就可以读取刚才linux系统写入的数据了。
从windows下通过U盘复制nios2gcc.tar.bz2至linux的/usr/local/src文件夹下,并解压缩。然后复制uClinux-dist-20070130.tar(2.6.0内核源文件),uClinux-dist-20070130-nios2-02.diff(内核补丁)到这个文件夹,把内核源文件解压缩,把补丁放到解压缩后得到的文件夹里。这些过程都在图形界面下操作。然后按住ctrl+alt+F1,进入字符操作界面,如要从字符界面返回,按住ctrl+alt+F7。进入界面后,用root用户登录,然后转到src文件夹:cd /usr/local/src/
输入命令:vi ~/.bash_profile
看到界面如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/opt/nios2/bin
export PATH
unset USERNAME
我们按下i键,或者用insert键,进行修改,在最后第二行改为:
然后按esc键退出编辑状态,再输入冒号:进入命令状态,输入wq,保存退出。
重新执行bash_profile script,让所设定的路径马上生效,不必再重新登出登入
命令为: source ~/.bash_profile
然后测试交叉编译器是否安装成功
命令为:nios2-linux-uclibc-gcc –v
如果看到如下界面,说明安装成功:
至此交叉编译环境已经建立起来。
建立硬件环境
用quartus11.0(或者其他版本)随便建立一个SOPC工程,我建立的系统为:timer的中断号为0(也有文章说SOPC不能有任何外设占用中断号0,搞不清楚,但是0号中断最好不要给timer以外的外设),UART中断和jtag UART中断随便分配,PIO有8个,连到LED上,systemid,SDRAM,Flash。这里要注意,SDRAM和Flash的容量一定要与实际容量匹配,不然uClinux系统不能正常运行。DE0光盘里的SDRAM部分原理图有错误,A12是不用的引脚,不能再SOPC里出现A12,否则uClinux会以为系统的RAM是16M!所以在SDRAM的配置页里,ROW一定是12!编译后通过U盘将system.ptf文件复制到linux的src文件夹下。
进入到uClinux-dist文件夹:cd uClinux-dist
给内核打补丁(只可操作一次):
gunzip -c uClinux-dist-20070130-nios2-02.diff.gz | patch -p0
成功后可见:
patching file vendors/Altera/nios2nommu/config.arch
patching file vendors/Altera/nios2nommu/config.linux-2.6.x
patching file lib/libpng/Makefile
patching file linux-2.6.x/include/asm-nios2nommu/ide.h
patching file linux-2.6.x/include/linux/elf-em.h
patching file linux-2.6.x/usr/Makefile
patching file linux-2.6.x/arch/nios2nommu/kernel/vmlinux.lds.S
patching file linux-2.6.x/arch/nios2nommu/drivers/Kconfig
patching file linux-2.6.x/arch/nios2nommu/drivers/altcf.c
patching file linux-2.6.x/arch/nios2nommu/drivers/pci/Kconfig
patching file linux-2.6.x/arch/nios2nommu/drivers/pci/pci-auto.c
patching file linux-2.6.x/arch/nios2nommu/drivers/pci/pci.c
patching file linux-2.6.x/arch/nios2nommu/drivers/pci/Makefile
patching file linux-2.6.x/arch/nios2nommu/drivers/spi.c
patching file linux-2.6.x/arch/nios2nommu/drivers/Makefile
patching file linux-2.6.x/drivers/mtd/maps/altera.c
patching file linux-2.6.x/drivers/mtd/maps/Kconfig
patching file linux-2.6.x/drivers/net/Kconfig
patching file linux-2.6.x/drivers/net/Makefile
patching file linux-2.6.x/drivers/net/dm9ks.c
patching file linux-2.6.x/drivers/net/open_eth.c
patching file linux-2.6.x/drivers/net/dm9000.c
patching file linux-2.6.x/drivers/net/Space.c
patching file linux-2.6.x/drivers/net/smc91x.c
patching file linux-2.6.x/drivers/net/smc911x.c
patching file linux-2.6.x/drivers/net/mtip1000.c
patching file linux-2.6.x/drivers/usb/Kconfig
patching file linux-2.6.x/drivers/usb/host/Kconfig
patching file linux-2.6.x/drivers/usb/host/isp1362-hcd.c
patching file linux-2.6.x/drivers/usb/host/Makefile
patching file linux-2.6.x/drivers/usb/host/isp1362.h
patching file linux-2.6.x/drivers/usb/Makefile
patching file linux-2.6.x/drivers/ide/ide.c
patching file user/microwin/src/fonts/X6x13.c
patching file user/microwin/src/demos/nxroach/Makefile
patching file user/microwin/src/demos/nanox/nxterm.c
patching file user/microwin/src/demos/nanox/nterm.c
patching file user/microwin/src/demos/nxkbd/keynum.c
patching file user/microwin/src/demos/nxkbd/keyctrl.c
patching file user/microwin/src/demos/nxkbd/keyshft.c
patching file user/microwin/src/Makefile.rules
patching file user/microwin/src/drivers/kbd_ttyscan.c
patching file user/microwin/src/drivers/scr_fb.c
patching file user/microwin/src/drivers/mou_ser.c
patching file user/ftpd/ftpcmd.c
patching file user/ftpd/Makefile
没有任何错误的话,可以开始下一步,配置内核。输入命令:make menuconfig
可以看到如下界面,上下方向键移动光标,回车键进入子菜单,空格键选中,S键选择,E键离开。
Vendor/Product Selection下如下设定:
在Kernel/Library/Defaults Selection如下设置
注意确保:第二行表示选择的库,默认是uClibc,这个需要修改,回车进入,空格选择None。并用空格选中第三行“Default all settings”。
至此配置完成,按E退出,按Y保存。出现如下提示:
意思是下面我们必须执行make dep命令。那么我们执行这个命令:make dep
提示说make dep指令不是必须的,这是因为我之前已经执行过了,如果没执行过就不会有这一行了。
下面根据系统硬件配置uClinux。输入命令:make vendor_hwselect SYSPTF=/usr/local/src/system.ptf
后面会有选择动作,根据DE0板的配置,都选1.最后配置结束后如下:
建立romfs文件夹,网上文章说:此操作可能报错,不过此处可以忽略,继续进行下面步骤。而实际上我开始时报错,然后生成zImage时也报错,后来运行了make dep命令后,make romfs就不再报错了。
然后,编译uClinux核心,运行命令:make
然后,生成zImage文件,运行命令:make linux image
然后回到图形操作界面,/usr/local/src/uClinux-dist/linux-2.6.x/arch/nios2nommu/boot/下找到zImage(大小为1.2M,如果不是这个大小,说明操作过程有错误),用U盘将其复制到windows的某一文件夹下,比如:D:/FPGA-PROJECT下。
然后开始->所有程序->Altera->NIOS II EDS 11.0->Nios II 11.0 Command Shell,如下:
这程序可以运行shell命令,我们先转到工作目录下:cd D:/FPGA-PROJECT
然后运行:nios2-configure-sof DE2_NIOS.sof
这一步不是必须的,你也可以在编译完成后就用quartus下载sof文件到FPGA里。
然后,下载zImage到SDRAM,运行:nios2-download –g zImage
然后运行uClinux系统,输入命令:nios2-terminal
看到这个漂亮的界面,说明移植成功,uClinux已经在DE0上运行了:
参考文献:真oo无双博客
清华大学step by step 教程