基于X86平台的PCIE-Linux驱动

编程知识 行业动态 更新时间:2024-06-13 00:19:09

此文章的PCIE使用的是block DMA,而且用户功能也比较简单,所以没有太多复杂的东西。

而且本人也是个新手,才疏学浅很多知识都似懂非懂,如果有什么写的不对的地方,还请大佬多多指正,谢谢!

本人所使用的测试环境:华硕主板Z390-A

系统:Ubuntu16.04

内核版本:4.15.0-112-generic

1. 目前Linux的驱动开发框架主要是设备、驱动、总线模型,而我们使用pcie也是使用此模型进行开发的,我们将其关联的总线称为pci总线。

而下面的这个函数,就是要将我们的driver和device关联绑定起来,而PCIE主要是通过vendor_id(厂商ID号,每个厂商都是唯一的)和device_id(设备ID号,开发人员可手动设置)去进行匹配的,通过我粗浅的理解它是通过.id_table去进行关联绑定的(这个可以去百度搜一下,我就不在这误人子弟了)。

而我写的这个fpga_ids里面驱动兼容范围在只要符合vendor_id的pcie板卡都会与之匹配上。且调用我的fpga_probe函数。

2. PCIE驱动属于字符设备驱动,所以我们在moudle_init里要先进行字符设备注册,在这里我使用的是静态主设备号分配,如果MAJOR_NUM为0,则系统会动态分配一个主设备号。

你可以通过cat /proc/devices查看驱动设备,第1列为主设备号(MAJOR_NUM),第2列为设备名称(DEVICE_NAME)。

下面这个是对应的文件操作,即你在上层应用中控制驱动时,就靠此处链接起来

3. 其实大家都知道,我们在操作驱动时,都是通过把设备节点当文件去进行操作,从而去控制相应的驱动功能。

我们在创建设备节点前,要先通过class_create去创建一个设备类节点。

你可以通过ls /sys/class找到在class_create传入的第二个参数对应的文件夹,在这个文件夹下面就是设备类节点。

在创建完设备类节点后,就要通过device_create在此类下面创建设备节点了

设备节点可以通过ls /dev/查看到。

4. pci_enable_device函数必须要有,且放在probe中,具体的源码作用本人没有细研究。

只知道它是启用设备的I/O和内存资源,分配不足的资源,如果需要,还要唤醒一个处于暂停状态的设备。需要注意的是,这个操作可能会失败。

5. pci_set_master设置成总线主DMA模式

6. 设置DMA寻址能力

通过调用dma_set_mask()来通知内核相关限制:

通过调用dma_set_coherent_mask()通知内核一致性内存分配的限制。

7. 对PCI区进行标记 ,标记该区域已经分配出去

8. 获取BAR0信息。包括起始地址,长度,以及类型

9. 将上步获得的bar0的IO内存,映射成内核可用的虚拟内存

10. 使能MSI中断

在这里要注意一点,就是在Linux系统下,内核默认只能使用一个MSI中断向量,目前我还未找到如果去增加这个向量并使用。

11. 申请中断号

12. 为每个方向申请内存

13. 为每个通道申请内存,并初始化等待队列

14. 将设备状态保存起来,以备之后使用

15. 为了增加传输速率,减少数据copy,我们使用mmap的映射方式,将dma的物理空间直接映射到用户空间去使用。

不过这种方式可能会有一些隐患,如果使用不当会破坏内核,所以使用起来需谨慎。

在这里,我们需要注意的是用户层如何使用mmap,这个mmap里面的物理地址和获得的虚拟地址一定是你所要关联的,否则会有问题,如下图所示的dma_phy是内核申请的dma物理地址,而dma_uva就是映射到用户空间的虚拟地址。这样它俩就被关联了起来,我们在访问dma_uva时,就相当于访问了dma_phy。

我在之前没弄明白此函数时,将最后一个参数传了0,表示内核自动分配物理地址,这样就会导致有时关联上了,有时关联不上,所以数据就会出问题,甚至在往地址写数据时,出现系统崩溃情况,所以这里一定要注意这点。

16. 对bar0的操作

17. 在这里还有需要注意的地方就是关闭板卡和卸载驱动时,资源释放的顺序。

如果顺序不对,就会导致一些意想不到的问题。

以下是我的资源释放顺序,仅供参考。

 

这里我也只是简单的介绍了下PCIE驱动的加载流程。剩下的功能,我都是以ioctl进行操作的,这里就不一一介绍了。

更多推荐

基于X86平台的PCIE-Linux驱动

本文发布于:2023-03-27 22:38:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/e3fea1f697108367c057b5b41a4886ab.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:平台   Linux   PCIE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!