Linux平台下XDMA驱动安装和调试过程记录
最近由于项目需要,需要实现Xilinx-FPGA到主机的数据传输功能,传输机制为PCIE-DMA。具体实现方法就是下载安装Xilinx提供的XDMA驱动,基于该驱动和硬件功能,实现用户代码(读写功能XDMA已经实现好了,直接调用就好)。由于我之前没有接触过FPGA和驱动开发,是一个完全的小白,在前期浪费了许多时间,故在此分享一下我的学习历程,希望能对大家有用。

一、XDMA驱动安装
1. 下载XDMA驱动(http://github.com/Xilinx/dma_ip_drivers)
2. 安装XDMA驱动
在命令行中输入lspci,查看系统是否检测到FPGA设备
根据dma_ip_drivers-master/XDMA/linux-kernel/readme.txt文件中的流程完成安装。或者根据网上的安装流程完成安装。
XDMA linux平台调试过程记录(http://blog.csdn.net/lum250/article/details/121318547)
HiFive Unmatched开发板安装XDMA(linux安装)(http://zhuanlan.zhihu.com/p/483896215)
当执行‘sudo ./load_driver.sh’后,若显示“Error: The Kernel module installed correctly, but no devices were recognized.”,请不要浪费时间,去找硬件工程师,十有八九是他们的问题。可以通过‘dmesg | grep xdma’和‘lspci -xxxvvv | grep xdma’查询有关xdma的日志信息和设备详细信息,以方便硬件工程师定位问题
若load_drivers.sh和run_test.sh脚本都运行成功了,则驱动安装完成
二、阅读XDMA驱动源代码
1. 阅读示例应用程序dma_utils.c,dma_from_devices.c,dma_to_devices.c
通过阅读上述示例程序,我们可以知道对设备的操作可以简化为文件操作,先用open函数打开字符设备(Character Device Driver,如/dev/xdma0_c2h_0,驱动安装完成后在/dev目录下可见),使用read和write函数进行设备读写
但是还有很多问题没有解决,为什么安装驱动后就可以转化为文件操纵,open,read这些函数哪来的;读写操作是同步还是异步的;除读写外还能进行哪些操作;如何处理中断(/dev/xdma0_events_0)等等。
2. 阅读书籍《Linux设备驱动程序》
通过阅读第三章《字符设备驱动程序》可以知道如何将设备抽象为多个字符设备,如何将自定义的驱动函数转化为linux内置的open、read、write函数。下面简单介绍一下我阅读驱动代码的过程,具体原理还是需要大家看书。
linux为每一个字符设备都定义了一组函数操作,如open、read、write;驱动程序员也可以为设备定义一组专用的操作如xdma_open、xdma_read、xdma_write。linux通过一个定义在<linux/fs.h>中的file_operations结构来将两者连接起来,该结构包含一组函数指针,驱动程序员定义好这个结构后,再通过内核函数cdev_init将该结构传入内核,就可以建立起连接。
下面是xdma中断字符设备file_operations的定义,我们可以确定该字符设备能进行open、close、read和poll操作,通过阅读char_open等函数就可以确定这些操作是如何实现的。
我们知道了能对字符设备进行的操作以及这些操作是如何实现的,就可以放心编写应用程序了。如果要进一步了解PCIE和DMA的实现,那就要进一步查看技术手册和书籍了。