3 在未使用 Xillinux 的项目中使用 Xillybus Lite

3.1 应用 IP 核

接下来介绍的过程基于 AMD Platform Studio 14.2 (XPS),但后续版本预计行为大致相同。

要将 Xillybus Lite 添加到现有项目,请执行以下步骤:

  • https://xillybus.com/xillybus-lite 下载 Xillybus Lite 工具包。

  • 将 Xillybus Lite 工具包中 “pcores” 文件夹下的 xillybus_lite_v1_00_a 文件夹复制到 XPS 项目的 “pcores” 文件夹下。如果 XPS 项目刚生成,后者可能为空。

  • 在 XPS 中打开相关项目,点击 Project > Rescan User Repositories。结果,“USER” 条目将出现在左侧 IP Catalog 的 “Project Local PCores” 下。展开此条目,找到 XILLYBUS_LITE 核。

  • 双击 XILLYBUS_LITE。在弹出的询问是否将 IP 核添加到设计的窗口中确认。

  • 接下来出现 XPS Core Config 窗口。只需点击 “OK”。无需更改。

  • 在随后的 “Instantiate and Connect IP” 窗口中,选择上方单选按钮,让 XPS 进行总线接口连接。

  • 选择 “Addresses” 选项卡,记下为 xillybus_lite_0 分配的地址范围(基地址和大小),以备后用。也可以根据需要更改此范 围。

  • 选择 “Zynq” 选项卡,点击 IRQ 框。在未连接中断列表中选择 “host_interrupt” 端口,点击中间的箭头将其移至已连接中断列 表。记下中断号(示例截图中为 91)。

  • 选择 “Ports” 选项卡,展开 “xillybus_lite_0” 条目。对于带有 “user_” 前缀的八个信号中的每一个,点击端口名右侧的空白区 域,将端口设为外部:

    在下拉选择框中选择 “External Port”,接受默认的连线名称(或进行更改)。为每个端口点击勾选标记或按 ENTER 确认。

重要 的:
host_interrupt 端口设置为 EDGE_RISING。请勿将其改为电平触发,否则中断可能导致系统锁定。

现在 XPS 项目已准备好构建(例如使用 “Create Netlist”)。

处理器模块(通常名为 “system”)将有 8 个额外的端口。这些端口应添加到此模块的实例化中(以及在 VHDL 中的架构描述 中)。

例如,在 Verilog 中:

...
  wire        user_clk;
  wire        user_wren;
  wire [3:0] user_wstrb;
  wire        user_rden;
  wire [31:0] user_rd_data;
  wire [31:0] user_wr_data;
  wire [31:0] user_addr;
  wire        user_irq;

...

  system
    system_i (

      ...

         .xillybus_lite_0_user_clk_pin ( user_clk ),
         .xillybus_lite_0_user_wren_pin ( user_wren ),
         .xillybus_lite_0_user_wstrb_pin ( user_wstrb ),
         .xillybus_lite_0_user_rden_pin ( user_rden ),
         .xillybus_lite_0_user_rd_data_pin ( user_rd_data ),
         .xillybus_lite_0_user_wr_data_pin ( user_wr_data ),
         .xillybus_lite_0_user_addr_pin ( user_addr ),
         .xillybus_lite_0_user_irq_pin ( user_irq )
    );

除 user_rd_data 和 user_irq 外,所有信号均为来自处理器的输出。

3.2 修改设备树

必须获取现有系统的设备树,以便添加 Xillybus Lite 的条目。重要的是从正在生效的设备树开始,否则系统配置可能会改 变,甚至在启动过程中失败。

对于 Xillinux 2.0 及更高版本,正在使用的设备树源代码是内核源代码的一部分,可从 Github 下载。请参考 Zynq-7000 的 Xillinux 入门 的第 6 节了解如何获取。

在早期版本的 Xillinux 中,设备树源代码位于 /boot 目录,例如 devicetree-3.3.0-xillinux-1.1.dts。

如果设备树源代码不可用,可以从其二进制文件重建,该二进制文件在启动时加载 boot.bin 的同一目录中可用。有关此问题 (以及其他与设备树相关的问题)的教程可在以下网址找到:

https://xillybus.com/tutorials/device-tree-zynq-1

应在 DTS 文件的总线外设段中(在包含 axi@0 的花括号内)添加如下条目:

xillybus_lite@6dc00000 {
 compatible = "xillybus_lite_of-1.00.a";
 reg = < 0x6dc00000 0x10000 >;
 interrupts = < 0 59 1 >;
 interrupt-parent = <&gic>;
};

重要 的:
此示例条目与上面显示的截图匹配,而不是 Xillinux 中使用的设置。

可能需要根据 XPS 项目中外设的实例对 DTS 条目进行以下更改:

  • 将 “reg” 赋值和节点名称中的基地址设置为 XPS 地址映射中的基地址(上例中为 0x6dc00000,节点名称中不带 “0x” 前 缀)。

  • 将 “reg” 的第二个参数设置为从基地址分配的字节数(上例中为 0x10000)。

  • 将 “interrupts” 的第二个参数设置为 XPS 中给出的中断号减去 32。例如,XPS 为外设分配了中断 91,因此 91 - 32 = 59。

  • 如果设备树是通过从二进制文件或 /proc/device-tree/ 反向编译获得的,则可能未定义 “gic” 标签。由于系统中的所有设备使 用相同的中断控制器,因此可以从设备树中其他 “interrupt-parent” 赋值中复制数值。在几乎所有情况下,这只需将 &gic 替换为值 0x1 即可。

编辑设备树源文件后,使用设备树编译器(DTC)将其编译为二进制 blob(DTB)。该编译器是 Linux 内核树的一部 分。

在正在运行的 Xillinux 系统上,可以按如下方式完成。内核树的目录可能因使用的 Xillinux 发行版而异。

# cd /usr/src/kernels/3.3.0-xillinux-1.1+/
# scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb my_device_tree.dts

然后用刚刚生成的文件覆盖用于启动的介质上的现有 devicetree.dtb 文件。

请注意,Xillinux 可用于编译用于非 Xillinux 系统的设备树。

3.3 编译 Linux 驱动程序

驱动程序可以在 Xillybus Lite 工具包的 “linuxdriver” 目录中找到。

有两种编译选项:

  • 针对 ARM 处理器进行交叉编译,需要目标内核的源代码(或至少其头文件)。

  • 如果目标发行版安装了 GNU 工具和内核头文件,则可以在 Zynq 板上直接编译。

Xillybus Lite 依赖几个内核选项,特别是 UIO 选项(CONFIG_UIO)至少需要作为模块启用。

以下假设在板上直接编译。这可以在 Xillinux 发行版中完成,但对于在 Xillinux 上运行 Xillybus Lite 并非必需(因为驱动程序 已安装)。另一方面,如果在 Xillinux 上编译了驱动程序(因此针对 Xillinux 的内核头文件),则生成的二进制文件可能无法在其他内核上运 行。

首先更改目录:

$ cd /path/to/linuxdriver

然后键入 “make” 编译驱动程序。会话输出应类似于:

$ make
make -C /lib/modules/3.3.0/build SUBDIRS=/tmp/lite/linuxdriver modules
make[1]: Entering directory `/usr/src/kernels/3.3.0'
 CC [M] /tmp/lite/linuxdriver/xillybus_lite_of.o
 Building modules, stage 2.
 MODPOST 1 modules
 CC     /tmp/lite/linuxdriver/xillybus_lite_of.mod.o
 LD [M] /tmp/lite/linuxdriver/xillybus_lite_of.ko
make[1]: Leaving directory `/usr/src/kernels/3.3.0'

请注意,内核模块的编译是针对编译时正在运行的内核进行的。如果使用另一个内核,则键入 “make TARGET=kernel-version”,其中 “kernel-version” 是目标内核版本,如 /lib/modules/ 中所示。

会话的输出可能略有不同,但不应出现错误或警告。

特别是,如果出现以下警告:

WARNING: "__uio_register_device" [xillybus_lite_of.ko] undefined!
WARNING: "uio_unregister_device" [xillybus_lite_of.ko] undefined!

这意味着目标内核缺少 UIO 选项,将驱动程序插入内核很可能会失败。

3.4 安装驱动程序

将 xillybus_lite_of.ko 文件复制到某个现有的驱动程序子目录,并按如下方式运行 depmod(假设当前正在运行目标内 核):

# cp xillybus_lite_of.ko /lib/modules/$(uname -r)/kernel/drivers/char/
# depmod -a

安装不会立即将驱动程序加载到内核中。如果检测到 Xillybus Lite 外设,它将在下次系统启动时加载。下面展示如何手动加 载驱动程序。

3.5 加载和卸载驱动程序

要加载驱动程序(并开始使用 Xillybus Lite),请以 root 身份键入:

# modprobe xillybus_lite_of

这将使 Xillybus Lite 设备文件(/dev/uio0)出现。

请注意,如果系统启动时存在 Xillybus Lite 外设并且驱动程序已按照上述方式安装,则通常不需要此步骤。

要查看内核中的模块列表,键入 “lsmod”。要从内核中移除驱动程序,运行:

# rmmod xillybus_lite_of

这将使设备文件消失。

如果似乎出现问题,请检查 /var/log/syslog 日志文件中包含 “xillybus” 单词的消息。该日志文件中通常包含有价值的线 索。

如果 /var/log/syslog 日志文件不存在,则可能是 /var/log/messages。

如果日志文件中出现关于 __uio_register_device 或类似内容的 “unknown symbol” 错误,则表示正在运行的内核缺少 UIO 配 置选项。