2 安装主机驱动程序

2.1 安装 Xillybus 驱动程序的步骤

安装 Linux 内核驱动程序需执行以下步骤:

  • 检查是否确实需要安装。如果不需要,则跳过后续步骤(但可能不跳过最后一步,即复制 udev 文件)。

  • 检查先决条件(即确认编译器和内核头文件已安装)。

  • 解压下载的驱动程序文件(其中包含作为内核模块的驱动程序)。

  • 编译内核模块。

  • 安装内核模块。

  • 安装 udev 文件,以便 Xillybus 设备文件对任意用户(而不仅仅是 root 用户)可访问。

这些步骤通过命令行(“终端”)完成。附录 A 所载之 Linux 快速参考指 南,可供对该界面操作尚不熟悉的用户参阅。

2.2 是否真的需要安装任何东西?

2.2.1 总体说明

大多数 Linux 内核和 Linux 发行版已支持 Xillybus(针对 PCIe 或 AXI),无需额外操作。下面将作进一步说明。

话虽如此,即使 Xillybus 已经得到支持,也值得阅读第 2.7 节关于安装 udev 文件的内 容。

XillyUSB 的驱动程序从 Linux 内核 5.14 版本(2021 年 8 月发布)起已包含在内。

2.2.2 预装驱动程序的 Linux 发行版

大多数 Linux 发行版(例如 Ubuntu 14.04 及更高版本、近期的 Fedora 发行版、Xillinux(仅限 Zynq 和 Cyclone V SoC 平 台))已预装 PCIe/AXI Xillybus 驱动程序(“开箱即用”)。

要快速检查驱动程序是否已安装,可在 shell 提示符下输入以下命令:

$ modinfo xillybus_core

如果驱动程序已安装,则会打印相关信息。否则会显示“modinfo: ERROR: Module xillybus_core not found”。

类似地,检查 XillyUSB 驱动程序的命令为:

$ modinfo xillyusb

XillyUSB 在 Ubuntu 22.04 及更高版本、Fedora 35 及更高版本以及由此衍生出的发行版中无需安装即可正常工作。

注意:如果 Linux 运行在虚拟机内,它将无法在 PCIe 总线上检测到 Xillybus。运行驱动程序的操作系统必须位于裸机之 上。XillyUSB 可能在虚拟机内工作。

2.7 节 展示了如何永久更改 Xillybus 设备文件的权限。此更改可使这些文件对任意用户(而不仅仅是 root 用户)可访问。在桌面计算机上使用 Xillybus 时,通常需要此修改。

2.2.3 包含 Xillybus 驱动程序的 Linux 内 核

Xillybus 的驱动程序(针对 PCIe 和 AXI)从内核 3.12 版本起已包含在官方 Linux 内核中。在 3.12 到 3.17 之间的内核版本中,该驱动程 序以“暂存驱动程序”(staging driver)形式包含,这是 Linux 社区完全接受新驱动程序之前的初步阶段。Xillybus 的驱动程序在 3.18 版本中被 接纳为非暂存状态。尽管与编码风格相关的更改较多,但从最早的内核版本(3.12)到当前可用的驱动程序之间,功能上几乎没有差 异。

当加载暂存驱动程序时,内核会在系统日志中发出警告,称该驱动程序的质量未知。对于 Xillybus,可以安全地忽略此警 告。

如前所述,XillyUSB 的驱动程序从 Linux 内核 5.14 版本起已包含在内。

关于作为 Linux 发行版一部分的内核: 即使 Xillybus 的驱动程序是内核源代码的一部分,也只有在内核配置为 包含这些驱动程序时,它们才会被编译。Xillybus 的驱动程序以内核模块形式包含在大多数主流 Linux 发行版中,但每个发行版都有自己选择 内核包含内容的标准。因此,Xillybus 可能并未包含在发行版附带的内核中。

本指南侧重于通过单独编译内核模块来安装驱动程序。这通常是最简单的方法。然而,那些无论如何都要编译自己内核的用 户,可能更倾向于配置内核以包含 Xillybus 的驱动程序。此方法在第 2.9 节讨论。

2.3 检查先决条件

Linux 系统可能缺少编译内核模块所需的基本工具。判断这些工具是否存在的最简单方法是尝试运行它们。例如,在命令提示符下输 入“make coffee”。正确的响应如下:

$ make coffee

make: *** No rule to make target `coffee'. Stop.

尽管这是一个错误,但我们可以看到“make”工具存在。但如果 GNU make 缺失且需要安装,则输出将类似于:

$ make coffee
bash: make: command not found

同样还需要 C 编译器。输入“gcc”以检查编译器是否已安装:

$ gcc
gcc: no input files

此响应表明“gcc”已安装。这里再次出现了错误消息,但并非“command not found”。

除了这两个工具之外,还需要安装内核头文件。检查这些文件是否缺失的常见方式是:当内核编译失败并显示缺少某个头文 件的错误时。

内核模块编译是一项常见任务,因此互联网上针对每种 Linux 发行版都有大量关于如何为编译准备系统的信息。

在 Fedora、RHEL、CentOS 及其他 Red Hat 衍生版上,以下命令很可能能让计算机准备就绪:

# yum install gcc make kernel-devel-$(uname -r)

对于 Ubuntu 及其他基于 Debian 的发行版:

# apt install gcc make linux-headers-$(uname -r)

重要 的:
这些安装命令必须以 root 身份执行。不熟悉 root 用户概念的用户请先了解相关知识。见附录第 A.4 节。

2.4 解压下载的文件

从 Xillybus 网站下载驱动程序后,切换到下载文件所在的目录。在命令提示符下输入(不包括 $ 符 号):

$ tar -xzf xillybus.tar.gz

对于 XillyUSB 驱动程序:

$ tar -xzf xillyusb.tar.gz

应该没有响应,只会出现新的命令提示符。

2.5 运行内核模块的编译

切换到内核模块源代码所在的目录。对于 Xillybus 驱动程序:

$ cd xillybus/module

对于 XillyUSB 驱动程序:

$ cd xillyusb/driver

输入“make”以执行模块编译。输出应类似于以下内容:

$ make
make -C /lib/modules/3.10.0/build SUBDIRS=/home/myself/xillybus/module modules
make[1]: Entering directory `/usr/src/kernels/3.10.0'
 CC [M] /home/myself/xillybus/module/xillybus_core.o
 CC [M] /home/myself/xillybus/module/xillybus_pcie.o
 Building modules, stage 2.
 MODPOST 2 modules
 CC     /home/myself/xillybus/module/xillybus_core.mod.o
 LD [M] /home/myself/xillybus/module/xillybus_core.ko
 CC     /home/myself/xillybus/module/xillybus_pcie.mod.o
 LD [M] /home/myself/xillybus/module/xillybus_pcie.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0'

具体细节可能略有不同,但不应出现任何错误或警告。对于 XillyUSB,仅生成一个模块 xillyusb.ko。

注意:内核模块的编译是专门针对编译时正在运行的内核的。

如果打算使用另一个内核,请输入“make TARGET=kernel-version”,其中“kernel-version”是所需内核版本的名称。该名称出 现在 /lib/modules/ 中。或者,编辑名为“Makefile”的文件中的以下行:

KDIR := /lib/modules/$(TARGET)/build

将 KDIR 的值更改为所需内核头文件的路径。

2.6 安装内核模块

在不切换目录的情况下,将用户切换为 root(例如使用“sudo su”)。然后输入以下命令:

# make install

此命令可能需要几秒钟才能完成,但不应产生任何错误。

如果此操作失败,请将编译生成的 *.ko 文件复制到现有的内核模块子目录中。然后运行 depmod。以下示例展示了如何为 PCIe 驱动程序执行此操作(假设相关内核版本为 3.10.0):

# cp xillybus_core.ko /lib/modules/3.10.0/kernel/drivers/char/
# cp xillybus_pcie.ko /lib/modules/3.10.0/kernel/drivers/char/

# depmod -a

安装不会立即将模块加载到内核中。如果系统在启动过程中检测到 Xillybus 外设,这将在下次启动时完成。第 2.8 节展示了如何手动加载模 块。

对于 XillyUSB,无需重新启动: 当下次 USB 设备连接到计算机时,模块会自动加载。

2.7 复制 udev 规则文件

默认情况下,Xillybus 设备文件仅对其所有者(即 root)可访问。让这些文件对任意用户可访问是很有意义的,这样可以避 免以 root 身份操作。udev 机制在创建设备文件时通过遵守特定规则来更改文件权限。

如何启用此功能: 停留在同一目录中,并保持 root 用户身份。将 udev 规则文件复制到系统中此类文件的存储 位置(通常是 /etc/udev/rules.d/)。

例如:

# cp 10-xillybus.rules /etc/udev/rules.d/

此文件的内容简单如下:

SUBSYSTEM=="xillybus", MODE="666", OPTIONS="last_rule"

这意味着由 Xillybus 设备驱动程序生成的所有文件都应被赋予权限模式 0666。换句话说,允许所有人读写。

对于 XillyUSB,文件为 10-xillyusb.rules,内容为:

SUBSYSTEM=="xilly*", KERNEL=="xillyusb_*", MODE="0666"

注意,可以更改 udev 文件以实现不同的结果。例如,可以改为更改设备文件的所有者,以便只有特定用户能够访问这些文 件。

2.8 加载和卸载模块

要加载模块(并开始使用 Xillybus),请以 root 身份输入:

# modprobe xillybus_pcie

或者,对于 XillyUSB:

# modprobe xillyusb

这将使 Xillybus 设备文件出现(假设总线上检测到 Xillybus 设备)。

注意,如果系统在启动过程中检测到 Xillybus PCIe/AXI 外设并且驱动程序已按上述方法安装,则通常不需要此操作。如果 XillyUSB 设备在驱动程序已安装的情况下连接到计算机,同样不需要此操作。

要查看内核中的模块列表,请输入“lsmod”。要从内核中移除模块,请输入(对于 PCIe 驱动程序):

# rmmod xillybus_pcie xillybus_core

这将使设备文件消失。

如果似乎出现了问题,请检查 /var/log/syslog 文件中包含“xillybus”或“xillyusb”的消息(视情况而定)。该日志文件中经常能 发现有价值的线索。也可以通过“dmesg”命令获取相同的日志信息。

如果不存在 /var/log/syslog 日志文件,则可能是 /var/log/messages。也可以尝试命令“journalctl -k”。

2.9 官方 Linux 内核中的 Xillybus 驱动程 序

如前所述,Xillybus 的驱动程序从 v3.12.0 版本起包含在 Linux 内核中。因此,可以编译整个内核,以便该内核支持 Xillybus。这是上述单独安装内核模块的替代方法。

从功能角度来看,涉及内核编译的方法与第 2.3 节至第 2.6 节中描述的步骤产生的结果 相同。

为了将 Xillybus 的驱动程序包含在准备编译的内核中,需要启用一些内核配置选项。有两种方式包含驱动程 序: 要么作为内核模块,要么作为内核映像的一部分。

例如,以下是在内核配置文件 (.config) 中为 PCIe 接口启用 Xillybus 驱动程序的部分:

CONFIG_XILLYBUS=m
CONFIG_XILLYBUS_PCIE=m

“m”表示将驱动程序作为内核模块包含。“y”表示将驱动程序包含在内核映像中。

类似地,对于 XillyUSB(内核 v5.14 及更高版本):

CONFIG_XILLYUSB=m

更改 .config 的常用方法是使用内核的配置工具: “make config”、“make xconfig”或“make gconfig”。

xconfig 和 gconfig 是图形用户界面工具,更易于使用,因为它们允许搜索字符串“xillybus”以找到 Xillybus 的驱动程序。通过单击复选框即 可启用驱动程序。.config 文件的文本表示有助于验证是否已设置正确的选项。

在内核版本低于 3.18 的系统上,可能需要在尝试启用 Xillybus 之前先启用暂存驱动程序。这会在 .config 文件中生成以下 行:

CONFIG_STAGING=y

在 .config 文件中启用 Xillybus 的驱动程序后,照常运行内核编译。

从内核 5.14 开始,当启用 Xillybus 或 XillyUSB 的驱动程序时,名为 CONFIG_XILLYBUS_CLASS 的选项会自动启用。这是 配置系统依赖规则的结果。因此,不需要手动更改此选项(通常也不可能)。