zc706 linux查看Ip,Xilinx ZC706嵌入式开发和Petalinux小试

zc706 linux查看Ip,Xilinx ZC706嵌入式开发和Petalinux小试_第1张图片

做点东西不容易,我这种有强迫症的人也在这个环节屈服了。开发环境这两年真是换了又换,被搞的精疲力尽。Xilinx的开发环境我还是推荐Linux(这里默认都是64bit系统),Windows的综合和P&R的效率要比Linux低三分之一,这个不能忍,再就是petalinux的交叉编译用啥呢,cygwin?Linux发行版里面我用的是CentOS,Vivado推荐测试的那几个我试过CentOS和Ubuntu。先说Ubuntu,不好用,问题比较多。CentOS最好的版本是6.5,但是6.5已经在官网不支持了,替代的是6.6和7。先说7,Vivado的开发环境没有问题,但是petalinux的环境始终有问题,具体在这里,Unable to determine a suitable packaging system type。那最后就剩下6.6了,6.6也有一个小问题,是eclipse的一个bug,eclipse cairo bug。网上你能找到的方法是在eclipse的配置文件加上一句disable cairo的话,但是这个在Xilinx的工具链中不管用,我试了好多Xilinx的eclipse的config文件,都不行。别的解决的方法下面我会说。好,现在正是搭建环境:

开发平台环境搭建

上边说了,我们用CentOS 6.6 64bit。装的时候有个地方让你选平台的用处,你就选最后一个,software development。装别的也行,注意把一些开发环境和库的选项都选上。装好系统后可能会提示你更新,内核也被更新了,你就更新吧。然后我们装几个库1。

yum install dos2unix iproute gawk gcc git gnutls-devel net-tools ncurses-devel sftp-server zlib-devel flex bison libstdc++.i686 libgcc.i686 libgomp.i686 ncurses-libs.i686 zlib.i686 libselinux libselinux.i686

前边几个都是文档里面说的库,有些也用不到,比如tftp那个,你不用tftp调试就不用。后边也要装上,要不然petalinux编译的时候还是会有问题。然后我们再装两个库,解决上边说的那个eclipse的bug。去rpmfind.net下载下面的两个库:

cairo-1.10.2-3.el6.x86_64.rpm

cairo-devel-1.10.2-3.el6.x86_64.rpm

然后装上,

yum localinstall cairo*.rpm

Vivado工具链安装

这个简单,下载下来装上就行,记得勾上 Install Cable Drivers。这里我用的都是2014.4的版本,下边的Petalinux也是对应的。记得source setting文件。

Petalinux开发环境

这个开发环境我们可以参考Xilinx Wiki上说的那些方法,也可以直接用他们准备好的Petalinux SDK工具链。这里我们选择后者。安装也简单,去官网下载下来然后装上就好。BSP你可以下载下来装上玩玩,我们这里不用下这个,我们自己建一个就好。大家可以参看Xilinx的官方文档,ug1144,里面有详细的说明。我们也只是按照说明走一遍,然后给出一个例子,让大家快速上手。

一个例子

这里给大家展示一个例子,跟Zynq CTT ug873里面的差不多,但是这里我们用了Vivado,并且结合了Petalinux SDK的开发流程。不过我建议大家多看help,这里还有一个Petalinux的command reference供大家参考。我们开始:

建立一个petalinux的project

petalinux-create -t project --name poll

cd poll

在当前目录就会建立一个poll的文件夹,这就是我们的工作目录,后边的所有操作如果不特别指出,都是在这个工作目录的根目录进行的。里面还缺hardware platform,driver,还有我们的application。我们一一补上。

创建一个hardware platform

这里我给大家准备了一个TCL文件,下载(戳这里下载),然后放到project的根目录。这里注意,我都是在Vivado 2014.4和ZC706环境下做的,要是你的环境不同,要做出适当的修改,板子不同改创建工程的那两句话。Vivado版本不同改所有IP的版本,或者你自己建一个也行,这个系统就是一个PS然后一个MicroBlaze,然后还有个BRAM。后边还得给MB写个程序。这里有个系统图你可以参考下,注意保证BRAM的起始地址是0x40000000,MB和ARM都得一样才行。zc706 linux查看Ip,Xilinx ZC706嵌入式开发和Petalinux小试_第2张图片

最后运行:

vivado -mode gui -source ./system.tcl

然后Vivado就是启动,等右上角的那个进度条走完,bitstream文件就会生成好了。机器不同,时间可能不同,我的机器大约5分钟。

生成系统的时候看着特别爽吧,哈哈,duang duang的生成完了。Vivado比ISE增加了tcl,在自动化的时候还是很爽的,不用像原来ISE分析那个系统描述文件来自动生成系统。其实下边的SDK的过程也可以全程自动化,但是有点麻烦,需要修改SDK的xml文件然后调用xsdk去build就行。这里就不说了,爽到底就没意思了。

然后我们就可以File->Export->Export Hardware,记得勾上Include bitstream。然后File->Launch SDK,我们就进入到下一步了。

给MicroBlaze写个程序

MB的这个程序主要的功能就是不断的把BRAM中一个地址的数值传到另一个地址,后边在ARM运行的Linux会把这个BRAM当做一个外设,然后要对其写个driver。不要MB也行,有个好玩嘛,异构系统,heterogeneous,多高大上。。。哈哈。给MB建一个空的Application Project,名字叫poll吧,然后添加一个main.c的文件到工程中,main.c里面复制上这些代码:

/*

* main.c

*/

#define BRAM_ADDRESS 0x40000000

int main(void) {

volatile int *bram = (int *)BRAM_ADDRESS;

while (1)

bram[1] = bram[0];

}

然后保存下,SDK就编译好啦。下面要做的事情就是把编译生成的ELF文件和系统生成的bitstream文件组合在一起。这样bit文件下载到板子里面,这个程序就可以直接运行了。这里有个简单的方法,选Xilinx Tools->Program FPGA。把下面的ELF File to Initialize in Block BRAM 选择成我们生成好的poll.elf,下拉下就找到了,一般在Debug下边(大就忍了吧)。然后点那个Program,然后出来下一个对话框后,点Cancel。这样,我们就骗SDK把我们要的那个download.bit文件生成出来了,然后我们不用这个下载。你们注意下边的Console选项卡,会有刚才这个合成调用的命令updatemem,原来是data2mem,不过模糊有印象哪里说过前者会更好一些。

配置一下Petalinux

刚才创建的Petalinux project是没有硬件的描述信息的,这会我们就把我们生成的硬件描述信息配置到Petalinux里面去。很简单,运行这个:

petalinux-config --get-hw-description=./hardware/hardware.sdk/system_wrapper_hw_platform_0

然后会出来个配置界面,我们直接选Exit,然后保存配置就可以了。系统会被自动配置好。详细的说明看上边说的那个reference guide。

创建Linux Kernel Module

接下来我们需要对刚才创建的那个PL上要program的硬件系统写一个驱动,主要就是对那个BRAM的两个location进行的访问。先创建一个module的工程吧:

petalinux-create -t modules --name poll_driver --enable --force

创建好的module的模板会在components->modules->poll_driver。这里已经有一个poll_driver.c,然后还要建一个poll_driver.h文件。下载这个zip文件,里面有这两个dirver文件和下一步要用的app文件。(戳这里下载)。都是参考CTT写得啦,他们也参考了另一个网站,上边给了比较简明的教程,写了个char的device driver。

创建Linux Application

这一步我们就创建个在petalinux上运行的程序,然后会调用刚才的那个driver。还是先建个app的工程:

petalinux-create -t apps --name poll_app --enable --force

app的模板会在components->apps->poll_app。把上一步那个压缩包里面的poll_app.c替换到这个生成的app目录里面。好啦,到目前为止所有的软硬件的创建工作就完成了,下面就得编译fsbl,device_tree, uboot,kernel,module和app了。我也不会分开弄了,Xilinx Wiki上的是分开弄的,好复杂的说。

编译生成所有image文件

上边说了那么复杂,Petalinux SDK里面好简单的。

petalinux-build

可能需要点时间,等一会,哈哈!再修改编译就快了。

生成image文件会在./image/linux里面,modules和apps会在./build/linux/rootfs/modules和./build/linux/rootfs/apps里面。但其实./image/linux下面的rootfs (或者kernel image,我不确定)里面已经有我们编译好的modules和apps了。

生成boot文件

这一步得生成启动需要用得boot文件:

petalinux-package --boot --fsbl ./image/linux/zynq_fsbl.elf --u-boot --force

生成pre-built文件夹

这一步主要是方便后面的boot的,其实上一步已经生成了我们可以boot zynq的所有文件了,但是养成好习惯,我们生成一个pre-built文件夹,把image和bitstream文件都包含进来。

petalinux-package --prebuilt --fpga ./hardware/hardware.sdk/system_wrapper_hw_platform_0/download.bit --force

好了之后可以看到工程根目录下生成了一个pre-built,然后./pre-built/linux/images和./pre-built/linux/implementation下分别是软件和硬件的文件。

启动zynq board

好啦,终于倒数第二步了,所有的文件都已经生成完了,启动zynq有好多种方法,因为我们有bitstream文件,所以介绍两种可以下载bitstream文件的方法,也是两种启动linux kernel的方法。就是SD和JTAG,还有些别的方法,参看文档。我就不用了,无论哪种方法先把板子上的SW4配置成 off和on。其实SD卡启动不用,但是方便就都配置成这样就行了。在这之前还得装一个看UART的小工具,用minicom就挺好。

yum install minicom

第一次运行su模式minicom -s,配置一下Serial port setup,Serial Device改成/dev/ttyUSB0(我的是0,你的不一定)。然后115200 8N1。Hardware Flow Control设置成No就可以输入字符到zynq上啦,我会乱说。

第一种SD卡引导啦(加粗显得正式一些。。)

先格式化一张SD卡成FAT格式,然后把这三个文件都考到SD卡上的第一个分区。

./pre-built/linux/images/image.ub

./pre-built/linux/images/BOOT.BIN

./pre-built/linux/implementation/download.bit

然后配置一下板子上的SW11成00110,0就是开关掰到下边,1就是上边。这样板子就进入了SD卡启动的模式。把SD卡插进去,重启电源就行啦!然后启动minicom,用户名和密码都输入root就进入系统啦!

第二种方法JTAG

调试的时候用JTAG了,不用一遍一遍的插拔SD卡了,多方便。发行的时候用SD卡模式了。同样,SW11先配置成00000。然后重启下zynq的电源,清空原来运行的系统,要不然会有错误哦,你又知道了。。然后我们执行:

petalinux-boot --jtag --prebuilt 3

稍等片刻,download.bit会先被下载到板子里面,然后kernel会被加载。然后输入用户名密码,系统又进去了。迭代开发的时候要记得生成pre-built啊,还得重启zynq电源啊。

Finally!!下载PL,加载module,运行我们的程序了

终于最后一步了,肚子好饿。如果上一步你用的JTAG启动,就不用再下载bitstream了,如果SD卡启动,我们先把bitstream下载到板子里面。进入到Petalinux的系统之后,运行这个,很神奇的。

mount /dev/mmcblk0p1 /mnt

cat /mnt/download.bit > /dev/xdevcfg

下载完啦。。用得是zynq上得PCAP啊。

接下就是加载我们的module:

insmod /lib/modules/`uname -r`/extra/poll_driver.ko

一般会输出printk里面的东西了,如果没有就运行:

dmesg

或者

cat /var/log/dmesg

最后就可以看到kernel的输出了。这里要看的是中间有那么一句话,我们需要知道module加载被分配的major device number。我这里是245,还要再创建一个设备节点,后边的app会用到。

mknod /dev/poll_dev c 245 0

然后/dev/poll_dev就被创建出来了。

最后的最后了。。运行我们创建的程序:

很简单,很简单。。

/bin/poll_app

整个流程终于结束了。。。

后记

万里长征第一步而已,入个门。还有很多的问题,比如debug,大家多多交流。

最后,推荐一本书Embedded Linux Primer: A Practical Real-World Approach,作者:Christopher Hallinan。 资深工程师写得书,通俗易懂,入门必选。

你可能感兴趣的:(zc706,linux查看Ip)