WDF驱动开发-电源策略(二)

支持单组件设备呈现单个或多个功能性电源状态

驱动程序可以为组件定义一个或多个功能电源状态,并注册电源管理框架 (PoFx) 在组件的 Fx 状态更改或其活动/空闲条件更改时调用的回调函数。 从 UMDF 版本 2.0 开始,单组件设备的 UMDF 驱动程序可以定义单个功能电源状态 (F0) 。

若要实现对单组件设备的 Fx 状态支持,必须在设备首次启动之前或期间按顺序执行以下操作。

1. 此步骤仅适用于 KMDF 驱动程序。 调用 WdfDeviceWdmAssignPowerFrameworkSettings 以指定 WDF 在注册 PoFx 时使用的 power Framework 设置。 在驱动程序调用 WdfDeviceWdmAssignPowerFrameworkSettings 时提供的WDF_POWER_FRAMEWORK_SETTINGS结构中,驱动程序可以提供指向多个回调函数的指针。 如果驱动程序仅支持单个功能电源状态 (F0) ,则此步骤是可选的;

2. 此步骤适用于 KMDF 驱动程序和 UMDF 驱动程序。 调用 WdfDeviceAssignS0IdleSettings 并将WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS结构的 IdleTimeoutType 字段设置为 SystemManagedIdleTimeout 或 SystemManagedIdleTimeoutWithHint。 这样做会导致 WDF 注册到 PoFx。对于 KMDF 驱动程序,在注册到 PoFx 时,框架使用驱动程序在调用 WdfDeviceWdmAssignPowerFrameworkSettings 时WDF_POWER_FRAMEWORK_SETTINGS提供的信息;

由于设备可以多次启动(例如,在资源重新均衡的情况下),因此驱动程序可能会在 EvtDeviceSelfManagedIoInit 回调函数中执行上述步骤。 如果驱动程序已注册 EvtDeviceSelfManagedIoInit 回调函数,则框架在框架首次调用驱动程序的 EvtDeviceD0Entry 回调函数后,为每个设备调用一次该回调函数。

本文其余信息仅适用于 KMDF 驱动程序。

通电

当驱动程序调用 WdfDeviceWdmAssignPowerFrameworkSettings 时,它可以提供指向 EvtDeviceWdmPostPoFxRegisterDevice 回调函数的指针。

框架在向 PoFx 注册后调用驱动程序的 EvtDeviceWdmPostPoFxRegisterDevice 回调函数。 下面是典型启动序列的示例:

  • EvtDevicePrepareHardware  //驱动程序提供 EvtDeviceWdmPostPoFxRegisterDevice 回调,如果它必须使用 POHANDLE 执行任何其他操作进行 Power Framework 注册。 例如,它可以指定延迟、驻留和唤醒要求。
  • EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  • EvtInterruptEnable
  • EvtDeviceWdmPostPoFxRegisterDevice // PoFx 句柄可用

驱动程序还可以使用 POHANDLE 与 PoFx 交换电源控制请求:

  • 若要向 PoFx 发送电源控制请求,驱动程序提供 EvtDeviceWdmPostPoFxRegisterDevice 回调函数,然后使用生成的 POHANDLE 调用 PoFxPowerControl;
  • 为了执行 PoFx 请求的电源控制操作,驱动程序在其WDF_POWER_FRAMEWORK_SETTINGS结构中提供 PowerControlCallback 回调例程;
关机

WDF 在删除 PoFx 的指定注册之前,调用 EvtDeviceWdmPrePoFxUnregisterDevice 回调函数。

驱动程序可以在它提供给 WdfDeviceWdmAssignPowerFrameworkSettings 的 WDF_POWER_FRAMEWORK_SETTINGS 结构中提供指向 ComponentIdleStateCallback 例程的指针。 PoFx 调用此例程以通知驱动程序指定组件的 Fx 电源状态的挂起更改。 在此回调例程中,驱动程序可以执行与功能状态更改相关的特定于硬件的操作。

例如,在将组件转换为低功耗 Fx 状态之前,驱动程序可能会保存硬件状态并禁用中断和 DMA。 驱动程序调用 WdfInterruptReportInactive 以通知系统中断不再处于活动状态。 在 F 状态转换期间关闭中断可能会降低系统整体功耗。

驱动程序还可以在其WDF_POWER_FRAMEWORK_SETTINGS结构中提供指向 ComponentIdleConditionCallback 例程的指针。 PoFx 调用此例程以通知驱动程序组件已变为空闲状态。 在此例程中,驱动程序开始停止其电源管理的队列和自我管理的 I/O 操作:

1. 为每个设备的电源托管队列调用 一次 WdfIoQueueStop 。 在每次调用 WdfIoQueueStop 时,提供 EvtIoQueueState 回调。 通常,驱动程序从 ComponentIdleConditionCallback 中调用 WdfIoQueueStop。

2. 确保从每个电源托管队列中调度到驱动程序的请求快速完成。 根据驱动程序,这可能涉及以下部分或全部内容:

  • 如果驱动程序长时间未保留请求,并且未将其转发到这样做的 I/O 目标,请继续执行步骤 3。
  • 如果驱动程序长时间保留某些请求,请将这些请求重新排队到手动队列。 然后,在其 ComponentActiveConditionCallback 例程中,驱动程序可以检索请求。
  • 如果驱动程序将某些请求转发到长时间保留这些请求的 I/O 目标,请取消这些请求。 重新提交 ComponentActiveConditionCallback 中的请求。

3. 每个队列停止后,框架将调用 EvtIoQueueState。 如果驱动程序正在停止多个电源管理的队列,框架会多次调用 EvtIoQueueState ,每个队列调用一次。

驱动程序必须在调用最后一个 EvtIoQueueState 函数后调用 PoFxCompleteIdleCondition。 例如,驱动程序可以从最后一个 EvtIoQueueState 内部进行此调用。

为了确定哪个调用是最后一次,驱动程序可以使用计数器来跟踪框架调用 EvtIoQueueState 的次数。 下面是典型关机序列的示例:

  • ComponentIdleConditionCallback
  • ComponentIdleStateCallback
  • EvtInterruptDisable
  • EvtDeviceD0Exit

在 ComponentActiveConditionCallback 中重启电源管理的队列和自我管理的 I/O 操作。

如果驱动程序以前名为 WdfInterruptReportInactive,则通过从 ComponentActiveConditionCallback 或 ComponentIdleStateCallback 调用 WdfInterruptReportActive 重新启用非活动中断。

支持多组件设备呈现单个或多个功能性电源状态

多组件设备的 KMDF 驱动程序可以为每个组件定义一个或多个功能电源状态。

在这种情况下,驱动程序直接注册到电源管理框架 (PoFx) 。 若要指定 WDF 不应注册到 PoFx,驱动程序调用 WdfDeviceAssignS0IdleSettings,并将 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的 IdleTimeoutType 成员设置为 DriverManagedIdleTimeout。 通常,驱动程序从其 EvtDriverDeviceAdd 回调函数调用此方法。

接下来,驱动程序必须注册到 PoFx。 为此,驱动程序调用 PoFxRegisterDevice ,然后 调用 PoFxStartDevicePowerManagement。 首次启动设备时,驱动程序只能向 PoFx 注册一次。 执行此操作的一种方法是从驱动程序提供的 EvtDeviceSelfManagedIoInit 函数调用这些例程。 EvtDeviceSelfManagedIoInit 仅在首次启动设备时调用。

删除设备后,驱动程序必须调用 PoFxUnregisterDevice 才能从 PoFx 注销设备。 若要仅注销一次,建议驱动程序从驱动程序提供的 EvtDeviceSelfManagedIoFlush 函数调用此例程。 仅在删除设备时调用 EvtDeviceSelfManagedIoFlush。 通过在 EvtDeviceSelfManagedIoFlush 中注销,驱动程序在睡眠和重新平衡转换期间保留电源注册,并且不必为在这些转换期间保持挂起的 I/O 请求的电源引用。

当驱动程序调用 PoFxRegisterDevice 时,它会收到一个电源注册句柄 (POHANDLE) ,该句柄可用于直接与 PoFx 交互,如以下所述:

  • 对 I/O 请求与组件电源状态进行协调
  • 报告当系统回到 S0 状态时设备开机
  • 支持多组件设备空闲时关闭电源

 此外,驱动程序可以直接调用 电源框架例程 来发送电源控制请求,并指定延迟、驻留和唤醒要求。

报告当系统回到 S0 状态时设备开机

这部分讨论的内容仅适用于 KMDF,当系统从低功耗状态返回到其工作 (S0) 状态时,PnP 管理器会发送系统设置电源 IRP (IRP_MN_SET_POWER) ,以将设备返回到其工作 (D0) 状态。 WDF 处理系统设置电源 IRP。 但是,由于在多组件方案中,驱动程序已直接注册到电源管理框架 (PoFx) ,因此当设备在电源状态D0 完全转换时,驱动程序必须调用 PoFxReportDevicePoweredOn 。 驱动程序可以通过注册 WDM 预处理例程来实现此目的,以在系统设置电源 IRP 到达时接收通知。

驱动程序可以使用以下过程:

1. 调用 WdfDeviceInitAssignWdmIrpPreprocessCallback 为IRP_MN_SET_POWER注册 EvtDeviceWdmIrpPreprocess 回调函数。 在回调中,驱动程序在其设备扩展中设置一个标志,以指示它需要从其下一个 EvtDeviceD0Entry 回调调用 PoFxReportDevicePoweredOn;
2. 在 EvtDeviceD0Entry 中,如果设置了标志,驱动程序将清除标志并调用 PoFxReportDevicePoweredOn;
3. 驱动程序还会检查 EvtDeviceSelfManagedIoFlush 中的标志。 如果设置了标志,则设备无法返回到 D0,并且设备已被删除。 在这种情况下,驱动程序调用 PoFxReportDevicePoweredOn ,然后注销 Power Framework;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式——创建型模式

设计模式 文章目录 设计模式创建型模式单例模式 [1-小明的购物车](https://kamacoder.com/problempage.php?pid1074)工厂模式 [2-积木工厂](https://kamacoder.com/problempage.php?pid1076)抽象⼯⼚模式 [3-家具工厂](https://kamacoder.com/problempage.php?pid1077)建造者…

JVMの静、动态绑定异常捕获JIT即时编译

在说明静态绑定和动态绑定之前,我们首先要了解在字节码指令的层面,JVM是如何调用方法的: 例如我有以下的代码,很简单就是在main方法中调用了另一个静态方法: public class MethodTest {public static void main(Strin…

详细说说机器学习在交通领域的应用

机器学习在交通领域的应用广泛而深入,以下是对其应用的详细归纳和分点表示: 自动驾驶技术: 自动驾驶技术是机器学习在交通领域中最具代表性的应用之一。通过大量数据的训练,自动驾驶车辆能够在不同的交通环境和场景中完成智能化的…

论文阅读——MIRNet

项目地址: GitHub - swz30/MIRNet: [ECCV 2020] Learning Enriched Features for Real Image Restoration and Enhancement. SOTA results for image denoising, super-resolution, and image enhancement.GitHub - soumik12345/MIRNet: Tensorflow implementation…

结构化查询语言SQL

SQL SQL 是 Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 关系数据库原型 System R 的原型关系语言,实现了关系数据库中的信息检索。 SQL 分类 SQL是结构化查询语言(Structure Query Lang…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值(数字&#xff…

C语言指针与数组的区别

在C语言中,指针和数组虽然在很多情况下可以互换使用,但它们在概念上和行为上存在一些区别。下面详细解释这些区别: ### 数组 1. **固定大小**:数组在声明时必须指定大小,这个大小在编译时确定,之后不能改…

电子设计入门教程硬件篇之集成电路IC(二)

前言:本文为手把手教学的电子设计入门教程硬件类的博客,该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC,这些集成电路IC包括:逻辑门芯片、运算放大器与电子零件。电子设计…

31、matlab卷积运算:卷积运算、二维卷积、N维卷积

1、conv 卷积和多项式乘法 语法 语法1:w conv(u,v) 返回向量 u 和 v 的卷积。 语法2:w conv(u,v,shape) 返回如 shape 指定的卷积的分段。 参数 u,v — 输入向量 shape — 卷积的分段 full (默认) | same | valid full:全卷积 ‘same…

双系统 Ubuntu无静态IP

需求:需要静态IP固定到网卡上 问题:只有连接有线或无线,才会有显示网卡,怎么办 习惯了windows装vmvare后装其他系统做实验,认为自动会有一些网卡 ,但是我装了双系统后(Windows11/Ubuntu22.04&am…

UnityXR Interaction Toolkit 如何使用XRHand手部识别

前言 Unity的XR Interaction Toolkit是一个强大的框架,允许开发者快速构建沉浸式的VR和AR体验。随着虚拟现实技术的发展,手部追踪成为了提升用户交互体验的关键技术之一。 本文将介绍如何在Unity中使用XR Interaction Toolkit实现手部识别功能。 准备工作 在开始之前,请…

46.SQLserver中按照多条件分组:查询每个地方的各种水果的种植数量,新增时,一个地方同时有几种水果,只插入一条记录,同时多种水果之间使用|隔开

1.SQLserver中按照多条件分组 ,分组条件包括(一个字段使用|进行分割,如:apple|orange,查询时,apple和orange分别对应一条数据) 例如:SQL如下: SELECT FROM ( SELECT CDFBM 地方编码…

Mybatis-plus 自动填充字段

需要注意的是,MetaObjectHandler 对Mybatis-plus 自动生成的 CRUD 方法起作用,对于手写 XML 文件的 insert、update 语句,不会直接起作用。 package com.ruoyi.common.mybatisplus;import com.baomidou.mybatisplus.core.handlers.MetaObjec…

python虚拟环境下 .gitignore 要忽略什么

在Python虚拟环境中,.gitignore 文件用于告诉 Git 哪些文件和目录是不需要添加到版本控制中的。以下是一个典型的 Python 虚拟环境中 .gitignore 文件的内容: # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class# C extension…

统信UOS1070上配置文件管理器默认属性01

原文链接:统信UOS 1070上配置文件管理器默认属性01 Hello,大家好啊!今天给大家带来一篇关于在统信UOS 1070上配置文件管理器默认属性的文章。文件管理器是我们日常操作系统使用中非常重要的工具,了解如何配置其默认属性可以极大地…

apache poi 插入“下一页分节符”并设置下一节纸张横向的一种方法

一、需求描述 我们知道,有时在word中需要同时存在不同的节,部分页面需要竖向、部分页面需要横向。本文就是用java调用apache poi来实现用代码生成上述效果。下图是本文实现的效果,供各位看官查阅,本文以一篇课文为例,…

小陈的容器镜像站

小陈的容器镜像站 背景 由于不可抗力原因建立了镜像站,支持多平台容器镜像代理。 镜像使用优先级:官方地址 > 镜像地址 > 阿里云地址 替换地址 gcr.io >>>>> gcr.chenby.cnquay.io >>>>> quay.chenby.cng…

整理好了!2024年最常见 20 道分布式、微服务面试题(五)

上一篇地址:整理好了!2024年最常见 20 道分布式、微服务面试题(四)-CSDN博客 九、什么是API网关,它在微服务架构中扮演什么角色? API网关(Application Programming Interface Gateway&#xf…

数据库的基础概念

1、什么是数据库? 引用百度词条 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合,可视为电子化的文件柜。   数据库技术是…

Linux系统推出VB6开发IDE了?Gambas,Linux脚本编写

第一个Linux程序,加法计算加弹窗对话框,Gambas,linux版的类似VB6的IDE开发环境 一开始想用VB6的Clng函数转成整数,没这函数。 输入3个字母才有智能提示,这点没做好 没有msgbox函数,要用messagebox.warning 如果可以添加函数别名就…