标签: pci

在Linux上查找并行端口的内存地址

我正在尝试通过PCI Express卡找到我已连接到笔记本电脑的并行端口的基本(内存)地址.运行lspci -v显示我的计算机识别并行端口并提供I/O端口(1000和1008)但不提供内存地址(其他条目同时具有端口和内存位置......此卡是唯一没有内存地址的条目).此外,当我查看时,/proc/ioports我得到了lspci中给出的相同端口.但是,当我尝试在我正在运行的程序中使用这些地址中的任何一个(EMC2来控制步进电机)时,它在该地址处找不到并行端口.

如果有一个类似于Windows设备管理器 - >端口 - >资源的话,那真的很棒.在Ubuntu中有没有办法做到这一点?PCIe设备是否有标准内存位置?

编辑: 来自的输出lspci -v

04:00.0 Parallel controller: Oxford Semiconductor Ltd Device c110 (prog-if 02)
Subsystem: Oxford Semiconductor Ltd Device c110
Flags: bus master, fast devsel, latency 0, IRQ 18
I/O ports at 1000 [size=8]
I/O ports at 1008 [size=4]
Capabilities: [40] Power Management version 3
Capabilities: [50] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable-
Capabilities: [70] Express Legacy Endpoint, MSI 00
Capabilities: [100] Device Serial Number 10-01-00-11-11-e0-30-00
Capabilities: …
Run Code Online (Sandbox Code Playgroud)

linux memory-address parallel-port pci

6
推荐指数
1
解决办法
1万
查看次数

什么是 Windows 中的 lshw 等价物,它可以像 lshw 在 Linux 上那样为我提供硬件树结构?

我需要如下所列的硬件信息,这些信息是在 linux 中使用 lshw 生成的。我需要一个没有 GUI 的 Windows 等价物,更喜欢代码或 dll,可用于提取同一树状结构中的信息。请注意 Wmi 不是一个合适的选项,因为它不会给我空插槽,而 lshw 会。


test-pc3
    description: Desktop Computer
    version: System Version
    width: 32 bits
    capabilities: smbios-2.5 dmi-2.5 smp-1.4 smp
    configuration: boot=normal chassis=desktop cpus=2 family=To Be Filled By O.E.M. sku=To Be Filled By O.E.M. uuid=C0EFA9AB-8DFE-D511-9075-BCAEC5B65DA4
  *-core
       description: Motherboard
       product: M4N68T-M-LE-V2
       vendor: ASUSTeK Computer INC.
       physical id: 0
       version: Rev X.0x
       serial: MT700CK35903797
       slot: To Be Filled By O.E.M.
     *-firmware
          description: BIOS
          vendor: American Megatrends Inc.
          physical id: 0
          version: 0402
          date: …
Run Code Online (Sandbox Code Playgroud)

windows hardware list pci

5
推荐指数
1
解决办法
1万
查看次数

为 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 页面)?

非常感谢!

windows 64-bit driver dma pci

5
推荐指数
1
解决办法
1521
查看次数

CPU如何知道PCI地址空间

我知道 PCI 和 PCIe 设备可以由 CPU(通过 BIOS 或 OS 中的代码)配置为通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核有相当复杂的算法来执行此操作。

看到那个软件似乎可以控制这个内存是否、何时以及在哪里映射,我的问题是:一个软件如何控制物理内存的映射?

在这种配置之后,PCI 设备将知道响应给定的地址范围,但是 CPU 如何知道它应该在 PCI 总线上为那些刚刚动态决定的特定地址?

linux-kernel memory-mapping pci pci-e

5
推荐指数
1
解决办法
2039
查看次数

用于(重新)编程 PCIe 板的 PCIe JTAG

我注意到 PCI 总线有 JTAG 线(即 TCK TDI TDO 等):有没有办法使用该 JTAG 来重新编程基于 fpga 的 PCIe 设备?(假设fpga的JTAG连接到PCI线上)。

谢谢米歇尔

编辑:因为我看到 -1,也许我无法让自己理解......我将尝试更好地解释这种情况。我们有一块 Terasic DE5 (Stratix V FPGA) PCIe 板,它实际上具有路由到 FPGA 的 PCIe 总线的 JTAG“线路”。确实,板上焊接有一个 JTAG 端口,但由于机械原因很难到达和使用。所以我的问题是:是否可以像使用 BLASTER 一样使用 PCI 引脚对 FPGA 进行编程?如果是的话,支持 PCIe JTAG 编程的 Linux 基础设施是什么?如果没有机会,有人可以解释一下为什么吗?

fpga pci pci-e

5
推荐指数
1
解决办法
3825
查看次数

谁以及何时分配 PCI/PCIe 设备 BAR 基址?

我正在寻找内核如何进行 PCI/PCIe 枚举和 BAR 分配。

我以为内核会在启动时分配BAR的PCI基地址,但是当我尝试pci earlydump(在内核初始PCI子系统之前)查看BAR值时,我发现所有基地址都已经分配了!?这是否意味着 BIOS 进行 PCI/PCIe 枚举和 BAR 分配?BIOS 如何知道每个 pci 设备的基地址并在没有冲突的情况下分配这些地址?

如果是这样,嵌入式系统(没有 BIOS )如何为 PCI/PCIe 设备枚举和分配基地址?

顺便说一下,我的电脑是 Ubuntu 14.04.1 LTS (x86_64)

boot linux-kernel pci

5
推荐指数
1
解决办法
5313
查看次数

内核空间中 PCI 内存的地址映射

我正在尝试从可加载的内核模块读取和写入 PCI 设备。

因此我关注了这篇文章

pci_enable_device(dev);
pci_request_regions(dev, "expdev");
bar1 = pci_iomap(dev, 1, 0);
// void iowrite32(u32 val, void __iomem *addr)
iowrite32( 0xaaaaaaaa, bar1 + 0x060000);  /* offset from device spec */
Run Code Online (Sandbox Code Playgroud)

但最终设备并没有按预期完成他的工作。然后我查看了后面的地址bar1,发现了一个非常大的值ffffbaaaaa004500

在这一点上,我真的不明白那里发生了什么,什么是对的。我可以解释bar1为内核地址空间内的地址,该地址直接0x60000指向与 PCI 芯片选择地址偏移的基地址吗?

我写的值怎么会bar1 + offset复制到设备上?iowrite32和后面的机制是如何工作的pci_iomap

感谢致敬

亚历克斯

PS:我成功测试了从同一地址的回读。


PCI设备的寄存器描述:

  • PCIBAR0PCI 基地址 0;用于内存映射配置寄存器
  • PCIBAR1PCI 基地址 1;用于 I/O 映射的配置寄存器
  • PCIBAR2PCI 基地址 2;用于本地地址空间 0
  • PCIBAR3PCI 基地址 3;用于本地地址空间 1
  • PCIBAR4 未使用的基地址
  • PCIBAR5 …

c kernel kernel-module linux-kernel pci

5
推荐指数
1
解决办法
8593
查看次数

删除/重新扫描后 pci_enable_device() 失败

我这里有 Linux 4.4(我曾经在一个旧的内核上工作,它以同样的方式失败),带有一个 PCIe 连接的 FPGA 设备和一个驱动程序,它们都是我自己设计的。这些在正常条件下工作得很好,但现在我尝试让它们在热插拔条件下工作。这不是真正的硬件热插拔,我一直在尝试的是echo 1 >remove设备的 sysfs 目录及echo 1 >/sys/bus/pci/rescan之后的常规操作。

设备重新出现后,我的驱动程序的初始化调用pci_enable_device()在记录时失败:

otscan 0000:02:00.0: can't enable device: BAR 0 [mem 0xf7e01000-0xf7e013ff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 1 [mem 0xf7e00000-0xf7e00fff] not claimed
otscan 0000:02:00.0: can't enable device: BAR 2 [mem 0xf0200000-0xf020ffff 64bit pref] not claimed
Run Code Online (Sandbox Code Playgroud)

(通常它会在第一个无人认领的资源之后停止,但我已将其修改为继续并确认实际上所有 BAR 均无人认领。)

这里的“未声明”意味着该对象struct resource存在但没有父对象,据我所知,这是由于request_resource()从未被调用而造成的。我不认为这是一个驱动程序问题,因为初始化例程在由于无法启用设备而中止之前没有做很多事情。

这留下了 FPGA(具有硬 IP PCIe 内核的 Altera Cyclone V)以及我可能在那里做错的事情,例如以某种方式错误处理总线重置。通过 sysfs 重新插入该计算机中的其他 PCIe 设备即可工作。

我已经研究了一段时间,但仍然没有弄清楚为什么我的设备被 Linux 区别对待。我的设备的哪些可能属性可能会让 Linux …

fpga linux-kernel pci pci-e

5
推荐指数
1
解决办法
2828
查看次数

在 Qemu 上编写用于 DMA 传输的 PCI 驱动程序

我正在 Qemu 上编写 PCI 设备,并在来宾操作系统中编写驱动程序(LKM)。虽然 Qemu 提供了一个示例 PCI 设备eduedu.txtedu.c)及其发行版,但我在编写内核模块来进行 DMA 传输时遇到了问题。这里介绍了一个基本的驱动程序,但它不支持 DMA。

我正在跟踪 link 和this的实现。我尝试将缓冲区从 IRQ 处理程序传输到 PCI 设备。设备可以读取数据(pci_dma_read),但我没有得到我应该接收的正确数据。这是进行 DMA 传输的代码段:

static int write_to_HyPerf(void *dev, void* addr, uint32_t size)
{
    /* ----------------------------------------------------------------------------
    * PCI address 'addr':
    * addr     -> DMA source address
    * 0x40000  -> DMA destination address
    * 100      -> DMA transfer count
    * 1        -> DMA command register
    * while (DMA command register & 1)
    *-------------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

qemu linux-device-driver dma pci

5
推荐指数
1
解决办法
1884
查看次数

如何通过MMIO访问pciexpress配置空间?

我是 PCI Express 新手,我想通过 MMIO 地址读/写 PCI Express 配置空间。我知道如何通过 0xCFC 和 0xCF8 端口地址(在 x86 上)将端口映射 IO 读/写到 PCI Express 配置空间。我还编写了一个示例 Linux 内核模块来通过端口映射 io 读取 pci 配置空间,效果很好。我想通过 MMIO/MMCFG 访问执行相同的操作。

我也进行了搜索,但找不到令人信服的答案。我正在寻找详细信息以及一些代码示例以更好地理解它。

任何帮助表示赞赏。

pci pci-e

5
推荐指数
1
解决办法
9164
查看次数