Introducción a la compatibilidad con controladores GPIO

A partir de Windows 8, la extensión de marco GPIO (GpioClx) simplifica la tarea de escribir un controlador para un dispositivo de controlador GPIO. Además, GpioClx proporciona compatibilidad con controladores para dispositivos periféricos que se conectan a patillas GPIO. GpioClx, que es una extensión proporcionada por el sistema al marco de controladores en modo kernel (KMDF), realiza tareas de procesamiento comunes a los miembros de la clase de dispositivo GPIO.

En esta introducción se describen los temas siguientes:

Controladores de controlador GPIO

Los proveedores de hardware suministran controladores para controlar sus controladores GPIO. Un controlador de controlador GPIO es un controlador KMDF que administra todas las operaciones específicas del hardware para un controlador GPIO. El controlador del controlador GPIO coopera con GpioClx para controlar las solicitudes de E/S para grupos de patillas GPIO configuradas como entradas de datos y salidas de datos. Además, este controlador coopera con GpioClx para controlar las solicitudes de interrupción de los patillas GPIO configuradas como entradas de interrupción.

Un dispositivo de controlador GPIO tiene algún número de patillas GPIO. Estas patillas se pueden conectar físicamente a dispositivos periféricos. Los patillas GPIO se pueden configurar como entradas de datos, salidas de datos o entradas de solicitud de interrupción. Normalmente, un pin GPIO se dedica a un dispositivo periférico y no lo comparten dos o más dispositivos. Las conexiones entre patillas GPIO y dispositivos periféricos son fijas y el usuario no puede cambiarlas (por ejemplo, quitando un dispositivo periférico y reemplazando por otro dispositivo). Por lo tanto, la asignación de patillas GPIO a dispositivos periféricos se puede describir en el firmware de la plataforma.

En el diagrama siguiente se muestra el controlador del controlador GPIO y GpioClx.

diagrama de bloques de componentes gpio.

El controlador del controlador GPIO y GpioClx se comunican entre sí a través de la interfaz device-driver (DDI) de GpioClx. El controlador de GPIO llama a los métodos de compatibilidad de controladores implementados por GpioClx. GpioClx llama a funciones de devolución de llamada de eventos implementadas por el controlador del controlador GPIO.

El controlador del controlador GPIO accede directamente a los registros de hardware del dispositivo del controlador GPIO.

GpioClx controla las solicitudes de E/S de los controladores para dispositivos periféricos que se conectan físicamente a patillas GPIO. GpioClx traduce estas solicitudes de E/S en operaciones de hardware simples, que realiza llamando a las funciones de devolución de llamada de eventos implementadas por el controlador del controlador GPIO. Por ejemplo, para leer o escribir datos en un conjunto de patillas GPIO, GpioClx llama a funciones de devolución de llamada de eventos como CLIENT_ReadGpioPins y CLIENT_WriteGpioPins. GpioClx administra las colas de E/S para el controlador GPIO y, por tanto, alivia el controlador del controlador GPIO de esta tarea.

Además, GpioClx controla las interrupciones principales del dispositivo del controlador GPIO y asigna estas interrupciones a las interrupciones secundarias, que se controlan mediante controladores de dispositivos periféricos. Las interrupciones principales son interrupciones generadas por dispositivos de hardware. El sistema operativo genera interrupciones secundarias en respuesta a determinadas interrupciones principales. Las interrupciones del sistema global (GSIs) identifican las interrupciones principales y secundarias. El firmware ACPI de la plataforma de hardware asigna los GSIs a las interrupciones principales y, en tiempo de ejecución, el sistema operativo asigna los GSIs a las interrupciones secundarias.

Por ejemplo, el firmware asigna un GSI a la interrupción de hardware del controlador GPIO y el sistema operativo asigna un GSI a un pin GPIO configurado como entrada de interrupción.

GpioClx implementa un ISR que controla las interrupciones principales generadas por el hardware del dispositivo del controlador GPIO. Cuando un dispositivo periférico afirma una interrupción en un pin GPIO, y las interrupciones en este pin están habilitadas y sin máscara, el controlador GPIO interrumpe el procesador. En respuesta, el controlador de captura de kernel programa el ISR gpioClx que se va a ejecutar. Para identificar el pin gpIO que provocó la interrupción, el ISR de GpioClx llama a la función de devolución de llamada de evento CLIENT_QueryActiveInterrupts , que implementa el controlador del controlador GPIO. A continuación, gpioClx ISR busca el GSI que se asigna a este pin y pasa este GSI a la capa de abstracción de hardware (HAL). HAL genera una interrupción secundaria llamando al ISR registrado para este GSI. Este ISR pertenece al controlador para el dispositivo periférico que originalmente afirmó la interrupción.

Para obtener más información sobre las interrupciones principales y secundarias, consulte Interrupciones de GPIO.

Controladores para dispositivos periféricos que usan patillas GPIO

En el inicio, el administrador de Plug and Play (PnP) enumera los dispositivos PnP y los que no son PnP. En el caso de los dispositivos que no son PnP que tienen conexiones fijas a patillas GPIO, el administrador de PnP consulta el firmware de la plataforma para determinar qué patillas GPIO se asignan como recursos de hardware administrados por el sistema a estos dispositivos.

El controlador KMDF de un dispositivo periférico recibe sus recursos de hardware asignados durante una devolución de llamada EvtDevicePrepareHardware . Estos recursos pueden incluir patillas GPIO configuradas como salidas de datos, entradas de datos o entradas de solicitud de interrupción.

Un recurso de E/S de GPIO es un nuevo tipo de recurso de Windows en Windows 8. Este recurso consta de un conjunto de uno o varios pines GPIO que se pueden usar como entradas de datos o salidas de datos. Si un controlador de dispositivo periférico abre un recurso de E/S gpIO para lecturas, el controlador usa todas las patillas del recurso como entradas de datos. Si un controlador abre un recurso de E/S de GPIO para escrituras, el controlador usa todas las patillas del recurso como salidas de datos. Para obtener ejemplos de código que muestran cómo un controlador de dispositivo periférico abre una conexión lógica a un conjunto de patillas de E/S de GPIO, consulte los temas siguientes:

Conexión de un controlador KMDF a patillas de E/S gpIO

Un pin gpIO configurado como entrada de interrupción se asigna a un controlador como un recurso de interrupción de Windows normal. La abstracción de recursos de interrupción oculta el hecho de que una interrupción podría implementarse mediante un pin GPIO en lugar de, por ejemplo, un controlador de interrupción programable. Por lo tanto, el controlador puede tratar un recurso de interrupción basado en GPIO igual que cualquier otro recurso de interrupción.

Para acceder a los patillas GPIO en un recurso de E/S de GPIO, un controlador de dispositivo periférico debe abrir una conexión lógica a las patillas. Un controlador KMDF llama al método WdfIoTargetOpen para abrir la conexión. A través de esta conexión, el controlador puede enviar solicitudes de E/S a los patillas GPIO. El controlador envía IOCTL_GPIO_READ_PINS solicitudes para leer datos de estas patillas (si son patillas de entrada) o IOCTL_GPIO_WRITE_PINS solicitudes para escribir datos en ellos (si son patillas de salida).

Para recibir interrupciones del pin GPIO en un recurso de interrupción, un controlador de dispositivo periférico debe registrar su rutina de servicio de interrupción (ISR) para recibir interrupciones del recurso de interrupción implementado por este pin. Un controlador KMDF llama al método WdfInterruptCreate para conectar un ISR a la interrupción.