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 配 置选项。
