摘 要:為使PCI設備具有電源管理功能,需要操作系統和驅動程序的配合來控制設備的電源狀態。通過研究Windows操作系統下系統和設備的電源策略,提出WDM驅動程序中處理系統電源IRP控制設備電源狀態的電源管理方案。說明處理電源管理IRP的工作機制,在基于Windows XP的系統上證明基于這種方案的WDM驅動程序運行穩定。
關鍵詞:電源管理; WDM; PCI; IRP
中圖分類號:TN302.7 文獻標識碼:A
文章編號:1004-373X(2010)14-0196-03
Driver Development of Power Management for PCI Device
CHENG Hai-quan1,2, HU Jun1, XU Shu-yan1, XIE Ai-ping3
(1. Space Optics Research Department, Changchun Institute of Optics, Fine Mechanics and Physics, Chinese Academy of Sciences, Changchun 130033, China;
2. Graduate School, Chinese Academy of Sciences, Beijing 100039, China;
3. College of Communication Engineering, Jilin University, Changchun 130032, China)
Abstract: The cooperation of operating system (OS) and driver is needed to control the power status of equipments for making PCI device to possess the function of power management. By the aid of the study on the power supply of systems and devices under Windows OS, a power management scheme is proposed to control the power status of equipments through processing system power IRP in WDM driver. WDM driver's mechanism of processing the power management IRP is elaborated. An experiment shows that WDM driver based on this scheme can work well with Windows XP.
Keywords: power management; WDM; PCI; IRP
0 引 言
隨著計算機軟硬件技術發展,要求設備能夠從待機或睡眠中快速啟動;要求在不使用時,移動設備能夠保持待機或休眠以節省電能的情況越來越多,傳統的冷啟動或熱啟動(復位啟動)已不能滿足人們的要求。微軟在Windows操作系統下設計了電源管理構架,為系統和設備的電源管理需求提供了廣泛的支持。目前Windows系統下的電源管理支持(advanced configuration and power interface ,ACPI) 高級配置和電源界面工業標準。
根據微軟的WDM驅動程序模型,很容易寫出具有一定功能的驅動程序,可是在設備運行了一段時間后,當系統要進入待機或休眠狀態時,就會發現桌面上彈出一個窗口——禁止待機。出現這種現象是由操作系統的默認電源管理策略所致,實際的原因在于驅動程序中沒有寫關于電源管理的代碼。本文中研究的WDM驅動就是為了使設備配合操作系統支持系統的待機和休眠。
1 系統和設備的電源策略
電源管理主要涉及操作系統和設備,系統電源狀態指示整個系統的總體電源使用,而設備電源狀態指示各個設備使用多少能量。PCI設備支持的電源等級是由PCI配置空間中的電源管理能力結構描述的[1]。PCI總線電源管理接口規范描述了電源管理能力結構寄存器和電源管理事件信號以及輔助電源,這些寄存器和信號讓操作系統可以控制PCI總線以及總線上每個功能的電源[2]。
電源管理器管理著系統級的電源策略,設備電源策略主負責設備的電源策略,它們互相配合才能完成系統和設備的電源狀態轉換。
1.1 系統和設備電源狀態
Windows操作系統定義了6種系統狀態S0~S5,S0稱為工作狀態,S1~S4屬于睡眠狀態。S5是關閉狀態。設備按照ACPI規范定義了4種設備狀態D0~D3。在D0狀態中,設備處于全供電狀態。在D3狀態中,設備處于無供電(或最小限度的電流)狀態。中間的D1和D2狀態指出設備的2個不同睡眠狀態。Microsoft規定了不同類型設備的類專用的電源需求,該規范要求每個設備至少要支持D0和D3兩個狀態[3]。
1.2 電源狀態轉換
應用程序請求、系統活動/電池級別或用戶按下電源按鈕會導致電源狀態的改變,例如系統在響應待機(standby)命令過程中,電源管理器首先向每個驅動程序發送帶有IRP_MN_QUERY_POWER副功能碼的IRP_MJ_POWER請求以詢問設備能否接受即將到來的電源關閉請求。如果所有驅動程序都同意,電源管理器將發送第2個帶有IRP_MN_SET_POWER副功能碼的電源管理IRP(I/O reequest package),然后驅動程序把其設備置入低電源狀態以響應這個IRP[3-4]。
前文中驅動程序不能待機的原因,也就在這里,不符合電源管理要求的驅動程序否決了電源管理器發來的要求改變電源狀態IRP,導致系統不能待機。
1.3 PCI總線驅動程序與電源管理能力結構
總線驅動程序在電源管理中發揮著重要作用,甚至可以是電源策略主[5]。PCI電源管理能力結構為操作系統提供了一種標準機制來控制設備的功耗管理。對于某一個PCI設備來講,設備本身直接由PCI總線驅動程序管理[3]。總線驅動程序通過存取PCI電源管理能力結構的寄存器直接控制設備運行,達到物理上改變設備的電源狀態。
2 驅動程序設計過程
要使WDM驅動程序具有電源管理功能,首先需要在DriverEntry入口函數中注冊IRP_MJ_POWER IRP的派遣函數例程[6-7]。
pDriverObject->MajorFunction[IRP_MJ_POWER]= PowerDispatchRoutine;
驅動程序的電源管理例程圍繞電源IRP_MJ_POWER IRP進行處理,這些例程處理這個IRP,并在需要時產生這個IRP。這個IRP有4個電源管理次功能代碼,如表1所示。
表1 IRP_MJ_POWER次功能代碼
次功能IRP代碼描述
IRP_MN_QUERY_
POWER查詢系統或設備狀態變化是否可行
IRP_MN_SET_POWER設置系統或設備電源狀態
IRP_MN_WAIT_WAKE喚醒計算機,響應1個外部事件
IRP_MN_POWER_SEQUENCE發送這個IRP,確定設備是否真正進入特定的電源狀態
大多數驅動程序要求必須處理表1中前2個IRP,具有喚醒能力的設備驅動要處理IRP_MN_WAIT_WAKE。這里對IRP_MN_WAIT_WAKE和IRP_MN_POWER_SEQUENCE做默認處理。
NTSTATUS PowerDispatchRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp) {
PAGED_CODE();
KdPrint((\"Enter PowerDispatchRoutine\\\\"));
NTSTATUS status = STATUS_SUCCESS;
switch(stack->MinorFunction) {
case IRP_MN_SET_POWER:
status = SetPowerState(fdo, Irp);
break;
case IRP_MN_QUERY_POWER:
status =QueryPowerState(fdo, Irp);
break;
case IRP_MN_WAIT_WAKE:
case IRP_MN_POWER_SEQUENCE:
default:
status = DispatchPowerDefault(fdo, Irp);
break;
}
return status;
}
電源管理器,維護一個單獨的電源IRP內部隊列,這保證在系統中只有一個“設置系統電源”IRP在處理,還保證每個設備只有一個“設置設備電源”IRP在運行[5]。
設備在完成一個電源IRP的處理時,必須告訴電源管理程序,使得它可以開始下一個電源IRP的處理。一般的默認處理就是簡單地把一個IRP沿設備棧向下傳遞(沒有完成例程),在跳過或復制當前IRP棧單元之前,應調用PoStartNextPowerIrp函數,如果使用完成例程,通常也必須調用PoStartNextPowerIrp。
NTSTATUS DispatchPowerDefault(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
PoStartNextPowerIrp(Irp);
IoSkipCurrentIrpStackLocation(Irp);
return PoCallDriver(pdx->LowerDeviceObject, Irp);
}
2.1 設備電源能力結構
PnP管理器在啟動設備后向設備發出查詢設備能力的請求,該請求的參數是一個DEVICE_CAPABILITIES結構,PCI總線驅動程序通常填充DEVICE_CAPABILITIES結構,該結構包含了與電源管理有關的幾個域。功能設備驅動程序應該首先向設備棧下轉發該IRP,等待IRP完成后,在必要時可以更改DEVICE_CAPABILITIES結構。
電源策略主負責檢查DEVICE_CAPABILITIES結構中的DeviceState域來確定每個系統電源狀態對應的設備電源狀態。這個結構中指出了對應于一個系統電源級設備可以處于的最高電源狀態。功能驅動程序可以在設備擴展中存儲這個結構中相關的域,在這個IRP完成以后,驅動程序不能改變它的內容[3]。
2.2 處理系統電源IRP
如果驅動程序收到一個“設置系統電源狀態”IRP,首先必須確定等效的設備電源狀態,如果當前設備電源狀態與要求的設備狀態不同,必須改變設備的狀態。通常總是把設備設置成與設備的當前活動、設備的電源能力以及系統的電源狀態相一致的最低電源狀態。
在向底層驅動程序傳遞“設置系統電源狀態”IRP之前改變設備狀態,在所有底層驅動程序處理后再給設備加電。必須給自己發出“設置設備電源狀態”IRP以改變設備電源狀態,然后等待這個IRP完成,然后可以繼續處理“設置系統電源狀態”IRP。以處理系統將要管理為例說明這個過程[4],如圖1所示。
圖1 降低系統電源IRP處理過程
2.3 處理設備電源IRP
如果收到“設置設備電源狀態”IRP,在調用低層驅動程序前,必須關閉設備的電源。在所有低層驅動程序啟動后,再啟動設備。這意味著應設置一個完成例程,并在那里給設備加電。這里以處理降低設備電源狀態為例[5]說明這個過程,如圖2所示。
圖2 降低設備電源IRP處理過程
2.4 實驗結果及分析
在Windows XP系統上加載采用這種電源管理方案的虛擬設備驅動程序,使系統從全功耗運行轉向休眠,再從休眠中恢復,用DebugView工具得到驅動打印的Log信息如下:
Enter HelloWDMPower
Power Manager query power state
Enter DispatchSystemPowerIrp
Enter CompletionSystemPowerRoutine
Send device power IRP according to system power IRP
Enter HelloWDMPower
Power Manager query power state
Enter DispatchDeviceQueryPower
Device power state query
newDeviceState = 4
Ready to pass down IRP for device power state query
Enter PowerDownPrepCallback
Enter DevicePowerCompleteCallback
Enter HelloWDMPower
System or device power is going to be change
Enter DispatchSystemPowerIrp
System power state change
newSystemState = 5
Enter CompletionSystemPowerRoutine
Send device power IRP according to system power IRP
Enter HelloWDMPower
System or device power is going to be change
Enter DispatchDeviceSetPower
Device power down
newDeviceState = 4
Ready to pass down IRP for device power state change
Enter PowerDownPrepCallback
Enter DevicePowerCompleteCallback
Enter HelloWDMPower
System or device power is going to be change
Enter DispatchSystemPowerIrp
System power state change
newSystemState = 1
Enter CompletionSystemPowerRoutine
Send device power IRP according to system power IRP
Enter HelloWDMPower
System or device power is going to be change
Enter DispatchDeviceSetPower
Device power up
newDeviceState = 1
Enter CompletionDevicePowerUp
Enter PowerUpCallback
Enter DevicePowerCompleteCallback
上述結果表明使用這種電源管理方案的驅動程序能和系統配合休眠,并能夠成功從休眠的狀態下啟動,另外具體應用到硬件上時要在說明的地方加上與設備相關的代碼。
3 結 語
本文介紹了PCI設備電源管理驅動程序的開發,電源管理在PCI規范中是可選的,現在PCI Express設備越來越多,而PCI Express設備必須實現電源管理能力。由于PCI Express與PCI軟件上兼容這里研究的電源管理方案同樣適用于PCI Express設備[8-10]。限于篇幅本文只給出了部分實現代碼,完整實例請參考WDK給出的toaster程序。
參考文獻
[1]PCI-SIG. PCI bus power management interface specification revision 1.2[EB/OL].[ 2004-03-03] . http://www.pcisig.com.
[2]李貴山,陳金鵬.PCI局部總線及其應用[M].西安:西安電子科技大學出版社,2003.
[3]Microsoft. Windows driver kit 7600[EB/OL].[ 2009-10-01] .http://www.microsoft.com.
[4]ONEY Walter. Programming the microsoft windows driver model[M]. US: Microsoft Press, 1999.
[5]Chris Cant.Windows WDM設備驅動程序開發指南[M].孫義,譯.北京:機械工業出版社,2000.
[6]PCI-SIG. PCI local bus specification v3.0[EB/OL].[ 2010-03-10] .http://www.pcisig.com.February 3,2004.
[7]張強.Compact PCl板卡硬件設計與傳輸速率測試[J].光學精密工程,2009,17(8):2049-2050.
[8]PCI-SIG. PCI.Express.Base.Specification.v1.1 [EB/OL].[ 2005-03-28] .http://www.pcisig.com.
[9]National Instruments. PCI Express 標準概述[EB/OL].[ 2007-12-14] . http://www.ni.com 2009.
[10]Microsoft. PCI, PCI-X, and PCI Express: Frequently Asked Questions[DB/OL]. [ 2005-10-18] . http://www.microsoft.com.