问题标签 [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.
memory - 如何在带有 32b PCI 设备的 x86_64 系统上使用 DMA 内存
在具有 32 位设备(例如旧 NIC)的 x86_64 系统上:在 NIC 和 DRAM 之间进行 DMA 时,内存地址是否必须在较低的内存中(低于 4GB)?
顺便问一下,OS如何知道为PCI设备保留的内存地址空间资源,即BAR中存储的地址?
c - 在 DOS 模式下实现消息信号中断
我有点卡在编程设备MSI(消息信号中断)上,欢迎任何指针...... (我的环境是 Watcom C + DOS/32a - dos 扩展器,在平面模式下......)
@ PIC(8259) 模式对我来说没问题...
我在下面列出了我所做的事情,也许有人可以帮助澄清这些......谢谢!
(1)多消息启用 = 0(对于单个 MSI 设置此字段 = 0;MMC = 100b)
(2) MSI能力中的MSI消息地址寄存器
- 位[31:20] = 0xFEE
- bit[19:12] = 0(目标 ID,并找到本地 APIC ID = 0...)
- bit3 = 0(重定向提示 = 0)
- bit2 = 0(目标模式,不关心,因为 RH = 0)
(3) MSI能力中的MSI消息数据寄存器
- bit15 = 0(触发模式 = 边沿)
- bit14 = 0(触发电平,如果触发模式 = 边沿则忽略)
- 位[10:8] = 000(传送模式 = 固定)
- bit[7:0] = 0x20(向量,我选择使用0x20)
(4)最后通过设置 MSICAP.MC.MSIE = 1 来启用 MSI
- 我已经大致阅读了文档(第 10 章)http://download.intel.com/products/processor/manual/253668.pdf
- 我认为没有必要对 IO APIC 和本地 APIC 寄存器进行编程,因为 MSI 不会路由到 APIC 系统......!
当前状态:启用 MSIE = 1 后发现系统挂起,设备通过 MSI 产生中断!
注意:在上面的序列中,没有安装服务例程,因为我不知道该怎么做......(这是我的应用程序挂起的原因吗?)
谢谢 !
[20120822 更新]将Message Data字段 中的向量设置为 0x20 时,app 挂起...但如果设置为 0x76,我发现 app 没有挂起,然后我可以检查设备是否产生中断,Local APIC 收到此中断消息如下:
对于 PCI 设备(AHCI 控制器):
- ID(中断禁用)= 0
- IS(中断状态)= 0
- MSI 上限 = 09,FEE00000,00000076
对于 AHCI HBA 寄存器:
- PxIS = 00000023
- PxIE = 7DC0007F
- IS = 00000001
- IE 位 1 = 1
通过 1 和 2,我认为设备成功发送消息以请求服务,因为:
- IS bit0 = 1(端口 0 有挂起的中断状态)
- IE(中断启用)= 1
- PCI 命令寄存器 bit10(ID) = 0
- MSICAP.MC.MSIE = 1(至 MSI 引擎)
我还发现 LAPIC 收到了这个中断消息,因为:
- 本地 APIC IRR(中断请求寄存器) bit118(=0x76) = 1
- 本地 APIC ISR(In-Service register) bit118(=0x76) = 1
因此,设备似乎产生了中断,而本地 APIC 接收到了这个;即便如此,我的服务程序也没有被调用!
bios - 定位 PCI 并口的基地址
我正在为 DOS 开发一个应用程序。我需要通过并行端口进行通信。
目前我被困在如何确定哪个 PCI 功能的 BAR(基地址寄存器)包含该并行端口的基地址(即数据端口地址)?:?
准确地说,是否存在特定 BAR 将始终包含该并行端口的基地址的行业约定或标准或事实上的标准?
如果不是,那么我如何确定该 PCI 并行端口的基地址(无论是在 pci 扩展卡上还是集成在主板上)?
实际上我关心的是PCI 扩展卡上的并行端口。AFAIK,BIOS 不知道这些。BIOS 只会将资源分配给 pci 卡,仅此而已。因此,BDA 中可能没有此类并行端口的条目,因为 BIOS 制造商只知道他们的主板拥有的所有设备。
例如,在 PC 上,我在 pci 扩展卡上安装了 4 个并行端口,并且在主板上集成了 1 个并行端口。现在其他 2 个并行端口的条目在哪里?
这就是为什么 BIOS 似乎只包含集成在芯片组或主板上的三个并行端口的条目。所以,我认为我们必须读取 PCI BAR 以获取安装在主板上的 pci 扩展卡上的任何并行端口的基地址。
谢谢
linux-kernel - 关于访问 pci 配置空间,宏 PCI_CONF1_ADDRESS 让我感到困惑
我正在学习linux内核代码,关于pci的部分,我阅读了文件/arch/x86/pci/Direct.c
,一些代码让我感到困惑:
内核版本是 2.6.18,所以宏 PCI_CONF1_ADDRESS 让我很困惑。众所周知,使用IO口CF8/CFC时只能访问pci配置空间的前256字节,如果要访问256~4095字节之间的空间,必须使用ECAM(Enhanced Configuration Access机制),但上面的注释说:
具有类型 1 访问的扩展(每个 PCI 功能 4096 字节)配置空间。
这是否意味着在使用 IO 口 CF8/CFC 时可以访问 pci 配置空间的全部 4096 字节?但是为什么 PCI LOCAL BUS SPECIFICATION 从来没有提到这一点呢?
同时,我也对这个表达感到疑惑:
((reg & 0xF00) << 16)
它使用这种方式生成 pci 配置地址,我从未在任何书籍或 SPECIFICATION 中看到此表达式。
linux - Old style PCI probing
Starting from Linux kernel 3.0, pci probing is automatic with: pci_register_driver(&pci_driver);
Linux kernel 2.6 and older, programmers had to create a character device, and walk through the PCI list, select appropriate PCI and doing work with it. Can you tell me how the steps of this procedure, why the initialization of a character device is need before working with the PCI driver and why it is unnecessary to register a character driver anymore.
linux - Linux 如何测试 PCIe 驱动程序?
我写了一个简单的 PCIe 驱动程序,我想测试它是否有效。例如,如果可以对设备使用的内存进行写入和读取。
我怎样才能做到这一点?
哪些东西也应该被证明?
linux - Linux 如何与 PCI 驱动程序通信
我是驱动程序编程的新手。所以我面临着一些“问题”。
我写了一个PCI驱动程序。现在的问题是应用程序如何与该驱动程序通信。
我的目的是为驱动程序编写一个测试应用程序。学习驱动程序编程是一种“基础研究”。
通常我会说/dev
. 但是我在这个目录下的文件除了root之外没有读写权限。那么怎么沟通呢?通过属性文件?
linux - 具有 DMA 功能的 PCI/PCIe 卡,用于设备驱动程序培训
我试图为带有 PCI/PCIe 设备的设备驱动程序学习 DMA,我的平台是 linux/bsd。我发现了很多用于训练的简单 PCI 板(例如简单的数字 I/O 板),但没有一个硬件复杂到足以处理 DMA。Stackoverflow 上是否有人知道带有某种微处理器或微控制器的 PCI/PCIe 卡,我可以使用 gcc 等开源工具(例如 PowerPC、68HC11、Atmel、8051 等)进行编程?
当然,踢球者的成本很低……如果可能的话,低于 300.00 美元。
我不想要基于 FPGA 的板,因为这需要 Windows 工作站(通常)来对 FPGA 进行编程,以及在 FPGA 中创建和使用 PCI/PCIe IP 内核所需的所有时间。基本上,我不想把时间花在 FPGA 上;我想在设备驱动程序上工作!虽然这可能是我唯一的选择......
c - 在不连接设备的情况下安装 Linux PCI 驱动程序
有什么方法可以在不连接设备的情况下安装 Linux 设备驱动程序?
我可以完全访问驱动程序代码。我正在使用 Linux 内核 2.6.35。
我尝试过 insmod 和 modprobe 无济于事。我正在开发一个自定义驱动程序(我没有编写它),但没有任何文档。
linux - Linux PCI 驱动程序,mmap 预取
我有一个 PCI 设备、它的 Linux 驱动程序和一个用户空间应用程序。应用程序 mmap 通过驱动程序获取 PCI 设备的第一个 BAR。所有访问都是通过 32 位整数完成的,这很重要,因为读/写寄存器可能会产生副作用(启动操作等)。
在 x86 平台上,这非常有效。但是,我刚搬到一个 ARM 平台,我有一个奇怪的行为:
- 来自驱动程序的读取/写入行为正确
- 从用户空间读取会触发 64 字节 PCI 读取请求,我的设备无法完成该请求,因为它只接受 32 位访问(+ 由于副作用,我不希望这样做)。
我认为问题在于 mmap 想要预取一些数据并发出读取的 64 字节。我是否缺少标志或可能禁用某种 mmap 预取的东西?
我目前在驾驶员方面的 mmap 实现很简单