wince6.0下DM9000驱动里增加powerdown关机后省电模式的代码怎么没被执行?

zhengmeifu 2011-05-19 04:14:28
/********************************************************************************************
*
* DriverEntry
*
********************************************************************************************/

extern "C" NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NDIS_STATUS status;
NDIS_HANDLE hwrapper;
// NDIS40_MINIPORT_CHARACTERISTICS ndischar;
NDIS51_MINIPORT_CHARACTERISTICS DM9000Char; /* add by ZMF */

RETAILMSG(1,(TEXT("[dm9]:[CUSTOM_BOARD_STR]\r\n")));
RETAILMSG(1,(TEXT("[dm9] NewOBJ-2009 \r\n")));
NKDbgPrintfW(TEXT("[dm9] NewOBJ-2009 %s \r\n"), DRIVER_VERSION);
NKDbgPrintfW(TEXT("[dm9] NewOBJ-2009 %s \r\n"), CUSTOM_BOARD_STR);

PUTS(("[dm9] <NDIS40_MINIPORT Driver>\r\n")); //PUTS(("<Davicom DM9000/9000A/9010 driver v2.08_n_later for WinCE 4.2/5.0/6.0>\r\n"));

NdisMInitializeWrapper(
&hwrapper,
pDriverObject,
pRegistryPath,
NULL);

memset((void*)&DM9000Char,0,sizeof(DM9000Char));
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.MajorNdisVersion = PRJ_NDIS_MAJOR_VERSION;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.MinorNdisVersion = PRJ_NDIS_MINOR_VERSION;

DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.InitializeHandler = MiniportInitialize;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.ResetHandler = MiniportReset;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.HaltHandler = MiniportHalt;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.ISRHandler = MiniportISRHandler;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.SendHandler = MiniportSend;
// ndischar.Ndis30Chars.DisableInterruptHandler =MiniportDisableInterrupt;
// ndischar.Ndis30Chars.EnableInterruptHandler=MiniportEnableInterrupt;
DM9000Char.AdapterShutdownHandler=MiniportHalt; 这个函数里就是关机后想要被执行的函数。这个函数定义在下面。
if((status = NdisMRegisterMiniport(
hwrapper,
(PNDIS_MINIPORT_CHARACTERISTICS)&DM9000Char,
sizeof(DM9000Char)) != NDIS_STATUS_SUCCESS))
{
NdisTerminateWrapper(hwrapper,NULL);
return status;
}

#ifndef IMPL_DLL_ENTRY
INIT_EXCEPTION();
#endif

return NDIS_STATUS_SUCCESS;

}
上面说的MiniportHalt的定义:
VOID MiniportHalt(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverHalt();
}
DriverHalt定义如下:/* ADD BY ZMF FOR PM */
void C_DM9000::DeviceHalt(void)
{

NKDbgPrintfW(TEXT("[dm9]ZMF: DeviceHalt:[dm9] -- \r\n"));

DeviceWritePort(DM9_GPR, 0x01);
DeviceWritePort(DM9_NCR, 0xB800);
DeviceWritePort(DM9_SCTCR,0x01);
// announce shutdown
m_bShutdown = 1;
DeviceDisableInterrupt();
ID_CUSTOM_INT_DIS

}
/* ADD BY ZMF FOR PM */
问题是怎么关机后没有被执行?我在注册表里也增加了ICLASS,如下:

[HKEY_LOCAL_MACHINE\Comm\DM9000]
"DisplayName"="DM9000 Fast Ethernet Adapter"
"Group"="NDIS"
"ImagePath"="DM9000.dll"
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic ADD BY ZMF

[HKEY_LOCAL_MACHINE\Comm\DM9000\Linkage]
"Route"=multi_sz:"DM9000"

[HKEY_LOCAL_MACHINE\Comm\DM9000\Parms]
"BusNumber"=dword:0
"BusType"=dword:0

[HKEY_LOCAL_MACHINE\Comm\DM9000\Parms\TcpIp]
"EnableDHCP"=dword:1
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\Suspend\{A32942B7-920C-486b-B0E6-92A702A99B35}]
"Default"=dword:4 ; D3
哪位大侠能指导一下?跪谢!
...全文
297 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengmeifu 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kj852284877 的回复:]
联系我 给给你解决 QQ1667698625
[/Quote]
你是销售人员吧?没法解决吧?都这么久了没音信。
zhengmeifu 2011-05-31
  • 打赏
  • 举报
回复
自己顶一下,网友们,谁做过网卡的休眠和唤醒呀?指导一二呀。
fqayst 2011-05-31
  • 打赏
  • 举报
回复
dm9000的wince驱动不是流驱动,休眠的时候好像就不会调用powerdown函数,流驱动休眠的时候是会调用powerdown函数的。网卡的休眠和唤醒,最近我也在弄,不过也没什么进展。
zhengmeifu 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fqayst 的回复:]
DM9000的注册表里面加入电源管理的IClass键值
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic
试试。
[/Quote]
有加呀,兄弟。可能是我不懂NDIS的工作机制呀。谢谢!
fqayst 2011-05-23
  • 打赏
  • 举报
回复
DM9000的注册表里面加入电源管理的IClass键值
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic
试试。
zhengmeifu 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 billyhe1983 的回复:]
DM9000没做过这个,但不管哪个设备,首先要确定的是,该设备是否支持休眠/唤醒功能
[/Quote]
要怎么确定呢?我看dm9000这个驱动是支持电源管理的,因为有DM9000Char.AdapterShutdownHandler这个结构体的域。我只要把这个shutdownHandler函数告诉它就行了。
用心飞翔 2011-05-20
  • 打赏
  • 举报
回复
DM9000没做过这个,但不管哪个设备,首先要确定的是,该设备是否支持休眠/唤醒功能

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧