zynq7000源码_zynq7000开发入门

hacker|
126

文章目录:

如何利用Zynq-7000的PL和PS进行交互

在Zynq-7000上编程PL大致有3种方法:

1. 用FSBL,将bitstream集成到boot.bin中

2. 用U-BOOT命令

3. 在Linux下用xdevcfg驱动。

步骤:

1. 去掉bitstream的文件头

用FSBL烧写PL Images没有什么好说的,用Xilinx SDK的Create Boot Image工具即可完成,不再赘述。用后两种方法需要把bitstream文件的文件头用bootgen工具去掉。

一个典型的bif文件如下所示:

the_ROM_image:

{

[bootloader]fsbl_name.elf

pl_bitstream_name.bit

u-boot_name.elf

}

bif文件可以用文本编辑器写,也可以用Xilinx SDK的Create Boot Image工具生成。然后在命令行下用以下命令即可去掉bitstream文件的文件头。

bootgen -image bootimage.bif -split bin -o i BOOT.BIN

"-split”参数可以生成以下文件:

pl_bitstream_name.bit.bin

2. 在U-BOOT下烧写PL Image

命令”fpga load”和”fpga loadb”都可以。区别是前一个命令接受去掉了文件头的bitstream文件,后一个命令接受含有文件头的bitstream文件。

在OSL 2014.2上,缺省编译就可以完整支持写入PL Image的功能。但是在Petalinux 2013.10下,尽管可以在U-BOOT下看到命令”fpga”,还需要在文件

PROJ/subsystems/linux/configs/u-boot/platform-top.h 中增加以下内容后重新编译才可以支持具体的功能。

/* Enable the PL to be downloaded */

#define CONFIG_FPGA

#define CONFIG_FPGA_XILINX

#define CONFIG_FPGA_ZYNQPL

#define CONFIG_CMD_FPGA

#define CONFIG_FPGA_LOADFS

在OSL 2014.2 U-BOOT中,具体的功能是在zynqpl.c的zynq_load()中实现的。

3. 在Linux下烧写PL Image

OSL Linux 2014.2.01中已经含有xdevcfg驱动了(之前就有,不过本文是在这个版本上验证的),直接用以下命令就可以完成PL Image写入。

cat path_to_storage_media/pl_bitstream_name.bit.bin /dev/xdevcfg

Linux驱动的源代码在xilinx_devcfg.c中。因为驱动的编号是通过alloc_chrdev_region()动态分配的,所以不需要手工用mknod命令手动建立设备节点。

在Linux驱动中,每次往DevCfg中写入4096字节,直到全部写完。

4. 在用户程序中烧写PL Image

目前没有现成的源码来完成这个功能,不过可以用mmap()把DevCfg的寄存器映射到用户程序的虚地址中,然后参考一些现成的软件代码来完成这个功能:

* FSBL中的pcap.c

* U-BOOT中的zynqpl.c

* Linux中的xilinx_devcfg.c

* Xilinx SDK中的例子。例子位于以下位置,随SDK的版本会有变化。

C:\Xilinx\SDK\2014.1\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html

小结:

DevCfg外设内部有自己的DMA,只需要简单的配置PL Image的基地址和长度到DevCfg寄存器,就可以完成Zynq-7000 PL Image的加载。Xilinx已经提供了灵活的解决方案,如果开发者要把这个功能集成在自己的应用程序中,也有很多的代码可以参考,并不是很困难的任务。

有人用过zynq7000 的axi dma实现PS与PL的高速通信吗

在Zynq-7000上编程PL大致有3种方法:1.用FSBL,将bitstream集成到boot.bin中2.用U-BOOT命令3.在Linux下用xdevcfg驱动。步骤:1.去掉bitstream的文件头用FSBL烧写PLImages没有什么好说的,用XilinxSDK的CreateBootImage工具即可完成,不再赘述。用后两种方法需要把bitstream文件的文件头用bootgen工具去掉。一个典型的bif文件如下所示:the_ROM_image:{[bootloader].elf.bit.elf}bif文件可以用文本编辑器写,也可以用XilinxSDK的CreateBootImage工具生成。然后在命令行下用以下命令即可去掉bitstream文件的文件头。bootgen-image.bif-splitbin-oiBOOT.BIN"-split”参数可以生成以下文件:.bit.bin2.在U-BOOT下烧写PLImage命令”fpgaload”和”fpgaloadb”都可以。区别是前一个命令接受去掉了文件头的bitstream文件,后一个命令接受含有文件头的bitstream文件。在OSL2014.2上,缺省编译就可以完整支持写入PLImage的功能。但是在Petalinux2013.10下,尽管可以在U-BOOT下看到命令”fpga”,还需要在文件/subsystems/linux/configs/u-boot/platform-top.h中增加以下内容后重新编译才可以支持具体的功能。/*EnablethePLtobedownloaded*/#defineCONFIG_FPGA#defineCONFIG_FPGA_XILINX#defineCONFIG_FPGA_ZYNQPL#defineCONFIG_CMD_FPGA#defineCONFIG_FPGA_LOADFS在OSL2014.2U-BOOT中,具体的功能是在zynqpl.c的zynq_load()中实现的。3.在Linux下烧写PLImageOSLLinux2014.2.01中已经含有xdevcfg驱动了(之前就有,不过本文是在这个版本上验证的),直接用以下命令就可以完成PLImage写入。cat/.bit.bin/dev/xdevcfgLinux驱动的源代码在xilinx_devcfg.c中。因为驱动的编号是通过alloc_chrdev_region()动态分配的,所以不需要手工用mknod命令手动建立设备节点。在Linux驱动中,每次往DevCfg中写入4096字节,直到全部写完。4.在用户程序中烧写PLImage目前没有现成的源码来完成这个功能,不过可以用mmap()把DevCfg的寄存器映射到用户程序的虚地址中,然后参考一些现成的软件代码来完成这个功能:*FSBL中的pcap.c*U-BOOT中的zynqpl.c*Linux中的xilinx_devcfg.c*XilinxSDK中的例子。例子位于以下位置,随SDK的版本会有变化。C:\Xilinx\SDK\2014.1\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html小结:DevCfg外设内部有自己的DMA,只需要简单的配置PLImage的基地址和长度到DevCfg寄存器,就可以完成Zynq-7000PLImage的加载。Xilinx已经提供了灵活的解决方案,如果开发者要把这个功能集成在自己的应用程序中,也有很多的代码可以参考,并不是很困难的任务。

没硬件怎么玩zynq7000

官网提供的可执行文件是基于64位Linux的:zynq_linux.tar.gz.

对于32位的系统,需要自己编译,解决方案如下:

1) 下载代码:git clone git://git.xilinx.com/qemu-xarm.git

2) 配置工程:

cd qemu-xarm

./configure --target-list=arm-softmmu --disable-werror --disable-kvm

3) 编译: make

4) 编译结果:

[walt@zynq7k qemu-xarm]$ ls -l arm-softmmu/qemu-system-arm

-rwxrwxr-x. 1 walt walt 18428427 Nov 6 15:27 arm-softmmu/qemu-system-arm

5) 检测环境是否OK,测试如下:

[walt@zynq7k qemu-xarm]$ ./arm-softmmu/qemu-system-arm -h

QEMU emulator version 1.0.50, Copyright (c) 2003-2008 Fabrice Bellard

usage: qemu-system-arm [options] [disk_image]

‘disk_image’ is a raw hard disk image for IDE hard disk 0

Standard options:

-h or -help display this help and exit

-version display version information and exit

-machine [type=]name[,prop[=value][,...]]

selects emulated machine (-machine ? for list)

property accel=accel1[:accel2[:...]] selects accelerator

supported accelerators are kvm, xen, tcg (default: tcg)

-cpu cpu select CPU (-cpu ? for list)

…… ……

注: 若无法执行,请按提示安装缺失的动态库。

替换官方下载的压缩包中的文件为新编译的qemu-system-arm,测试执行如下:

[walt@zynq7k zynq_linux]# ./start_qemu.sh

ram size=40000000

error reading QSPI block device

error no mtd drive for nand flash

a0mpcore_priv: smp_priv_base f8f00000

error no sd drive for sdhci controller (0)

error no sd drive for sdhci controller (1)

Number of configured NICs 0×1

ram_size 40000000, board_id d32, loader_start 0

Uncompressing Linux… done, booting the kernel.

Booting Linux on physical CPU 0

Linux version 3.3.0-14.2-build1 (relman@xcobldal824) (gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-50) ) #1 SMP PREEMPT Thu Jul 12 09:04:32 MDT 2012

CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d

CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache

Machine: Xilinx Zynq Platform, model: Xilinx Zynq ZC702

bootconsole [earlycon0] enabled

Memory policy: ECC disabled, Data cache writealloc

PERCPU: Embedded 7 pages/cpu @c190b000 s5696 r8192 d14784 u32768

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 255744

Kernel command line: console=ttyPS0,115200 root=/dev/ram rw initrd=0×800000,8M ip=:::::eth0:dhcp earlyprintk

PID hash table entries: 4096 (order: 2, 16384 bytes)

Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)

Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)

Memory: 240MB 768MB = 1008MB total

Memory: 1009280k/1009280k available, 39296k reserved, 270336K highmem

Virtual kernel memory layout:

vector : 0xffff0000 – 0xffff1000 ( 4 kB)

fixmap : 0xfff00000 – 0xfffe0000 ( 896 kB)

vmalloc : 0xf0000000 – 0xff000000 ( 240 MB)

lowmem : 0xc0000000 – 0xef800000 ( 760 MB)

pkmap : 0xbfe00000 – 0xc0000000 ( 2 MB)

modules : 0xbf000000 – 0xbfe00000 ( 14 MB)

.text : 0xc0008000 – 0xc040bdb0 (4112 kB)

.init : 0xc040c000 – 0xc0430640 ( 146 kB)

.data : 0xc0432000 – 0xc045fd20 ( 184 kB)

.bss : 0xc045fd44 – 0xc0479f5c ( 105 kB)

Preemptible hierarchical RCU implementation.

Verbose stalled-CPUs detection is disabled.

NR_IRQS:128

xlnx,ps7-ttc-1.00.a #0 at 0xf0000000, irq=43

Console: colour dummy device 80×30

Calibrating delay loop… 147.35 BogoMIPS (lpj=736768)

pid_max: default: 32768 minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

CPU0: thread -1, cpu 0, socket 0, mpidr 80000000

smp_twd: clock not found: -2

Calibrating local timer… 84.48MHz.

hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 1 counters available

Setting up static identity map for 0x2f3000 – 0x2f3034

CPU1: Booted secondary processor

CPU1: thread -1, cpu 1, socket 0, mpidr 80000001

Brought up 2 CPUs

SMP: Total of 2 processors activated (271.66 BogoMIPS).

devtmpfs: initialized

NET: Registered protocol family 16

L2x0 series cache controller enabled

l2x0: 8 ways, CACHE_ID 0×00000000, AUX_CTRL 0×72060000, Cache size: 524288 B

registering platform device ‘pl330′ id 0

registering platform device ‘arm-pmu’ id 0

hw-breakpoint: debug architecture 0×0 unsupported.

xslcr xslcr.0: at 0xF8000000 mapped to 0xF0008000

bio: create slab at 0

gpiochip_add: registered GPIOs 0 to 245 on device: xgpiops

xgpiops e000a000.gpio: gpio at 0xe000a000 mapped to 0xf000a000

SCSI subsystem initialized

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

Switching to clocksource xttcpss_timer1

NET: Registered protocol family 2

IP route cache hash table entries: 32768 (order: 5, 131072 bytes)

TCP established hash table entries: 131072 (order: 8, 1048576 bytes)

TCP bind hash table entries: 65536 (order: 7, 786432 bytes)

TCP: Hash tables configured (established 131072 bind 65536)

TCP reno registered

UDP hash table entries: 512 (order: 2, 16384 bytes)

UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)

NET: Registered protocol family 1

RPC: Registered named UNIX socket transport module.

RPC: Registered udp transport module.

RPC: Registered tcp transport module.

RPC: Registered tcp NFSv4.1 backchannel transport module.

Trying to unpack rootfs image as initramfs…

rootfs image is not initramfs (junk in compressed archive); looks like an initrd

Freeing initrd memory: 8192K

xscugtimer xscugtimer.0: ioremap fe00c200 to f000c200 with size 400

pl330 dev 0 probe success

highmem bounce pool size: 64 pages

JFFS2 version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc.

msgmni has been set to 1459

io scheduler noop registered

io scheduler deadline registered

io scheduler cfq registered (default)

e0001000.uart: ttyPS0 at MMIO 0xe0001000 (irq = 82) is a xuartps

console [ttyPS0] enabled, bootconsole disabled

console [ttyPS0] enabled, bootconsole disabled

e0000000.uart: ttyPS1 at MMIO 0xe0000000 (irq = 59) is a xuartps

xdevcfg f8007000.devcfg: ioremap f8007000 to f0060000 with size 100

brd: module loaded

loop: module loaded

GEM: BASEADDRESS hw: e000b000 virt: f0062000

XEMACPS mii bus: probed

xemacps e000b000.eth: invalid address, use assigned

MAC updated d2:c4:43:31:6b:d0

eth0, pdev-id -1, baseaddr 0xe000b000, irq 54

ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver

xusbps-ehci xusbps-ehci.0: Xilinx PS USB EHCI Host Controller

xusbps-ehci xusbps-ehci.0: new USB bus registered, assigned bus number 1

xusbps-ehci xusbps-ehci.0: irq 53, io mem 0×00000000

xusbps-ehci xusbps-ehci.0: USB 2.0 started, EHCI 0.00

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 0 ports detected

Initializing USB Mass Storage driver…

usbcore: registered new interface driver usb-storage

USB Mass Storage support registered.

Xilinx PS USB Device Controller driver (Apr 01, 2011)

mousedev: PS/2 mouse device common for all mice

i2c /dev entries driver

Linux video capture interface: v2.00

gspca_main: v2.14.0 registered

uvcvideo: Unable to create debugfs directory

usbcore: registered new interface driver uvcvideo

USB Video Class driver (1.1.1)

WDT OF probe

xwdtps f8005000.swdt: Xilinx Watchdog Timer at 0xf0066000 with timeout 10 seconds

sdhci: Secure Digital Host Controller Interface driver

sdhci: Copyright(c) Pierre Ossman

sdhci-pltfm: SDHCI platform and OF driver helper

mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using ADMA

usbcore: registered new interface driver usbhid

usbhid: USB HID core driver

TCP cubic registered

NET: Registered protocol family 17

VFP support v0.3: implementor 41 architecture 3 part 40 variant 0 rev 0

Registering SWP/SWPB emulation handler

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

GEM: lp-tx_bd ffdfb000 lp-tx_bd_dma 2f2b2000 lp-tx_skb ee9199c0

GEM: lp-rx_bd ffdfc000 lp-rx_bd_dma 2f2b1000 lp-rx_skb ee9198c0

GEM: MAC 0x3143c4d2, 0x0000d06b, d2:c4:43:31:6b:d0

GEM: phydev ee90ec00, phydev-phy_id 0x1410cc2, phydev-addr 0×17

eth0, phy_addr 0×17, phy_id 0x01410cc2

eth0, attach [Marvell 88E1111] phy driver

Sending DHCP requests ., OK

IP-Config: Got DHCP answer from 10.0.2.2, my address is 10.0.2.15

IP-Config: Complete:

device=eth0, addr=10.0.2.15, mask=255.255.255.0, gw=10.0.2.2,

host=10.0.2.15, domain=, nis-domain=(none),

bootserver=10.0.2.2, rootserver=10.0.2.2, rootpath=

RAMDISK: ext2 filesystem found at block 0

RAMDISK: Loading 8192KiB [1 disk] into ram disk… done.

VFS: Mounted root (ext2 filesystem) on device 1:0.

devtmpfs: mounted

Freeing init memory: 144K

Starting rcS…

++ Mounting filesystem

++ Setting up mdev

eth0: link up (1000/FULL)

++ Starting telnet daemon

++ Starting http daemon

++ Starting ftp daemon

++ Starting dropbear (ssh) daemon

rcS Complete

zynq uname -v

#1 SMP PREEMPT Thu Jul 12 09:04:32 MDT 2012

zynq df

Filesystem 1K-blocks Used Available Use% Mounted on

none 508808 0 508808 0% /tmp

zynq

ZYNQ7000芯片的基本组成

赛灵思Zynq-7000 可扩展处理平台(EPP)将双 ARM Cortex-A9 MPCore 处理器系统与可编程逻辑和硬 IP 外设紧密集成在一起,提供了灵活性、可配置性和性能的完美组合。围绕其刚刚推出的可扩展处理平台(EPP), 赛灵思在今年3月发布了基于Zynq -7000新系列的首批器件。 采用 28 nm制造工艺, Zynq-7000嵌入式处理平台系列的每款产品均采用带有NEON及双精度浮点引擎的双核 ARM Cortex-A9 MPCore 处理系统,该系统通过硬连线完成了包括L1,L2 缓存、存储器控制器以及常用外设在内的全面集成。(图 1)。尽管 FPGA 厂商此前已推出过带硬核或软核处理器的器件,但 Zynq-7000 EPP 的独特之处在于它由ARM处理器系统而非可编程逻辑元件来进行控制。也就是说,处理系统能够在开机时引导(在 FPGA 逻辑之前)并运行各个独立于可编程逻辑之外的操作系统。这样设计人员就可对处理系统进行编程,根据需要来配置可编程逻辑。

如何在Zynq 7000平台上使用Linux spidev.c驱动

一、在前一篇博客中,我们采用xilinx针对Zynq 7000处理器提供的spi-cadence.c驱动实现了芯片上SPI总线驱动的注册,接下来需要修改设备树文件以时我们的外设挂接在SPI总线下。

在petalinux工程的../subsystems/linux/configs/device-tree目录下找到zynq相关的设备树文件,目录所包含的文件如下图所示。

打开其中的zynq-7000.dtsi文件,找到其中的spi0节点(具体使用spi0还是spi1根据硬件工程的配置情况),并在该节点下添加如下内容:

如何为zynq-7000创建BOOT.bin文件

1、用于创建BOOT.bin需要的文件

(1)u-boot.elf:在Linux下编译后生成u-boot文件,再强制改名为u-boot.elf文件,得到之。

(2)zynq_fsbl_0.elf:在EDk下创建得到之。

(3)system.bit::在PlanAhead中生成的bit文件;该文件不是必须的,没有该文件时,相当于把Zynq只当ARM来用。

2、创建BOOT.bin文件

(1)只含有PS部分的设计

在SDk下,Xilinx Tools - Craete Boot

Image得到如下图所示:

(2)同时包含有PS和PL设计

在(1)中所述生成的BOOT.bin文件不含有给PL部分配置的*.bit文件,即只是ARM部分的运行代码。要使PL部分也能运行,需要在创建BOOT.bin文件时,加入PL部分的设计生成system.bit文件

相比而言,由于(1)中生成的BOOT.bin文件没有PL部分的设计,也就无需对PL进行配置,所以启动时会快一些,而(2)中的BOOT.bin文件启动要慢一些,大概有30s~40s不等(依赖于system.bit文件的大小)。

4条大神的评论

  • avatar
    访客 2022-07-12 上午 12:38:26

    文件头用FSBL烧写PL Images没有什么好说的,用Xilinx SDK的Create Boot Image工具即可完成,不再赘述。用后两种方法需要把bitstream文件的文件头用boo

  • avatar
    访客 2022-07-12 上午 10:31:21

    (order: 2, 16384 bytes)Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)Inode-cache hash table entries: 65536 (or

  • avatar
    访客 2022-07-12 上午 08:10:07

    ilable, 39296k reserved, 270336K highmemVirtual kernel memory layout:vector : 0xffff0000 – 0xffff1000 ( 4 kB)fixmap : 0x

  • avatar
    访客 2022-07-12 上午 03:28:21

    \data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\index.html小结:DevCfg外设内部有自己的DMA,只需要简单的配置PLImage的基地址和长度到DevCfg寄存器,就可以

发表评论