怎么编写PCIe设备驱动程序

这篇具有很好参考价值的文章主要介绍了怎么编写PCIe设备驱动程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

怎么编写PCIe设备驱动程序




参考内核文件:

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

一、 PCI总线设备驱动模型

怎么编写PCIe设备驱动程序
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是否匹配?使用如下图所示函数:

怎么编写PCIe设备驱动程序
pci_bus_match`核心代码如下:

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

怎么编写PCIe设备驱动程序
示例,下图表示支持这样的pci_dev:

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

怎么编写PCIe设备驱动程序

二、 获得PCIe设备的资源

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

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

2.1 获得内存/IO空间

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

怎么编写PCIe设备驱动程序
判断资源类型,参考代码:

怎么编写PCIe设备驱动程序

2.2 获得中断号

2.2.1 获得INTx中断号

直接使用pci_dev->irq。

2.2.2 获得MSI-X/MSI中断号

参考代码:`drivers\nvme\host\pci.c
怎么编写PCIe设备驱动程序

三、 使能设备

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

怎么编写PCIe设备驱动程序



致谢

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

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬文章来源地址https://www.toymoban.com/news/detail-416312.html



到了这里,关于怎么编写PCIe设备驱动程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】02.hello驱动程序之cdev注册字符设备驱动程序和设置次设备号

    目录 一、register_chrdev 二、解决方法 2.1 alloc_chrdev_region函数:注册一系列字符设备编号 2.2 cdev_init函数:初始化cdev结构体  2.3  cdev_add函数:将字符设备添加到系统中  三、驱动程序 【IMX6ULL驱动开发学习】01.编写第一个hello驱动+自动创建设备节点(不涉及硬件操作)_阿龙还

    2024年02月14日
    浏览(38)
  • Linux 设备驱动程序(四)

    Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序(三) Linux 设备驱动程序(四) Linux设备驱动开发详解 深入理解Linux虚拟内存管理     ⇐ ⇒ ⇔ ⇆ ⇒ ⟺ ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕

    2024年02月16日
    浏览(43)
  • 操作系统实验·字符设备驱动程序

    编写一个简单的字符设备驱动程序,该字符设备并不驱动特定的硬件, 而是用内核空间模拟字符设备,要求该字符设备包括以下几个基本操作,打开、读、写和释放,并编写测试程序用于测试所编写的字符设备驱动程序。在此基础上,编写程序实现对该字符设备的同步操作。

    2024年02月10日
    浏览(52)
  • linux的SPI设备驱动程序

            串行外设接口(SPI)是四线总线:MOSI、MISO、串行时钟SCK和片选CS。它常用于连接闪存、AD/DA转换器。主设备生成时钟和管理片选CS,速度可达80MB,远超I2C总线。         SPI设备在内核中表示为struct spi_device{},管理他们的驱动程序的实例是struct spi_driver{}。spi的拓扑结构

    2024年02月13日
    浏览(38)
  • Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

    container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型: 内核开发者只实现了循环双链表,因为这个结构能够实现FIFO和LIFO,并且内核开发者要保持最少代码。 为了支持链表,代码中要添加的头文件是linux/list.h。内核中链表实现核心部分的数据结构 是struct li

    2024年01月22日
    浏览(51)
  • 这个设备(服务)的驱动程序已被禁用。另一个驱动程序可以提供这个功能。(代码32)

    今天拿到一台笔记本,插上U盘没有反应,进【设备管理器】发现【USB大容量存储设备】有个黄色的叹号。   鼠标右键【USB大容量存储设备】打开属性查看信息,显示设状态“这个设备(服务)的驱动程序已被禁用。另一个驱动程序可以提供这个功能。(代码32)”   研究了

    2024年02月11日
    浏览(50)
  • 【IMX6ULL驱动开发学习】07.驱动程序分离的思想之平台总线设备驱动模型和设备树

    目录 一、驱动程序分离的思想 二、设备树 2.1 使用设备树 三、平台总线设备驱动模板 【IMX6ULL驱动开发学习】05.字符设备驱动开发模板(包括读写函数、poll机制、异步通知、定时器、中断、自动创建设备节点和环形缓冲区)_阿龙还在写代码的博客-CSDN博客 之前编写驱动程序

    2024年02月07日
    浏览(39)
  • Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)

     个人名片: 🦁作者简介:学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755@qq.com 🦉个人WeChat:Vir2021GKBS 🐼 本文由妄北y原创,首发CSDN 🎊🎊🎊 🐨座右铭:大多数人想要改造这个世界,但却罕有人想改造自己。 专栏导航: 妄北y系列专栏导航: C/C++的基

    2024年02月21日
    浏览(42)
  • 识别并安装Windows中未知设备的驱动程序

    我们偶尔需要重装系统,或者帮助老婆、女朋友重装系统时,装完驱动后常常发现还剩下几个未知设备的驱动没有安装,由于不知道是什么设备,所以不知道安装什么驱动程序。去官网把与电脑型号相关的驱动全部下载再一个个的安装?如果安装了不必要的驱动既浪费了空间

    2024年02月21日
    浏览(51)
  • 已签名驱动程序安装后提示“Windows无法验证此设备所需驱动程序数字签名”的原因和解决方法

    在Windows 64位系统上,正常开启数字签名认证时,驱动程序软件需要经过微软数字签名的才允许被使用。否则在设备管理器下,安装完硬件驱动后设备上会有“黄色感叹号”标识,右键该设备属性提示:“Windows 无法验证此设备所需驱动程序数字签名。(代码52)” 当遇到在部

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包