我在驱动中加调试信息发现我申请中断处问题了!
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.
想请教下各位是怎么回事呀??
39 个解决方案
#1
忘记说了 我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
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
#2
帮顶下.
mark,学习下。
mark,学习下。
#3
友情关注,这个没弄过。
#4
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??
#5
帮你娃顶一下 看你娃也好可怜啊 呵呵
#6
谢谢楼上兄弟!呵呵!我现在在我驱动中都加了调试信息,驱动加载后信息如下
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不通我的开发板??
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不通我的开发板??
#7
LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?
#8
这个API只是注册吧,不是申请。
#9
我现在对这个中断已经很困惑了!不知道是怎么样一个流程!
#10
我用的是动态申请的?
#11
lz的这个函数走完了吗?MiniportInitialize
#12
先看chipid吧
#13
"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
#14
谢谢楼上兄弟,我在csdn上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??
#15
不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。
90000a46好像应该是DM9000EP的ID。
#16
1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
#17
托雷斯兄弟!你就不要谦虚了!呵呵!我看了你的帖子发现你也在弄这东西!我的驱动是移植立于泰的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中断我现在时一点都不明白了!还请你指点下!
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中断我现在时一点都不明白了!还请你指点下!
#18
为了方便你们分析问题我把我的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
还请各位大侠分析下!!
[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
还请各位大侠分析下!!
#19
帮顶!
#20
应该不需要做什么大的改动,芯片公司已经提供了样例驱动.
#21
是的!现在就是这个样例驱动,在我的bsp中有点问题,现在我在oal层已经看到驱动申请的中断了,但是接受不到数据,调试信息如下
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
还请各位大侠献计献策呀!!
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
还请各位大侠献计献策呀!!
#22
和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
NDIS会根据IrqNumber自己去申请SysIntr。
NDIS会根据IrqNumber自己去申请SysIntr。
#23
看看你的dm9000的INT管脚连接到了CPU的那个gpio或者中断脚上面,然后根据你自己BSP里面获得gpio的IRQ的方式得到一个IRQ,这个IRQ就是注册表里面的IRQ_Number的值,同样也是这个里面的IRQ值,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}。
同时将此IRQ用动态申请或者静态映射的方式关联上一个Sysintr。
NDIS只会去注册这个IRQ,不会根据这个IRQ去申请系统中断。
同时将此IRQ用动态申请或者静态映射的方式关联上一个Sysintr。
NDIS只会去注册这个IRQ,不会根据这个IRQ去申请系统中断。
#24
LZ的cpu是什么型号?三星的还是marvell的?
#25
兄弟您好!我现在中断脚接的EINT9(GPG1)这个脚,那我的中断是不是就是EINT9呢?我注册表中是
[HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
"BusNumber"=dword:0
"BusType"=dword:1
"XmitBuffer"=dword:20
"RecvBuffer"=dword:20
"SysIntr"=dword:25 //这个一直不明白
"IrqNumber"=dword:25//这个就是所谓的IRQNUM??我想问下这个事硬件中断号还是系统中断号呢??
"IoAddress"=dword:18000300//这个是因为dm9000接了NGCS3,但是我不明白为什么是0x18000300而不是0x18000000??
"UseSoftwareMac"=dword:1
"SoftwareMacAddress0"=dword:20
"SoftwareMacAddress1"=dword:04
"SoftwareMacAddress2"=dword:09
"SoftwareMacAddress3"=dword:18
"SoftwareMacAddress4"=dword:00
"SoftwareMacAddress5"=dword:07
#26
我今早又理清思路。现在这里是这样配置的!
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, 37, NDIS_STRING_CONST("IrqNumber")}, { -1,-1,NULL}
};
请各位看看我的问题!
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, 37, NDIS_STRING_CONST("IrqNumber")}, { -1,-1,NULL}
};
请各位看看我的问题!
#27
没有人顶呀??各位大侠帮我看看什么问题吧??
我现在在调试信息中发现我申请中断后OAL层竟然有这样的信息
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1). 纳闷呀为什么是-1呀??什么意思呢??
我现在在调试信息中发现我申请中断后OAL层竟然有这样的信息
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1). 纳闷呀为什么是-1呀??什么意思呢??
#28
建议lz看看你的BSP中其它驱动是如何申请中断的。
#29
各位好!小弟下午有好好看dm9000驱动的源码!并通过相关调试信息分析了下,这里还根据网上牛人的文章分析了dm9000驱动的流程。下面是我的分析还请各位大侠们指点下小弟。谢谢了!
从dm9000.def文件中可以看到dm9000的驱动程序(dm9000.dll)exports的函数只有DriverEntry。从名字上也可以看出这是该dll文件入口。
下面详细看下这个入口函数(在driver.cpp中实现):在这个函数中主要有一个NdisMInitializeWrapper(),这个函数中有很多回调函数MiniportInitialize,MiniportReset,MiniportInterruptHandler,MiniportISRHandler,MiniportQueryInformation,MiniportSetInformation,MiniportSend)。这些函数在驱动中已经实现好了。在这里还有一个 NdisMRegisterMiniport()函数。This function registers an NIC or intermediate driver's Miniport_* entry points and name with the NDIS library when the driver initializes。就是用刚才初始化的那个结构体注册。在public\common\oak\drivers\netsamp\passthru \miniport.c中微软提供了一系列Miniportxxxx函数的实现范例。help中对MiniportInitialize的解释是:This function is a required function that sets up a network adapter, or virtual network adapter, for network I/O operations, claims all hardware resources necessary to the network adapter in the registry, and allocates resources the driver needs to carry out network I/O operations.
接下来就是MiniportInitialize了。在其中有NIC_DRIVER_OBJECT类的初始化,以及该类的 EDriverInitialize函数调用,在此函数中全面展开了dm9000的所有初始化操作。主要是通过DeviceEntry()这个函数来实现(这个函数实现在dm9000.cpp文件中),在DeviceEntry这个函数中只做了一件事:new了一个C_DM9000类的实例并 return。这里小弟通过调试信息发现在MiniportIntialize()中做很多工作,DeviceSetDefaultSettings();DeviceSetEepromFormat();DeviceRetriveConfigurations(hconfig);EDeviceValidateConfigurations() 等等。在这里我的驱动已经读取了dm9000的ID。
C_DM9000::EDeviceInitialize
[dm9000: Chip signature is 90000A46
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1).
DM9000 EDriverInitialize EDeviceRegisterInterrupt
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceStart
C_DM9000::DeviceEnableInterrupt
<DM9:--MiniportInitialize>这段是MiniportIntialize函数最后的些信息。
从dm9000.def文件中可以看到dm9000的驱动程序(dm9000.dll)exports的函数只有DriverEntry。从名字上也可以看出这是该dll文件入口。
下面详细看下这个入口函数(在driver.cpp中实现):在这个函数中主要有一个NdisMInitializeWrapper(),这个函数中有很多回调函数MiniportInitialize,MiniportReset,MiniportInterruptHandler,MiniportISRHandler,MiniportQueryInformation,MiniportSetInformation,MiniportSend)。这些函数在驱动中已经实现好了。在这里还有一个 NdisMRegisterMiniport()函数。This function registers an NIC or intermediate driver's Miniport_* entry points and name with the NDIS library when the driver initializes。就是用刚才初始化的那个结构体注册。在public\common\oak\drivers\netsamp\passthru \miniport.c中微软提供了一系列Miniportxxxx函数的实现范例。help中对MiniportInitialize的解释是:This function is a required function that sets up a network adapter, or virtual network adapter, for network I/O operations, claims all hardware resources necessary to the network adapter in the registry, and allocates resources the driver needs to carry out network I/O operations.
接下来就是MiniportInitialize了。在其中有NIC_DRIVER_OBJECT类的初始化,以及该类的 EDriverInitialize函数调用,在此函数中全面展开了dm9000的所有初始化操作。主要是通过DeviceEntry()这个函数来实现(这个函数实现在dm9000.cpp文件中),在DeviceEntry这个函数中只做了一件事:new了一个C_DM9000类的实例并 return。这里小弟通过调试信息发现在MiniportIntialize()中做很多工作,DeviceSetDefaultSettings();DeviceSetEepromFormat();DeviceRetriveConfigurations(hconfig);EDeviceValidateConfigurations() 等等。在这里我的驱动已经读取了dm9000的ID。
C_DM9000::EDeviceInitialize
[dm9000: Chip signature is 90000A46
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1).
DM9000 EDriverInitialize EDeviceRegisterInterrupt
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceStart
C_DM9000::DeviceEnableInterrupt
<DM9:--MiniportInitialize>这段是MiniportIntialize函数最后的些信息。
#30
当初始化完成后有个DriverStart()。这里程序主动权基本都在c_DM9000的类里了。俺网上牛的文章在DeviceEnableInterrupt()启动中断后,接下来就是无休止的等待,接收,发送了。这样我根据他的文章简单分析后发现似乎我的驱动没什么问题?不过为什么我的后面的中断没有产生,调试信息总是
DM9000 DriverQueryInformation
DM9000 DriverSend
DM9000 DriverQueryInformation这玩意呢??这样我就困惑了??是不是说明我中断没产生、但是我确实按上面回复已经配置了呀??还有哪里要注意的呢??
DM9000 DriverQueryInformation
DM9000 DriverSend
DM9000 DriverQueryInformation这玩意呢??这样我就困惑了??是不是说明我中断没产生、但是我确实按上面回复已经配置了呀??还有哪里要注意的呢??
#31
先帮顶一个
#32
up
#33
巴乔:
当WMI向小端口发送一个query或者set(即IRP),NDIS库就会截取这个query或者set,并把GUID映射为小端口支持的OID,然后通过调用MiniportQuerylnformtion或者Miniportsetlnformation来查询或者是设置这些OID。OID对象的设置和查询是通过switch语句实现的.
而且在NTSTATUS DriverEntry()里面:
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
ndischar.Ndis30Chars.ResetHandler = MiniportReset;
ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
ndischar.Ndis30Chars.HaltHandler = MiniportHalt;
ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;
ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
ndischar.Ndis30Chars.SendHandler = MiniportSend;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?
当WMI向小端口发送一个query或者set(即IRP),NDIS库就会截取这个query或者set,并把GUID映射为小端口支持的OID,然后通过调用MiniportQuerylnformtion或者Miniportsetlnformation来查询或者是设置这些OID。OID对象的设置和查询是通过switch语句实现的.
而且在NTSTATUS DriverEntry()里面:
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
ndischar.Ndis30Chars.ResetHandler = MiniportReset;
ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
ndischar.Ndis30Chars.HaltHandler = MiniportHalt;
ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;
ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
ndischar.Ndis30Chars.SendHandler = MiniportSend;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?
#34
如果是2440的话还是看一下中断有没有处理好
#35
lz的问题搞定没有,到什么程度了?咱俩的问题估计差不多,呵呵。。。
你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?
你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?
#36
不停的reset应该是总线时序配置的不好,另外看看中断的配置是否正确,用的哪个外部中断,在注册表里中断号写的是否正确,一般是写系统中断号的
#37
老问题新发现,上周在开发板上已经把Dm9000A驱动调试成功,这周在自己的硬件板子上调试,有遇到问题了,这次问题是CPU已经成功读取了Dm9000AEP芯片的ID,并且产生了中断。但是似乎数据没有收发,简单的就是我用抓包工具抓不到数据包,并且ping也ping不通,还请各路高手帮忙一起分析下!
#38
这个帖子终于可以结了,经过反复测试验证,看波形比较,最后换了块DM9000AEP芯片,竟然奇迹般的ko了!现在的困惑是为什么都是DM9000AEP 007版的芯片,为什么换了一块就好了呢??也不管了,让硬件区解决这个难题吧!
#39
#1
忘记说了 我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
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
#2
帮顶下.
mark,学习下。
mark,学习下。
#3
友情关注,这个没弄过。
#4
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??
#5
帮你娃顶一下 看你娃也好可怜啊 呵呵
#6
谢谢楼上兄弟!呵呵!我现在在我驱动中都加了调试信息,驱动加载后信息如下
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不通我的开发板??
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不通我的开发板??
#7
LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?
#8
这个API只是注册吧,不是申请。
#9
我现在对这个中断已经很困惑了!不知道是怎么样一个流程!
#10
我用的是动态申请的?
#11
lz的这个函数走完了吗?MiniportInitialize
#12
先看chipid吧
#13
"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵
#14
谢谢楼上兄弟,我在csdn上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??
#15
不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。
90000a46好像应该是DM9000EP的ID。
#16
1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
2) 确定中断的优先级别,我估计是不是没有确定中断的优先级。
3) 接收到中断并对中断进行排队
每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。
至于NdisMRegisterlnterrupt()申请不成功的原因,我现有的资料只有DDK方面的,所以不敢妄下结论。正在学习中!
#17
托雷斯兄弟!你就不要谦虚了!呵呵!我看了你的帖子发现你也在弄这东西!我的驱动是移植立于泰的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中断我现在时一点都不明白了!还请你指点下!
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中断我现在时一点都不明白了!还请你指点下!
#18
为了方便你们分析问题我把我的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
还请各位大侠分析下!!
[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
还请各位大侠分析下!!
#19
帮顶!
#20
应该不需要做什么大的改动,芯片公司已经提供了样例驱动.
#21
是的!现在就是这个样例驱动,在我的bsp中有点问题,现在我在oal层已经看到驱动申请的中断了,但是接受不到数据,调试信息如下
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
还请各位大侠献计献策呀!!
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
+OALIntrDoneIrqs(1, 0x8201ef18)
+BSPIntrDoneIrq(25).
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
DM9000 DriverQueryInformation
还请各位大侠献计献策呀!!
#22
和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
NDIS会根据IrqNumber自己去申请SysIntr。
NDIS会根据IrqNumber自己去申请SysIntr。
#23
看看你的dm9000的INT管脚连接到了CPU的那个gpio或者中断脚上面,然后根据你自己BSP里面获得gpio的IRQ的方式得到一个IRQ,这个IRQ就是注册表里面的IRQ_Number的值,同样也是这个里面的IRQ值,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}。
同时将此IRQ用动态申请或者静态映射的方式关联上一个Sysintr。
NDIS只会去注册这个IRQ,不会根据这个IRQ去申请系统中断。
同时将此IRQ用动态申请或者静态映射的方式关联上一个Sysintr。
NDIS只会去注册这个IRQ,不会根据这个IRQ去申请系统中断。
#24
LZ的cpu是什么型号?三星的还是marvell的?
#25
兄弟您好!我现在中断脚接的EINT9(GPG1)这个脚,那我的中断是不是就是EINT9呢?我注册表中是
[HKEY_LOCAL_MACHINE\Comm\DM9CE1\Parms]
"BusNumber"=dword:0
"BusType"=dword:1
"XmitBuffer"=dword:20
"RecvBuffer"=dword:20
"SysIntr"=dword:25 //这个一直不明白
"IrqNumber"=dword:25//这个就是所谓的IRQNUM??我想问下这个事硬件中断号还是系统中断号呢??
"IoAddress"=dword:18000300//这个是因为dm9000接了NGCS3,但是我不明白为什么是0x18000300而不是0x18000000??
"UseSoftwareMac"=dword:1
"SoftwareMacAddress0"=dword:20
"SoftwareMacAddress1"=dword:04
"SoftwareMacAddress2"=dword:09
"SoftwareMacAddress3"=dword:18
"SoftwareMacAddress4"=dword:00
"SoftwareMacAddress5"=dword:07
#26
我今早又理清思路。现在这里是这样配置的!
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, 37, NDIS_STRING_CONST("IrqNumber")}, { -1,-1,NULL}
};
请各位看看我的问题!
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, 37, NDIS_STRING_CONST("IrqNumber")}, { -1,-1,NULL}
};
请各位看看我的问题!
#27
没有人顶呀??各位大侠帮我看看什么问题吧??
我现在在调试信息中发现我申请中断后OAL层竟然有这样的信息
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1). 纳闷呀为什么是-1呀??什么意思呢??
我现在在调试信息中发现我申请中断后OAL层竟然有这样的信息
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1). 纳闷呀为什么是-1呀??什么意思呢??
#28
建议lz看看你的BSP中其它驱动是如何申请中断的。
#29
各位好!小弟下午有好好看dm9000驱动的源码!并通过相关调试信息分析了下,这里还根据网上牛人的文章分析了dm9000驱动的流程。下面是我的分析还请各位大侠们指点下小弟。谢谢了!
从dm9000.def文件中可以看到dm9000的驱动程序(dm9000.dll)exports的函数只有DriverEntry。从名字上也可以看出这是该dll文件入口。
下面详细看下这个入口函数(在driver.cpp中实现):在这个函数中主要有一个NdisMInitializeWrapper(),这个函数中有很多回调函数MiniportInitialize,MiniportReset,MiniportInterruptHandler,MiniportISRHandler,MiniportQueryInformation,MiniportSetInformation,MiniportSend)。这些函数在驱动中已经实现好了。在这里还有一个 NdisMRegisterMiniport()函数。This function registers an NIC or intermediate driver's Miniport_* entry points and name with the NDIS library when the driver initializes。就是用刚才初始化的那个结构体注册。在public\common\oak\drivers\netsamp\passthru \miniport.c中微软提供了一系列Miniportxxxx函数的实现范例。help中对MiniportInitialize的解释是:This function is a required function that sets up a network adapter, or virtual network adapter, for network I/O operations, claims all hardware resources necessary to the network adapter in the registry, and allocates resources the driver needs to carry out network I/O operations.
接下来就是MiniportInitialize了。在其中有NIC_DRIVER_OBJECT类的初始化,以及该类的 EDriverInitialize函数调用,在此函数中全面展开了dm9000的所有初始化操作。主要是通过DeviceEntry()这个函数来实现(这个函数实现在dm9000.cpp文件中),在DeviceEntry这个函数中只做了一件事:new了一个C_DM9000类的实例并 return。这里小弟通过调试信息发现在MiniportIntialize()中做很多工作,DeviceSetDefaultSettings();DeviceSetEepromFormat();DeviceRetriveConfigurations(hconfig);EDeviceValidateConfigurations() 等等。在这里我的驱动已经读取了dm9000的ID。
C_DM9000::EDeviceInitialize
[dm9000: Chip signature is 90000A46
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1).
DM9000 EDriverInitialize EDeviceRegisterInterrupt
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceStart
C_DM9000::DeviceEnableInterrupt
<DM9:--MiniportInitialize>这段是MiniportIntialize函数最后的些信息。
从dm9000.def文件中可以看到dm9000的驱动程序(dm9000.dll)exports的函数只有DriverEntry。从名字上也可以看出这是该dll文件入口。
下面详细看下这个入口函数(在driver.cpp中实现):在这个函数中主要有一个NdisMInitializeWrapper(),这个函数中有很多回调函数MiniportInitialize,MiniportReset,MiniportInterruptHandler,MiniportISRHandler,MiniportQueryInformation,MiniportSetInformation,MiniportSend)。这些函数在驱动中已经实现好了。在这里还有一个 NdisMRegisterMiniport()函数。This function registers an NIC or intermediate driver's Miniport_* entry points and name with the NDIS library when the driver initializes。就是用刚才初始化的那个结构体注册。在public\common\oak\drivers\netsamp\passthru \miniport.c中微软提供了一系列Miniportxxxx函数的实现范例。help中对MiniportInitialize的解释是:This function is a required function that sets up a network adapter, or virtual network adapter, for network I/O operations, claims all hardware resources necessary to the network adapter in the registry, and allocates resources the driver needs to carry out network I/O operations.
接下来就是MiniportInitialize了。在其中有NIC_DRIVER_OBJECT类的初始化,以及该类的 EDriverInitialize函数调用,在此函数中全面展开了dm9000的所有初始化操作。主要是通过DeviceEntry()这个函数来实现(这个函数实现在dm9000.cpp文件中),在DeviceEntry这个函数中只做了一件事:new了一个C_DM9000类的实例并 return。这里小弟通过调试信息发现在MiniportIntialize()中做很多工作,DeviceSetDefaultSettings();DeviceSetEepromFormat();DeviceRetriveConfigurations(hconfig);EDeviceValidateConfigurations() 等等。在这里我的驱动已经读取了dm9000的ID。
C_DM9000::EDeviceInitialize
[dm9000: Chip signature is 90000A46
DM9000 EDriverInitialize EDeviceInitialize
DM9000 EDeviceRegisterInterrupt
+OALIntrEnableIrqs(1, 0x8201ef20)
+BSPIntrEnableIrq(-1).
DM9000 EDriverInitialize EDeviceRegisterInterrupt
C_DM9000::DeviceOnSetupFilter
C_DM9000::DeviceStart
C_DM9000::DeviceEnableInterrupt
<DM9:--MiniportInitialize>这段是MiniportIntialize函数最后的些信息。
#30
当初始化完成后有个DriverStart()。这里程序主动权基本都在c_DM9000的类里了。俺网上牛的文章在DeviceEnableInterrupt()启动中断后,接下来就是无休止的等待,接收,发送了。这样我根据他的文章简单分析后发现似乎我的驱动没什么问题?不过为什么我的后面的中断没有产生,调试信息总是
DM9000 DriverQueryInformation
DM9000 DriverSend
DM9000 DriverQueryInformation这玩意呢??这样我就困惑了??是不是说明我中断没产生、但是我确实按上面回复已经配置了呀??还有哪里要注意的呢??
DM9000 DriverQueryInformation
DM9000 DriverSend
DM9000 DriverQueryInformation这玩意呢??这样我就困惑了??是不是说明我中断没产生、但是我确实按上面回复已经配置了呀??还有哪里要注意的呢??
#31
先帮顶一个
#32
up
#33
巴乔:
当WMI向小端口发送一个query或者set(即IRP),NDIS库就会截取这个query或者set,并把GUID映射为小端口支持的OID,然后通过调用MiniportQuerylnformtion或者Miniportsetlnformation来查询或者是设置这些OID。OID对象的设置和查询是通过switch语句实现的.
而且在NTSTATUS DriverEntry()里面:
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
ndischar.Ndis30Chars.ResetHandler = MiniportReset;
ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
ndischar.Ndis30Chars.HaltHandler = MiniportHalt;
ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;
ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
ndischar.Ndis30Chars.SendHandler = MiniportSend;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?
当WMI向小端口发送一个query或者set(即IRP),NDIS库就会截取这个query或者set,并把GUID映射为小端口支持的OID,然后通过调用MiniportQuerylnformtion或者Miniportsetlnformation来查询或者是设置这些OID。OID对象的设置和查询是通过switch语句实现的.
而且在NTSTATUS DriverEntry()里面:
ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize;
ndischar.Ndis30Chars.ResetHandler = MiniportReset;
ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
ndischar.Ndis30Chars.HaltHandler = MiniportHalt;
ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler;
ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
ndischar.Ndis30Chars.SendHandler = MiniportSend;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?
#34
如果是2440的话还是看一下中断有没有处理好
#35
lz的问题搞定没有,到什么程度了?咱俩的问题估计差不多,呵呵。。。
你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?
你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?
#36
不停的reset应该是总线时序配置的不好,另外看看中断的配置是否正确,用的哪个外部中断,在注册表里中断号写的是否正确,一般是写系统中断号的
#37
老问题新发现,上周在开发板上已经把Dm9000A驱动调试成功,这周在自己的硬件板子上调试,有遇到问题了,这次问题是CPU已经成功读取了Dm9000AEP芯片的ID,并且产生了中断。但是似乎数据没有收发,简单的就是我用抓包工具抓不到数据包,并且ping也ping不通,还请各路高手帮忙一起分析下!
#38
这个帖子终于可以结了,经过反复测试验证,看波形比较,最后换了块DM9000AEP芯片,竟然奇迹般的ko了!现在的困惑是为什么都是DM9000AEP 007版的芯片,为什么换了一块就好了呢??也不管了,让硬件区解决这个难题吧!