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_ ...
随机推荐
- docker push dial tcp *.*.*.*:443 getsockopt: connection refused
docker 在提交镜像的时候出现以下错误. 我用的是本地的仓库,所以tcp后面是我的ip地址. 错误信息: #docker push ubuntu docker push dial tcp 192 ...
- IIS 设置 FTP 服务器 添加多个账户
我们有很多童鞋经常开不动IIS自带的FTP如何创建,就算创建了也不会实现多用户,下面我来分享一下我的经验吧: 使用 IIS 设置 FTP 服务器 依次单击“开始”按钮.“控制面板”和“添加或删除程序” ...
- poj 2236【并查集】
poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical t ...
- hdu2044 dp
/* 每一种情况都可以由周围2个点得出 */ #include<stdio.h> int main() { __int64 dp[]; int i,t,l,r; dp[]=; dp[]=; ...
- python HTTP请求过程
- 亲测的orabbix监控Oracle过程
网上教程很多,但普遍较老,担心新版本的变化,于是亲自测试了一下,记录过程如下: 一.环境 Centos7.3 192.168.56.104 Oracle安装在windows下,192.168.56.1 ...
- python 数据的读取
- HDU-2859_Phalanx
Phalanx Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- Python基础:13装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的应用有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同 ...
- 一个项目看java TCP/IP Socket编程
前一段时间刚做了个java程序和网络上多台机器的c程序通讯的项目,遵循的是TCP/IP协议,用到了java的Socket编程.网络通讯是java的强项,用TCP/IP协议可以方便的和网络上的其他程序互 ...