nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1562回复:10

弱智问题! 答对有分!

楼主#
更多 发布于:2002-10-29 11:13
我在用driverwork,在向导里的第八步,我选择添加ADD IO Port resouce   其中有一个值PCI Base Address 取值范围0-5。我不太明白指的是什末!  请各位指点!
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
Dragon2008
驱动中牛
驱动中牛
  • 注册日期2002-04-01
  • 最后登录2006-03-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-29 14:10
我在用driverwork,在向导里的第八步,我选择添加ADD IO Port resouce   其中有一个值PCI Base Address 取值范围0-5。我不太明白指的是什末!  请各位指点!


PCI Base Address取值范围0-5意为PCI Base Address Index。
DriverWorks有曰:
PCI based drivers only require a PCI Base Address Index, and receive the I/O port\'s length and alignment requirements from the PCI configuration space.

0-->BAR0
1-->BAR1
2-->BAR2
3-->BAR3
4-->BAR4
5-->BAR5
(BAR: PCI配置寄存器中的Base Address Register)


[编辑 -  10/29/02 by  Dragon2008]
我姓龙,我属龙,我叫龙。。。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-10-29 14:20
用户被禁言,该主题自动屏蔽!
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-30 13:45
是每个PCI设备,都分配有6个寄存器吗?选0或5有什末区别?

不好意思,问的问题较弱,请知道的兄弟耐心回答,一定有分。 ;)
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
Dragon2008
驱动中牛
驱动中牛
  • 注册日期2002-04-01
  • 最后登录2006-03-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-30 16:14
是每个PCI设备,都分配有6个寄存器吗?选0或5有什末区别?

不好意思,问的问题较弱,请知道的兄弟耐心回答,一定有分。 ;)


并不是每个PCI设备都要分配6个局部空间,根据你的需要。比如,可能你只要用到两个局部空间,一个IO空间;一个MEM空间。这时,你可只配置BAR0,BAR1两个寄存器。
如果你的MEM空间对就的是BAR0,则在DRIVERWORKS声明MEM资源时就将PCI Base Address的值设成0;
如果你的IO空间对就的是BAR1,则在DRIVERWORKS声明IO端口资源时就将PCI Base Address的值设成1。
其它情况类推。

明白了吗?加点分吧!
我姓龙,我属龙,我叫龙。。。
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-31 09:06
那就是说,如果我要分配两个I/O,两个Mem和一个IRQ,我就需要占据BAR0--BAR4的5个基址寄存器,至于把哪个BAR分给哪个资源由我来决定。

还有一个问题,怎末给分呀? :P
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-31 10:09
是不是BAR0就对应着在SoftICE里查到的Base Address 0  ?
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
Dragon2008
驱动中牛
驱动中牛
  • 注册日期2002-04-01
  • 最后登录2006-03-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-31 11:25
那就是说,如果我要分配两个I/O,两个Mem和一个IRQ,我就需要占据BAR0--BAR4的5个基址寄存器,至于把哪个BAR分给哪个资源由我来决定。

还有一个问题,怎末给分呀? :P


基本正确。不过,至于把哪个BAR分给哪个资源是由硬件决定,如果你是大拿,硬件也由你做,那就请你做主了。

我姓龙,我属龙,我叫龙。。。
Dragon2008
驱动中牛
驱动中牛
  • 注册日期2002-04-01
  • 最后登录2006-03-13
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-31 11:26
是不是BAR0就对应着在SoftICE里查到的Base Address 0  ?
 


YES。
我姓龙,我属龙,我叫龙。。。
nikko
驱动小牛
驱动小牛
  • 注册日期2002-08-08
  • 最后登录2004-09-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-31 11:34
谢了!
 
顺便问一点题外话。用DS向导做出来的原始代码,那些功能已经做好,我们着重要添加什末?  我的意思是,想到本身生成的代码能到什末程度?
http://202.106.185.224/music_1024/battleraper_02_04_27.mp3
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-01 10:20

 
我在用driverwork,在向导里的第八步,我选择添加ADD IO Port resouce 其中有一个值PCI Base Address 取值范围0-5。我不太明白指的是什末! 请各位指点!

-----------------------------------------------------
可以简单的这样认为:
pci配置空间0------------对应-----------PCI Base Address 0
pci配置空间1------------对应-----------PCI Base Address 1
.............................
..............................
--------------------------------------------------------
如果按照ds的向导生成代码,如你只是访问io或mem,就不用再做什么了。
 例:
在用driverwork,在向导里的第八步,我选择添加ADD IO Port resouce ,添加m_IoPortRange1为PCI Base Address 1
即pci配置空间1---对应--PCI Base Address 1--对应硬件io地
则在生成代码中的onstartdevice函数中有
status = m_IoPortRange1.Initialize(
pResListTranslated,
pResListRaw,
PciConfig.BaseAddressIndexToOrdinal(1)     //假设硬件地址为本地配置寄存器地址
);

则以后用m_IoPortRange1.inb(index)以字节读本地配置寄存器
m_IoPortRange1.outb(index,data)以字节写本地配置寄存器
m_IoPortRange1.inw(index)以字读本地配置寄存器
m_IoPortRange1.outw(index,data)以字写本地配置寄存器
....................
........................

即可访问本地配置寄存器。
-------------------------------------------
如需中断,用driverwork,在向导里的第八步,选择添加IRQ。
生成代码后,需在中断CALLBACK函式Isr_Irq()中简单判一下是否自己的中断,如是则先关掉中断源,然后调用中断延时处理函数m_DpcFor_Irq.Request(NULL, NULL)排队等待执行。
在中断延时处理函数m_DpcFor_Irq中可编写你要做的事。
-------------------------------------------------------
如需DMA,则更为麻烦,无论是SLAVE OR MASTER都很罗嗦。
你不但要访问PCI配置寄存器,还要访问本地配置寄存器来初始化DMA
控制器。
往往,DMA还经常需和中断配合使用。
对于不支持GATHING/SCATHING的设备还存在数据BUFFER物理地址连续的问题。
总之一句话,用DS做DMA自己需做大量工作。


[编辑 -  11/1/02 by  hglzw]
[img]http://www.kinboh.com/images/5130.jpg[/img]
游客

返回顶部