Linux 多用户环境下 Vivado 无法连接 Digilent JTAG 适配器的解决方法

最近在所里的项目需要多个人在同一台服务器上连接 FPGA 进行开发调试。在使用的过程中,观察到一个奇怪的现象:有时在 Vivado 的 Hardware Manager 中,点击 Auto Connect 过后,Hardware 窗格中只出现一个 localhost,而无法找到 JTAG 适配器。本文记述此问题的调试过程和解决方法。

首先,你需要参考此页面的方法来安装“驱动”(实际是几个 udev rule 文件)。如果不安装,则无法以普通用户身份来访问适配器。

Vivado 连接 FPGA 依靠其内置的 Hardware Server。遇到无法连接的问题时,首先应当考虑查看 Hardware Server 的日志:使用 hw_server -L- 即可将 hw_server 的日志输出到控制台。在控制台中,我看到了以下的错误信息:

TCF 07:48:22.251: jtagpoll: cannot get port description list: ftdidb_lock failed: FTDMGR wasn't properly initialized
TCF 07:48:22.256: jtagpoll: cannot get port description list: JTAG device enumeration failed: Initialization of the DPCOMM library failed.

在网上搜索此错误信息,得到的有用内容较少。不过,在 此链接 中,有人建议下载并安装 Digilent 的官方 JTAG 软件,然后使用 dadutil enum 命令来检测是否可以连接到适配器。按此建议操作,也无法连接到适配器,提示如下信息:

$ dadutil enum
ERROR: DmgrSetNetworkEnumTimeout failed, erc = 3090

该命令运行速度非常快,推测其内部逻辑应该非常简单,故考虑使用 strace 工具观察其行为。运行如下命令:

$ strace -f -o 1.txt dadutil enum

得到 1.txt 文件,记录了 dadutil 命令与系统交互的所有信息。在文件末尾处,看到有如下系统调用:

327746 openat(AT_FDCWD, "/tmp/digilent-adept2-shm-dvtbl", O_RDWR|O_CREAT, 0777) = -1 EACCES (Permission denied)
327746 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x7), ...}) = 0
327746 write(1, "ERROR: DmgrSetNetworkEnumTimeout"..., 52) = 52

根据此行为判断,dadutil 尝试打开 /tmp/digilent-adept2-shm-dvtbl 文件但无法打开,因此报错并退出。删除 /tmp 下所有以 digilent-adept2 开头的文件后,再重启 hw_server,即可正常连接。

CC BY-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.