|
WinCE的WiFi开关要依赖于WiFi模块的休眠功能还有模块厂商提供的驱动里面有支持电源管理功能。这里面用的是SDIO86861模块,WinCE5的系统,S3C2416的CPU。
头文件要包括:
#include <winioctl.h>
#include <ntddndis.h>
#include <nuiouser.h>
#include <pm.h>
关键部分代码:
BOOL CDevCtrlDlg::OpenWiFiDriver(BOOL b_OpenDriver)
{
if(b_OpenDriver)
{
//Delete Register
reg.Create(HKEY_LOCAL_MACHINE, _T("Comm\\NdisPower"));
reg.DeleteValue(_T("SDIO86861"));
Sleep(100);
//Power Up SDIO86861
DevicePowerNotify(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), D0, POWER_NAME);
SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), POWER_NAME, D0);
#if 0 //这里面因为电源开启之后驱动会自动把网卡开启,所以下面的操作可以不用。// Open NetworkCard
WCHAR Name[]=_T("SDIO86861\0");
HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) INVALID_HANDLE_VALUE);
if( m_hFileHandle == INVALID_HANDLE_VALUE )
{
RETAILMSG(1, (TEXT("Failed To CreateFile NDS0!\r\n")));
return FALSE;
}
else
{
RETAILMSG(1, (TEXT("Succeed To CreateFile NDS0!\r\n")));
//return TRUE;
}
BOOL SDIO86861Control=DeviceIoControl( m_hFileHandle, IOCTL_NDIS_BIND_ADAPTER, Name, sizeof(Name), NULL, 0, NULL, NULL );
if(SDIO86861Control==TRUE)
{
RETAILMSG(1, (TEXT("Succeed To Control SDIO86861!\r\n")));
CloseHandle( m_hFileHandle );
return TRUE;
}
else
{
RETAILMSG(1, (TEXT("Failed To Control SDIO86861!\r\n")));
CloseHandle( m_hFileHandle );
return FALSE;
}
#endif
return TRUE;
}
else
{
//Power Down SDIO86861
DevicePowerNotify(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), D4, POWER_NAME);
SetDevicePower(_T("{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\SDIO86861"), POWER_NAME, D4);
//Close NetworkCard
WCHAR Name[]=_T("SDIO86861\0");
HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) INVALID_HANDLE_VALUE);
if( m_hFileHandle == INVALID_HANDLE_VALUE )
{
RETAILMSG(1, (TEXT("Failed To CreateFile NDS0!\r\n")));
return FALSE;
}
else
{
RETAILMSG(1, (TEXT("Succeed To CreateFile NDS0!\r\n")));
}
BOOL SDIO86861Control=DeviceIoControl( m_hFileHandle, IOCTL_NDIS_UNBIND_ADAPTER, Name, sizeof(Name), NULL, 0, NULL, NULL );
if(SDIO86861Control==TRUE)
{
RETAILMSG(1, (TEXT("Succeed To Control SDIO86861!\r\n")));
CloseHandle( m_hFileHandle );
}
else
{
RETAILMSG(1, (TEXT("Failed To Control SDIO86861!\r\n")));
CloseHandle( m_hFileHandle );
return FALSE;
}
//写注册表,此注册表用于WiFi休眠唤醒之后是否启动WiFi
//[HKEY_LOCAL_MACHINE\Comm\NdisPower]
//"SDIO86861"=dword:00000004
reg.Create(HKEY_LOCAL_MACHINE, _T("Comm\\NdisPower"));
reg.SetDW(TEXT("SDIO86861"), 4);
return TRUE;
}
return FALSE;
}
|
|