Pci设备驱动1:pci设备驱动实例(realtek8168)

2023-10-31

分类: LINUX

Realtek8168网卡时pci接口的网卡,其驱动程序就是一个PCI设备的驱动程序实例,我们一起看看其流程。

1.  首先,初始化模块调用static inline int pci_register_driver(struct pci_driver *driver)函数来注册设备驱动,这个函数的参数是struct pci_driver *driver,对应于r8168,就是

static struct pci_driver rtl8168_pci_driver = {

       .name             = MODULENAME,

       .id_table  = rtl8168_pci_tbl,

       .probe            = rtl8168_init_one,

       .remove          = __devexit_p(rtl8168_remove_one),

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)

       .shutdown       = rtl8168_shutdown,

#endif

#ifdef CONFIG_PM

       .suspend  = rtl8168_suspend,

       .resume          = rtl8168_resume,

#endif

};

这个结构体把这个设备驱动所支持的设备 (rtl8168_pci_tbl),探测函数(rtl8168_init_one)等都定义好,后面我们将需要用到 rtl8168_pci_tbl,rtl8168_init_one两部分内容来匹配,是否系统中的设备,看是否有设备可以跟这个驱动匹配

2.  pci_register_driver 函数调用__pci_register_driver来完成任务,而__pci_register_driver则重新封装了要注册的驱动为PCI总线的,即

int __pci_register_driver(struct pci_driver *drv, struct module *owner)

{

       ……

       drv->driver.bus = &pci_bus_type;

    ……

       drv->driver.kobj.ktype = &pci_driver_kobj_type;

    ……

}

接下来就是调用设备驱动模型的函数,把我们要注册的驱动挂载到PCI总线的设备队列上,并扫描PCI总线的设备队列,查看是否有设备可以匹配这个驱动,这跟usb设备驱动的挂载是一致的,只是这里挂载的是PCI总线,usb挂载的是USB总线,大致的流程是

driver_register()---àbus_add_driver()----àdriver_attach()--à__driver_attach()--àdriver_probe_device()---àdev->bus->probe(), 即最后还是调用了2.中的pci_bus_type结构体中的probe成员函数,即static int pci_device_probe(struct device * dev)

3.  static int pci_device_probe(struct device * dev)函数的参数dev就是遍历了PCI总线上的设备链表,一一进行匹配来完成的,因为我们调用__driver_attach()的方式是 bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);

4.  static int pci_device_probe(struct device * dev)通过两个宏转换to_pci_driver,to_pci_dev,获得需要匹配的设备和驱动,调用static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)函数进行匹配

5.  __pci_device_probe函数首先通过设备驱动中的rtl8168_pci_tbl表,跟从设备获得vendorID,productID进 行比较,看是否一致,如果一致,就返回这个表的地址;如果没有一致的,就表明,这个设备跟这个驱动不匹配,就不需要继续进行下面的操作了,直接退出

6.  如果第5步发现了一致的设备表,就表明有设备ID一致,需要进一步探测,接下来就要调用我们设备驱动程序中的探测函数,进行更具体的探测了,即 pci_call_probe(drv, pci_dev, id)---à drv->probe(dev, id),到这里,就开始调用我们的设备驱动中的探测函数了。

7.  static int __devinit rtl8168_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)函数是r8168的探测函数,其调用rtl8168_init_board(pdev, &dev, &ioaddr)来完成跟PCI设备驱动相关的探测。

8.  static int __devinit rtl8168_init_board(struct pci_dev *pdev, struct net_device **dev_out, void __iomem **ioaddr_out)函数调用pci_enable_device函数来使能PCI设备,只有使能成功的PCI设备,才能正常使用。

9.  调用pci_set_mwi函数判断设备是否支持memory-write-invalidate 功能

10.              调用pci_find_capability函数来判断设备是否有电源管理功能.

11.              调用pci_resource_flags函数来判断PCI是内存映射模式,还是IO模式

12.              调用pci_resource_len函数来判断内存空间是否小于设备所需要的内存空间,如果小于,明显出错

13.              调用pci_request_regions函数通知内核,当前PCI将使用这些内存地址,其他设备不能再使用了

14.              调用pci_set_master(pdev)函数,设置设备具有获得总线的能力,即调用这个函数,使设备具备申请使用PCI总线的能力。

15.              调用ioremap函数把刚刚申请的物理内存,映射成虚拟内存,因为进程使用的都是虚拟内存地址,而不是物理内存地址。

16.              把ioremap映射的虚拟内存返回给调用函数。

17.              到此,跟PCI相关的初始化都完成了,设备即可正常工作了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pci设备驱动1:pci设备驱动实例(realtek8168) 的相关文章

  • 如何阻止 Linux 初始化 USB HID 设备

    我有一个 USB HID 设备 可以在两种不同的模式下工作 模式的选择基于发送给它的 USB 枚举 初始化数据包的顺序 我使用的是运行 Raspbian 的 Raspberry Pi 3 但是如果我为桌面 Ubuntu 发行版编译代码 我也
  • 使用“设备过滤器”解决方案时如何处理 Android 上的 USB 权限对话框事件?

    当我将 已知 USB 设备连接到 Android 手机时出现的自动权限对话框中 用户按下 确定 或 取消 时 我试图处理该事件 我正在使用 android usb host 库 可以在 Android 手机和设备之间发送和接收 此外 我使用
  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 使用 DeviceWatcher 监视 USB 驱动器并检索设备信息?

    I m a WinForms开发人员和我已经知道如何使用 WMI 监视连接或断开连接的 USB 但不久前我发现了设备观察者 http msdn microsoft com en us library windows devices enum
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 发现多个 USB-IrDA 设备,打开并连接每个设备的套接字

    对于任何优秀的套接字程序员 是否可以使用套接字枚举通过 USB 端口连接到 PC 的多个活动 IrDA 设备 如果是这样 怎么办 这确实是我的主要问题 帖子的其余部分完善了细节并描述了我所尝试的内容 我正在使用 Microsoft SDK
  • Android 到 PC USB 读/写

    我在 PC 上有一个程序 从 USB 接收字符串输入 旧程序 我有一个 Android 4 X 平板电脑 需要向在 PC 上运行的程序提供 USB 上的字符串输入 当我在 Android 上使用示例代码时 以下代码给出了空的哈希图 PC 在
  • 无法使用 Android Studio、Windows 7 连接到 Samsung Galaxy Tab S

    我有一台漂亮的新三星 Galaxy Tab S 我正在尝试将其与 Android Studio 连接 我已在平板电脑上启用 USB 调试 并通过执行 SAMSUNG USB Driver for Mobile Phones v1 5 45
  • 不支持混合类型

    请看一下下面的头文件 pragma once using namespace UsbLibrary ref class MissileLauncher public MissileLauncher void private Bytes us
  • libv4l2:打开流时出错:设备上没有剩余空间

    我尝试为 opencv 获取立体声对 我将 Logitech B910 和 Logitech C910 网络摄像头连接到 USB 但有这个错误 我玩弄了怪癖参数并设置outfmt mjpeg在mplayer中 但又出现此错误 在哪里可以找到
  • OSX:如何从 IOUSBDeviceInterface 或位置 id 获取卷名称(或 bsd 名称)

    我正在尝试编写一个应用程序 将特定的 USB 字符串描述符 USB 大容量存储设备 与其卷或 bsd 名称相关联 因此 代码会遍历所有连接的 USB 设备 获取字符串描述符并从其中之一提取信息 我想获取这些 USB 设备的卷名 我找不到合适
  • Silverlight 能否访问可访问 USB 端口的 .Net 库?

    我们有一个 Net 库 可以通过 USB 端口访问一些自定义硬件 我读到 Silverlight 包含 Net 运行时的子集 所以 我的问题是 这个子集足以让 Net 库运行吗 不可以 您不能使用从 Silverlight 内部访问 USB
  • Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

    使用 pyinstaller 3 1 python 2 7 9 和 tkinter 尝试使用 pyusb 而不是 pyserial 但没有可用的后端 调查Windows 上的 Pyusb 没有可用的后端 https stackoverflo
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • 如何在 C# 中从 USB 令牌读取证书

    我有一个 USB 令牌 其中包含一个加密证书 该证书具有公钥和私钥 现在我想用 C 创建一个应用程序 通过它我可以找到可访问的证书信息 当我插入 USB 令牌时 它会被检测到 但计算机部分上没有显示任何驱动器 就像闪存驱动器一样 如何从 U
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar

随机推荐

  • 用邻接表存储无向图的深度优先遍历

    实现代码 include
  • 记Nani_xiao的CSDN成长历程

    从小白 一步一步走来 记下我的成长脚步 虽然现在还是一菜鸟 但是我在努力 在前进的路上永不止步 记下这些 希望五年后的自己 真的成为了自己所期望的样子 从第一篇博客 到原创97篇 虽然很多技术含量并不大 但都是平时学习中和学习后的心血 记录
  • SpringBoot webSocket 资源无法加载、tomcat启动报错解决方法

    问题描述 1 项目集成WebSocket 且打包发布tomcat时出现websocket is already in CLOSING or CLOSE state这样的问题 建议参考 解决方法二 但是 解决方法一 请要了解查看 因为解决方法
  • MCU集成-系统架构(不断更新)

    应用场景 mcu主要应用于手环 无人机等等场景 成本与工艺 一个晶圆7英寸 参考价格一个28nm工艺的晶圆大概400w USD 约等于7万平方毫米 mm2 一个mcu可能1mm2 但是die是长方形 晶圆是圆形 所以会有损耗 die和die
  • JMeter安装教程

    JMeter JMeter安装步骤 1 JMeter简介 2 下载 3 配置环境 4 启动JMeter JMeter安装步骤 1 JMeter简介 安装JMeter之前必须安装jdk8或以上版本 jdk安装教程 http t csdn cn
  • C++11新特性

    文章目录 一 auto 用法 注意点 二 decltype 用法 三 变量初始化 四 增强for循环 五 静态断言 六 noexcept 七 nullptr 八 强类型枚举 九 常量表达式 十 自定义字面量 十一 原生字符串字面值 十二 继
  • 多线程(一) -- 多线程的初识

    目录 多线程 线程的引入 进程和线程的关系 多线程可能存在的问题 多线程程序的创建 Thread创建第一个多线程程序 线程的抢占式执行 查看java进程中的所有线程 用Thread的其他方法创建多线程 实现Runnable接口 使用匿名内部
  • WebRTC音视频通话-WebRTC本地直播高分辨率不显示画面问题

    iOS开发 WebRTC本地直播高分辨率不显示画面问题 在之前使用WebRTC结合ossrs进行推流时候 ossrs的播放端无法看到高分辨率画面问题 根据这个问题 找到了解决方案 一 WebRTC是什么 WebRTC是什么呢 WebRTC
  • SSD的删除方式

    SSD的删除方式 erase trim discard sanitize
  • Chrome浏览器小号多开

    Chrome浏览器在上网的过程中 会保存一些用户数据 如缓存 cookie 收藏的网页等信息 这些信息的保存位置是可以设置的 方法也很简单 桌面上复制一个Chrome的快捷方式 编辑属性 添加 user data dir参数即可 比如 复制
  • Keil5中添加TKSCOPE下载器

    21年已经进入最后一个月了 这一年也挺魔幻的 发生挺多事情的 自己也在慢慢地走向正轨 Keil5中添加TKSCOPE下载器 添加教程 这篇博客总结的很全 我主要说一下我遇到的问题 首先就是那篇博客说要 禁止签名驱动 之后我就直接跟着博客来了
  • CImg库介绍

    转自 http www cppprog com 2009 0424 106 html CImg是一个跨平台的C 的图像处理库 提供了加载 处理 显示 保存等一系列功能 其中的图像处理功能尤其强大 首先 建议先到这里欣赏一下使用CImg代码做
  • get方法和post方法的区别和联系

    1 功能不同 post是向服务器发送数据 get是向服务器获取数据 2 过程不同 get在浏览器回退时是无害的 但是post会再次提交请求 get请求会被浏览器主动缓存 但是post不会 除非手动设置 get请求只能进行URL编码 但是po
  • [C#] 使用Spire.XLS 将excel转DataTable

  • 企业微信 40001 invalid credential问题解决

    获取access token报错 errcode 40001 errmsg invalid credential hint XXXXX from ip XXX XXX XXX XXX more info at https open work
  • 《JAVA 基础: 第一个JAVA应用程序》

    一 Java语言运行机制及运行过程 1 再次强调JAVA语言的特点 特点一 面向对象 两个基本概念 类 对象 三大特性 封装 继承 多态 特点二 健壮性 吸收了C C 语言的优点 但去掉了其影响程序健壮性的部分 如指针 内存的申请与释放等
  • 运用成员函数模板接受所有兼容类型——条款45

    所谓智能指针是 行为像指针 的对象 并提供指针没有的机能 例如条款13曾经提及std auto ptr和tr1 shared ptr如何能够被用来在正确时机自动删除heap based资源 STL容器的迭代器几乎总是智能指针 无疑地你不会奢
  • 卷积神经网络的复杂度分析

    在进行CNN的设计中 我们不仅要考虑模型的准确率 还需要考虑模型的实用性 现阶段大量的paper纯堆精度 缺没有深入思考模型以及算法的实用性 最近有一点感触很深 很多我们在做研究时认为默认的东西 在进行实际应用项目中 才发现这些先验数据是无
  • NVIDIA 安装 CUDA

    名词解释 CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一 准备工作 如图我这个显卡需要安装 CUDA 11 7
  • Pci设备驱动1:pci设备驱动实例(realtek8168)

    Pci设备驱动1 pci设备驱动实例 realtek8168 2012 05 25 11 30 32 分类 LINUX Realtek8168网卡时pci接口的网卡 其驱动程序就是一个PCI设备的驱动程序实例 我们一起看看其流程 1 首先