前言:鄙人专业是搞芯片的,用FPGA只是做板上验证。我从大四才开始接触FPGA,到现在也三年了,对V2P还是比较熟悉的,因为这是我接触的第一块很爽的开发板,既便宜功能又全,所以一年前我突发想法,因为兴趣,很想在这块板上自己搭建一个Linux系统,这个系统就像PC机,能连接键鼠,能上网,能带的起串口硬盘等等,但是由于时间问题,这个想法一直没有实现。今放假回家,巧收到这次大赛的通知信,欲借助这个博客大赛让我帮自己整理思路,开学到实验室再搞定这套系统。
摘要:本篇介绍了利用Xilinx XUP Virtex2 pro 开发板搭建一个linux平台,以实现嵌入式系统。
关键词:Virtex2pro,linux,嵌入式系统,Xilinx,EDK
本篇以自顶向下的方式来帮助我整理思路。通过以下五大步就能搞定嵌入式板上系统:
1.安装并配置交叉编译工具 Crosstool-ng 1.3.2
2.用EDK10.1SP3创建工程,搭出硬件平台
3.用EDK生成device-tree和device-tree generator
4.编译Linux内核
5.编译文件系统(最难)
第一章 安装配置交叉编译工具
参考http://hi.baidu.com/caicry方法,因Crossstool-ng能建立一个新的工具链(gcc 4.3.2 glibc 2.9),以支持对最新kernel编译,故而不用Crosstool。我实验室的环境是redhat9,将crosstool-ng装在redhat上。实际在redhat装crosstool的时候会遇到许多问题,例如bash不是3.0以上版本等等问题,遇到该问题只需要根据提示在ftp.gnu.org上下载相应的包解压,安装即可。
需要的升级包为:
binutils-2.19.1.tar.bz2
dmalloc-5.5.2.tgz
duma_2_5_14.tar.gz
ecj-latest.jar
gcc-4.3.2.tar.gz
glibc-2.9.tar.bz2
glibc-ports-2.9.tar.bz2
gmp-4.2.4.tar.bz2
libelf-0.8.11.tar.gz
linux-2.6.31.1.tar.gz
mpfr-2.4.1.tar.bz2
ncurses-5.7.tar.gz
建议用最新版本的linux发行版,例如ubuntu8以上继续操作。
第一步,下载文件,命令为:
cd /tmp
mkdir crosstool-ng
wget http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.5.3.tar.bz2
tar jxvf crosstool-ng-1.5.3.tar.bz2
cd /tmp/crosstool-ng-1.5.3
./configure --local
make
chmod a rx ct-ng 注:有些linux版本对rx不支持,可用777代替。
第二步配置crosstool-ng以编译一个专用的交叉编译器
第1点,配置glibc。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。开始配置:
./ct-ng menuconfig
经过一小段等待后出现以下画面:
以图形界面方式配置glibc,参数表如下:
?Paths and misc options
*******Paths*******
Local tarballs directory: ${HOME}/sources
Save new tarballs: Yes
Prefix directory: ${HOME}/crosstool-ng-1.5.3/${CT_TARGET}
******Build behavior*******
Number of parallel jobs: 3 or 4 (if you have a quad-core computer)
Nice level: 10
******Logging*******
Maximum log level to see: EXTRA
?Target options
Target Architecture: powerpc
Emit assembly for CPU: 405
Tune assembly for CPU: 405
Floating point: software
?Toolchain options
Tupl's Vendor string: 405
?Operating System
Target OS: linux
Linux kernel version: 2.6.27.35(Long-term stable)
?GMP and MPFR
Build libraries for target: Yes
GMP version: 4.2.4
MPFR version: 2.3.2
?binutils
binutils version: 2.19
binutils libraries for the target: Yes (libiberty and libbfd)
?C compiler
gcc version: 4.3.2
C : Yes
Fortran: Yes (optional)
Java: Yes (optional)
(Untested: enable any other languages you may want)
?C-library
C library: glibc
glibc version: 2.6.1
Threading implementation to use: nptl
Use the ports addon: Yes
?Tools (Optional, Untested!)
libelf: Yes
sstrip: No (because I couldn't get it to build)
?Debug facilities (Optional, Untested!)
dmalloc: Yes (5.5.2)
duma: Yes (2_5_14)
gdb: Yes
Build a static cross gdb: Yes
Native gdb: Yes
Build a static native gdb: Yes
Use GMP and MPFR: yes
Version: 6.8
ltrace: Yes (0.4)
strace: No (because I couldn't get it to build)
!!提醒我自己注意以上参数根据自己版本实际更改。
第1点,配置glibc结束。配置结束后跳至第二步,非第2点。
第2点,配置uClibc。uClibc 是一个小型的C 库,应用于嵌入式Linux 系统开发。它基本实现了glibc 的功能。配置表如下:
?C compiler
gcc version: 4.2.4 (because 4.3.2 would not build)
Java: No (because I could not get this to build)
?C-library:
C library: uClibc
uClibc version: 0.9.30
Configuration file: ${CT_LIB_DIR}/uClibc-0.9.30-ppc405-nofpu-config
Threading implementation to use: linuxthreads (but really we want NPTL)
其中uClibc 0.9.30的配置方法是通用的配置方法,即下载(如果PC中没有的话),配置,生成配置文件。以下是uClibc配置表:
?Target architecture: powerpc
?Target Architecture Features and Options:
Target CPU has a floating point unit (FPU): No
Enable full C99 math library support: Yes
Enable C99 Floating-point environment: Yes
Enable long double support: No
?General Library Settings:
POSIX Threading support: Yes
Use the older (stable) version of linuxthreads: Yes (but we really want NPTL though...)
?Network Support:
Remote Procedure Call (RPC) support: Yes (for NFS)
Full RPC support: Yes
Reentrant RPC support: Yes
?String and Stdio Support
ctype argument checking: Issue a diagnostic and abort()
!!提醒我自己注意以上参数根据自己版本实际更改。
第2点,配置uClibc结束。
第三步用crosstool-ng编译交叉编译器
unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
export LD_LIBRARY_PATH LIBRARY_PATH CPATH
./ct-ng build
如果能走过这步则返回第2点继续,如出现error则要根据实际情况来判断如何解决问题使操作正常完成。
这三步运行顺序是第一步,第1点,第三步,第2点,第三步。
第一章结束。
第二章 用EDK10.1SP3创建工程,搭出硬件平台
硬件设备:XUP Virtex-II PRO evaluation board,一256M内存条,一CF卡(兼容Flash),键鼠,USB下载线或自制JTAG下载线,电源,VGA插口显示器一台备用,串口线调试用,PC机。
软件设备:Xilinx 10Designsuit,sp3的补丁放在项目工程路径下,该文件在xilinx公网上下载,地址:http://www.xilinx.com/univ/XUPV2P/lib/lib_xupv2p_edk_10_1_sp3.zip。切记,XUP光盘包带自带的IP核在没有打sp3补丁的xilinx10下无法识别,该光盘只适用于EDK8.2。另,如在Windows操作系统下,需使用GIT下载工具下载device-tree,地址是:git://git.xilinx.com/device-tree.git
下面一步步介绍如何用EDK搭硬件平台。高手请略过,写给入门者看的。
1.打开EDK
2.选择Base system Builder wizard,点ok
3.选择项目工程保存路径
4.挑上复选框的勾,并将外部存储路径设置为sp补丁包的lib文件夹,如图,点OK。
5.选择I would like to creat a new design,不上图了,Next。
6.按图配置,不解释了,Next。
7.点击Next,按照默认,配置PowerPC。
8.如图配置,处理器设置为200M,使能Cashe。点Next。
9.按照红框配置,设置外部中断。继续Next。
10.一路Next,直到遇到配置Cashe,如图所示。Next。
11.继续一路Next,直到Generate,下图是我的配置信息,点击Generate,然后Finish。
12.OK!顺利的话能看到以下架构:
13.在Bus Interface中双击Ethernet_MAC,如下图按照红框配置乒乓Buffer。点OK。
14.完成后编译项目,在菜单栏上依次点击DeviceConfig-->UpdateBitstream。根据提示修正错误,例如,提示ERROR:MDT - issued from TCL procedure "check_partno" line 21
DDR_SDRAM (mpmc) -
The parameter C_MEM_PARTNO=KVR266X64C25/256 is not found in the memory
database.
这时候重新配置一遍DDR就行了。找一个和自己内存条一样配置的就行,例如我的是MT46V16M16-6T。设置完成编译时候又遇到新问题:ERROR:MDT - IPNAME:xps_ethernetlite INSTANCE:ethernet_mac ……该问题是因xps_ethernetlite_v2_1_0.bbd文件没包含v2p。这个问题我的解决方案是在文件中添加一条支持V2p的信息,该bbd文件位置在:
$Xilinx\EDK\hw\XilinxProcessorIP\Lib\pcores\xps_ethernetlite_v2_00_a\data
然后继续updatebitstream。通过编译,开始综合了。综合的时候会遇到各种各样的问题,我就遇到了system.ucf不能写的问题,我是用修改权限解决此问题,找到了该文件,右键属性,在安全tab中添加everyone属性,并“完全控制”。并且已经在环境变量中添加变量CYGWIN=nontsec ,如未添加则添加后重新打开EDK。OK,最终通过了生成bit文件,Done!当然中间提示了些warning,说是DDR某些管脚悬空。
第二章结束
第三章 用EDK生成device-tree和device-tree generator
步骤如下:
1.用Windows的同仁在http://code.google.com/p/msysgit/downloads/list下载一个git安装文件,安装完成后运行bin下的git命令:git clone git://git.xilinx.com/device-tree.git
如果服务器up的话就会顺利的down到一个device-tree的文件夹,里边有个bsp文件夹,把他整个拷到项目工作路径根目录中。如果连不上git.xilinx.com到xilinx官方网络提问题,由服务器的系统管理员为你解决。
2.回到EDK的工程中来,在生成device-tree之前先跑一遍自测试memory,一般显示通过,接着,重新配置EDK使之生成linux device-tree。点击Software-->Software Platform Settings...在弹出的选项框中设置OS为device-tree。如果这时没有device-tree就要确认是不是把正确的bsp文件夹放在正确的工程路径中。成功的话如下图所示,然后点击OK。
3.在左边一列中选择OS and Libraies 并将新选框中的console device设置成你UART的名称并把bootargs的值由ttyS0改为console=ttyUL0。如下图所示,点击OK。
4.可以生成device-tree了,点击Software-->Generate Libraries and BSPs待到console Window出现:LibGen Done. Done!的时候在工作路径下EDK会创建xilinx.dts,该文件在我的工作路径下是:D:\my_program\my_edk\20100124-v2pro-linux-edk\ppc405_0\libsrc\device-tree_v0_00\xilinx.dts
该文件用于下一章的编译linux。
第三章结束
第四章 编译Linux内核
这一章通过五步轻松搞定:
1.准备文件
2.编译配置linux
3.通过XMD跑linux
4.通过ACE跑linux
下面进行说明:
1.准备文件
1)Linux Kernel
可以有几种办法得到linux kernel。推荐用git.xilinx.com上的linux-2.6-xlnx。命令:
git clone git://git.xilinx.com/linux-2.6-xlnx.git这样你有了个linux-2.6-xlnx文件夹,大概700多M。并将整个文件夹拷到第一章安装交叉编译工具的linux PC机。
2)修改linux kernel 中有关boot loader 的文件
文件路径:linux-2.6-xlnx\arch\powerpc\boot\wrapper 用户vim或其他工具打开wrapper这个文件,搜索第一个link_address='0x400000',把他改为link_address='0x800000'否则可能会出现如下错误:
zImage starting: loaded at 0x00400000 (sp: 0x0061deb0)
Allocating 0x48505c bytes for kernel ...
Insufficient memory for kernel at address 0! (_start=00400000, uncompressed size="00405128")
2.编译linux
1)先设置环境变量:
export ARCH="powerpc"
export CROSS_COMPILE=powerpc-405-linux-gnu-
export PATH=%%交叉编译工具路径%%/crosstool-ng-1.3.2/powerpc-405-linux-gnu/bin:$PATH
测试环境变量设置正确与否:新开终端运行powerpc-405-linux-gnu-gcc
应该看到以下信息:powerpc-405-linux-gnu-gcc: no input files
2)配置linux:
运行make menuconfig,按照下面配置单配置:
?Processor support
Processor Type: AMCC 40x
?Platform support:
Walnut: No
Generic Xilinx Virtex board: Yes
?Kernel options:
Time frequency: 250 HZ (该值可以根据需要调整)
?Bus options:
PCI support: No
PCCard (PCMCIA/CardBus) support: No
?Networking support:
Networking options:
IP: kernel level autoconfiguration: Yes (to enable NFS root)
?Device Drivers:
Block devices:
Xilinx SystemACE support: No (暂时这么设,以后回来设成Yes)
Network device support:
Ethernet (10 or 100Mbit)
Xilinx 10/100 OPB EMACLITE support: Yes
Ethernet (1000Mbit)
Xilinx LLTEMAC 10/100/1000 Ethernet MAC driver: Yes
Xilinx LLTEMAC PHY Support: TODO: GMII or MII? (for ML403)
Character devices:
Serial drivers:
Xilinx uartlite serial port support: Yes
Support for console on Xilinx uartlite serial port: Yes
GPIO Support:
Xilinx GPIO support: Yes
?Filesystems:
Second extended fs support: Yes
Ext2 execute in place support: Yes (高级选项,用google搜索“execute in place”或者“XIP”)
Network File Systems:
NFS client support: Yes (开启NFS root)
Root file system on NFS: Yes (开启这个选项需要开启“Networking options”中的“IP: kernel level autoconfiguration”)
配置完成,配置后生成".config"文件,建议备份好此文件,以便以后修改配置。仅需要把备份的文件覆盖原.config文件,并make oldconfig即可。
3)拷贝EDK生成的Device-tree
该文件是xilinx.dts,上一章最后提到的文件。将它拷贝到linux-2.6-xlnx\arch\powerpc\boot\dts中,并改名为:virtex405-xxx.dts,其中xxx可随意命名,本版定为virtex405-mine.dts。
4)开始执行编译linux命令
nice make -j 4 simpleImage.virtex405-mine,该命令是开始编译内核并且将进程的优先级提高。执行完该命令后会有一个后缀为ELF的可执行文件。路径为:
linux-2.6-xlnx\arch\powerpc\boot\simpleImage.virtex405-mine.elf
该文件可以通过CompactFlash+SystemACE用XMD下载到FPGA中。
3.通过XMD跑linux
顺序如下:1)将elf文件拷到装有EDK的电脑上,并将该电脑连接到V2P,至于用JTAG连接还是usb连接都可以。2)启动EDK,打开第二章创建的工程,该工程已生成bit文件待下载。3)下载该文件到V2P开发板上。4)点击Debug-->Launch XMD打开调试工具后再在XMD中找到第1步拷来的elf文件,并down到FPGA上去,命令如下:
XMD% cd x:\xxxxxxx\xxxx\xxxx\linux-2.6-xlnx
XMD% cd arch/powerpc/boot
XMD% dow simpleImage.virtex405-mine.elf
XMD% run
成功的话能在XMD中看到启动信息。
4.通过ACE跑linux
这个先只写流程:1)用XMD创建ACE文件,2)格式化CF卡,3)拷入ACE文件。具体暂时不写了。
第四章结束
第五章编译文件系统
本章解释如何创建最简单的initramfs和initrd,他们只包含两个文件:
/dev/console
必须的路径,作用是使屏幕显示字符。
init
在上电启动之后启动linux的和执行程序。
通常的initramfs或initrd比这里用的复杂多了,这里只是用最小的系统。
initramfs和initrd提供了根文件系统,对于嵌入式系统,只要读取initramfs或initrd就达到目标了。有一件事情必须注意:initramfs和基于initrd的文件系统不稳定,只要重启,你对文件系统做的任何修改都将丢失。在linux2.6内核中已经加入了initramfs,他和initrd相比有两个特点:
1)尤其对于嵌入式系统来说,他让内核启动更有效率。initramfs不是基于基本文件系统,而initrd必须基于如ext2的文件系统,initramfs能旁路这些间接层。initramfs可以使文件奇迹般的存在于没有任何基本文件系统的linux虚拟内存子系统中。
2)具有将linux内核空间的特点移动到用户空间中的潜在能力,并且它能更灵活的发现和挂载根文件系统。
创建initramfs和initrd的主要差别:
镜像类型 初始化地址 编译镜像的工具
initramfs /init cpio -H newc -o
initrd /sbin/init mkcramfs,genext2fs等
接着,在交叉编译环境下编译一个C代码,假设让他print一句话。命令:
gcc -static myinit.c -o myinit
现在介绍用initramfs:
1.内核配置:设置initramfs的源文件以明确配置内核。(initramfs.cpio)
2.建立一个initramfs文件夹,拷贝已经编译的myinit工程到initramfs文件夹并重命名为init,用假超级用户权限创建CPIO档案文件,下面命令中newc意思是一种便携格式,cpio的消息页。
mkdir initramfs
cp myinit initramfs/init
cd initramfs
fakeroot
mkdir -p dev
mknod dev/console c 5 1
chown root init
find . | cpio -H newc -o > ../initramfs.cpio
exit
cd ..
3.最后拷贝CPIO归档文件到编译内核路径中,并编译
cp initramfs.cpio .........
nice make -j 4 simpleImage.virtex405-mine
4.同上一章,当down到板上后会有C程序的输出。
第五章结束
总述:一切只是理论,借助这次大赛我帮我整理了思路,感觉文件系统这块确实不简单,要搭出能用ACE的,VGA的,PS2的,能插串口盘的xilinx V2p板上嵌入式linux系统仅仅靠这篇博客是无法完成的,还需要多多学习。开学在到实验室跑下整个流程,希望能顺利通过。如果哪位哥们已经跑通了还麻烦多多指导!
文章评论(0条评论)
登录后参与讨论