Linux平臺下XDMA驅(qū)動安裝和調(diào)試過程記錄
最近由于項目需要,需要實現(xiàn)Xilinx-FPGA到主機的數(shù)據(jù)傳輸功能,傳輸機制為PCIE-DMA。具體實現(xiàn)方法就是下載安裝Xilinx提供的XDMA驅(qū)動,基于該驅(qū)動和硬件功能,實現(xiàn)用戶代碼(讀寫功能XDMA已經(jīng)實現(xiàn)好了,直接調(diào)用就好)。由于我之前沒有接觸過FPGA和驅(qū)動開發(fā),是一個完全的小白,在前期浪費了許多時間,故在此分享一下我的學(xué)習(xí)歷程,希望能對大家有用。

一、XDMA驅(qū)動安裝
1. 下載XDMA驅(qū)動(http://github.com/Xilinx/dma_ip_drivers)
2. 安裝XDMA驅(qū)動
在命令行中輸入lspci,查看系統(tǒng)是否檢測到FPGA設(shè)備
根據(jù)dma_ip_drivers-master/XDMA/linux-kernel/readme.txt文件中的流程完成安裝?;蛘吒鶕?jù)網(wǎng)上的安裝流程完成安裝。
XDMA linux平臺調(diào)試過程記錄(http://blog.csdn.net/lum250/article/details/121318547)
HiFive Unmatched開發(fā)板安裝XDMA(linux安裝)(http://zhuanlan.zhihu.com/p/483896215)
當執(zhí)行‘sudo ./load_driver.sh’后,若顯示“Error: The Kernel module installed correctly, but no devices were recognized.”,請不要浪費時間,去找硬件工程師,十有八九是他們的問題。可以通過‘dmesg | grep xdma’和‘lspci -xxxvvv | grep xdma’查詢有關(guān)xdma的日志信息和設(shè)備詳細信息,以方便硬件工程師定位問題
若load_drivers.sh和run_test.sh腳本都運行成功了,則驅(qū)動安裝完成
二、閱讀XDMA驅(qū)動源代碼
1. 閱讀示例應(yīng)用程序dma_utils.c,dma_from_devices.c,dma_to_devices.c
通過閱讀上述示例程序,我們可以知道對設(shè)備的操作可以簡化為文件操作,先用open函數(shù)打開字符設(shè)備(Character Device Driver,如/dev/xdma0_c2h_0,驅(qū)動安裝完成后在/dev目錄下可見),使用read和write函數(shù)進行設(shè)備讀寫
但是還有很多問題沒有解決,為什么安裝驅(qū)動后就可以轉(zhuǎn)化為文件操縱,open,read這些函數(shù)哪來的;讀寫操作是同步還是異步的;除讀寫外還能進行哪些操作;如何處理中斷(/dev/xdma0_events_0)等等。
2. 閱讀書籍《Linux設(shè)備驅(qū)動程序》
通過閱讀第三章《字符設(shè)備驅(qū)動程序》可以知道如何將設(shè)備抽象為多個字符設(shè)備,如何將自定義的驅(qū)動函數(shù)轉(zhuǎn)化為linux內(nèi)置的open、read、write函數(shù)。下面簡單介紹一下我閱讀驅(qū)動代碼的過程,具體原理還是需要大家看書。
linux為每一個字符設(shè)備都定義了一組函數(shù)操作,如open、read、write;驅(qū)動程序員也可以為設(shè)備定義一組專用的操作如xdma_open、xdma_read、xdma_write。linux通過一個定義在<linux/fs.h>中的file_operations結(jié)構(gòu)來將兩者連接起來,該結(jié)構(gòu)包含一組函數(shù)指針,驅(qū)動程序員定義好這個結(jié)構(gòu)后,再通過內(nèi)核函數(shù)cdev_init將該結(jié)構(gòu)傳入內(nèi)核,就可以建立起連接。
下面是xdma中斷字符設(shè)備file_operations的定義,我們可以確定該字符設(shè)備能進行open、close、read和poll操作,通過閱讀char_open等函數(shù)就可以確定這些操作是如何實現(xiàn)的。
我們知道了能對字符設(shè)備進行的操作以及這些操作是如何實現(xiàn)的,就可以放心編寫應(yīng)用程序了。如果要進一步了解PCIE和DMA的實現(xiàn),那就要進一步查看技術(shù)手冊和書籍了。