2011-07-29 23 views
4

首先,我是Linux编程的新手,非常抱歉,如果这样做没有意义,或者我在咆哮错误的树,指向正确的方向。C++应用程序使用mmap通过PCI在用户空间中通过PCI与FPGA通信

我正在尝试编写一个cpp应用程序,通过pci总线在FPGA上与FPGA进行通话。

我到目前为止编写的代码列举了/sys/bus/pci/devices中的目录,检查设备和供应商文件以找到正确的代码。

一旦我找到了设备,我知道我需要写入的映射区域以某种方式由资源[n]文件表示,但我不知道如何使用它们来读取/写入某些值。

从另一个操作系统编写的代码我知道我想和PCI设备的BAR1交谈,我试图这样做的方式是使用mmap(这是正确的方式吗?) 。首先,我得到一个文件句柄/sys/bus/pci/devices/[device_addr]/resource1O_RDWR,然后调用mmap像这样:

char *map = (char*)mmap(NULL, FPGA_MEM_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 

哪里fd是开放的文件描述符。

我要对这个正确的方法或者是更好的功能/调用来使用?我知道我可以写一个内核模块要做到这一点,但我宁愿没有进入内核模块编程,只是还没有。

如果有帮助,我可以在一段时间内粘贴代码,但是我并不是真的在对代码进行批评之后,只是指出了最好的方法。

如果有任何细节我错过了就问我。

我使用的是基于ubuntu 11.04(运行在活动usb上)的2.6 Linux内核,硬件基于x86。

感谢

UPDATE: 后更是对谷歌搜索和试错与我得到它的工作的代码。

步骤我跟着其中:

  • 使用/sys/bus/pci/devices/[device]/[vendor|device]
  • 解析/sys/bus/pci/devices/[device]/resource识别装置中,每一行的第 列是起始地址和第二个是 映射区域的结束地址。我想BAR1所以第二行有 需要我的价值观。
  • open("/dev/mem", O_RDWR)得到文件描述符fd
  • 电话mmap同上,但传中,起始地址的偏移量(最后 参数)并使用开始和结束地址来获取映射区域 大小(第二个参数)。

回答

3

这是一个完全可以接受的mmap调用,应该可以正常工作。

+0

因此,打开/ sys/bus/pci/devices/[device]/resource1文件以访问FPGA的共享内存是否正确? –

+0

@rb_:上的sysfs + PCI文档意味着它。 –

+0

使用uio_pci_generic驱动程序和mmap()资源文件的一些工作示例代码可以在此处找到:http://billfarrow.blogspot.com/2010/09/userspace-access-to-pci-memory.html –

相关问题