Compatibilidad con dispositivos Single-Component con estados de energía funcional único o múltiple

Un controlador KMDF para un dispositivo de un solo componente puede definir uno o varios estados de energía funcionales para el componente y registrar las funciones de devolución de llamada a las que llama el marco de administración de energía (PoFx) cuando cambia el estado Fx del componente o cambia su condición activa/inactiva. A partir de la versión 2.0 de UMDF, un controlador UMDF para un dispositivo de un solo componente puede definir un único estado de alimentación funcional (F0).

Para obtener más información sobre PoFx, consulte Introducción a Power Management Framework.

Para implementar la compatibilidad con el estado Fx para un dispositivo de un solo componente, debe hacer lo siguiente en orden antes o durante la primera vez que se inicie un dispositivo.

  1. Este paso es solo para controladores KMDF. Llame a WdfDeviceWdmAssignPowerFrameworkSettings para especificar la configuración de Power Framework que usa WDF al registrarse con PoFx. En la estructura WDF_POWER_FRAMEWORK_SETTINGS que proporciona el controlador cuando llama a WdfDeviceWdmAssignPowerFrameworkSettings, el controlador puede proporcionar punteros a varias funciones de devolución de llamada. Si el controlador solo admite un estado de alimentación funcional (F0), este paso es opcional.

  2. Este paso se aplica a los controladores kmdf y a los controladores UMDF. Llame a WdfDeviceAssignS0IdleSettings y establezca el campo IdleTimeoutType de la estructura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS en SystemManagedIdleTimeout o SystemManagedIdleTimeoutWithHint. Al hacerlo, WDF se registra con PoFx.

    En el caso de los controladores KMDF, al registrarse con PoFx, el marco usa la información que el controlador proporcionó en WDF_POWER_FRAMEWORK_SETTINGS cuando llamó a WdfDeviceWdmAssignPowerFrameworkSettings.

Dado que un dispositivo puede iniciarse más de una vez, por ejemplo, en caso de reequilibrio de recursos, un controlador podría realizar los pasos anteriores en la función de devolución de llamada EvtDeviceSelfManagedIoInit . Si el controlador ha registrado una función de devolución de llamada EvtDeviceSelfManagedIoInit , el marco lo llama una vez para cada dispositivo, después de que el marco haya llamado a la función de devolución de llamada EvtDeviceD0Entry del controlador por primera vez.

El resto de la información de este tema solo se aplica a los controladores kmdf.

Encendiendo

Cuando el controlador llama a WdfDeviceWdmAssignPowerFrameworkSettings, puede proporcionar un puntero a una función de devolución de llamada EvtDeviceWdmPostPoFxRegisterDevice .

El marco llama a la función de devolución de llamada EvtDeviceWdmPostPoFxRegisterDevice del controlador después de que el marco se haya registrado con PoFx. Este es un ejemplo de una secuencia típica de encendido:

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. El identificador EvtDeviceWdmPostPoFxRegisterDevice // PoFx está disponible

El controlador proporciona la devolución de llamada EvtDeviceWdmPostPoFxRegisterDevice si debe realizar operaciones adicionales mediante poHANDLE para el registro de Power Framework. Por ejemplo, podría especificar los requisitos de latencia, residencia y reactivación. Para obtener más información sobre las rutinas que usan POHANDLE, consulte Rutinas de administración de energía de dispositivos.

El controlador también puede usar poHANDLE para intercambiar solicitudes de control de energía con PoFx:

Apagar

WDF llama a la función de devolución de llamada EvtDeviceWdmPrePoFxUnregisterDevice antes de eliminar un registro especificado con PoFx.

El controlador puede proporcionar un puntero a una rutina ComponentIdleStateCallback en la estructura WDF_POWER_FRAMEWORK_SETTINGS que proporciona a WdfDeviceWdmAssignPowerFrameworkSettings. PoFx llama a esta rutina para notificar al controlador un cambio pendiente al estado de energía Fx del componente especificado. En esta rutina de devolución de llamada, el controlador puede realizar operaciones específicas del hardware relacionadas con el cambio de estado funcional.

Por ejemplo, antes de realizar la transición de un componente a un estado Fx de bajo consumo, un controlador podría guardar el estado de hardware y deshabilitar interrupciones y DMA. El controlador llama a WdfInterruptReportInactive para informar al sistema de que la interrupción ya no está activa. Desactivar interrupciones durante las transiciones de estado F puede reducir el consumo general de energía del sistema.

El controlador también puede proporcionar un puntero a una rutina ComponentIdleConditionCallback en su estructura WDF_POWER_FRAMEWORK_SETTINGS . PoFx llama a esta rutina para notificar al controlador que un componente está inactivo. En esta rutina, el controlador comienza el proceso de detener sus colas administradas por energía y las operaciones de E/S autoadministrados:

  1. Llame a WdfIoQueueStop una vez para cada una de las colas administradas por energía del dispositivo. En cada llamada a WdfIoQueueStop, proporcione una devolución de llamada EvtIoQueueState . Normalmente, el controlador llama a WdfIoQueueStop desde ComponentIdleConditionCallback.

  2. Asegúrese de que las solicitudes que se envían al controlador desde cada una de las colas administradas por energía se completan rápidamente. En función del controlador, esto puede implicar algunos o todos los siguientes elementos:

    • Si el controlador no contiene solicitudes durante un tiempo prolongado y no las reenvía a un destino de E/S que lo hace, continúe con el paso 3.
    • Si el controlador contiene determinadas solicitudes durante un tiempo prolongado, vuelva a poner estas solicitudes en una cola manual. En su rutina ComponentActiveConditionCallback , el controlador puede recuperar las solicitudes.
    • Si el controlador reenvía determinadas solicitudes a un destino de E/S que los contiene durante un tiempo prolongado, cancele estas solicitudes. Vuelva a enviar las solicitudes en ComponentActiveConditionCallback.
  3. Cuando se ha detenido cada cola, el marco llama a EvtIoQueueState. Si el controlador detiene varias colas administradas por energía, el marco llama a EvtIoQueueState varias veces, una vez para cada cola.

    El controlador debe llamar a PoFxCompleTeIdleCondition después de llamar a la última función EvtIoQueueState . Por ejemplo, el controlador podría realizar esta llamada desde el último EvtIoQueueState.

    Para determinar qué llamada es la última, el controlador puede usar un contador para realizar un seguimiento del número de veces que el marco ha llamado EvtIoQueueState. En el ejemplo Singlecomp se muestra esta técnica. Este ejemplo está disponible a partir del Windows 8 WDK.

Este es un ejemplo de una secuencia típica de apagado:

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

Reinicie las colas administradas por energía y las operaciones de E/S autoadministrados en ComponentActiveConditionCallback.

Si el controlador anteriormente llamado WdfInterruptReportInactive, vuelva a habilitar las interrupciones inactivas mediante una llamada a WdfInterruptReportActive desde ComponentActiveConditionCallback o ComponentIdleStateCallback.