问题标签 [pci]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何在 Windows 中获取 PCI 区域大小?
我需要扫描我的 PCI 总线并从特定供应商处获取特定设备的信息。我的目标是找到 AMD 显卡的 PCI 区域大小,以便将该卡的 PCI 内存映射到用户空间,以便进行 i2c 传输并查看来自各种传感器的信息。
为了扫描 PCI 总线,我在一年前下载并编译了适用于 Windows x64 的 pciutils 3.1.7。据说它使用 DirectIO。
这是我的代码。
正如您在我的 printf 行中看到的那样,我尝试打印一些数据,我正在成功打印device_id
,base_addr
但是size
应该包含此设备的 PCI 区域大小始终为 0。我预计,循环中至少有一个循环显示大小 > 0。
我的代码基于使用相同代码的 Linux 应用程序,尽管它使用 Linux 附带的 pci.h 标头(pciutils 显然具有相同的 API)。显然,Windows(在我的情况下是 Windows 7 x64)没有显示此信息,或者至少没有暴露给 PCIUtils。
你建议我如何获得这些信息?如果有 Windows 的 pciutils 的替代品并提供此信息,我很高兴获得它们的链接。
编辑:我仍然没有找到解决方案。如果我的问题有任何解决方案并且也适用于 32 位 Windows,我们将不胜感激。
windows-xp - 卸载 PCI 设备驱动程序
我想通过 c++ 代码从计算机上卸载 pci 设备驱动程序。我正在寻找相同的操作,例如在设备管理器中右键单击设备,然后单击“卸载”。我找到了一个名为 的函数DiUninstallDevice
,但它仅在 Windows 7 和更高版本的 Windows 中可用。我使用的是 Windows XP。是否有可能做到这一点?
linux - 为什么没有分配给 pci 设备的 BAR 地址?
问题描述如下:
linux 启动后,运行命令“lspci -v”,我们可以看到 pci 设备可以找到,但没有分配地址给设备。通过进一步检查 linux 启动消息,可以发现许多类似“bridge window mem ...”的消息。不确定这些消息是正常的还是实际上是地址分配失败的迹象。
我正在运行的处理器是飞思卡尔 p2010,它是 powerpc 架构。bootloader是我们自己设计的,没有接触pci相关的东西。所以我们完全依赖Linux内核自己做完整的pci枚举。
在 Linux 内核 pci 枚举开始之前,我们唯一做的就是为 pci 空间使用配置一个 LAW 窗口(特别是 LAW4)。此外,当然,根据我们的硬件配置对 dts 文件进行适当的修改。我们认为完成所有这些准备后,Linux 内核应该能够使所有 pci 东西正常工作,但事实并非如此。
那么,有没有人知道如何解决这个问题或曾经遇到过类似的问题并且可以对此有所了解?非常感谢!
更多信息附在下面:
========内核启动参数===============
========dts中的PCI部分设置=======
==============“lspci -v”的结果===============
=======================Linux内核启动消息====================
linux - BUG:无法处理内核分页请求
我正在为一个简单的测试设备编写 PCI 驱动程序。
使用 lspci 可以正确识别硬件(您可以看到我的驱动程序vabs已注册):
驱动程序和 PCI 子系统的初始化和取消初始化工作正常。我得到了一个设备号,并且 udev 创建了一个设备文件。
从设备文件读取时,我收到以下错误消息:
我在初始化中成功请求 PCI 资源。这将为 memstart0 返回 00000000f0000000,这是我的 PCI 基地址 0。
尝试使用以下代码从该 memio 地址读取会出现上述错误:
我还尝试了其他访问函数,如 memcpy_fromio、ioread32 和直接指针访问,结果相同。
硬件在 Windows 机器上工作。唯一显着的区别是,Windows 将基地址 0 保留为 00000000f d 000000,而 Linux 将其保留为 00000000f 0 000000。
这是用于公立学校的非营利教育目的。谢谢你的帮助!
windows - 为 32 位 PCI 设备编写 Windows 64 位设备驱动程序
我正在评估将几年前编写的设备驱动程序从 32 位移植到 64 位。物理设备是 32 位 PCI 卡。也就是说,该设备是 32 位的,但我需要从 Win7x64 访问它。该设备向 Windows 世界提供一些寄存器,然后执行繁重的总线主数据传输到一块驱动程序分配的内存中。
我在 Microsoft 文档中读到,您可以指示驱动程序是否支持 64 位 DMA。如果不是,则 DMA 是双缓冲的。但是,我不确定是否是这种情况。我的驱动程序将/可能是一个完整的 64 位驱动程序,因此它可以支持处理器地址空间中的 64 位地址,但实际的物理设备不支持它。事实上,设备 BAR 必须映射到 4 GB 以下,并且设备必须获得一个 PC RAM 地址才能执行 4 GB 以下的总线主控。这是否意味着我的驱动程序将始终通过双缓冲?这是一个对性能非常敏感的过程,双缓冲可能会阻止整个系统工作。
当然,设计一个新的 64 位 PCI(或 PCI-E)板是没有问题的。
任何人都可以为这个过程提供一些资源(除了 MS 页面)?
非常感谢!
linux - Linux 在特定物理地址分配内存
我正在测试一个 PCI 端点驱动程序,我想做从 PCI RootPort 端到 PCI 端点端的简单复制。在 PCI Endpoint 端,我们有从 PCI 地址到 CPU 物理地址的地址转换。我们可以在转换中配置 CPU 物理地址,使其映射到特定的 DRAM 区域。问题是我们如何在特定的 CPU 物理地址分配内存缓冲区以确保来自 RootPort 端的写入确实有效?
任何建议表示赞赏。非常感谢!
linux - PCIe 中断路由
我目前正在 xilinx PFGA 中实现 PCIE 端点设备,并且在中断方面存在一些问题。
当驱动程序初始化时,它将中断映射到 IRQ 32
但是,当中断触发时,
irq 似乎被路由到另一个引脚 IRQ #16。我使用了 PCIe msi 中断。什么可能导致这个问题?
c# - 如何在 Windows XP 中分配 500 MB 的 DMA 缓冲区
有一个 PCI 卡连接到 PC,我们有一个相同的 GUI。我们要在 RAM 中分配大约 400 到 600 MB 物理内存的 DMA 缓冲区,以便从 PCI 卡中读取/写入(FPGA 在 PCI 卡中进行读取/写入操作)。我们正在使用 JUNGO windows PCI 驱动程序。JUNGO 提供了一个 WDC_DMAContigBufLock 方法,通过 Contiguous 或 scatter/Gather 方法分配 DMA Buffer。我们可以在 RAM 中创建最多 63MB 的缓冲区,但不能创建超过 63MB 的缓冲区。操作系统是 Windows XP 32 位,RAM 大小为 4GB(相对 3 GB 是免费的)。
应用程序 (GUI) 是用 C# .Net 编写的,并尝试通过此应用程序创建 400 – 600MB 的 DMA 缓冲区。我正在寻找可能导致/阻止我创建 400 - 600MB 缓冲区大小的解决方案/想法。
谢谢
c# - 我应该使用线程异步访问连接到 PCI 总线的设备吗?
我有一块硬件通过 PCI 总线连接到我的 PC。我正在通过设备驱动程序周围的 .NET 包装器访问硬件。
我没有关于设备如何执行 PCI 的任何规范。这让我想到了我的第一个问题。
1)通过PCI连接的设备是否保证以一定的速度传输数据?
2) 与设备通信时,我希望我的 UI 保持响应。在(线程池)线程中启动与设备的通信是个好主意,或者与访问 PCI 总线的速度相比,与此相关的开销是否太大?
编辑:
问题重写。过多地反映了漫长工作日的结束。
删除了线程是线程池线程的要求。
c - 我的进程正在映射到 PCI 内存孔,为什么?
我修改了我的内核并自己遍历页表以获取一个进程代码段的物理地址。我(current->mm)->start_code
作为参数传递给我的函数。上述功能的代码如下:
但是,物理地址似乎经常位于 PCI 内存孔中。我从用户应用程序调用我的函数作为系统调用。请注意,我的函数可以像这样打印出地址:
然后我通过$ cat /proc/iomem
.
我可以看到(显示部分):
您可以看到地址efxxxxxx
完全在 PCI 内存孔中。但是,它应该驻留在系统 RAM 中,对吧?
这使我无法为该页面保留页面属性,因为它位于具有另一个属性的内存孔中。这很奇怪。
至于我的系统,我在具有 8GB 内存的 Intel i5 Core 机器上使用 32 位 12.04 Ubuntu 内核。