首先,我是Linux编程的新手,非常抱歉,如果这样做没有意义,或者我在咆哮错误的树,指向正确的方向。C++应用程序使用mmap通过PCI在用户空间中通过PCI与FPGA通信
我正在尝试编写一个cpp应用程序,通过pci总线在FPGA上与FPGA进行通话。
我到目前为止编写的代码列举了/sys/bus/pci/devices
中的目录,检查设备和供应商文件以找到正确的代码。
一旦我找到了设备,我知道我需要写入的映射区域以某种方式由资源[n]文件表示,但我不知道如何使用它们来读取/写入某些值。
从另一个操作系统编写的代码我知道我想和PCI设备的BAR1交谈,我试图这样做的方式是使用mmap(这是正确的方式吗?) 。首先,我得到一个文件句柄/sys/bus/pci/devices/[device_addr]/resource1
与O_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
同上,但传中,起始地址的偏移量(最后 参数)并使用开始和结束地址来获取映射区域 大小(第二个参数)。
因此,打开/ sys/bus/pci/devices/[device]/resource1文件以访问FPGA的共享内存是否正确? –
@rb_:上的sysfs + PCI文档意味着它。 –
使用uio_pci_generic驱动程序和mmap()资源文件的一些工作示例代码可以在此处找到:http://billfarrow.blogspot.com/2010/09/userspace-access-to-pci-memory.html –