㈠ Linux下PCI设备驱动开发详解(六)
Linux下PCI设备驱动开发详解:
本章节主要探讨了基于RIFFA框架的Linux PCI内核态设备驱动的开发。以下是重点内容:
一、Linux下PCI驱动结构 通常用模块方式编写PCI设备驱动,至少需要实现:初始化设备模块、设备打开模块、数据读写模块、中断处理模块、设备释放模块、设备卸载模块。
二、初始化设备模块 源代码中涉及了驱动程序、字符设备、class、文件节点等关键词。
三、probe探测硬件设备 fpga_probe函数非常关键,用于探测和初始化硬件设备。
四、写操作 基本的读写操作通过ioctl来调用对应的驱动实现。 ioctl_send函数中实现了用户数据拷贝到内核态,并调用了chnl_send_wrapcheck函数。 chnl_send_wrapcheck函数主要做了避免错误的判断,支持多线程,并调用了chnl_send函数将数据写入指定的FPGA通道。 数据写入过程中涉及了sg_maps的初始化、通过BAR空间告知FPGA通道信息、使用通用buffer发送数据、更新sg_mapping等步骤。 使用了while循环来处理Tx数据完成中断或出错时的返回,以及中断处理过程中的等待和唤醒机制。
五、读操作 读操作和写操作类似,主要通过chnl_recv函数将FPGA发送的数据读到缓冲区内。 涉及等待队列的初始化和中断处理过程。
六、销毁/卸载设备 释放设备模块主要负责释放对设备的控制权,释放占用的内存和中断等。 所做的事情正好和打开设备模块相反。
七、后续内容预告 《Linux下PCI设备驱动开发详解》将详细分析RIFFA的环形通信队列,其最大好处是不需要对后续的队列内容进行搬移,可以后续由入队覆盖。
通过以上内容,可以了解到Linux下基于RIFFA框架的PCI设备驱动开发的主要步骤和关键函数,为后续的驱动开发提供了重要的参考。