2011-07-29 26 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 –

相關問題