Compartir a través de


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 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 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 energía 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 el dispositivo.

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

  2. Este paso se aplica a los controladores de 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 en 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 reasignación de recursos, es posible que un controlador realice los pasos previos en la función de devolución de llamada EvtDeviceSelfManagedIoInit. Si el conductor ha registrado una función de devolución de llamada EvtDeviceSelfManagedIoInit, el marco la llama una vez para cada dispositivo, después de que el marco haya llamado al controlador de la función de devolución de llamada por primera vez Evtdeviced0entrada.

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

Encendido

Cuando el conductor llama a la Configuración de wdfdevicewdmassignpowerframeworks, puede proporcionar un puntero a la función de devolución de llamada EvtDeviceWdmPostPoFxRegisterDevice.

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

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

El conductor proporciona la devolución de llamada EvtDeviceWdmPostPoFxRegisterDevice si debe realizar operaciones adicionales usando el controlador POHANDLE para el registro del marco de poder. Por ejemplo, podría especificar los requisitos de latencia, permanencia 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:

Apagado

La función de devolución de llamadaWDF llama al 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 las 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 se ha inactivo. En esta rutina, el controlador comienza el proceso de detener sus colas administradas por energía y operaciones de E/S auto gestionadas:

  1. Llamada WdfIoQueueStop una vez para cada una de las colas administradas por energía del dispositivo. En cada llamada a WdfIoQueueStop, la devolución de llamada de suministro a EvtIoQueueStato. 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 la energía se completen rápidamente. Dependiendo del controlador, esto puede implicar algunas o todas las siguientes:

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

    El conductor debe llamar a PoFxCompleteIdleCondition después que se ha llamado a la función última EvtIoQueueStato por última vez. 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 WDK de Windows 8.

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 auto gestionadas en ComponentActiveConditionCallback.

Si el controlador llamó previamente a WdfInterruptReportInactive, vuelva a habilitar las interrupciones inactivas llamando a WdfInterruptReportActive desde ComponentActiveConditionCallback o ComponentIdleStateCallback.