qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2539回复:12

请问,WinCE下用NdisMRegisterInterrupt注册中断的问题

楼主#
更多 发布于:2004-12-28 10:53
芯片ARMV4I,接口VLIO,WinCE4.2,PXA270,WLAN模块。
在Miniport_Init中用NdisMRegisterInterrupt注册一个共享中断,中断号是手动指定的一个任意值,函数返回成功,但是不知道为什么中断处理函数却怎么也不调用。
我在注册表里设了
BusType=0xC,
BusNumber=1,
Sysintr=0xXX,// 和NdisMRegisterInterrupt里面用的值相同。
是不是还有什么事没有做,或者还有什么健值没有设?
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-28 10:57
BusType=0xC; // ProcessorInternal bus
是不是和这个值有关系?
另外,注册中断号的时候,很奇怪从1到127全部都能成功,感觉这是不对的,但是不知道是哪里出了问题。

[编辑 -  12/28/04 by  qwdrv]
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-28 14:22
你的NIC的ISR里面处理完后返回你分配的SYSINTR了吗?
根据地的兄弟们,团结就是力量
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-28 15:24
你的NIC的ISR里面处理完后返回你分配的SYSINTR了吗?
不明白,这是指的什么?我的ISR根本就没有被调用过,不管我注册成几号中断。
但是NdisMRegXXX是成功的呀。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-29 13:51
ISR是你写的吗?处理网卡的中断后(注意不是IST,是ISR),你返回的值应该是SYSINTR
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-30 13:18
(1)qwdrv兄弟,ISR是你写的吗?你说isr从来没有调用过,我怀疑你的网卡的中断和isr根本就没有挂上。
(2)在NdisMRegisterInterrupt函数中,InterruptVector的值应该是NIC的硬件中断irq(注意不是Sysintr)。而与irq相对应的Sysintr需要你自己定义或者在驱动中调用相应的函数申请得到。
(3)另外,在你的isr中,只有返回这个Sysintr时,你的ist才会被释放。
Come on, let us drive the world.
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-05 09:10
不明白。
(1)ISR是我写的,不过函数类型是:void (_stdcall*)(PBOOLEAN,PBOOLEAN,NDIS_HANDLE);不是DWORD (_stdcall*)(DWORD);在这里没有办法返回Sysintr,只能返回recognized。
(2)我在.def里面导出DriverEntry,Wrapper以后在Miniport_Init中用NdisMRegisterInterrupt,函数返回成功,但是MyISR不被调用。应该是网卡的中断和ISR没有挂上。
(3)InterruptVector要怎样才能得到?用NdisMQueryAdapterResources吗?那么Sysintr可以随意定义吗?何这个InterruptVector有什么关系?
(4)驱动是否PCMCIA的是否会有不同的处理?
太多地方不明白了,请指教。

[编辑 -  1/5/05 by  qwdrv]
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-05 13:42
刚才看了一下ne2000的代码,有几个问题非常疑惑:
(1)由于没有接触过,不知道ne2000做的具体是什么事情,但是为什么需要两个dll(ne2000.dll&ne2000isr.dll)?而且两个dll里都有中断处理,这是怎么回事啊?难道必须要两个dll才能协同工作吗?
(2)另外,加载ne2000isr.dll的条件是BusType==NdisInterfacePci,这是为什么?在其他时候为什么就不需要这个dll呢?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-05 13:58
"(ne2000.dll&ne2000isr.dll)?而且两个dll里都有中断处理,"

ne2000isr.dll这个是ISR,是中断服务例程(Interrupt Service Routin),做最简单的中断处理,比如判断中断源和清除中断,然后返回给系统一个可识别的逻辑中断号。ne2000.dll这个实现的是nic驱动的miniport函数,里面的中断服务代码叫IST(Interrupt Service Thread),这个用于做中断后的需要较长时间处理的事,比如从设备读取数据,读取状态,对数据进行各种运算等。这两个dll必须配合工作,而且它们之间有些定义必须一致

那个bustype的规定你再看看,ce的例子里面有好多设备默认就是挂在pci总线上的,所以这些驱动中夹杂了pci总线操作代码,如果你的设备不是挂在pci总线上的就不需要,这个要根据你的需要改
根据地的兄弟们,团结就是力量
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-05 14:56
谢谢。
ISR和IST不是应该对应Miniport.ISRHandler和Miniport.HandleInterruptHandler的吗?
ne2000中的处理是:
if (Adapter->BusType == NdisInterfacePci)
{
    status = LoadISR(Adapter); //load dll
    ....
}
那么如果不是pci的话是不是ne2000isr.dll就不需要加载了?
我的驱动原来是PCMCIA上的,可以正常工作的啊。
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-06 08:20
To qwdrv,
ne2000 网卡有pci接口的也有isa接口的,因此它的驱动也分别针对pci接口和针对isa接口,在pb右边的网卡驱动group里面你也能发现这一点。下面的这段程序应该是处理pci接口的网卡的。

if (Adapter->BusType == NdisInterfacePci)
{
status = LoadISR(Adapter); //load dll
....
}

Come on, let us drive the world.
qwdrv
驱动大牛
驱动大牛
  • 注册日期2004-03-19
  • 最后登录2005-12-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-06 12:12
对,这段处理是针对pci接口的,只是我的接口如果不是pci的话是不是就不需要处理ne2000isr.dll了?我是对用两个dll处理isr很奇怪,应该在ne2000.dll里就可以完成ist和isr的呀。
我现在能够通过接口读写卡上的内容,但是不知道怎么回事,中断就是挂不上。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-01-06 14:42
写成一个还是两个没关系三

你能读写内部寄存器?用上层应用通过驱动读的?如果这步都对了那挂isr应该问题不大了
根据地的兄弟们,团结就是力量
游客

返回顶部