各位大侠好!小弟现在搞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.
想请教下各位是怎么回事呀??
忘记说了 我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
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??
谢谢楼上兄弟!呵呵!我现在在我驱动中都加了调试信息,驱动加载后信息如下
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不通我的开发板??
LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?
引用: 引用 4 楼 xuefeng_baggio 的回复:
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??
这个API只是注册吧,不是申请。
我现在对这个中断已经很困惑了!不知道是怎么样一个流程!
lz的这个函数走完了吗?MiniportInitialize
"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
谢谢楼上兄弟,我在eeworld上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??
不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。
1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
托雷斯兄弟!你就不要谦虚了!呵呵!我看了你的帖子发现你也在弄这东西!我的驱动是移植立于泰的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中断我现在时一点都不明白了!还请你指点下!
为了方便你们分析问题我把我的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
还请各位大侠分析下!!