最新文章
EP1K50TI144-2N
型号:EP1K50TI144-2N 欢迎来电咨询!可提供原厂技术支持,方案开发,帮助客户选型!
===========================================
深圳市毅创腾电子科技有限公司
电话:(86)-755-83210909 83616256 83210801 83213361
企业QQ: 2355507165 / 2355507163
===========================================
深圳市毅创腾电子科技有限公司是一家大型、专业的XILINX(赛灵思)、ALTERA(阿特拉)、FREESCALE(飞思卡尔)、Analog Devices、TexasInstruments嵌入式FPGA、CPLD、微控制器、数字信号处理等集成电路销售与服务的授权分销商。也是亚太地区最大规模的原装XILINX、ALTERA、FREESCALE产品供应商之一。
===========================================
下面详细介绍我们项目团队安装PetaLinux的方法。第一步,我们下载了PetaLinux软件包12.12版以及用于Kintex-7目标板的电路板支持包(BSP)。然后运行了PetaLinux SDK安装程序,并在控制台上使用下列命令把SDK安装到了/opt/Petalinux-v12.12-final目录下:
@ cd /opt
@ cd /opt/PetaLinux -v12.12-final-full.tar.gz
@ tar zxf PetaLinux-v12.12-final-full.tar.gz
随后,我们把从赛灵思网站获得的PetaLinux SDK许可证复制并拷贝到.xilinx和.Petalogix文件夹中。接下来,我们使用下列命令获取适当设置,设置了SDK的工作环境:
@ cd /opt/PetaLinux-v12.12-final
@ source settings.sh
为验证工作环境是否设置正确,我们使用了以下命令:
@ echo $PETALINUX
如果环境设置正确,将显示PetaLinux的安装路径。在本案例中,PetaLinux的安装路径是 /opt/PetaLinux-v12.12-final。
图1:用于用户设置的Linux终端窗口截屏
接下来的工作是安装BSP,其中包含必要的设计文件、配置文件和预构建软硬件包。这些软硬件包已经通过测试,可随时下载到目标板上。另外软件包还可用于在快速仿真器(QEMU)系统仿真环境下的引导。为了安装BSP,我们在path /opt中创建了一个名为“bsp”的文件夹,并使用下列命令复制了KC705 BSP的ZIP文件:
@ cd /opt/PetaLinux-v12.12-final-full
@ source settings.sh
@ source /opt/Xilinx/14.4/ISE _DS/settings32.sh
@ PetaLinux-install-bsp /bsp/Xilinx-KC705
-v12.12- final.bsp
构建为新平台定制的PetaLinux系统,有两种创建和配置软件平台的方法。一种方法是使用Linux终端,在PetaLinux命令对应的路径位置使用PetaLinux命令,如图1所示。第二种方法是通过下拉菜单使用GUI,如图2所示。您可使用其中任何一种方法来选择平台,配置Linux内核,配置用户应用和构建镜像。在操作系统安装完成后,就可使用PetaLinux控制台。而使用GUI则需要完成PetaLinux SDK插件的安装。完成该插件的安装后,就可使用PetaLinux Eclipse SDK中提供的PetaLinux GUI设置各种配置(图2)。该GUI具有各种特性,如用户应用和库开发,以及PetaLinux及硬件平台的调试、构建和配置等。
图2:用于用户设置的PetaLinux SDK菜单截屏
硬件构建
我们为项目使用了基于Kintex-7 FPGA的KC705评估板。设计需要的硬件接口有用于监控输出的RS232接口、用于编程FPGA的JTAG接口以及用于远程编程的以太网接口。除了PetaLinux SDK,所推荐设计需要的其它软件还包括Xil-inx Platform Studio (XPS) [6,7] 和赛灵思软件开发套件(SDK)[7]。
在该嵌入式设计的硬件部分,我们的第一项任务就是使用XPS中的基本系统构建器(BSB)设计基于MicroBlaze处理器的硬件平台。BSB允许选择目标板上提供的一系列外设。您还可根据应用需求添加或删除外设。我们所推荐应用采用的内核或外设集包括带8Mb存储器的外部存储器控制器、在中断情况下启用的定时器、波特率为115,200Bps的RS232 UART、以太网、非易失性存储器以及LED。完成选择后,我们就获得了硬件外设及其总线接口(图3)。对于基于MicroBlaze处理器的设计,PetaLinux需要支持MMU的CPU。因此我们在XPS窗口中双击MicroBlaze_0实例,选择了带MMU的低端Linux。
图3:FPGA的硬件配置
此时硬件设计已完成。现在可以使用第一阶段引导载入程序引导该内核。
接下来,我们使用三步转换流程将硬件配置转换为比特流。首先,我们使用XPS生成了代表嵌入式硬件平台的网表。随后,我们将设计映射到FPGA逻辑中。最后我们将实现的设计转换为能够下载到FPGA上的比特流。XPS的最终输出是system.bit和sys-tem_bd.bmm文件。
生成比特流后,我们将硬件平台描述导出到SDK,以便在SDK中观察目标硬件平台。导出的系统xml文件包含SDK编写应用软件并在目标硬件平台上对其进行调试所需的信息。我们的下一项任务是使用Xilinx Tools → Repository → New 在SDK中添加一个PetaLinux库,然后选择PetaLinux的安装路径。在本实例中,该路径为$PetaLinux/Hardware/edk_user_repository。
接下来,我们使用File → Board support package → PetaLinux创建了PetaLinux BSP。我们根据所需的应用选择必要的驱动程序,配置了PetaLinux BSP。随后我们通过构建BSP并创建和配置第一阶段的引导载入程序应用(fs-boot),引导了内核。该BSP可建立硬件和引导应用之间的交互。SDK的输出为fs-boot.elf。可使用数据到存储器转换器命令data2mem将system.bit、system_bd.bmm和fs-boot.elf 合并为一个名为download.bit的统一比特流文件,用作最终的FPGA比特流。
此时硬件设计已完成,其它方面还包括一个MicroBlaze内核和运行其上的PetaLinux操作系统。现在我们可以使用第一阶段的引导载入程序引导内核。
构建软件
完成硬件平台的构建后,我们使用下列命令创建了针对硬件的定制PetaLinux软件平台:
$ cd/opt/PetaLinuxv12.12
$ PetaLinux-new-platform –c <CPU-ARCH> –v <VENDOR> –p <PLATFORM>
其中–c <cpu-arch>为支持的CPU类型(这里是MicroBlaze处理器)、–v <vendor>为厂商名称(这里是赛灵思),而–p <platform>则为产品名称(这里是KC705)。软件平台的配置文件在安装PetaLinux的目录下生成,即/opt/PetaLi-nuxv12.12/software/ PetaLinux-dist/vendors/Xilinx/ KC705。
图4:内核配置菜单
为定制与硬件匹配的软件平台模板,我们使用PetaLinux-copy-autoconfig命令将现有平台配置与内核配置进行了合并。该命令可生成硬件配置文件Xilinx-KC705.dts、xparame-ters.h 和 config.mk。
我们使用GUI(PetaLinux SDK → Kernel Configuration)打开内核配置菜单,配置了Linux内核。此外,您也可以在Linux终端上使用下列命令完成该工作:
$ cd /opt/PetaLinux_v12.12 $ PetaLinux-config-kernel
我们在内核配置弹出窗口中启用该应用的驱动程序(如图4所示)。为通过用户空间输入/输出(UIO)接口访问设备,完成所提出的工作,我们在内核配置菜单中启用了UIO驱动程序。
内核配置完成后,我们设计了一些应用。PetaLinux可提供用于C语言和C++编程的用户应用模板[8]。这些模板包括应用源代码和Makefile文件,方便为目标芯片配置和编译应用并将其安装在根文件系统中。创建新的PetaLinux用户应用,既可使用GUI(File → PetaLinux New Application),也可在Linux终端上输入下列命令:
$ cd /opt/PetaLinux_v12.12 $ PetaLinux-config-apps
随后我们为该用户应用起了个文件名。在本实例中,我们创建了gpio-dev-mem-test和gpio-uio-test用户应用,并根据应用要求修改了模板源代码。
接下来我们使用GUI构建了PetaLinux系统映像(如图2所示)。此外,您还可以在Linux终端上使用make命令完成该任务,如下图所示:
$ cd $PETALINUX/software/ PetaLinux-dist $ make
支持操作系统(OS)和定制用户应用的软件平台以及我们前文讨论过的硬件设计现已可供使用。
测试运行在设备上的PetaLinux
下面介绍PetaLinux的引导方式。MicroBlaze处理器可处理驻留在Block RAM中的代码。第一阶段的引导载入程序(fs-boot)将初始化基本硬件、执行fs-boot.elf、搜索通用引导载入程序或U-Boot、在闪存分区中进行寻址(因为U-Boot的地址已在配置fs-boot时设定)。随后,fs-boot将从闪存中的U-Boot分区中获取U-Boot映像,将其发送到设备的DDR3存储器并运行内核。一旦构建好所有引导所需的映像后,您就可以通过JTAG、以太网或快速仿真器在硬件上测试这些映像了。QEMU是一种仿真器和虚拟机,允许您运行PetaLinux操作系统[9]。下面讨论所有这三种解决方案的引导方法。
JTAG是编程和测试FPGA设计的传统方法。为使用JTAG对FPGA进行编程,我们使用了下拉菜单“Xilinx Tool → Program the FPGA”并下载了之前生成的download.bit文件。随后我们使用GUI(PetaLinux SDK → BOOT JTAG [Li-nux])将映像下载到了电路板上,如图2所示。您也可以在Linux终端上使用下列命令:
$ cd/opt/PetaLinux _v12.12/software/ PetaLinux-dist
$ PetaLinux-jtag-boot -i images/image.elf
此外,您还可使用U-Boot执行间接内核引导,从而引导PetaLinux。系统首先使用GUI(PetaLinux SDK → BOOT JTAG [U-Boot])或以下命令通过JTAG接口下载U-Boot来进行引导。
$ cd $PETALINUX/software/ PetaLinux-dist
$ PetaLinux-jtag-boot -i images/u -boot.elf
图6是U-Boot控制台的快照。
值得注意的是,FPGA电路板连接的是以太网接口。您必须在XPS的硬件资源部分选择以太网接口。一旦U-Boot引导成功,就要检查服务器和主机的IP地址是否相同。如果IP地址不同,请在U-Boot终端上使用下列命令设置主机IP。
u-boot>print serverip // prints 192.168.25.45(server ip)
u-boot>print ipaddr // prints IP address
of the board as // 192.168.25.68
u-boot>set serverip <HOST IP> // Host IP 192.168.25.68
u-boot>set serverip 192.168.25.68192.168.25.68
现在服务器(PC)和主机(KC705电路板)具有相同的IP地址。请通过服务器运行网络引导命令,下载PetaLinux映像和引导程序:
u-boot> run netboot
运行网络引导命令后,您应该能够看到PetaLinux控制台,如图5所示。
图5:确认操作系统引导成功的PetaLinux控制台快照
图6:通过通用引导载入程序(U-Boot)进行的间接内核引导
最后您可使用GUI(PetaLinux SDK → BOOT QEMU [Linux])或以下命令执行内核引导,这也很重要。
$ cd $ PETALINUX/software/ PetaLinux-dist $ PetaLinux-qemu-boot -i images/image.elf
使用这种快速方法,我们将看到图7所示信息。
图7:通过QEMU运行PetaLinux
测试运行在设计上的应用
完成PetaLinux引导的测试后,接下来就是测试专为PetaLinux设计的用户应用。MicroBlaze处理器将Kintex-7 FPGA电路板上的硬件外设视为一组存储寄存器。每个寄存器都有自己的基址和结束地址。要访问一个外设,用户必须知道它的基址和结束地址。您可以在设备树源(*.dts)文件中找到有关地址的详细信息。就本设计而言,我们开发并测试了四款应用,分别是访问DDR3、使用/dev/mem访问GPIO、使用UIO访问GPIO和文件传输。
1. 访问DDR3
我们使用名为DDR3-test.c的PetaLinux应用访问DDR3存储器。该应用经过精心设计,可向DDR存储器位置写入数据并从这里读取数据。DDR3是双列直插式存储器模块,可提供用于存储用户代码和数据的SDRAM。如上文所述,用户需要知道DDR存储器的开始地址和结束地址,分别是0xC0000000和0xC7FFFFFF。存储器的容量为512兆字节。Linux内核驻留在DDR存储器的初始存储器位置。因此需要选择DDR3存储器的写入位置,以避免破坏Linux内核。我们使用以下命令向DDR3存储器写入数据:
#DDR3-test –g 0xc7000000 –o 15
其中DDR3-test是应用名称、-g是DDR3存储器的物理地址、-o是输出、15是准备在0xc7000000位置写入DDR3存储器的值。为测试该值是否能写入预计的位置,我们使用以下命令从DDR3存储器读取数据:
#DDR3-test –g 0xc7000000 –i
值15显示在终端上,这说明DDR3存储器读写操作正在成功进行。
该应用旨在控制8位离散输出,可通过将板载LED连接至GPIO进行测试。
2. 使用/dev/mem访问GPIO
对于接下来的应用测试,我们使用名为gpio-dev-mem-test.c的PetaLinux应用访问了通用I/O(GPIO)。该应用的设计目的是控制8位离散输出并通过将板载LED连接至GPIO来测试该输出。要从用户空间访问任何设备,就要先打开/dev/mem,然后使用mmap()将设备映射至存储器。我们所使用LED GPIO的开始地址和结束地址分别是0x40000000 和0x4fffffff。
GPIO外设具有两个寄存器:数据寄存器(GPIO_DATA)和方向寄存器(GPIO_TRI_OFFSET)。为了读取GPIO的状态,我们将方向位设置为1(即GPIO_TRI_OFFSET=1)并且从数据寄存器读取数据。为了将数据写入到GPIO,我们设置方向位为0并写入值到数据寄存器。在PetaLinux终端上使用下列命令将数据写入到GPIO:
#gpio-dev-mem-test –g 0x40000000 –o 255
其中gpio-dev-mem-test为应用名称,-g为GPIO物理地址,-o为输出,255为从GPIO(连接到LED)发送的值。LED按编写的程序点亮时,测试的结果就得到了验证。
3. 使用UIO访问GPIO
访问GPIO的另一个途径是通过用户空间输入/输出。我们通过UIO,使用名为gpio-uio-test.c的PetaLinux应用访问了GPIO。该应用旨在控制8位离散输出,可通过将板载LED连接至GPIO进行测试。UIO设备在文件系统中表现为/dev/uioX。为通过UIO访问GPIO,我们打开了/dev/uioX或sys/class/ui0,然后使用了mmap()调用。我们配置了内核使之支持UIO,并在内核中启用了UIO框架。随后我们使用名为“Compatibility”的参数,根据UIO设备(而非标准GPIO设备)对LED的GPIO控制方式进行了设置。此外,我们还将设备的标签从 gpio@40000000修改成了leds@40000000。