怎么编写PCIe设备驱动程序

news/2025/2/6 21:53:42/

怎么编写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开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

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




http://www.ppmy.cn/news/265714.html

相关文章

PCI设备驱动和相关知识

在研究黑苹果驱动时,经常会看到修改Info.plist中的IOPCIMatch字段。需要研究一下相关内容。 PCI是一种外设部件互连标准总线,和USB总线差不多,可以将不同类型的设备连接到同一条总线上。 常见的PCI设备有显卡,网卡,声…

PCI驱动程序例子

PCI协议详细介绍英文版 PCI 实例驱动代码如下&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/signal.h> #include <linux/init.h> #include <linux/cdev.h> #include <li…

XCOM串口调试软件的安装与使用(附串口及驱动资源包)

材料&#xff1a; C340模块或者别的模块&#xff0c;我这里直接用的是STM32F407芯片&#xff0c;内部集成了C340 一根usb线 一、下载安装XCOM串口调试助手 下载地址 XCOM的详细讲解 另外需要安装C340的驱动 正点原子提供的驱动win10系统不支持&#xff0c;安装了几次都失…

设备管理器里“SM总线控制器”、“其他PCI桥设备”驱动有问题

WinXP重装系统后设备管理器里面出现黄色问号&#xff0c;分别是“SM总线控制器”和“其他PCI桥设备“&#xff0c;主板是七彩虹的&#xff0c;芯片组是 geForce 7025的&#xff0c;南桥是 nForce 630a&#xff0c;用七彩虹官网的主板驱动装了没用。 用驱动人生先备份另一个同样…

vxworks的pci设备驱动调试

开发环境&#xff1a;风河workbench3.2 —vxworks6.8 &#xff0c;目标板&#xff1a;飞思卡尔powerpc mpc8536 NI PXIe机箱。 问题描述&#xff1a;目标板由NI公司的PXIE机箱供电&#xff0c;并插入零槽作为主控制器&#xff0c;现在实验室有自己研发的AD数据采集模块…

Linux设备驱动之——PCI 总线

PCI总线概述 随着通用处理器和嵌入式技术的迅猛发展&#xff0c;越来越多的电子设备需要由处理器控制。目前大多数CPU和外部设备都会提供PCI总线的接口&#xff0c;PCI总线已成为计算机系统中一种应用广泛、通用的总线标准[1]。Linux因其开放源代码以及稳定的…

利用FPGA实现PCI总线接口及Windows驱动实现

利用FPGA实现PCI总线接口及Windows驱动实现 关于PCI总线协议&#xff0c;资料网上、书本都是。这里我们仅仅对重点对利用FPGA实现PCI总线接口问题进行简单分析。下图是PCI总线接口信号&#xff1a; 配置空间寄存器操作时序如下图&#xff1a; 配置寄存器空间写时序如下图&…

基于TMS320C6205的内嵌PCI设备WDM驱动程序开发

摘 要: 采用内嵌PCI的DSP主芯片可以简化设备PCI接口的软硬件复杂度&#xff0c;缩短系统开发的周期&#xff0c;降低开发成本。本文以工程项目为背景&#xff0c;详细讨论了以TMS320C6205 为核心的内嵌PCI设备WDM驱动程序开发方法。该方法在实际中得到了很好的应用&#xff0c…