wince5.0的Dm9000驱动调试问题

caobinec   2010-1-12 11:42 楼主
各位大侠好!小弟现在搞wince5.0下的DM9000驱动遇到点问题!
我在驱动中加调试信息发现我申请中断处问题了!
EDeviceRegisterInterrupt()函数中有个NdisMRegisterInterrupt()这个函数应该是NDIS层的函数。意思是申请了中断吗?可是现在我这出了问题了
if((status=NdisMRegisterInterrupt(
                &m_InterruptHandle,
                m_pUpper->GetNdisHandle(),
                37,        // or say, irq vector
                37,        // irql level
                TRUE,                // request ISR
                TRUE,//(BOOLEAN)m_szConfigures[CID_IRQ_SHARED],                // shared interrupt
                (KINTERRUPT_MODE)m_szConfigures[CID_IRQ_GEN_TYPE])) != NDIS_STATUS_SUCCESS)       
        {
                if(status==NDIS_STATUS_RESOURCE_CONFLICT)
                        RETAILMSG(DM9000_DEBUG, (TEXT("NDIS_STATUS_RESOURCE_CONFLICT\r\n")));
                else if(status==NDIS_STATUS_RESOURCES)
                        RETAILMSG(DM9000_DEBUG, (TEXT("NDIS_STATUS_RESOURCES\r\n")));
                else
                        RETAILMSG(DM9000_DEBUG, (TEXT("NDIS_STATUS_FAILURE\r\n")));
                RETAILMSG(DM9000_DEBUG, (TEXT("request irq fucking errors\r\n")));               
                THROW((ERR_STRING("Error in registering interrupt"),status));
        }
现在调试信息显示时红色部分我看help中这样描述的:
The attempt to initialize the interrupt object failed, possibly due to another driver's prior claim on the InterruptVector or InterruptLevel in the registry.

想请教下各位是怎么回事呀??

回复评论 (38)

忘记说了 我dm9000是这样配置的
1.SD0~SD15  --------  LDATA0~LDATA15  数据线和地址线复用
2.CMD            --------  LADDR2                唯一的一根地址线用于判断是数据还是地址
3.nCS            --------  nGCS3                  片选BANK3
中断号是 EINT9(GPG1)我的注册表是这样配置的:
[HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
"BusNumber"=dword:0
"BusType"=dword:1
"XmitBuffer"=dword:20
"RecvBuffer"=dword:20
;"SysIntr"=dword:26
"IrqNumber"=dword:25
"IoAddress"=dword:18000300
"UseSoftwareMac"=dword:1
"SoftwareMacAddress0"=dword:20
"SoftwareMacAddress1"=dword:04
"SoftwareMacAddress2"=dword:09
"SoftwareMacAddress3"=dword:18
"SoftwareMacAddress4"=dword:00
"SoftwareMacAddress5"=dword:07
点赞  2010-1-12 11:46
帮顶下.

mark,学习下。
点赞  2010-1-12 12:18
友情关注,这个没弄过。
点赞  2010-1-12 13:26
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??
点赞  2010-1-12 13:52
帮你娃顶一下   看你娃也好可怜啊  呵呵  
点赞  2010-1-12 14:08
谢谢楼上兄弟!呵呵!我现在在我驱动中都加了调试信息,驱动加载后信息如下
DM9000 DriverReset
C_DM9000::DeviceReset
C_DM9000::EDeviceInitialize
DM9000ReadPort:Address=0x28,value=0x46
DM9000ReadPort:Address=0x29,value=0xa
DM9000ReadPort:Address=0x2a,value=0x0
DM9000ReadPort:Address=0x2b,value=0x90
[dm9000: Chip signature is 90000A46
DM9000ReadPort:Address=0xfe,value=0x0
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceStart
C_DM9000::DeviceEnableInterrupt
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceOnSetupFilter
DM9000 DeviceCalculateCRC32
DM9000 DeviceCalculateCRC32
DM9000 DeviceCalculateCRC32
DM9000 DriverQueryInformation
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
DM9000ReadPort:Address=0x7,value=0x0
+OALIntrDoneIrqs(1, 0x8201eefc)
+BSPIntrDoneIrq(26). 然后不停地在reset!不知道怎么回事?但是我ping不通我的开发板??
点赞  2010-1-12 14:12
LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?
点赞  2010-1-12 14:36
引用: 引用 4 楼 xuefeng_baggio 的回复:
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??


这个API只是注册吧,不是申请。
点赞  2010-1-12 14:36
我现在对这个中断已经很困惑了!不知道是怎么样一个流程!
点赞  2010-1-12 14:44
我用的是动态申请的?
点赞  2010-1-12 16:01
lz的这个函数走完了吗?MiniportInitialize
点赞  2010-1-12 17:56
先看chipid吧
点赞  2010-1-12 17:58
"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
点赞  2010-1-12 18:47
谢谢楼上兄弟,我在eeworld上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??
点赞  2010-1-12 18:48
不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。
点赞  2010-1-12 19:02
1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
点赞  2010-1-12 22:36
托雷斯兄弟!你就不要谦虚了!呵呵!我看了你的帖子发现你也在弄这东西!我的驱动是移植立于泰的DM9000,关键是我不知道在wince5.0中怎么申请这个中断。特别是注册表那得!还有程序中:
CONFIG_PARAMETER        g_szDm9ConfigParams[] =
{
        { CID_CONNECTION_TYPE, -1, NDIS_STRING_CONST("ConnectionType") },
        { CID_SLOT_NUMBER, -1, NDIS_STRING_CONST("SlotNumber")},
        { CID_BUFFER_PHYSICAL_ADDRESS, 0, NDIS_STRING_CONST("BufferPhysicalAddress")},
        { CID_TXBUFFER_NUMBER, 0x20, NDIS_STRING_CONST("XmitBuffer")},
        { CID_RXBUFFER_NUMBER, 0x10, NDIS_STRING_CONST("RecvBuffer")},
        { CID_ADAPTER_NUMBER, 0, NDIS_STRING_CONST("AdapterNumber")},
        { CID_IO_BASE_ADDRESS, 0x18000300, NDIS_STRING_CONST("IoAddress")},
        { CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
        { CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")},
        { -1,-1,NULL}
};
这段我很困惑,如果我设置的不是0x1a的话,dm9000驱动都加载不成功!但是0x1a的话 理论上讲不通 ,因为0x1a的十进制是26 ,而26是#define IRQ_USBH            26是usbh的中断,我看了我注册表usb部分确实也是26.我本来自认为对wince中断了解了一点点,现在发现自己正是自以为是!这个wince中断我现在时一点都不明白了!还请你指点下!
点赞  2010-1-13 09:00
为了方便你们分析问题我把我的usb OHCI部分注册表信息贴上来:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\OHCI]
   "InterfaceType"=dword:0     ; Internal
   "Prefix"="HCD"
   "Dll"="ohci2.dll"
   "Index"=dword:1
   "Order"=dword:1
   "Irq"=dword:1a                ; 26
   "SysIntr"=dword:11                ; (SYSINTR_FIRMWARE+1)
   "MemBase"=dword:49000000
   "MemLen"=dword:1000
   "UseExistingSettings"=dword:0
还请各位大侠分析下!!
点赞  2010-1-13 09:02
帮顶!
点赞  2010-1-13 09:20
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复