Compartir a través de


Sincronización de interrupciones para controladores de controlador GPIO

Los controladores del controlador GPIO pueden llamar a los métodos de GPIO_CLX_AcquireInterruptLock y GPIO_CLX_ReleaseInterruptLock para adquirir y liberar bloqueos de interrupción implementados internamente por la extensión de marco GPIO (GpioClx). El código de controlador que se ejecuta en IRQL = PASSIVE_LEVEL puede llamar a estos métodos para sincronizar con la rutina del servicio de interrupción (ISR) en GpioClx. GpioClx dedica un bloqueo de interrupción independiente a cada banco de patillas del controlador GPIO.

Si los registros de hardware del controlador GPIO están asignados a la memoria, el ISR de GpioClx llama a determinadas funciones de devolución de llamada de eventos implementadas por el controlador en DIRQL; GpioClx llama al resto de las funciones de devolución de llamada en PASSIVE_LEVEL. Una función de devolución de llamada de nivel pasivo que accede a un banco de registros podría necesitar usar un bloqueo de interrupción para sincronizar con las funciones de devolución de llamada que se ejecutan en DIRQL y que acceden a los mismos registros.

Por ejemplo, el CLIENT_EnableInterrupt de nivel pasivo y CLIENT_DisableInterrupt funciones de devolución de llamada modifican la configuración de hardware que afecta al funcionamiento de otras rutinas de devolución de llamada relacionadas con interrupciones que se ejecutan en DIRQL. Las funciones CLIENT_EnableInterrupt y CLIENT_DisableInterrupt suelen usar los bloqueos de interrupción del banco para sincronizar sus accesos de registro.

GpioClx serializa automáticamente las devoluciones de llamada relacionadas con interrupciones y relacionadas con E/S que se producen en DIRQL. GpioClx adquiere el bloqueo de interrupción para el banco de destino antes de llamar a una función de devolución de llamada en DIRQL y libera el bloqueo después de que la función devuelva. Se trata de un error para una función de devolución de llamada a la que se llama en DIRQL para intentar volver a adquirir el bloqueo de interrupción bancaria mediante una llamada a GPIO_CLX_AcquireInterruptLock.

De forma similar, GpioClx serializa automáticamente las devoluciones de llamada que se producen en PASSIVE_LEVEL. GpioClx implementa internamente un bloqueo de espera por banco. GpioClx adquiere el bloqueo de espera del banco de destino antes de llamar a una función de devolución de llamada en PASSIVE_LEVEL y libera el bloqueo cuando la función vuelve. Para un controlador GPIO asignado a memoria, GpioClx administra los bloqueos de espera bancarios en nombre del controlador, pero no permite que el controlador adquiera y libere explícitamente los bloqueos.

Sin embargo, para un controlador GPIO no asignado a memoria, GPIO_CLX_AcquireInterruptLock y GPIO_CLX_ReleaseInterruptLock adquirir y liberar un bloqueo de espera en lugar de un bloqueo de interrupción. GpioClx implementa un bloqueo de espera independiente para cada banco de patillas en el controlador GPIO. Dado que los registros no están asignados a memoria, se llama a todas las funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S en PASSIVE_LEVEL para que puedan usar solicitudes de E/S para acceder a los registros a través de un bus serie, como I²C. GpioClx adquiere el bloqueo de espera del banco de destino antes de llamar a una de estas funciones de devolución de llamada y libera el bloqueo después de que la función devuelva.

Se trata de un error para que una función de devolución de llamada de un controlador no asignado a memoria intente volver a adquirir el bloqueo de espera del banco mediante una llamada a GPIO_CLX_AcquireInterruptLock. Sin embargo, el código de controlador de nivel pasivo fuera de las funciones de devolución de llamada puede llamar a los métodos GPIO_CLX_XxxInterruptLock para sincronizar con las funciones de devolución de llamada. Dado que GpioClx llama a todas las funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S en PASSIVE_LEVEL, los bloqueos de espera del banco toman efectivamente el lugar de los bloqueos de interrupción del banco para controladores no asignados a memoria.

Otra opción para un controlador no asignado a memoria es que el controlador del controlador implemente un conjunto de bloqueos de espera. Estos bloqueos de espera pueden permitir que las rutinas de devolución de llamada realicen un bloqueo más específico y el desbloqueo de recursos compartidos de lo que es posible con los bloqueos de espera implementados por GpioClx.

Durante la llamada a la rutina de devolución de llamada de CLIENT_QueryControllerBasicInformation , un controlador de controlador GPIO informa a GpioClx si los registros del controlador están asignados a la memoria. Para obtener más información, vea la descripción de la marca MemoryMappedController en CLIENT_CONTROLLER_BASIC_INFORMATION.

Para obtener más información sobre los bloqueos de interrupción y los bloqueos de espera, consulte Uso de bloqueos de marco.

En las tablas siguientes se proporciona información más detallada sobre qué funciones de devolución de llamada se llaman en DIRQL en lugar de en PASSIVE_LEVEL si los registros están asignados a memoria. Las notas que siguen a las tablas explican cuándo las funciones de devolución de llamada de nivel pasivo deben usar bloqueos de interrupción.

Para admitir patillas GPIO configuradas como entradas de interrupción, un controlador de controlador GPIO implementa un conjunto de funciones de devolución de llamada de eventos para administrar las solicitudes de interrupción a través de estas patillas. En la tabla siguiente, la columna central indica el IRQL en el que se llama a las funciones si los registros de hardware del controlador GPIO están asignados a memoria. La columna situada más a la derecha indica el IRQL en el que se llama a las funciones si los registros no están asignados a la memoria y se debe tener acceso a través de un bus serie.

Función de devolución de llamada IRQL si está asignado a memoria (MemoryMappedController = 1) IRQL si se accede en serie (MemoryMappedController = 0)

CLIENT_EnableInterrupt

CLIENT_DisableInterrupt

PASSIVE_LEVEL

(Véase la nota 1.

PASSIVE_LEVEL

(Véase la nota 2.

CLIENT_ClearActiveInterrupts

CLIENT_MaskInterrupts

CLIENT_QueryActiveInterrupts

CLIENT_QueryEnabledInterrupts

CLIENT_ReconfigureInterrupt

CLIENT_UnmaskInterrupt

DIRQL

(Véase la nota 3.)

PASSIVE_LEVEL

(Véase la nota 4.

CLIENT_PreProcessControllerInterrupt

DIRQL

(Véase la nota 5.)

DIRQL

(Véase la nota 6).

Notas

  1. GpioClx no adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada. La función de devolución de llamada puede adquirir el bloqueo de interrupción bancaria, si es necesario, para sincronizar los accesos de los registros que se comparten con las funciones de devolución de llamada que se ejecutan en DIRQL.

  2. GpioClx serializa la llamada a esta función de devolución de llamada con otras funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S que se llaman en PASSIVE_LEVEL. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de espera del banco.

  3. GpioClx adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada y libera el bloqueo después de que la función devuelva. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de interrupción bancaria.

  4. GpioClx serializa la llamada a esta función de devolución de llamada con otras funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S que se llaman en PASSIVE_LEVEL. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de espera del banco.

  5. GpioClx adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada y libera el bloqueo después de que la función devuelva. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de interrupción bancaria.

  6. GpioClx no adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada. El controlador del controlador GPIO es responsable de proporcionar cualquier sincronización que pueda ser necesaria.

Para admitir patillas GPIO configuradas como patillas de E/S de datos, un controlador de controlador GPIO implementa un conjunto de funciones de devolución de llamada de eventos para administrar las operaciones de E/S a través de estas patillas. En la tabla siguiente, la columna central indica el IRQL en el que se llama a las funciones si los registros de hardware del controlador GPIO están asignados a memoria. La columna situada más a la derecha indica el IRQL en el que se llama a las funciones si los registros no están asignados a la memoria y se debe tener acceso a través de un bus serie.

Función de devolución de llamada IRQL si está asignado a memoria (MemoryMappedController = 1) IRQL si se accede en serie (MemoryMappedController = 0)

CLIENT_ConnectIoPins

CLIENT_DisconnectIoPins

PASSIVE_LEVEL

(Véase la nota 1.

PASSIVE_LEVEL

(Véase la nota 2.

CLIENT_ReadGpioPins

CLIENT_ReadGpioPinsUsingMask

CLIENT_WriteGpioPins

CLIENT_WriteGpioPinsUsingMask

DIRQL

(Véase la nota 3.)

PASSIVE_LEVEL

(Véase la nota 4.

Notas

  1. GpioClx no adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada. La función de devolución de llamada puede adquirir el bloqueo de interrupción, si es necesario, para sincronizar los accesos de los registros que se comparten con las funciones de devolución de llamada que se ejecutan en DIRQL.

  2. GpioClx serializa la llamada a esta función de devolución de llamada con otras funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S que se llaman en PASSIVE_LEVEL. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de espera del banco.

  3. GpioClx adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada y libera el bloqueo después de que la función devuelva. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de interrupción bancaria.

  4. GpioClx serializa la llamada a esta función de devolución de llamada con otras funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S que se llaman en PASSIVE_LEVEL. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de espera del banco.

Para configurar un controlador GPIO para realizar operaciones de E/S e interrupción, un controlador de controlador GPIO implementa un conjunto de funciones de devolución de llamada de eventos para inicializar el controlador. En la tabla siguiente, la columna central indica el IRQL en el que se llama a las funciones si los registros de hardware del controlador GPIO están asignados a memoria. La columna situada más a la derecha indica el IRQL en el que se llama a las funciones si los registros no están asignados a la memoria y se debe tener acceso a través de un bus serie.

Función de devolución de llamada IRQL si está asignado a memoria (MemoryMappedController = 1) IRQL si se accede en serie (MemoryMappedController = 0)

CLIENT_PrepareController

CLIENT_ReleaseController

CLIENT_StartController

CLIENT_StopController

CLIENT_QueryControllerBasicInformation

CLIENT_QuerySetControllerInformation

PASSIVE_LEVEL

(Véase la nota 1.

PASSIVE_LEVEL

(Véase la nota 2.

Notas

  1. Cuando GpioClx llama a cualquiera de estas funciones de devolución de llamada, los bloqueos de interrupción bancaria no están disponibles. Por lo tanto, estas funciones de devolución de llamada no deben intentar adquirir el bloqueo de interrupción bancaria.

  2. Los bloqueos de espera del banco GpioClx no están disponibles cuando se llama a estas funciones de devolución de llamada. Por lo tanto, el controlador no debe intentar adquirir un bloqueo de espera bancaria para sincronizar con estas funciones de devolución de llamada.

Para permitir que un controlador GPIO cambie los estados de energía del dispositivo, un controlador de controlador GPIO implementa un conjunto de funciones de devolución de llamada de eventos para guardar y restaurar la configuración de hardware durante estos cambios. En la tabla siguiente, la columna central indica el IRQL en el que se llama a las funciones si los registros de hardware del controlador GPIO están asignados a memoria. La columna situada más a la derecha indica el IRQL en el que se llama a las funciones si los registros no están asignados a la memoria y se debe tener acceso a través de un bus serie.

Función de devolución de llamada IRQL si está asignado a memoria (MemoryMappedController = 1) IRQL si se accede en serie (MemoryMappedController = 0)

CLIENT_RestoreBankHardwareContext

CLIENT_SaveBankHardwareContext

DIRQL o HIGH_LEVEL

(Vea Notas).

No compatible.

Notas

  • Para las transiciones de estado F normales: se llama a las funciones de devolución de llamada de guardado y restauración con el bloqueo de interrupción del banco mantenido por GpioClx en DIRQL. Por lo tanto, ninguna función de devolución de llamada debe intentar adquirir el bloqueo de interrupción del banco.
  • Para las transiciones de estado F críticas: se llama a las devoluciones de llamada de guardado y restauración cuando se invoca el complemento del motor de energía (PEP) para guardar y restaurar el estado GPIO. Se llama a las funciones de devolución de llamada de guardado y restauración en HIGH_LEVEL en el contexto del último procesador para que pase a estar inactiva, lo que se produce tarde en la secuencia de transición de inactividad profunda de la plataforma. Por lo tanto, ninguna función de devolución de llamada debe intentar adquirir el bloqueo de interrupción del banco.

Para obtener más información sobre los estados F, consulte Administración de energía de nivel de componente. Para obtener más información sobre el PEP, consulte PoFxPowerControl.

Otras funciones de devolución de llamada

Para habilitar un controlador GPIO para admitir operaciones específicas del controlador, un controlador de controlador GPIO implementa una función de devolución de llamada de evento CLIENT_ControllerSpecificFunction . En la tabla siguiente, la columna central indica el IRQL en el que se llama a la función si los registros de hardware del controlador GPIO están asignados a memoria. La columna situada más a la derecha indica el IRQL en el que se llama a la función si los registros no están asignados a la memoria y se debe tener acceso a través de un bus serie.

Función de devolución de llamada IRQL si está asignado a memoria (MemoryMappedController = 1) IRQL si se accede en serie (MemoryMappedController = 0)

CLIENT_ControllerSpecificFunction

PASSIVE_LEVEL

(Véase la nota 1.

PASSIVE_LEVEL

(Véase la nota 2.

Notas

  1. GpioClx no adquiere el bloqueo de interrupción bancaria antes de llamar a esta función de devolución de llamada. La función de devolución de llamada puede adquirir el bloqueo de interrupción bancaria, si es necesario, para sincronizar los accesos de los registros que se comparten con las funciones de devolución de llamada que se ejecutan en DIRQL.

  2. GpioClx serializa la llamada a esta función de devolución de llamada con otras funciones de devolución de llamada relacionadas con interrupciones y relacionadas con E/S que se llaman en PASSIVE_LEVEL. Por lo tanto, la función de devolución de llamada no debe intentar adquirir el bloqueo de espera del banco.