电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

Linux设备驱动之pci设备的枚举VIP免费

Linux设备驱动之pci设备的枚举_第1页
1/21
Linux设备驱动之pci设备的枚举_第2页
2/21
Linux设备驱动之pci设备的枚举_第3页
3/21
1 一:前言 Pci,是 Peripheral Component Interconnect 的缩写,翻译成中文即为外部设备互联.与传统的总线相比.它的传输速率较高.能为用户提供动态查询 pci deiv ce.和局部总线信息的方法,此外,它还能自动为总线提供仲裁.在近几年的发展过程中,被广泛应用于多种平台. pci 协议比较复杂,关于它的详细说明,请查阅有关 pci 规范的资料,本文不会重复这些部份. 对于驱动工程师来说,Pci 设备的枚举是 pci 设备驱动编写最复杂的操作。分析和理解这部份,是进行深入分析 pci 设备驱动架构的基础。 我们也顺便来研究一下,linu x 是怎么对这个庞然大物进行封装的。 二:pci 架构概貌 上图展现了pci 驱动架构中,pci_bu s、pci_dev 之间的关系。如上图所示,所有的根总线都链接在 pci_root_bu ses链表中。 Pci_bu s ->dev ice 链表链接着该总线下的所有设备。而 pci_bu s->children 链表链接着它的下层总线。对于 pci_dev 来说。pci_dev ->bu s 指向它所属的 pci_bu s。 Pci_dev ->bu s_list 链接在它所属 bu s 的 dev ice 链表上。此外,所有 pci 设备都链接在 pci_dev ice 链表中。 三:pci 设备的配置空间 每个pci 设备都有最多 256 个连续的配置空间。配置空间中包含了设备的厂商 ID,设备 ID,IRQ,设备存储区信息等.摘下 LDD3 中的一副说明图,如下: 2 要注意了,上图是以字节为单位的,而不是以位为单位. 那怎么去读取每个设备的配置空间呢?我们在开篇的时候提到过,pci 总线为用户提供了动态查询pci 设备信息的方法。在x86 上,保留了0xCF8~ 0xCFF 的8 个寄存器.实际上就是对应地址为0xCF8 的32 位寄存器和地址为0xCFC 的32 位寄存器。在0xCF8 寄存中写入要访问设备对应的总线号, 设备号、功能号和寄存器号组成的一个32 位数写入0xCF8.然后从 0xCFC 上就可以取出对应pci 设备的信息. 写入到0xCF8 寄存器的格式如下: 低八位(0~ 7): (寄存器地址)&0xFC.低二位为零 8~ 10:功能位. 有时候,一个pci 设备对应多个功能.将每个功能单元分离出来,对应一个独立的pci device 11~ 15 位:设备号 对应该 pci 总线上的设备序号 16~ 23 位:总线号 根总线的总线号为0.每遍历到下层总线,总线号+1 31:有效位 如果该位为1.则说明写入的数据有效,否则无效 例如:要读取n 总线号m 设备号f 功能号对应设备的vendor id 和Device id.过程如下: 要写入到0xCF8 ...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

Linux设备驱动之pci设备的枚举

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部