linux 老式 PCI 探测
在老的内核版本中, 函数 pci_register_driver, 不是一直被 PCI 驱动使用. 相反, 它 们要么手工浏览系统中的 PCI 设备列表, 要么它们将调用一个能够搜索一个特定 PCI 设 备的函数. 驱动的浏览系统中 PCI 设备列表的能力已被从 2.6 内核中去除, 为了阻止驱 动破坏内核, 如果它们偶尔修改 PCI 设备列表当一个设备同时被去除时.
如果发现一个特定 PCI 设备的能力真正被需要, 下列的函数可用:
struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from);
这个函数扫描当前系统中 PCI 设备的列表, 并且如果输入参数匹配指定的供应商 和设备 ID, 它递增在 struct pci_dev 变量 found 中的引用计数, 并且返回它给 调用者. 这阻止了这个结构没有任何通知地消失, 并且确保内核不会 oops. 在驱 动用完由这个函数返回的 struct pci_dev, 它必须调用函数 pci_dev_put 来正确 地递减回使用计数, 以允许内核清理设备如果它被去除.参数 from 用同一个签名 来得到多个设备; 这个参数应答指向已被找到的最后一个设备, 以便搜索能够继续, 而不必从列表头开始. 为找到第一个设备, from 被指定为 NULL. 如果没有找到 (进一步)设备, 返回 NULL.
一个如何正确使用这个函数的例子是:
struct pci_dev *dev;
dev = pci_get_device(PCI_VENDOR_FOO, PCI_DEVICE_FOO, NULL); if (dev)
{
/* Use the PCI device */
...
\
pci_dev_put(dev);
}
这个函数不能从中断上下文中被调用. 如果这样做了, 一个警告被打印到系统日志.
struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from);
这个函数就象 pci_get_device 一样, 但是它允许当寻找设备时指定子系统供应商 和子系统设备 ID. 这个函数不能从中断上下文调用. 如果是, 一个警告被打印到 系统日志.
struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
这个函数查找系统中的 PCI 设备的列表, 在指定的 struct pci_bus 上, 一个指 定的 PCI 设备的设备和功能号. 如果找到一个匹配的设备, 它的引用计数被递增 并且返回指向它的一个指针. 当调用者完成存取 struct pci_dev, 它必须调用 pci_dev_put.
所有指向函数都不能从中断上下文调用. 如果是, 一个警告被打印到系统日志中.
linux 老式 PCI 探测的更多相关文章
- 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...
- Linux mips64r2 PCI中断路由机制分析
Linux mips64r2 PCI中断路由机制分析 本文主要分析mips64r2 PCI设备中断路由原理和irq号分配实现方法,并尝试回答如下问题: PCI设备驱动中断注册(request_irq) ...
- Linux显示PCI设备
Linux显示PCI设备 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ lspci -tv -[0000:00]-+-00.0 Advanced Micro ...
- LINUX内核PCI扫描过程
LINUX内核PCI扫描过程 内核版本 3.10.103 1. ACPI热插拔扫描subsys_initcall(acpi_init)@drivers/acpi/bus.c |-acpi_scan_i ...
- Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)
三.PCI驱动程序实现 1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给 ...
- Linux的PCI驱动分析
1. 关键数据结构 PCI设备上有三种地址空间:PCI的I/O空间.PCI的存储空间和PCI的配置空间.CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置 ...
- Linux 内核PCI去除一个设备
一个 PCI 可用多个不同的方法被从系统中去除. 所有的 card-bus 设备在一个不同的物 理因素上是真正的 PCI 设备, 并且内核 PCI 核心不区分它们. 允许在机器运行时加减 PCI 设备 ...
- Linux 内核PCI 中断
对于中断, PCI 是容易处理的. 在 Linux 启动时, 计算机的固件已经分配一个唯一的中 断号给设备, 并且驱动只需要使用它. 中断号被存储于配置寄存器 60 (PCI_INTERRUPT_LI ...
- linux的pci驱动模型
做个笔记 linux通过pcibios_scan_root函数以深度优先的算法搜索整个pci架构,建立一个树形的链表,如下: 之后再调用pci_bus_add_devices函数把所有搜索到的pci_ ...
随机推荐
- 开启远程XUL
参考:https://developer.mozilla.org/zh-cn/Remote_XUL firefox自4.0起(2011年4月版本,目前最新版为13.0),开始禁用远程XUL,这阻碍了初 ...
- 在Debug模式下,如何给.lib和.dll添加一个d标记(*d.lib,*d.dll)
选中工程->右键->属性->配置属性->常规,可以看到项目默认值的配置类型有好几种类型,选择静态库类型生成lib文件,选择动态库类型生成dll文件,选择应用程序生成exe文件, ...
- 在laravel框架中使用ajax请求报错419
laravel框架中报419 419 unknown status 这个时候你需要将这个接口放到api路由上,这样可以跳过CSRF的检查
- Kubernetes1.4新特性前瞻:设置JOB执行计划
(一) 核心概念 Kubernetes在新版中会新增了一个设置JOB执行计划的功能,在1.3中已经可以初见端倪了,从进度上来看会在1.4版本中进行发布,下面我们先睹为快. Kubernetes通过这 ...
- javascript —— 禁止通过 Enter 键提交表单
$('btn').on('keydown', function () { return false; })
- 2018-2-13-WPF-只允许打开一个实例
title author date CreateTime categories WPF 只允许打开一个实例 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...
- hdu 3329 The Flood (Flood Fill + MFSet)
Problem - 3329 用pfs,将淹没时间调整回来,然后用并查集,时间倒序插入点. 代码如下: #include <iostream> #include <algorithm ...
- TAE words
love handle pang carbohydrate podiatry splay out Cinderella liposuction mingle fly t ...
- LRJ-Example-06-17-Uva10562
main() 函数中的这两行 fgets(buf[0], maxn, stdin); sscanf(buf[0], "%d", &T); 不能简单替换为 scanf(&qu ...
- 你看Http的 三次握手
你看Http的 三次握手 按层次分,TCP位于传输层,而且TCP协议能够确认数据是否送达到对方,所以在客户端请求资源的时候,你得让俺知道咱俩关系是不是已经确定了啊,对不.这跟谈恋爱一样一样的,得先确定 ...