阅读:6119回复:12
如何使用驱动给pci设备分配资源?
最好请各位高手给出wdm的例程(是不是只有nt驱动才能实现呢?)。
重新分配以后的资源一定可以使用么? 比如说,eeprom中设定了设备的io空间是3000到3fff 而我在驱动程序中重新加了4000到4fff的io空间给它 那么系统或者pci bus如何知道呢?通过读取配置空间寄存器? 因为,我看书,说wdm驱动程序通过读取注册表,直到设备所需要申请的资源,然后进行动态分配,而我的pci卡,没有外加的eeprom,所以在dos下面没有被分配任何资源(我只需要io空间就可以了)。 现在需要在驱动程序里面重新分配资源,使设备能够进行io操作。 希望各位高手指教。 |
|
|
沙发#
发布于:2002-04-16 14:03
wdm由系统自动分配
|
|
|
板凳#
发布于:2002-04-16 14:50
这个我知道,只是他分配的时候需要依据什么呢?我认为应当是配置空间中的内容,而我现在需要更改配置空间确定分配的资源。应该怎么办呢?
|
|
|
地板#
发布于:2002-04-17 01:28
只是要个资源的话,inf里的硬件资源部分声明一下就行了,你的驱动还能按一般wdm的写。不过你的硬件部分也要跟着调整啊,干要一段地址,里边没有映射任何硬件寄存器也没用的。
|
|
地下室#
发布于:2002-04-17 15:16
在没有驱动程序的情况下,real dos下面,如果我硬更改了bar寄存器中的值,那么算不算给我的pci卡分配了资源呢?
比如说分了一段3000 to 31ff的io给它,那么我重汇编程序中用out 3000,0ffh 那么这块pci的地址线上是不是会有信号? (虽然pci的地址线和数据线是复用的,先这么认为有地址线吧) 那么我如果是这样用的话,就不需要什么硬件的寄存器了吧? 因为只是一个桥,将pci interface这边的地址译码,所以我只需要关系pci interface这边会不有信号出现 |
|
|
5楼#
发布于:2002-04-18 03:38
out in指令有意义就意味着你的地址译码没问题,isa一般是个简单的译码,pci我记得都在firmware里改,只不过主机程序要访问这个地址还得先找到bar的地址而已。我说的要映射几个寄存器是这个意思,你的硬件需要对地址线上产生的这个地址有反应,当出现相应的地址时,可以把数据线的数据读入,至于这个数据放在哪里,和怎么用,都是pci这边的事,和主机的驱动没关系。你现在的疑问都应该能从pci的datasheet里找到。
|
|
6楼#
发布于:2002-04-19 02:05
PCI的BAR配置过程:
HOST向BAR寄存器送全1的数据即FFFFFFFF,在从此BAR读数据, 如果读到的数据是非全1的数据,HOST认为此PCI卡实现了此BAR 寄存器,并根据BAR的LSB来判断起实现的是IO还是MEMORY。 HOST根据读回的数据计算机出此BAR实现的空间大小,然后分配 一块符合此大小的空间给此卡,即将卡的起始地址写入该BAR。 计算机上电后,POST就是这样做的,如果你要重新对起进行分配, 在地层硬件来看,都是这样的。一般来说,你是没办法分配一个固定 地址给PCI卡的,其实这无所谓,如果你在驱动里面要把地址读出来 可以调用函数读的。 |
|
|
7楼#
发布于:2002-04-19 10:04
可惜的是,我现在的卡上的bar里面什么信息也没有(全0)。所以非常郁闷。所以我需要在启动超做系统之后重新给他分配资源。
后来回去仔细想想好象这样:(这是我发在水母上的文章,但是回答的人都没有什么实质性的东西) 我仔细地读了一下关于 pci bios的1ah中断的文档和pci总线规范里面关于pci配置空间的东西。并且自己 用汇编写了一个小程序,能够读取pci卡配置空间的基本信息,并且能够按照要求 对一些配置寄存器(不知道应不应该如此称呼它们)进行写操作。在对配置空间( 256字节)中前64字节以后的寄存器进行写操作的时候,能够顺利进行;但是对前 64字节进行写操作的时候,能写(因为相应中断的返回值正确),但是当我再对他 们进行读操作的时候,这些被写过的寄存器又重新回到了全0的状态。这样的方法 ,在v86模式和real dos模式都试过,结果一致。 现在我搞不明白的就是,pci bus或者是操作系统如何知道一段io地址是分配 给了谁?按照常理,应该是启动系统的时候,总线枚举器对所有的pci卡的配置空 间所申请的空间都备案,(如果不是这样的,那么怎么通过操作系统底层的驱动程 序来对这些空间进行更改呢?所以说,操作系统对pci卡的配置空间有一定的管理 机制,但是我不清楚。)等到需要用的时候,就知道了。但是,仔细想想,好像不 对哦。因为,几乎所有的pci总线接口的相应管脚(除了极个别的)都一一对应, 并且连在一起的(起码地址、数据复用信号线是连在一起的)。那么,当操作系统 对某个端口进行读写操作的时候,所有的地址线都应该是有同样的信号,那么判断 这个io端口是否属于自己(pci卡),是不是就应该由pci卡自己来决定咯。pci卡 是通过什么来决定的呢?配置空间,还是其他的(比如经过地址译码电路,然后片 选)途径? |
|
|
8楼#
发布于:2002-04-19 10:44
PCI卡先在BAR里申明要一段地址空间(通过基地址和长度),上电的时候由BIOS负责资源分配,真正卡能拿到的不一定就是它想要的,但只要分配了,就有一段地址是对应它的。这也会在BAR里面表现出来(BIOS写进去就行了)。以后对这段地址操作的时候,卡就会知道这段地址是它的。而操作系统或软件只要从BIOS拿到这些信息就可以对卡进行操作了。对PCI设备而言,地址数据线固然是连在一起的,但配置用的控制线是分开的,否则就会在配置的时候搞不清是给谁的数据了。
|
|
|
9楼#
发布于:2002-04-19 10:49
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2002-04-19 13:22
哦,原来。
阿们…… 但是,现在我的问题时,我们的板子上根本没有eeprom,而且桥接器片子本来应该会对配置空间进行初始化,但是它没有!55~~ 怎么办呢?通过修改配置空间的bar寄存器的值行么?好像不行…… 通过驱动程序行么?没有试过…… 各位老大!我们不想再做新的板子 |
|
|
11楼#
发布于:2004-11-02 15:22
遇到了同样的问题:(
同问。。。。。。。。。 |
|
12楼#
发布于:2010-01-26 17:54
这个肯定要修改配置寄存器的默认值,你板子上没有eep,如果是FPGA的话,应该比较好办,改默认值就好,如果是流片出来的芯片,那悲剧了,没有eeprom怎么配置寄存器?他的配置寄存器的默认值都是固定的。。。。
|
|