wince5.0的Dm9000驱动调试问题

时间:2022-08-20 17:29:48
各位大侠好!小弟现在搞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. 

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

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 

#2


帮顶下.

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不通我的开发板??

#7


LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?

#8


引用 4 楼 xuefeng_baggio 的回复:
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??


这个API只是注册吧,不是申请。

#9


我现在对这个中断已经很困惑了!不知道是怎么样一个流程!

#10


我用的是动态申请的?

#11


lz的这个函数走完了吗?MiniportInitialize

#12


先看chipid吧

#13


"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵

#14


谢谢楼上兄弟,我在csdn上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??

#15


不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。

#16


1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
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中断我现在时一点都不明白了!还请你指点下!

#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
还请各位大侠分析下!!

#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

还请各位大侠献计献策呀!!

#22


和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
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去申请系统中断。

#24


LZ的cpu是什么型号?三星的还是marvell的?

#25


引用 22 楼 seemknow 的回复:
和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
NDIS会根据IrqNumber自己去申请SysIntr。

兄弟您好!我现在中断脚接的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}
};
请各位看看我的问题!

#27


没有人顶呀??各位大侠帮我看看什么问题吧??
我现在在调试信息中发现我申请中断后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函数最后的些信息。

#30


当初始化完成后有个DriverStart()。这里程序主动权基本都在c_DM9000的类里了。俺网上牛的文章在DeviceEnableInterrupt()启动中断后,接下来就是无休止的等待,接收,发送了。这样我根据他的文章简单分析后发现似乎我的驱动没什么问题?不过为什么我的后面的中断没有产生,调试信息总是
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;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?

#34


如果是2440的话还是看一下中断有没有处理好

#35


lz的问题搞定没有,到什么程度了?咱俩的问题估计差不多,呵呵。。。

你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?

#36


不停的reset应该是总线时序配置的不好,另外看看中断的配置是否正确,用的哪个外部中断,在注册表里中断号写的是否正确,一般是写系统中断号的

#37


老问题新发现,上周在开发板上已经把Dm9000A驱动调试成功,这周在自己的硬件板子上调试,有遇到问题了,这次问题是CPU已经成功读取了Dm9000AEP芯片的ID,并且产生了中断。但是似乎数据没有收发,简单的就是我用抓包工具抓不到数据包,并且ping也ping不通,还请各路高手帮忙一起分析下!

#38


这个帖子终于可以结了,经过反复测试验证,看波形比较,最后换了块DM9000AEP芯片,竟然奇迹般的ko了!现在的困惑是为什么都是DM9000AEP 007版的芯片,为什么换了一块就好了呢??也不管了,让硬件区解决这个难题吧!

#39


该回复于2011-09-06 15:38:57被版主删除

#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 

#2


帮顶下.

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不通我的开发板??

#7


LZ的irq跟系统中断map起来没有?是动态请求的还是静态映射的?

#8


引用 4 楼 xuefeng_baggio 的回复:
就没有朋友做过吗?我现在对中断这很困惑!不是dm9000是怎么和ce的中断结合的?看help的意思是NdisMRegisterInterrupt()申请中断的,可是为什么申请不成功呢??


这个API只是注册吧,不是申请。

#9


我现在对这个中断已经很困惑了!不知道是怎么样一个流程!

#10


我用的是动态申请的?

#11


lz的这个函数走完了吗?MiniportInitialize

#12


先看chipid吧

#13


"dm9000: Chip signature is 90000A46 "
LZ的chipid应该是已经读到了。
最近DM9000的驱动很火,呵呵

#14


谢谢楼上兄弟,我在csdn上看到你以前也做过这方面的移植,你指点下吗??我的chipid是90000a46?不知道对不对??

#15


不好意思,DM9000的CE驱动移植我没有做过。上次看到Ricky_hu大哥的帖子就顺便看了下代码。不过没有看懂。-_-||
90000a46好像应该是DM9000EP的ID。

#16


1)在系统中注册中断(连接到中断).对应NDIS库中的NdisMRegisterlnterrupt函数来实现中断的注册。
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中断我现在时一点都不明白了!还请你指点下!

#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
还请各位大侠分析下!!

#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

还请各位大侠献计献策呀!!

#22


和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
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去申请系统中断。

#24


LZ的cpu是什么型号?三星的还是marvell的?

#25


引用 22 楼 seemknow 的回复:
和我最初的问题差不多。dm9000的代码到处都是,挺乱的,配置信息用g_szDm9ConfigParams表和用注册表的代码我都看到过。所以你应该看一下你手里的程序中断、io地址是调用g_szDm9ConfigParams表里的还是用注册表里的,而且要和你的bsp里的对应起来。既然usb已经用了0x1a,{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")}就不对了。
NDIS会根据IrqNumber自己去申请SysIntr。

兄弟您好!我现在中断脚接的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}
};
请各位看看我的问题!

#27


没有人顶呀??各位大侠帮我看看什么问题吧??
我现在在调试信息中发现我申请中断后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函数最后的些信息。

#30


当初始化完成后有个DriverStart()。这里程序主动权基本都在c_DM9000的类里了。俺网上牛的文章在DeviceEnableInterrupt()启动中断后,接下来就是无休止的等待,接收,发送了。这样我根据他的文章简单分析后发现似乎我的驱动没什么问题?不过为什么我的后面的中断没有产生,调试信息总是
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;
看样子你是符合的啊!查询完然后发送!
我不知道你要什么结果?
有什么办法实现抓包吗?

#34


如果是2440的话还是看一下中断有没有处理好

#35


lz的问题搞定没有,到什么程度了?咱俩的问题估计差不多,呵呵。。。

你现在能保准你的硬件没有任何问题吗?能交流一下硬件的原理部分吗?

#36


不停的reset应该是总线时序配置的不好,另外看看中断的配置是否正确,用的哪个外部中断,在注册表里中断号写的是否正确,一般是写系统中断号的

#37


老问题新发现,上周在开发板上已经把Dm9000A驱动调试成功,这周在自己的硬件板子上调试,有遇到问题了,这次问题是CPU已经成功读取了Dm9000AEP芯片的ID,并且产生了中断。但是似乎数据没有收发,简单的就是我用抓包工具抓不到数据包,并且ping也ping不通,还请各路高手帮忙一起分析下!

#38


这个帖子终于可以结了,经过反复测试验证,看波形比较,最后换了块DM9000AEP芯片,竟然奇迹般的ko了!现在的困惑是为什么都是DM9000AEP 007版的芯片,为什么换了一块就好了呢??也不管了,让硬件区解决这个难题吧!

#39


该回复于2011-09-06 15:38:57被版主删除