hiahia
驱动牛犊
驱动牛犊
  • 注册日期2002-01-17
  • 最后登录2002-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5973回复:12

如何使用驱动给pci设备分配资源?

楼主#
更多 发布于:2002-04-16 13:56
最好请各位高手给出wdm的例程(是不是只有nt驱动才能实现呢?)。

重新分配以后的资源一定可以使用么?
比如说,eeprom中设定了设备的io空间是3000到3fff
而我在驱动程序中重新加了4000到4fff的io空间给它
那么系统或者pci bus如何知道呢?通过读取配置空间寄存器?

因为,我看书,说wdm驱动程序通过读取注册表,直到设备所需要申请的资源,然后进行动态分配,而我的pci卡,没有外加的eeprom,所以在dos下面没有被分配任何资源(我只需要io空间就可以了)。
现在需要在驱动程序里面重新分配资源,使设备能够进行io操作。

希望各位高手指教。
hello
Xman
驱动大牛
驱动大牛
  • 注册日期2001-08-24
  • 最后登录2011-10-07
  • 粉丝0
  • 关注0
  • 积分343分
  • 威望127点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-16 14:03
wdm由系统自动分配
[img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
hiahia
驱动牛犊
驱动牛犊
  • 注册日期2002-01-17
  • 最后登录2002-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-16 14:50
这个我知道,只是他分配的时候需要依据什么呢?我认为应当是配置空间中的内容,而我现在需要更改配置空间确定分配的资源。应该怎么办呢?
hello
wuqix
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2008-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-17 01:28
只是要个资源的话,inf里的硬件资源部分声明一下就行了,你的驱动还能按一般wdm的写。不过你的硬件部分也要跟着调整啊,干要一段地址,里边没有映射任何硬件寄存器也没用的。
hiahia
驱动牛犊
驱动牛犊
  • 注册日期2002-01-17
  • 最后登录2002-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-17 15:16
在没有驱动程序的情况下,real dos下面,如果我硬更改了bar寄存器中的值,那么算不算给我的pci卡分配了资源呢?
比如说分了一段3000 to 31ff的io给它,那么我重汇编程序中用out 3000,0ffh
那么这块pci的地址线上是不是会有信号?
(虽然pci的地址线和数据线是复用的,先这么认为有地址线吧)
那么我如果是这样用的话,就不需要什么硬件的寄存器了吧?
因为只是一个桥,将pci interface这边的地址译码,所以我只需要关系pci interface这边会不有信号出现
hello
wuqix
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2008-06-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-18 03:38
out in指令有意义就意味着你的地址译码没问题,isa一般是个简单的译码,pci我记得都在firmware里改,只不过主机程序要访问这个地址还得先找到bar的地址而已。我说的要映射几个寄存器是这个意思,你的硬件需要对地址线上产生的这个地址有反应,当出现相应的地址时,可以把数据线的数据读入,至于这个数据放在哪里,和怎么用,都是pci这边的事,和主机的驱动没关系。你现在的疑问都应该能从pci的datasheet里找到。
jokeshe
驱动牛犊
驱动牛犊
  • 注册日期2001-06-06
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望101点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
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卡的,其实这无所谓,如果你在驱动里面要把地址读出来
可以调用函数读的。
CPLD来了
hiahia
驱动牛犊
驱动牛犊
  • 注册日期2002-01-17
  • 最后登录2002-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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卡
是通过什么来决定的呢?配置空间,还是其他的(比如经过地址译码电路,然后片
选)途径?
hello
Master_Yi
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-19 10:44
PCI卡先在BAR里申明要一段地址空间(通过基地址和长度),上电的时候由BIOS负责资源分配,真正卡能拿到的不一定就是它想要的,但只要分配了,就有一段地址是对应它的。这也会在BAR里面表现出来(BIOS写进去就行了)。以后对这段地址操作的时候,卡就会知道这段地址是它的。而操作系统或软件只要从BIOS拿到这些信息就可以对卡进行操作了。对PCI设备而言,地址数据线固然是连在一起的,但配置用的控制线是分开的,否则就会在配置的时候搞不清是给谁的数据了。
我读书少,不要欺负我呀!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-04-19 10:49
用户被禁言,该主题自动屏蔽!
hiahia
驱动牛犊
驱动牛犊
  • 注册日期2002-01-17
  • 最后登录2002-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-19 13:22
哦,原来。
阿们……
但是,现在我的问题时,我们的板子上根本没有eeprom,而且桥接器片子本来应该会对配置空间进行初始化,但是它没有!55~~
怎么办呢?通过修改配置空间的bar寄存器的值行么?好像不行……
通过驱动程序行么?没有试过……
各位老大!我们不想再做新的板子
hello
ginger_l
驱动牛犊
驱动牛犊
  • 注册日期2004-09-07
  • 最后登录2006-04-05
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-11-02 15:22
遇到了同样的问题:(
同问。。。。。。。。。
achillowy
驱动牛犊
驱动牛犊
  • 注册日期2009-05-26
  • 最后登录2010-02-18
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望171点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2010-01-26 17:54
这个肯定要修改配置寄存器的默认值,你板子上没有eep,如果是FPGA的话,应该比较好办,改默认值就好,如果是流片出来的芯片,那悲剧了,没有eeprom怎么配置寄存器?他的配置寄存器的默认值都是固定的。。。。
游客

返回顶部