Linux平台PCIe驱动编写

        以前文章分析了PCIe整个系统知识,包括如何扫描PCIE树,这篇文章讲解一下当拿到一个PCIe设备时如何编写驱动程序。编写驱动程序在应用程序中编写,同样可以在内核层编写驱动。

从应用层编写驱动主要是使用pcilib库和/dev/mem接口,下面开始分析代码。根据pcie设备的厂家ID和设备ID初始化设备,并且返回访问设备指针描述符,pci_dev指针指向我们需要访问的设备。

                                                                                                        图 1

清理PCIe设备函数:pci_cleanup(myaccess);

读写配置空间函数如下:

                                                                                                    图 2

到目前为止程序能够顺利访问PCIe 4k配置空间,写配置空间时必须在root用户下,接下来实现访问bar空间,bar空间访问分为两部分,得到大小和映射。获取bar空间大小先给bar0寄存器全写1,查看位的变化情况得到大小。

获取bar空间大小函数:

                                                                                             图 3

映射bar空间,程序中获取到的地址已经是cpu存储域的地址 ,而不是PCIe域地址。/dev/mem接口是物理地址的全部镜像,mmap可以通过该接口将指定的物理地址映射到虚拟地址空间上,这样进程就可以访问实际存在的物理地址空间。映射函数如下,phy_addr参数待映射的物理地址,size是待映射的物理地址大小。

                                                                                            图 4

程序退出时应该释放映射的内存和关闭/dev/mem设备节点。

munmap(vir_addr,size);

close(pcieVirAddr_fd);

驱动程序中编写PCIe驱动程序,所有的思路与应用程序一致,只是用到的函数接口和类型不一样。但是我建议将PCIe驱动写入到内核中。

驱动程序中这里只列举出核心代码,详细代码与Makefile请下载源码阅读。

                                                                                           图 5 得到设备指针

                                                                                    图 6 映射BAR空间

如果仅仅是调试为了方便,那么可以使用系统的lspci指令访问配置空间。

源码下载地址:Linux中Pcie驱动_linuxpcie驱动,linuxpcie代码-Linux代码类资源-CSDN下载

  • 11
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HeroKern

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值