怎么编写PCIe设备驱动程序

news2024/9/21 19:10:08

怎么编写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_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)

在这里插入图片描述
示例,下图表示支持这样的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.coloradmin.cn/o/343391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧税务+数据可视化:企业财务管理告别难题

一、引言在发展社会主义市场经济的过程中,税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收,其地位和作用越来越重要,可称之为国家经济的“晴雨表”,有效进行税务管理、充分挖掘税务大数…

秒杀项目之商品秒杀接口测压及优化

目录一、生成测试用户二、jmeter压测2.1 测试三、秒杀接口优化3.1 优化第一步:解决超卖3.2 优化第二步:Redis重复抢购3.3 优化第三步:Redis预减库存3.3.1 商品初始化3.3.2 预减库存一、生成测试用户 将UserUtils工具类导入到zmall-user模块中…

【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍

用于大型Transformer的8-bit矩阵乘法介绍原文地址:A Gentle Introduction to 8-bit Matrix Multiplication for transformers at scale using transformers, accelerate and bitsandbytes 相关博客 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…

产品经理必看的高效产品文档撰写指南

对于企业来说,如何推广自己的产品是一个非常重要的话题,而其中必要的就是创建企业产品宣传册,这对于产品宣传非常重要,尤其是一些大公司,非常重视这种产品展示方式。因为它可以更完整地展现产品,撰写一份合…

uart 子系统

串口硬件储备知识: uart 在Linux 应用层的体现及使用 uart 就是串口,它也是属于字符设备中的一种,众所周知 字符设备都会在/dev/ 目录下创建节点,串口所创建的节点名都是以tty* 为开头,例如下面这些节点&#xff1a…

GeekChallenge

2.GeekChallenge 1.web 1.朋友的学妹 url:http://49.234.224.119:7413/ 右键点击查看源码,找到flagU1lDe0YxQF80c19oNExwZnVsbGxsbGx9 然后base64解码得到SYC{F1_4s_h4Lpfullllll} 2.EZwww url:http://47.100.46.169:3901/ 根据网站提示…

备战蓝桥杯【高精度乘法和高精度除法】

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

一步一步动手实现CANoe例程

最近在学习CANoe,记录下学习路程,方便后续查看。参考《CANoe开发从入门到精通》和CANoe软件内附带的Easy例程,一步步去实现这个例程,稍加优化。 一、创建仿真工程 打开CANoe 16 SP4进入主界面,单击File→New可以看到…

2022年Q4业绩超预期,功能性饮料能成为百事下一增长极吗?

北京时间2月9日,美国食品饮料巨头百事公司发布2022财年年报,第四季度业绩再超预期。 据百事公司财报显示,其2022年Q4实现营收280亿美元,市场预期为268.8亿美元;核心每股收益为1.67美元,市场预期为1.64美元…

专业调度器JS版:BRYNTUM SCHEDULER PRO

BRYNTUM SCHEDULER PRO 5.2 专业的日程安排小部件,有大脑的专业调度UI组件。Scheduler Pro 可帮助您安排任务,同时将资源和任务的可用性考虑在内,POJIE VERSION 连接你的任务 让 Scheduler Pro 处理剩下的事情。它将根据您定义的链接安排您的任务并遵守任…

目标检测论文阅读:GraphFPN算法笔记

标题:GraphFPN: Graph Feature Pyramid Network for Object Detection 会议:ICCV2021 论文地址:https://ieeexplore.ieee.org/document/9710561/ Abstract 特征金字塔已经被证明在需要多尺度特征的图像理解任务中是强大的。SOTA的多尺度特征…

指派问题与匈牙利法讲解

指派问题概述:实际中,会遇到这样的问题,有n项不同的任务,需要n个人分别完成其中的1项,每个人完成任务的时间不一样。于是就有一个问题,如何分配任务使得花费时间最少。通俗来讲,就是n*n矩阵中&a…

Django框架之展示书籍列表案例

展示书籍列表 需求 实现步骤 1.创建视图2.创建模板3.配置URLconf 1.创建视图 查询数据库数据构造上下文 传递上下文到模板 # 定义视图:提供书籍列表信息 def bookList(request):# 查询数据库书籍列表数据books BookInfo.objects.all()# 构造上下文context {boo…

超详细的JAVA高级进阶基础知识04

目录 4. 面向对象高级 - 常用的API 4.1 Arrays 工具类 4.1.1 Arrays 类介绍 4.2 冒泡排序 4.3 选择排序 4.4 二分查找 4.5 正则表达式 4.5.1 String 类中与正则有关的常见方法 4.5.2 练习 4.5.3 今日学习目标 4. 面向对象高级 - 常用的API 4.1 Arrays 工具类 4.1.1…

Java面试——Spring Bean相关知识

目录 1.Bean的定义 2.Bean的生命周期 3.BeanFactory及Factory Bean 4.Bean的作用域 5.Bean的线程安全问题 1.Bean的定义 JavaBean是描述Java的软件组件模型。在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生…

Day887.MySQL写入binlog和redolog的流程机制 -MySQL实战

MySQL写入binlog和redolog的流程机制 Hi,我是阿昌,今天学习记录的是关于MySQL写入binlog和redolog的流程机制的内容。 只要 redo log 和 binlog 保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢复。 那redo log 的写入…

《第一行代码》 第四章:碎片的最佳实践

一&#xff0c;碎片的简单用法 在一个活动中添加两个碎片&#xff0c;并且让这两个碎片平分活动空间。 第一步&#xff1a;首先在layout中创建 left_fragment.xml&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"androi…

【LoRaWAN 时钟同步】

本文主要介绍了 LoRaWAN 自组网协议、设备工作模式、设备间的时间同步问题 LoRaWAN 时钟同步1. 前言2. 设备数据收发2.1 数据帧格式2.2 数据发送2.3 数据接收3. A类设备4. C类设备5. B类设备5.1 GPS5.3 网关时间同步5.4 节点时间同步5.4.1 首次时间同步5.4.2 节点接收Beacon5.5…

生成系列论文:文本控制的3d点云生成 TextCraft(一):论文概览

TextCraft: Zero-Shot Generation of High-Fidelity and Diverse Shapes from Text 论文原文&#xff1a; https://arxiv.org/abs/2211.01427 论文的研究动机 DALL2已经在文本控制的图像生成上取得很好的效果&#xff0c;但是基于文本控制的3d点云生成的研究还不太成熟&#…

软件架构知识2-系统复杂度

架构设计的真正目的&#xff1a;是为了解决软件系统复杂度带来的问题&#xff0c;一个解决方案。 系统复杂度&#xff0c;如何入手&#xff1a; 1、通过熟悉和理解需求&#xff0c;识别系统复杂性所在的地方&#xff0c;然后针对这些复杂点进行架构设计。 2、架构设计并不是要…