首先,我是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 –