阅读:1562回复:10
弱智问题! 答对有分!
我在用driverwork,在向导里的第八步,我选择添加ADD IO Port resouce 其中有一个值PCI Base Address 取值范围0-5。我不太明白指的是什末! 请各位指点!
|
|
|
沙发#
发布于: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] |
|
|
板凳#
发布于:2002-10-29 14:20
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2002-10-30 13:45
是每个PCI设备,都分配有6个寄存器吗?选0或5有什末区别?
不好意思,问的问题较弱,请知道的兄弟耐心回答,一定有分。 ;) |
|
|
地下室#
发布于: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。 其它情况类推。 明白了吗?加点分吧! |
|
|
5楼#
发布于:2002-10-31 09:06
那就是说,如果我要分配两个I/O,两个Mem和一个IRQ,我就需要占据BAR0--BAR4的5个基址寄存器,至于把哪个BAR分给哪个资源由我来决定。
还有一个问题,怎末给分呀? :P |
|
|
6楼#
发布于:2002-10-31 10:09
是不是BAR0就对应着在SoftICE里查到的Base Address 0 ?
|
|
|
7楼#
发布于:2002-10-31 11:25
那就是说,如果我要分配两个I/O,两个Mem和一个IRQ,我就需要占据BAR0--BAR4的5个基址寄存器,至于把哪个BAR分给哪个资源由我来决定。 基本正确。不过,至于把哪个BAR分给哪个资源是由硬件决定,如果你是大拿,硬件也由你做,那就请你做主了。 |
|
|
8楼#
发布于:2002-10-31 11:26
是不是BAR0就对应着在SoftICE里查到的Base Address 0 ? YES。 |
|
|
9楼#
发布于:2002-10-31 11:34
谢了!
顺便问一点题外话。用DS向导做出来的原始代码,那些功能已经做好,我们着重要添加什末? 我的意思是,想到本身生成的代码能到什末程度? |
|
|
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] |
|
|