driver - 多板Windows设备管理器提示资源冲突,错误代码为12

标签 driver fpga device-manager

我将多个相同的板插入系统中。设备 PCIe 使用 Xilinx IP 核实现。每个FPGA程序烧写完成后,手动刷新设备管理器,检查设备和驱动是否正常工作。

我的困惑是,这种方法似乎只能同时在两 block 板上工作。第三 block 板烧录完成后,刷新任务管理器,系统提示资源不足,“此设备无法找到足够的可用资源(代码12)”

我尝试禁用另外两 block 板,但设备仍然提示冲突。我不知道如何查询冲突的资源。

我的主板有 2 个 BAR(BAR0:2KB,BAR1:16MB)和 1 个 IRQ。 enter image description here

我做了一些实验,感觉是内存资源冲突造成的。冲突方是主板附带的AMD集成显卡。 第1、第2、第3都表示我的板号。 enter image description here

由于冲突,无法识别第 3 个。

关闭它后,我插入所有三个板,然后再次打开它。结果在启动过程中,系统突然断电又重新启动,然后三 block 板都正常了。这时发现显卡的内存地址发生了变化

enter image description here

我想知道如何解决冲突?修改我的驱动程序代码或 FPGA 配置?

最佳答案

PCIe 枚举应该可以解决内存分配问题,但是有几个实现问题需要注意。举个例子,我使用了具有 2GB 大小的 64 位 BAR 的 Xilinx XDMA,并且我实际上已经将 DELL XPS 主板变砖了。但我对 IBM 系统做了同样的事情,而且它确实有效。这里的要点是枚举可以通过固件、硬件或操作系统驱动的事件来完成。如果您使用硬件管理器,这听起来像是操作系统驱动的,但是当我烘烤 XPS 板时,这是某种与 BAR 大小相关的固件问题,导致了永久性故障。 16MB 并不大,应该不是问题,但我建议首先使用 Xilinx 默认值并显示可靠性。我认为是 1M 的 1 BAR。我以每条 1MB 的速度运行了 3 个 64 位 BARS,没有出现任何问题,但要保持简单并显示可靠性。然后向上移动。这将有助于确定是否是系统不稳定。

我见过一些系统使用基于固件的枚举,在 FPGA 配置之前,该枚举速度非常快,在这种情况下,没有 PCIe 目标进行 ID。如果您经常发现您的 FPGA 在加电时未检测到,但在重新扫描时检测到,这可能是一种症状。如何解决这个问题,有点痛苦。我们最终使用了部分重新配置。从 PCIe 接口(interface)开始,然后重新配置以加载剩余的镜像。希望这不是这个问题

接下来要注意的是 FPGA 内的重置机制。您可能将 PCIe IP 复位连接到总线复位,这很棒,但是,我过去也将该复位连接到可能未启动的内部 PLL 锁定信号。出于故障排除的目的,请保持重置简单并摆脱其他所有内容,以表明只有 PCIe IP 本身才是可靠的。

这里你也必须小心。如果你把东西拆下来,请确保它是干净的。如果您忽略 PLL 锁定并尝试使用 Xilinx 驱动程序(例如 XDMA 驱动程序),它有一个例程尝试通过数据事务识别 XDMA。它一次寻找一个 BAR 的 DMA BAR。但当它这样做时,如果 BAR 不是 XDMA 控制 BAR,它尝试的事务可能会在 AXI 总线上发出。如果发生这种情况时 AXI 总线没有复位或计时,您将锁定 AXI 总线,我已经多次以这种方式锁定了 Linux 机器。 AXI 要求事务完成,否则它只是坐在那里等待。

顺便说一句,在 Linux 机器上,您可以查看内核日志中的枚举输出。我不确定 Windows 是否会向您显示同样的内容。但是,如果您看到设备最初被探测,但随后在配置寄存器中检测到无效的内容,而不是根本没有看到,这可能会很有帮助。

有几件事需要注意。

关于driver - 多板Windows设备管理器提示资源冲突,错误代码为12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64567547/

相关文章:

c++ - Mysql C++ 驱动程序-创建后获取准备好的语句查询

c++ - Win32_SystemDriver 禁用设备驱动程序

c - USB Linux API : call ioctl requests from user space app

vhdl - 综合translate_off如何工作?

verilog - VERILOG 中的随机 0、1、-1

linux - 任何用于 AXI 突发类型设备的内置 Linux 方法?

command-line-interface - 是否有命令行方式来检测设备管理器中已卸载的驱动程序?

c++ - 有没有用 C++ 编写的开源 PDF 打印机?

android - 令人沮丧的 DevicePolicyManager lockNow() 行为

c# - 如何使用 WMI 列出设备类型?