怎么编写PCIe设备驱动程序


文章目录

  • 怎么编写PCIe设备驱动程序
  • 参考内核文件:
    • 一、 PCI总线设备驱动模型
    • 二、 获得PCIe设备的资源
      • 2.1 获得内存/IO空间
      • 2.2 获得中断号
        • 2.2.1 获得INTx中断号
        • 2.2.2 获得MSI-X/MSI中断号
    • 三、 使能设备
  • 致谢


参考内核文件:

  • Documentation\PCI\MSI-HOWTO.txt
  • drivers\nvme\host\pci.c

一、 PCI总线设备驱动模型


PCI总线设备驱动模型:

  • 右边是pci_dev,由PCIe控制器的驱动程序扫描PCIe总线,识别出设备,并构造、注册pci_dev

    • pci_dev结构体含有丰富的信息,比如vid、pid、class、已经分配得到的mem/io资源、INTx中断资源
  • 左边是PCIe设备驱动程序pci_driver,需要我们编写、注册
    • 使用函数pci_register_driver来注册
    • pci_driver结构体里含有id_table,表示它能支持哪些设备
    • pci_driver结构体里含有probe函数,表示发现能匹配的pci_dev后,这个probe函数将被调用

怎么判断pci_driver和pci_dev是否匹配?使用如下图所示函数:


pci_bus_match`核心代码如下:

pci_bus_matchfound_id = pci_match_device(pci_drv, pci_dev);found_id = pci_match_id(drv->id_table, dev);pci_match_one_device(ids, dev)


示例,下图表示支持这样的pci_dev:

  • pci_dev的class & 0xffffff == PCI_CLASS_STORAGE_EXPRESS
  • pci_dev的VID为PCI_VENDOR_ID_APPLE、DID为0x2001

二、 获得PCIe设备的资源

PCIe控制器扫描出PCIe设备后,会为这个设备分配资源、并记录在对应的pci_dev里:

  • struct resource resource[DEVICE_COUNT_RESOURCE]:含有mem/io资源
  • irq:含有INTx中断号

2.1 获得内存/IO空间

参考代码:`kernel\drivers\scsi\3w-9xxx.c


判断资源类型,参考代码:

2.2 获得中断号

2.2.1 获得INTx中断号

直接使用pci_dev->irq。

2.2.2 获得MSI-X/MSI中断号

参考代码:`drivers\nvme\host\pci.c

三、 使能设备

参考代码:`drivers\nvme\host\pci.c



致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬



怎么编写PCIe设备驱动程序相关推荐

  1. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  2. linux如何切换到设备,如何编写Linux设备驱动程序(转)

    序言 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环 境下的驱动程序有很大的区别.在Linux环境下设计驱动程序 ...

  3. Linux驱动程序教程:如何编写简单的Linux设备驱动程序

    翻译来自: https://www.apriorit.com/dev-blog/195-simple-driver-for-linux-os 代码下载 此Linux设备驱动程序教程将为您提供有关如何为 ...

  4. 字符设备驱动程序——点亮、熄灭LED操作

    2019独角兽企业重金招聘Python工程师标准>>> 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设 ...

  5. Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  6. IO子系统(一) — 块设备驱动程序

    VFS层(虚拟文件系统层): 由于内核需要跟不同的文件系统打交道,而每一个文件系统所实现的方式和数据结构也不尽相同,所以内核抽象了这一层,专门用来适配各种文件系统,对上提供统一的操作接口,对下层的诸多 ...

  7. linux系统reales,基于uCLinux系统的IEEE1394设备驱动程序的编程研究与实现

    本文分析了IEEE1394协议驱动层框架,介绍了uCLinux下IEEE1394设备驱动程序架构和编写IEEE1394视频设备驱动程序的步骤和方法.(1)IEEE1394网络架构IEEE1394的网络 ...

  8. Linux 设备驱动程序(二)

    系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...

  9. 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计

    嵌入式Linux下USB驱动程序的设计 usb概念:  USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...

最新文章

  1. 目标检测分割--Mask R-CNN
  2. WF4.0进行单元测试
  3. 成为阿里 P7 真的难么?
  4. java读取项目资源文件的方法
  5. 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
  6. 组策略中Run logon scripts synchronously和Run startup scripts asynchronously的区别
  7. 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
  8. 读取本地图片存入数据库
  9. 组策略设置IE 11的Compatible View
  10. 1.5万转12Gbps 东芝发布全新企业硬盘AL14SX
  11. iOS 五种传值方式
  12. 表单多条相同name数据的获取
  13. 【搞定GTD】用iPhone打造GTD实践1年后的心得体会
  14. HTML5+CSS3基础
  15. Python实现简易TCP服务器
  16. 3D模型贴图算法归纳讨论,以及OpenGL渲染器中的数据格式——篇1:模型展开算法与UV贴图
  17. 六轴机器人直角坐标系建立_工业机器人六种坐标系详解(图)
  18. 流?I/O操作?阻塞?epoll?
  19. 海康、大华IP摄像机RTSP地址及格式详解
  20. “应用程序无法启动,因为应用程序的并行配置不正确”问题的解决

热门文章

  1. tvOS游戏开发系列(SpriteKit)之新建tvOS游戏项目(二)
  2. 4种改善类别不平衡的方法
  3. Spring+Hibernate配置文件-applicationContext.xml设置
  4. python 模拟微信浏览器请求_python爬虫:使用Selenium模拟浏览器行为
  5. java中的setting文件
  6. 芯片市场低迷 SK海力士Q1利润大跌69%
  7. win10此电脑桌面显示(桌面显示)
  8. Android应用程序icon规范
  9. 4511或74LS48来实现BCD转7段数码管及逻辑状态输入演示
  10. 使用iTEXT生成PDF