Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Opcionalmente, el controlador de un controlador GPIO (E/S de uso general) puede proporcionar soporte para interrupciones GPIO. Para admitir interrupciones GPIO, un 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 el controlador proporciona cuando se registra como cliente de la extensión del framework 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.
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 del controlador GPIO integrado. El gpioClx DDI puede acomodar tanto el controlador GPIO integrado como el controlador GPIO externo en este ejemplo.
Si un dispositivo de controlador GPIO está asignado a la 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 Passive-Level ISR.
El controlador de un controlador GPIO que tiene 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 la 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, consulte 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 Las funciones son llamadas en DIRQL o PASSIVE_LEVEL, dependiendo 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 callbacks para que llamar a una de estas funciones no se produzca en medio de una llamada a otra de estas funciones.
La extensión del framework GPIO llama a las siguientes funciones de devolución de llamada relacionadas con interrupciones solo en PASSIVE_LEVEL, independientemente de si se establece la marca MemoryMappedController:
CLIENT_DisableInterruptCLIENT_EnableInterrupt Si no se establece el flag MemoryMappedController, el sistema 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 de GpioClx, que llama a las otras cuatro funciones de devolución de llamada relacionadas con interrupciones en DIRQL.
Normalmente, las otras 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 tiene acceso 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 mantiene 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 mantener bloqueada la interrupción solo el tiempo necesario.
Para obtener más información, vea sincronización de interrupciones para controladores de controlador GPIO.