有两种方法可以创建用于构建PetaLinux系统 的软件平台:在Linux终端上使用PetaLinux 命令或通过下拉菜单使用GUI。
开始安装
- 下面详细介绍我们项目团队安装 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/PetaLinuxv12.12-final。 接下来的工作是安装
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 及硬件平台的调试、构建和 配置等。
硬件构建
- 我们为项目使用了基于 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。
此时硬件设计已完成。现在可以使用第一阶段 引导载入程序引导该内核。
- 接下来,我们使用三步转换流程将硬件配置转换为比 特流。首先,我们使用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 类型(这里是 MicroBlaze 处理器)、 –v 为厂商名称(这里 是赛灵思),而 –p 则为产品名称(这里是 KC705)。软件平台的配置文件在安装 PetaLinux 的目录下 生成,即 /opt/PetaLinuxv12.12/software/ PetaLinux-dist/vendors/Xilinx/ KC705。 为定制与硬件匹配的软件平台模板,我们使用 PetaLinux-copy-autoconfig命令将现有平台配置与内核配置 进行了合并。该命令可生成硬件配置文件 Xilinx-KC705. dts, xparameters.h 和config.mk。
- 我 们 使 用 G U I (P e t a L i n u x S D K → K e r n e l 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 时设定)。随后, fsboot 将从闪存中的 U-Boot 分区中获取 U-Boot 映像,将其 发送到设备的 DDR3 存储器并运行内核。一旦构建好所有 引导所需的映像后,您就可以通过 JTAG、以太网或快速仿真器在硬件上测试这些映像了。 QEMU 是一种仿真器和 虚拟机,允许您运行 PetaLinux 操作系统 [9]。下面讨论所 有这三种解决方案的引导方法。 J TA G 是编程和测试 F P G A 设计的传统方法。为 使用 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.68
- 现在服务器(PC)和主机(KC705 电路板)具有 相同的 IP 地址。请通过服务器运行网络引导命令,下载 PetaLinux映像和引导程序 :
u-boot> run netboot
- 运行网络引导命令后,您应该能够看到 PetaLinux 控 制台,如图 5 所示。
- 最后您可使用 GUI(PetaLinux SDK → BOOT QEMU [Linux])或以下命令执行内核引导,这也很重要。
$ cd $ PETALINUX/software/ PetaLinux-dist
$ PetaLinux-qemu-boot -i images/image.elf
-
使用这种快速方法,我们将看到图 7 所示信息。 测试运行在设计上的应用 完成 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
该应用旨在控制8位离散输出,可通过将 板载LED连接至GPIO进行测试。
- 值 15 显示在终端上,这说明 DDR3 存储器读写操作 正在成功进行。
-2. 使用 /dev/mem 访问 GPIO - 对于接下来的应用测试,我们使用名为 gpio-dev-memtest.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。
- 然后我们重新构建了 PetaLinux,并使用 UIO 测试了 GPIO 访问。我们使用以下命令,获得了所加载 UIO 模块 的详细信息 :
# ls /sys/class/uio/
uio0 uio1 uio2
- UIO 的名称和地址可在 /sys/class/uio/uioX 下找到。我 们使用以下命令通过 UIO 驱动程序访问了 GPIO LED
:
# cd “/sys/class/uio/uioX
# gpio-uio-test -d /dev/uio1 -o 255
- 其中 gpio-uio-test 为应用名称、 -d 为设备路径、 -o 为 输出、 255 为通过 UIO 传递给 GPIO
的值。使用以上命 令, LED 按写入到 GPIO 线路上的数据点亮,验证了该结 果。
- 4.文件传输应用
- 最后一项测试,我们将文件从服务器传输到了客户端,这 里的服务器是主机 PC,客户端是 KC705 电路板。在这项测试中,我们使用以太网线缆连接服务器和客户端,并使 用了小型文件传输协议(TFTP)。这种协议因简单而出名,通常用于自动传输配置文件或引导文件。为测试使用 TFTP 从服务器向客户端传输文件的情况,我们在 /tftpboot 位置为服务器PC 创建了一个名为 test 的文件。我们使用 以下命令在文件中写入了“世界,你好”并查看了该文件 中的内容(如图 8 所示):
@ echo “Hello World” > /tftpboot/test
@ more /tftpboot/test
- 为从服务器接收该文件,我们在以客户端方式运行在 KC705 电路板上的 PetaLinux 终端窗口中输入以下获取命 令(-g):
# tftp -r test -g 192.168.25.68
# ls –a
- 在客户端中创建了一个名为“test”的新文件(如图 9 所示)。我们可以使用更多内容命令查看该文件的内容, 如图 9 所示 :
- 同样,如果要从客户端向服务器传输文件,可先 在客户端机器上创建一个名为 test1 的文件,其内容为 “PetaLinux OS”。然后在运行在客户端上的 PetaLinux 终 端中使用以下“放置”命令(-p),便可将该文件从客户 端传输至服务器,如图 10所示 :
# tftp -r test1 -p 192.168.25.68
- 可在服务器中创建一个空白文件 test1,其内容可在文 件传输工作完成后读取。该内容可图 11 所示方法进行验证。 在 FPGA 上实现嵌入式系统和运行 PetaLinux,操作 起来非常简单直观。接下来,我们计划使用远程编程实现设计,即引导文件通过以太网传输,客户端能够运行新应 用。
参考资料
1.Kynan Fraser,《运行 UClinux 的 MicroBlaze》,摘自《高级计
算机体系架构》: http://www.cse.unsw.edu.au/~cs4211
2.赛灵思公司 Xilkernel 3.0 版, 2006 年 12 月
3. 赛灵思公司《PetaLinux SDK 用户指南》 UG976, 2013 年 4
月
4. Gokhan Ugurel 和 Cuneyt F. Bazlamacci,《在 MicroBlaze 上
Xilkernel 和 μC/OS-II 上下文切换时间及内存占用比较》,摘
自 2011 年 12 月土耳其布尔萨的《第 7 届电子电气工程国际
学术会议》第 52 页至 55 页。
5. Chenxin Zhang、 Kleves Lamaj、 Monthadar Al Jaberi 和 Praveen
Mayakar,《极小型网络附加存储(NAS)》”,摘自隆德大学
机械学院(Lunds Tekniska Hogskola)《项目报告,高级嵌入
式系统课程》 2008 年 11 月
6. 赛灵思公司《Platform Studio 用户指南》 UG113, 1.0 版,
2004 年 3 月
7. 赛灵思公司《EDK 概念、工具和技巧 :高效嵌入式系统设计
实际操作指南》 UG683, 14.1 版本, 2002 年 4 月
8. 赛灵思公司《PetaLinux 应用开发指南》 UG981, 2013 年 4 月
9. 赛灵思公司《PetaLinux QEMU 仿真指南》 UG982, 2013 年
11 月