如何将PetaLinux移植到Xilinx FPGA上
时间:04-13
来源:互联网
点击:
测试运行在设备上的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所示。
最后您可使用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电路板上的硬件外设视为一组存储寄存器。每个寄存器都有自己的基址和结束地址。要访问一个外设,用户必须知道它的基
图5:确认操作系统引导成功的PetaLinux控制台快照
图6:通过通用引导载入程序(U-Boot)进行的间接内核引导
址和结束地址。您可以在设备树源(*.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
图7:通过QEMU运行PetaLinux
该应用旨在控制8位离散输出,可通过将板载LED连接至GPIO进行测试。
值15显示在终端上,这说明DDR3存储器读写操作正在成功进行。
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。
然后我们重新构建了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
图8:在服务器中创建文件的快照
图9:在客户端接收文件的快照
图10:从客户端到服务器传输文件的快照
图11:在服务器中接收文件的快照
为从服务器接收该文件,我们在以客户端方式运行在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,操作起来非常简单直观。接下来,我们计划使用远程编程实现设计,即引导文件通过以太网传输,客户端能够运行新应用。
下面介绍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所示。
最后您可使用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电路板上的硬件外设视为一组存储寄存器。每个寄存器都有自己的基址和结束地址。要访问一个外设,用户必须知道它的基
图5:确认操作系统引导成功的PetaLinux控制台快照
图6:通过通用引导载入程序(U-Boot)进行的间接内核引导
址和结束地址。您可以在设备树源(*.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
图7:通过QEMU运行PetaLinux
该应用旨在控制8位离散输出,可通过将板载LED连接至GPIO进行测试。
值15显示在终端上,这说明DDR3存储器读写操作正在成功进行。
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。
然后我们重新构建了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
图8:在服务器中创建文件的快照
图9:在客户端接收文件的快照
图10:从客户端到服务器传输文件的快照
图11:在服务器中接收文件的快照
为从服务器接收该文件,我们在以客户端方式运行在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,操作起来非常简单直观。接下来,我们计划使用远程编程实现设计,即引导文件通过以太网传输,客户端能够运行新应用。
通信工程 电子 FPGA 嵌入式 Linux 赛灵思 ARM SoC 电路 仿真 Xilinx LED 总线 C语言 uClinux 相关文章:
- 一种扩频通信调制器的FPGA设计与仿真(11-08)
- 基于FPGA的RS485接口误码测试仪的设计(11-09)
- 零基础学FPGA (一) 关于我和FPGA(01-14)
- 基于ARM的嵌入式系统中从串配置FPGA的实现(06-09)
- 周立功:如何兼顾学习ARM与FPGA(05-23)
- 初学者如何学习FPGA(08-06)
