怎么编写PCIe设备驱动程序
怎么编写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设备驱动程序相关推荐
- 嵌入式Linux设备驱动程序:编写内核设备驱动程序
嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...
- linux如何切换到设备,如何编写Linux设备驱动程序(转)
序言 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环 境下的驱动程序有很大的区别.在Linux环境下设计驱动程序 ...
- Linux驱动程序教程:如何编写简单的Linux设备驱动程序
翻译来自: https://www.apriorit.com/dev-blog/195-simple-driver-for-linux-os 代码下载 此Linux设备驱动程序教程将为您提供有关如何为 ...
- 字符设备驱动程序——点亮、熄灭LED操作
2019独角兽企业重金招聘Python工程师标准>>> 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设 ...
- Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- IO子系统(一) — 块设备驱动程序
VFS层(虚拟文件系统层): 由于内核需要跟不同的文件系统打交道,而每一个文件系统所实现的方式和数据结构也不尽相同,所以内核抽象了这一层,专门用来适配各种文件系统,对上提供统一的操作接口,对下层的诸多 ...
- linux系统reales,基于uCLinux系统的IEEE1394设备驱动程序的编程研究与实现
本文分析了IEEE1394协议驱动层框架,介绍了uCLinux下IEEE1394设备驱动程序架构和编写IEEE1394视频设备驱动程序的步骤和方法.(1)IEEE1394网络架构IEEE1394的网络 ...
- Linux 设备驱动程序(二)
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...
- 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计
嵌入式Linux下USB驱动程序的设计 usb概念: USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...
最新文章
- 目标检测分割--Mask R-CNN
- WF4.0进行单元测试
- 成为阿里 P7 真的难么?
- java读取项目资源文件的方法
- 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
- 组策略中Run logon scripts synchronously和Run startup scripts asynchronously的区别
- 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
- 读取本地图片存入数据库
- 组策略设置IE 11的Compatible View
- 1.5万转12Gbps 东芝发布全新企业硬盘AL14SX
- iOS 五种传值方式
- 表单多条相同name数据的获取
- 【搞定GTD】用iPhone打造GTD实践1年后的心得体会
- HTML5+CSS3基础
- Python实现简易TCP服务器
- 3D模型贴图算法归纳讨论,以及OpenGL渲染器中的数据格式——篇1:模型展开算法与UV贴图
- 六轴机器人直角坐标系建立_工业机器人六种坐标系详解(图)
- 流?I/O操作?阻塞?epoll?
- 海康、大华IP摄像机RTSP地址及格式详解
- “应用程序无法启动,因为应用程序的并行配置不正确”问题的解决
热门文章
- tvOS游戏开发系列(SpriteKit)之新建tvOS游戏项目(二)
- 4种改善类别不平衡的方法
- Spring+Hibernate配置文件-applicationContext.xml设置
- python 模拟微信浏览器请求_python爬虫:使用Selenium模拟浏览器行为
- java中的setting文件
- 芯片市场低迷 SK海力士Q1利润大跌69%
- win10此电脑桌面显示(桌面显示)
- Android应用程序icon规范
- 4511或74LS48来实现BCD转7段数码管及逻辑状态输入演示
- 使用iTEXT生成PDF