最近在做電源管理,初識 WINCE 對電源管理只知道 ON????? ?UserIdle????? SystemIdle??? Suspend? 這幾種狀態(tài)(初學,寫錯希望高手指點)。
?
最初的想法是在?? UserIdle 的地方只關(guān)背光,但是不知道如何下手,還是 GOOGLE 幫了大忙,不斷的 GOGO 哈哈。
最后發(fā)現(xiàn)
建立支持電源管理的設(shè)備驅(qū)動
為了建立一個能夠?qū)υO(shè)備進行電源管理的驅(qū)動程序,我們必須首先建立一個支持non-COM-related設(shè)備接口的驅(qū)動程序。non-COM-related設(shè)備接口標明這個設(shè)備是支持電源管理的。可以用以下方式建立這種接口:
????l????????? 可以在注冊表中,用激活設(shè)備所用的IClass值定義接口;
????l????????? 可以在驅(qū)動程序的Init函數(shù)中,設(shè)置注冊表中的IClass值;
????l????????? 可以使用ActivateDeviceEx的參數(shù)REGINI設(shè)置IClass值;
????l????????? 可以在驅(qū)動程序中顯示地調(diào)用AdvertiseInterface函數(shù)。
電源管理器通過IOCTL代碼來和驅(qū)動通信。通常情況下,當一個驅(qū)動程序聲明為支持電源管理時,驅(qū)動只需要在DeviceIoControl中實現(xiàn)電源的管理即可。下面是電源管理器用來與驅(qū)動通信的IOCTL代碼:
????l????????? IOCTL_POWER_CAPABILITIES:代表電源管理器請求設(shè)備驅(qū)動返回設(shè)備支持的電源狀態(tài)及相關(guān)特征;
????l????????? IOCTL_POWER_SET:請求驅(qū)動更新設(shè)備的電源狀態(tài);
????l????????? IOCTL_POWER_QUERY:電源管理器詢問設(shè)備是否準備好進行狀態(tài)切換;
????l????????? IOCTL_POWER_GET:請求驅(qū)動返回當前設(shè)備的電源狀態(tài);
????l????????? IOCTL_REGISTER_POWER_RELATIONSHIP:通知父設(shè)備注冊所有它所控制的設(shè)備。
其中IOCTL_POWER_CAPABILITIES和IOCTL_POWER_SET是支持電源管理的設(shè)備驅(qū)動必須實現(xiàn)的。
?
?
可以知道系統(tǒng)在進入 UserIdle 的時候會給流驅(qū)動發(fā)一個IOCTL_POWER_SET消息,通過IOCTL 來接收。
但是只設(shè)置 IOCTL 的 IOCTL_POWER_SET 消息是不夠的,
在流驅(qū)動的注冊表里面需要加入 PM類入口 "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
這樣基本 OK 了, 有待測試,
現(xiàn)介紹到這里,睡覺啦,
明天繼續(xù)。
?
?
?
?