通过sysfs-pci驱动程序映射CompactPCI设备

时间:2015-01-30 08:43:21

标签: linux embedded mmap pci sysfs

所以,问题可以描述如下:

  1. 我们有11个完全相同的PCI设备,通过两个CompactPCI总线连接,一个连接6个,另一个连接5个。
  2. 我们正在尝试通过sysfs文件系统访问设备的资源,例如: /sys/class/pci_bus/0000:04/device/0000:04:0d.0/resource1。前4个设备允许对其资源进行读/写访问而不会出现问题,但是:
  3. 两个总线的第5和第6个设备都不起作用:所有文件都存在,但所有读取操作都返回一堆FF,无论写入的值如何,所以我无法真正说出是否写入成功与否。当前4个中的一个被物理移除时,第5个设备像往常一样开始工作,同样在6个设备的总线上运行6个。它看起来只能使用每个总线4个设备,而不是更多。应该注意的是,根据规范,CompactPCI允许一次在总线上使用7个PCI设备。
  4. 它实际上可能是一个硬件问题,因为Windows驱动程序(很久以前由我们无法访问的人开发)就可以了。
  5. lspci的:

    03:0b.0 Multimedia controller: Device 6472:8001 (rev 01)
    03:0c.0 Multimedia controller: Device 6472:8001 (rev 01)
    03:0d.0 Multimedia controller: Device 6472:8001 (rev 01)
    03:0e.0 Multimedia controller: Device 6472:8001 (rev 01)
    03:0f.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:09.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:0a.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:0b.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:0c.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:0d.0 Multimedia controller: Device 6472:8001 (rev 01)
    04:0f.0 Multimedia controller: Device 6472:8001 (rev 01)
    

    lspci -vv(等于所有11个设备的总线号码):

    04:0f.0 Multimedia controller: Device 6472:8001 (rev 01)
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr Stepping- SERR- FastB2B- DisINTx-
    Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx+
    Interrupt: pin A routed to IRQ 11
    Region 0: I/O ports at d800 [size=128]
    Region 1: Memory at febfe800 (32-bit, non-prefetchable) [size=128]
    

    不知道我是否真的需要向您展示代码,因为它尽可能简单 - 打开文件然后进行mmaped,然后生成的指针用于写入和读取该文件。 / p>

    fd = open ( (device_ + "resource" + std::to_string (i)).c_str(), O_RDWR);
    ptr = (u_int32_t*) mmap (NULL, 0x7f, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    

    所有路径都已正确恢复,这是我先检查过的。

    dmesg 没有关于PCI的错误。

1 个答案:

答案 0 :(得分:0)

经过相当长的一段时间,我决定回答这个问题。我自己没有解决这个问题,并在linux内核中写了一封与PCI相关代码维护者的电子邮件。经过数十次尝试找出出了什么问题,我们就停止了 - 我不得不换到另一个项目,业余时间结束了。唯一发现的是在这样的配置中你不能使用mmap(这是通过sysfs文件系统访问BAR的主要方式)。所以,相反,我开发了一个简单的PCI驱动程序,它完全相同,但使用读/写操作,它工作。

基本上,

kernel -> userspace - result

ioremap -> read/write - works
ioremap -> mmap - doesn't work
sysfs -> mmap - doesn't work