Linux驱动开发杂记(0x02) - pci_dev结构体_Vinx911的博客-程序员信息网_pci_dev

技术标签: 驱动  Linux驱动  linux  

每种类的PCI设备都可以用结构类型pci_dev来描述。更为准确地说,应该是每一个PCI功能,即PCI逻辑设备都唯一地对应有一个pci_dev设备描述符。该数据结构的部分定义如下(include/linux/pci.h):

struct pci_dev {
    
/* 总线设备链表元素bus_list:每一个pci_dev结构除了链接到全局设备链表中外,还会通过这个成员连接到
其所属PCI总线的设备链表中。每一条PCI总线都维护一条它自己的设备链表视图,以便描述所有连接在该
PCI总线上的设备,其表头由PCI总线的pci_bus结构中的 devices成员所描述t*/
struct list_head bus_list;
/* 总线指针bus:指向这个PCI设备所在的PCI总线的pci_bus结构。因此,对于桥设备而言,bus指针将指向
桥设备的主总线(primary bus),也即指向桥设备所在的PCI总线*/
struct pci_bus *bus;
/* 指针subordinate:指向这个PCI设备所桥接的下级总线。这个指针成员仅对桥设备才有意义,而对于一般
的非桥PCI设备而言,该指针成员总是为NULL*/
struct pci_bus *subordinate;
/* 无类型指针sysdata:指向一片特定于系统的扩展数据*/
void *sysdata;
/* 指针procent:指向该PCI设备在/proc文件系统中对应的目录项*/
struct proc_dir_entry *procent;
/* devfn:这个PCI设备的设备功能号,也成为PCI逻辑设备号(0-255)。其中bit[7:3]是物理设备号(取值
范围0-31),bit[2:0]是功能号(取值范围0-7)。 */
unsigned int devfn;
/* vendor:这是一个16无符号整数,表示PCI设备的厂商ID*/
unsigned short vendor;
/*device:这是一个16无符号整数,表示PCI设备的设备ID */
unsigned short device;
/* subsystem_vendor:这是一个16无符号整数,表示PCI设备的子系统厂商ID*/
unsigned short subsystem_vendor;
/* subsystem_device:这是一个16无符号整数,表示PCI设备的子系统设备ID。*/
unsigned short subsystem_device;
/* class:32位的无符号整数,表示该PCI设备的类别,其中,bit[7:0]为编程接口,bit[15:8]为子类
别代码,bit [23:16]为基类别代码,bit[31:24]无意义。显然,class成员的低3字节刚好对应与PCI配
置空间中的类代码*/
unsigned int class;
/* hdr_type:8位符号整数,表示PCI配置空间头部的类型。其中,bit[7]=1表示这是一个多功能设备,
bit[7]=0表示这是一个单功能设备。Bit[6:0]则表示PCI配置空间头部的布局类型,值00h表示这是一
个一般PCI设备的配置空间头部,值01h表示这是一个PCI-to-PCI桥的配置空间头部,值02h表示CardBus桥
的配置空间头部*/
u8 hdr_type;
/* rom_base_reg:8位无符号整数,表示PCI配置空间中的ROM基地址寄存器在PCI配置空间中的位置。
ROM基地址寄存器在不同类型的PCI配置空间头部的位置是不一样的,对于type 0的配置空间布局,ROM基
地址寄存器的起始位置是30h,而对于PCI-to-PCI桥所用的type 1配置空间布局,ROM基地址寄存器的起始
位置是38h*/
u8 rom_base_reg;
/* 指针driver:指向这个PCI设备所对应的驱动程序定义的pci_driver结构。每一个pci设备驱动程序都必须定
义它自己的pci_driver结构来描述它自己。*/
struct pci_driver *driver;
/*dma_mask:用于DMA的总线地址掩码,一般来说,这个成员的值是0xffffffff。数据类型dma_addr_t定义在
include/asm/types.h中,在x86平台上,dma_addr_t类型就是u32类型*/
u64 dma_mask;
/* 当前操作状态 */
pci_power_t  current_state;
/* 通用的设备接口*/
 struct device dev;
/* 无符号的整数irq:表示这个PCI设备通过哪根IRQ输入线产生中断,一般为0-15之间的某个值 */
unsigned int irq;
/*表示该设备可能用到的资源,包括:I/O断口区域、设备内存地址区域以及扩展ROM地址区域。*/
struct resource resource[DEVICE_COUNT_RESOURCE];
/* 配置空间的大小 */
int cfg_size;
/* 透明 PCI 桥 */
unsigned int transparent:1;
/* 多功能设备*/
unsigned int multifunction:1;
/* 设备是主设备*/
unsigned int is_busmaster:1;
/* 设备不使用msi*/
unsigned int no_msi:1;
/* 配置空间访问形式用块的形式 */
unsigned int block_ucfg_access:1;
/* 在挂起时保存配置空间*/
u32 saved_config_space[16];
/* sysfs ROM入口的属性描述*/
struct bin_attribute *rom_attr;
/* 能显示rom 属性*/
int rom_attr_enabled;
/* 资源的sysfs文件*/
struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE];

};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011471873/article/details/83863567

智能推荐

python stack_Python numpy.stack() 使用实例_weixin_39538451的博客-程序员信息网

The following are code examples for showing how to use . They are extracted from open source Python projects. You can vote up the examples you like or vote down the exmaples you don’t like. You can al...

CMake Could NOT find OpenJPEG未解决_fengyuzaitu_126_com的博客-程序员信息网

场景CMake 3.19.1编译OpenCV 4.4版本源码,提示出错Could NOT find OpenJPEG (minimal suitable version: 2.0, recommended version >= 2.3.1)

刷机_MrPeng1991的博客-程序员信息网

fastboot是比revovery更底层的刷机模式fastboot刷机必须解锁Bootloader,否则无法刷机,解锁方法,开发者模式 ’ OEM unlcok ’adb reboot bootloaderfastboot flashing unlock一般手机常用音量+进入fastbootmodefastboot rebootadb disable-verityadb rebo...

大数据项目实践(五)——Hue安装_weixin_34302561的博客-程序员信息网

一、下载hue安装包http://archive-primary.cloude...二、安装依赖包yum install gcc g++ libxml2-devel libxslt-devel cyrus-sasl-devel cyrus-sasl-gssapi mysql-devel python-devel python-set...

FPGA基于VerilogHDL的电子时钟----开发平台Quartus II_weixin_43165086的博客-程序员信息网_verilog电子时钟

FPGA基于VerilogHDL的电子时钟----开发平台Quartus II整体框架分频模块时钟计时模块时间设置模块防抖模块显示扫描模块秒表模块视频展示代码资源整体框架本次电子时钟功能:时钟计时功能,时间设置功能(设置的时间是时钟的功能),秒表计时功能三种功能。由于verilog的模块(module)概念,因此设计顺序是自顶而下,首先设计电子时钟的顶层文件,确定每个模块之间的联系。上图是电子时钟的原理图。 分频模块向秒表计时模块和时钟计时模块输入100Hz(0.01s)和1Hz(1s)的频率用来

随便推点

BZOJ 2467 解题报告_Icontofig的博客-程序员信息网

BZOJ 2467 解题报告 对于一个合格的程序员来说,掌握一定的数学知识是非常必要的,所以这次就开个数学专题玩玩。不多说啥,上题目,我们直接分析题目!首先ORZ stonepage神犇,一眼就看出我把快速幂写成快速乘了……话说%2007为啥不是2007年的题?还TMD是市选,MDZZ;算了不管他,我们说我们的:由于题目要求...

bsc智能合约流动池自动回滚 销毁,慈善回流,营销钱包税合约部署_元链科技的博客-程序员信息网

1,打开Remix - Ethereum IDE写好相应的代码选择版本进行优化编译,看代码是否报错2,快捷键找到名字相关信息进行编写3,选择环境,进行部署

2020-08-20Python入门问题之路径问题_蔚蓝呆鸟的博客-程序员信息网

Python入门问题在分水岭算法进行图像分割时候,出现error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'的错误,然后就问度娘,结果好多不同的答案,但是https://blog.csdn.net/kabcko/article/details

SaltStack常用模块_汉木木的博客-程序员信息网

1、SaltStack模块介绍Module是日常使用SaltStack接触最多的一个组件,其用于管理对象操作,这也是SaltStack通过Push的方式进行管理的入口,比如我们日常简单的执行命令、查看包安装情况、查看服务运行情况等工作都是通过SaltStack Module来实现的。当安装好Master和Minion包后,系统上会安装很多Module,大家可以通过以下命令查看...

第八届真题-第八题:包子凑数_敲代码的乔帮主的博客-程序员信息网

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。当然有时包子大叔无...

mmdetection3d 训练_Coding的叶子的博客-程序员信息网_mmdetection3d训练

mmdetection3d 训练 ​ 本节以SECOND算法为例,简要介绍mmdetection3d second算法训练过程,含数据和python源码详细介绍。1 mmdetection3d环境安装 mmdetection3d环境详细安装和调试请参考:【mmdetection3d】mmdetection3d安装详细步骤_Coding的叶子的博客-程序员信息网。2 KITTI数据集准备mmdetection3d的kitti原始数据集主要由三部份组成,......

推荐文章

热门文章

相关标签