设为首页 加入收藏

TOP

C语言-遍历pci设备
2015-07-26 13:14:25 来源: 作者: 【 】 浏览:39
Tags:语言 遍历 pci 设备

目录


最近楼主比较苦逼啊,主管布置了一道访问pci的作业,这个作业使用io方式还可以非常浪地将所有的东西都给读取出来,虽然不能读取出pci-e设备的所有信息,但是还是可以将256位的其他东西给读出来的。


本文将先从io访问模式进行对pci访问的设置,在这里我所使用的包含了dos和Linux,这样可以看到这2个的系统代码的不同。


PCI总线是一种高性能32位或者64位的多路复用地址或者数据行的总线。相当于现实生活中的公路,是所谓的信号通道。可以在这上面传输数据、控制信号等等。


作用:高度集成外围控制其、外围插件和处理器/内存系统之间的互连机制。


如果要访问PCI 设备,首先要确定PCI设备在系统中的物理连接情况。描述这个连接情况的数据是“总线号”、“设备号”和“功能号”。一个系统可以有256个PCI总线,每个总线上可以有32个设备,每个设备可以具有8个功能(每个功能作为一个PCI设备)。当这三个数据确定的时候,就可以在系统中唯一确定一个PCI 设备。


8~10:功能位. 有时候,一个pci设备对应多个功能.将每个功能单元分离出来,对应一个独立的pci device
11~15位:设备号 对应该pci总线上的设备序号
16~23位:总线号 根总线的总线号为0.每遍历到下层总线,总线号+1



PCI配置空间是一块容量为256字节并具有特定记录结构或模型的地址空间,通过配置空间,我们可以了解该PCI设备的一些配置情况,进而控制该设备,除主总线桥以外的所有PCI设备都必须事先配置空间.


配置空间的前64个字节叫头标区,头标区又分成两个部分,第一部分为前16个字节,在各种类型的设备中定义都是一样的,其他字节随各设备支持的功能不同而有所不同,位于偏移0EH的投标类型字段规定了是何种布局,目前有三种头标类型,头标类型1用于PCI-PCI桥,头标类型2用于PCI-CARDBUS桥,头标类型0用于其他PCI设备,下图为头标类型0的头标区布局。

头标区中有5个字段涉及设备的识别。


偏移:00H。该字段用以标明设备的制造者。一个有效的供应商标识由PCI SIG来分配,以保证它的唯一性。0FFFFH是该字段的无效值。


偏移:02H。用以标明特定的设备,具体代码由供应商来分配。


偏移:08H。用来指定一个设备特有的版本识别代码,其值由供应商提供,可以是0。


偏移:0EH。该字段有两个作用,一是用来表示配置空间头标区第二部分的布局类型;二是用以指定设备是否包含多功能。位7用来标识一个多功能设备,位7为0表明是单功能设备,位7为1表明是多功能设备。位0-位6表明头标区类型。


偏移:09H。标识设备的总体功能和特定的寄存器级编程接口。该字节分三部分,每部分占一个字节,第一部分是基本分类代码,位于偏移0BH,第二部分叫子分类代码,位于偏移0AH处,第三部分用于标识一个特定的寄存器级编程接口。


在dos下申请相关的接口就可以得到io口,通过cf8和cfc的模式进行读取遍历pci设备。


在Linux系统下就很简单了,直接看代码吧!


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在白板上写代码是有难度的 下一篇Android程序员不可错过的十款实用..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: