3 构建 Xillinux

3.1 概述

Xillinux 发行版旨在作为一个开发平台,而不仅仅是演示:在其为硬件运行做准备的过程中,会构建一个可直接使用的环境,用于自定义 逻辑开发和集成。因此,首次测试运行的准备时间稍长(通常约 30 分钟,其中大部分时间用于等待 Altera 工具)。然而,较长的准备时间可 缩短后续集成自定义逻辑的周期。

要从 microSD 卡引导 Xillinux 发行版,microSD 卡必须包含三个组件:

  • 一个初始引导镜像环境,位于一个特殊分区中,包含 U-boot 加载程序(U-boot loader)。

  • 一个小型 FAT 文件系统,其中包含 FPGA 部分的配置位流(bitstream)文件、Linux 内核二进制文件及其设备树(device tree)。

  • 由 Linux 挂载的根文件系统(root file system)。

除了 FPGA 的位流外,上述所有内容均已包含在 Xillinux 的 microSD 镜像中。

本节将逐步详细说明准备 microSD 卡的各种操作。大部分时间花在准备 FPGA 位流上。

以下步骤假设使用 SoCKit 开发板,并需按所列顺序执行:

  • 解压启动镜像工具包(boot image kit)

  • 生成处理器的包装(wrapper)和总线基础设施

  • 实现主 FPGA 项目,并将位流转换为正确格式

  • 将原始 Xillinux 镜像写入 microSD 卡

  • 将位流文件复制到 microSD 卡中

有关如何使用其他开发板的信息,请参见第 5.2 节。

3.2 解压启动镜像工具包

将之前下载的 xillinux-eval-sockit-XXX.zip 文件解压到一个工作目录中。

重要 的:
工作目录的路径不得包含空格。特别地,桌面(Desktop)不适用,因为其路径包含 "Documents and Settings"。

该工具包包含以下目录:

  • verilog – 包含主逻辑的项目文件以及一些 Verilog 源文件(位于 ’src’ 子目录中)。

  • vhdl – 包含主逻辑的项目文件以及一些源文件。需要编辑的 VHDL 文件位于 ’src’ 子目录中。

  • core – 预编译的 Xillybus IP 核二进制文件。

  • soc_system – ARM 处理器包装和总线基础设施。

  • instantiation templates – 包含 Verilog 和 VHDL 的实例化模板。

请注意,’verilog’ 和 ’vhdl’ 目录均包含 SoCKit 开发板的 QSF 文件。如果使用其他开发板,则必须编辑此文件。

另外请注意,vhdl 目录中包含 Verilog 文件,但用户无需编辑它们。

与 Xillybus IP 核的接口位于各自 ’src’ 子目录中的 xillydemo.v 或 xillydemo.vhd 文件中。当您希望使用自己的数据源(data source)和数据接收器(data sink)尝试 Xillybus 时,需编辑该文件。

3.3 生成处理器的包装

打开 Quartus II,可以通过双击启动镜像工具包中 ’verilog’ 或 ’vhdl’ 子目录下的 ’xillydemo.qpf’ 文件来启动。

在 Quartus 中,选择 “File > Open...” 打开 Qsys 项目,向上导航一个目录,进入 soc_system 目录,然后选择 soc_system.qsys。此时将启动 Qsys 工具并打开处理器包装项目。

点击窗口顶部附近的 “Generation” 选项卡,然后点击 “Generate”(位于底部附近)。

该过程大约需要几分钟,进度窗口最终显示如下:

关闭进度窗口以及 Qsys 窗口。以后无需重复此过程。

3.4 生成原始位流文件

此步骤在完成处理器包装生成(如第 3.3 节所述)之 后进行。

根据您的偏好,双击 ’verilog’ 或 ’vhdl’ 子目录下的 ’xillydemo.qpf’ 文件。Quartus II 将启动并使用正确的设置打开项目。如果 您刚刚完成 Qsys 操作,可能 Quartus II 已经处于打开状态。在这种情况下,只需确认选择了您偏好的语言(如果您不关心,请选择 Verilog)。

确保 “flow” 设置为 “Compilation”,然后点击 “Compile Design” 以创建 FPGA 编程文件,如下图所示。

该过程会产生约 100 个警告,但最终应出现一个对话框,告知 “Full Compilation was successful”。会有关键警告(Critical warnings)产生,但不应容忍任何错误。此外,在编译之后,务必检查是否没有出现 “Timing requirements not met”(时序要求未满足)的警告(332148)。后续在 Verilog/VHDL 源文件中进行修改后运行编译时,这一点尤其重 要。

最后,将获得的编程文件转换为所需格式。在 Quartus II 中,选择 File > Convert Programming Files...,然后选择 Raw Binary File (.rbf) 作为编程文件类型。紧接着,将 “File name” 设置为 soc_system.rbf。

在 “Input files to convert” 区域中,点击 “SOF Data”,然后点击右侧的 “Add File...”,选择 xillydemo.sof。

然后点击右下角的 “Generate”。成功生成文件后关闭窗口。soc_system.rbf 应复制到 MicroSD 卡中,如第 3.6 节所述。

重要 的:
生成 .rbf 文件时不要启用压缩(保持默认设置)。soc_system.rbf 的大小应为 6-7 MB。

3.5 将镜像加载到 microSD 卡

3.5.1 概述

此任务的目标是将下载的 microSD 卡镜像文件写入设备。下载的文件名为 xillinux-1.1-sockit.img.gz(或类似),是 microSD 卡的 gzip 压缩镜像(但之后需要添加 soc_system.rbf 文件)。

该镜像应解压缩,然后写入 microSD 卡的第一扇区(sector)及后续扇区。有几种方法和工具可以完成此操作。下面建议几 种方法。

该镜像包含一个分区表、一个部分填充的用于放置启动镜像的 FAT 文件系统、一个原始启动分区以及 ext4 类型的 Linux 根文 件系统。几乎所有 Windows 计算机只能检测到 FAT 分区,因此 microSD 卡显示出的容量会非常小(约 47 MB)。

写入完整磁盘镜像并非面向普通计算机用户的操作,因此在 Windows 计算机上需要特殊软件,在 Linux 上也需要格外小心。 以下段落将说明如何在两种操作系统上完成此操作。

重要 的:
向 microSD 卡写入镜像将不可恢复地删除其可能包含的任何先前内容。强烈建议使用与写入镜像相同的工具先备份其现有 内容。

3.5.2 加载镜像(Windows)

在 Windows 上,需要使用特殊应用程序来复制镜像,例如 USB Image Tool。此工具适用于使用 USB 适配器访问 microSD 卡的情况。

某些计算机(尤其是笔记本电脑)内置有 SD 插槽,可能需要使用其他工具,例如 Win32 Disk Imager。在运行 Windows 7 时也可能遇到这种情况。

这两个工具均可从网络上各种站点免费下载。以下操作步骤假定使用 USB Image Tool。

对于图形界面,运行 “USB Image Tool.exe”。当主窗口出现后,插入 USB 适配器,选择左上角出现的设备图标。确保左上 角下拉菜单中处于 “Device Mode”(而不是 “Volume Mode”)。点击 Restore,并将文件类型设置为 “Compressed (gzip) image files”。选择 下载的镜像文件(xillinux-1.1-sockit.img.gz)。整个过程大约需要 4-5 分钟。完成后,卸载设备(“安全移除硬件”)并拔出。

在某些机器上,GUI 可能会运行失败,显示软件初始化错误。在这种情况下,可以使用命令行替代方案,或者需要安装 Microsoft .NET framework 组件。

另外,也可以在命令行下完成此操作(如果尝试运行 GUI 失败,这是一种快速的替代方法)。这分两个阶段进行。首先,获 取设备编号。在 DOS 窗口中,将目录更改为应用程序解压的位置,然后执行(典型会话如下):

C:\usbimage>usbitcmd l

USB Image Tool 1.57
COPYRIGHT 2006-2010 Alexander Beug
http://www.alexpage.de

 Device | Friendly Name                     | Volume Name | Volume Path | Size
------------------------------------------------------------------------------
    2448 | USB Mass Storage Device |                           | E:\        | 2014 MB

(注意, "usbitcmd" 后面的字符是小写字母 "l" ,而不是数字 "1")

现在,当我们得到设备编号后,就可以实际执行写入(“restore”)操作:

C:\usbimage>usbitcmd r 2448 \path\to\xillinux-1.1-sockit.img.gz /d /g

USB Image Tool 1.57
COPYRIGHT 2006-2010 Alexander Beug
http://www.alexpage.de

Restoring backup to "USB Mass Storage Device USB Device" (E:\)...ok

再次说明,这大约需要 4-5 分钟。当然,请将编号 2448 替换为第一阶段获得的实际设备编号,并将 \path\to 替换为 microSD 卡镜像在您计算机上存储的路径。

3.5.3 加载镜像(Linux)

重要 的:
向设备进行原始复制是一项危险的操作:一个简单的人为错误(通常选择错误的目标磁盘)可能导致计算机硬盘上所有数 据不可恢复地丢失。在按 Enter 键之前请三思,如果您不熟悉 Linux,考虑在 Windows 下完成此操作。

如前所述,正确识别作为 microSD 卡的设备非常重要。最佳方法是插入 USB 连接器,并在主日志文件(/var/log/messages 或 /var/log/syslog)中查找类似以下内容:

Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] 7813120 512-byte logical blocks
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Write Protect is off
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sdc: sdc1
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Assuming drive cache: write through
Sep 5 10:30:59 kernel: sd 1:0:0:0: [sdc] Attached SCSI removable disk
Sep 5 10:31:00 kernel: sd 1:0:0:0: Attached scsi generic sg0 type 0

输出可能略有不同,但关键是要查看内核给新磁盘分配的名称。上面的例子中是 “sdc”。

解压镜像文件:

# gunzip xillinux-1.1-sockit.img.gz

将镜像复制到 microSD 卡只需执行:

# dd if=xillinux-1.1-sockit.img of=/dev/sdc bs=512

当然,您应该指向您确定的闪存盘。

重要 的:
/dev/sdc 仅作为示例。请勿使用此设备,除非它恰好与您的计算机上识别的设备一致。

然后进行验证:

# cmp xillinux-1.1-sockit.img /dev/sdc
cmp: EOF on xillinux-1.1-sockit.img

注意输出信息:在镜像文件上遇到 EOF 意味着其他所有内容都已正确比较,并且闪存驱动器有比实际使用的更多空间。如 果 cmp 没有任何输出(通常会被认为是好的),实际上意味着出现了问题。很可能生成了一个普通文件 “/dev/sdc”,而不是写入到设 备。

3.6 将 soc_system.rbf 文件复制到 microSD 卡中

拔出 USB 适配器,然后将其重新连接到计算机。 这步操作是必要的,以确保计算机能够获取到 microSD 卡最 新的分区表信息。如有必要,挂载第一个分区(例如 /dev/sdb1)。大多数计算机会自动完成此操作。

然后将 soc_system.rbf(在第 3.4 节中生成)复制到 microSD 卡的 FAT 文件系统中。在 Windows 系统上,这是系统会显示的唯一“磁盘”。在 Linux 系统上,这是第一个(也较小的)分区。无论 哪种方式,正确的目标位置可以通过其现有内容轻松识别,该内容仅包含两个文件:’socfpga.dtb’ 和 ’uImage’。

完成后,正确卸载 microSD 卡,并将其从计算机拔出,例如:

> umount /mnt/sd

如果 SoCKit 开发板已在运行 Xillinux,则可以直接从开发板本身更新 soc_system.rbf。要在 Xillinux 上挂载 FAT 文件系统, 请执行:

> mkdir /mnt/sd
> mount /dev/mmcblk0p1 /mnt/sd

然后访问 /mnt/sd/ 处的文件系统。请注意,如果新的 soc_system.rbf 本身有问题(例如被压缩)或其他操作不当,开发板下 次可能无法启动。因此,务必保留另一种访问 microSD 卡的备用手段。