Linux 使用者空間 PCI 驅動程序選項?(uio_pci_generic)
我在 PCI 匯流排上有一個 Xilinx FPGA PCIe 端點。Linux 很好地拾取了設備,lspci 中的一切看起來都很完美。
我的問題是關於使用者空間的 PCI 訪問選項以及什麼是好/壞。
選項 1:通過 /sys/…/resource0 直接訪問
(到目前為止,我只有一個成功的工作)
我可以打開並 mmap 說 /sys/bus/pci/devices/XXXX:XX:XX.X/resource0 然後 mmap 並讀/寫。只需要先修復權限。我的問題是,這是一個好方法還是壞方法?感覺這可能不是訪問 PCI 地址空間的首選方法?
選項 2:使用 uio_pci_generic
我已經設法配置我的 FPGA,以便這個驅動程序真正連接,它需要中斷的事實真的很煩人。似乎這可以訪問任何接受中斷和配置記憶體空間?這對我來說似乎不是很有用?我錯過了什麼嗎?
選項 3:編寫我自己的 uio 驅動程序
這可能是一個合理的選擇?我不確定這有多難。這樣做的一個可能的好處是我可以訪問 DMA 並因此加快速度。
選項 4:編寫完全自定義的 linux PCI 驅動程序
如果可能的話,我想避免這個選項
我的問題是什麼是最好的方法,以及選項 1 的缺點是什麼。或者我應該考慮其他方法嗎?
(我正在執行核心 3.14.15 rt 修補的 debian)
選項 1(通過 /sys/…/resource0 直接訪問)
適合測試,功能上沒有問題,雖然不能做任何高級的事情,也沒有驅動層抽象。由於使用者程序與 sysfs 互動的方式,我發現這種方法很討厭,但這可能是我個人的看法。
選項 2(使用 uio_pci_generic)
我不知道 uio_pci_generic 做了什麼,但它似乎除了允許您的使用者程序訪問 pci 遺留中斷之外幾乎沒有添加任何功能。這是不好的,因為無論如何首選MSI。
選項 3(自定義 uio 驅動程序)
我沒有嘗試過,但我懷疑與選項 4 相比有點浪費時間
選項 4(自定義核心驅動程序)
這確實是最好的解決方案,也是正確做事的唯一方法。您需要一個驅動程序才能正確處理諸如 DMA 和 MSI 之類的事情,並能夠通過字元設備提供任意數量的抽象。然而,有大量關於如何線上為 PCI 卡編寫驅動程序的文件,並且核心為管理事物提供了很多支持。