Compartir a través de


devoluciones de llamada de Interrupt-Related

Como opción, el controlador para un controlador de E/S de uso general (GPIO) puede proporcionar compatibilidad con interrupciones gpIO. Para admitir interrupciones GPIO, un controlador de controlador GPIO implementa un conjunto de funciones de devolución de llamada para administrar estas interrupciones. El controlador incluye punteros a estas funciones de devolución de llamada en el paquete de registro que proporciona el controlador cuando se registra como un cliente de la extensión de marco GPIO (GpioClx). Para obtener más información sobre este paquete de registro, consulte GPIO_CLIENT_REGISTRATION_PACKET.

Como regla, un controlador GPIO que es una parte integrada de un sistema en un chip (SoC) tiene registros de hardware asignados a memoria a los que el procesador puede acceder directamente en el chip SoC. Sin embargo, un dispositivo de controlador GPIO independiente podría conectarse externamente al chip SoC a través de un bus serie, como se muestra en el diagrama siguiente.

un controlador gpio integrado y un controlador gpio externo.

En este diagrama, el controlador GPIO externo está conectado a un bus I²C. Este bus está controlado por un controlador de bus I²C que es una parte integrada del chip SoC. La línea de solicitud de interrupción del controlador GPIO externo está conectada a un pin en el controlador GPIO integrado. El DDI gpioClx puede acomodar el controlador GPIO integrado y el controlador GPIO externo en este ejemplo.

Si un dispositivo de controlador GPIO está asignado a memoria, el controlador del controlador GPIO puede acceder directamente a los registros de hardware del controlador en DIRQL. Sin embargo, si el controlador GPIO está conectado en serie, el controlador del controlador GPIO solo puede acceder a los registros de hardware en IRQL = PASSIVE_LEVEL, como se describe en ISR de nivel pasivo.

El controlador de un controlador GPIO que tenga registros de hardware asignados a memoria debe establecer el bit de marca MemoryMappedController en la información del dispositivo que el controlador proporciona a GpioClx. De lo contrario, GpioClx supone que los registros de hardware no están asignados a memoria y que el controlador solo puede acceder a estos registros en IRQL = PASSIVE_LEVEL. Para obtener más información sobre este bit de marca, vea CONTROLLER_ATTRIBUTE_FLAGS.

GpioClx implementa una rutina de servicio de interrupción (ISR) para atender las solicitudes de interrupción del controlador GPIO. Este ISR llama a las siguientes funciones de devolución de llamada relacionadas con interrupciones:

CLIENT_ClearActiveInterruptsCLIENT_MaskInterruptsCLIENT_QueryActiveInterruptsCLIENT_QueryEnabledInterruptsCLIENT_UnmaskInterrupt Estas funciones se llaman en DIRQL o en PASSIVE_LEVEL, en función de si el ISR de GpioClx se ejecuta en DIRQL o PASSIVE_LEVEL. El ISR llama a estas funciones en DIRQL si MemoryMappedController = 1 y en PASSIVE_LEVEL si MemoryMappedController = 0. En cualquier caso, el ISR serializa automáticamente sus devoluciones de llamada para que una llamada a una de estas funciones no se produzca en medio de una llamada a otra de estas funciones.

La extensión del marco gpIO llama a las siguientes funciones de devolución de llamada relacionadas con interrupciones solo en PASSIVE_LEVEL, independientemente de si se ha establecido la marca MemoryMappedController :

CLIENT_DisableInterrupt CLIENT_EnableInterrupt Si no se establece la marca MemoryMappedController, se llama a todas las funciones de devolución de llamada relacionadas con interrupciones en PASSIVE_LEVEL. GpioClx serializa automáticamente las llamadas a estas funciones para que una llamada a una de estas funciones no se produzca en medio de una llamada a otra de estas funciones.

Sin embargo, si se establece la marca MemoryMappedController , las funciones CLIENT_EnableInterrupt y CLIENT_DisableInterrupt deben sincronizar explícitamente sus operaciones de habilitación y deshabilitación de interrupciones en el ISR gpioClx, que llama a las otras cuatro funciones de devolución de llamada relacionadas con interrupciones en DIRQL.

Normalmente, las demás funciones de devolución de llamada CLIENT_Xxx (cuyos nombres no contienen "Interrupción") no realizan el procesamiento relacionado con interrupciones y, por lo tanto, no es necesario sincronizar con el ISR de GpioClx. Sin embargo, si se llama a cualquiera de estas funciones en PASSIVE_LEVEL y contienen código que accede a la configuración de interrupción a la que acceden las funciones relacionadas con interrupciones en DIRQL, este código debe sincronizarse con el ISR.

Para admitir la sincronización de interrupciones, GpioClx implementa un conjunto de bloqueos de interrupción. Una función de devolución de llamada que se ejecuta en PASSIVE_LEVEL puede llamar al método GPIO_CLX_AcquireInterruptLock para adquirir un bloqueo de interrupción y llamar al método GPIO_CLX_ReleaseInterruptLock para liberar el bloqueo. Cuando la función contiene el bloqueo de interrupción, el ISR gpioClx no se puede ejecutar y este ISR no puede llamar a ninguna función de devolución de llamada relacionada con interrupciones. Para permitir que las interrupciones gpIO se controlen de forma oportuna, el controlador debe contener el bloqueo de interrupción durante no más de lo necesario.

Para obtener más información, vea Sincronización de interrupciones para controladores de controlador GPIO.