最近在所里的项目需要多个人在同一台服务器上连接 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,即可正常连接。
本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.