当前位置:首页 > 作文大全 >

PCI设备电源管理驱动程序开发

发布时间: 2022-03-23 09:14:17 浏览:

摘 要:为使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-quan1,2, HU Jun1, XU Shu-yan1, XIE Ai-ping3

(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种系统状态S0~S5,S0称为工作状态,S1~S4属于睡眠状态。S5是关闭状态。设备按照ACPI规范定义了4种设备状态D0~D3。在D0状态中,设备处于全供电状态。在D3状态中,设备处于无供电(或最小限度的电流)状态。中间的D1和D2状态指出设备的2个不同睡眠状态。Microsoft规定了不同类型设备的类专用的电源需求,该规范要求每个设备至少要支持D0和D3两个状态[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\\n"));

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] . .

[2]李贵山,陈金鹏.PCI局部总线及其应用[M].西安:西安电子科技大学出版社,2003.

[3]Microsoft. Windows driver kit 7600[EB/OL].[ 2009-10-01] ..

[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] ..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] ..

[9]National Instruments. PCI Express 标准概述[EB/OL].[ 2007-12-14] . 2009.

[10]Microsoft. PCI, PCI-X, and PCI Express: Frequently Asked Questions[DB/OL]. [ 2005-10-18] . .

相关热词搜索: 程序开发 电源 驱动 设备 管理

版权所有:无忧范文网 2010-2024 未经授权禁止复制或建立镜像[无忧范文网]所有资源完全免费共享

Powered by 无忧范文网 © All Rights Reserved.。冀ICP备19022856号