recursos de hardware de GPIO-Based
A partir de Windows 8, las patillas de E/S de uso general (GPIO) controladas por un controlador gpIO están disponibles para otros controladores como recursos de hardware administrados por el sistema. Las patillas de E/S de GPIO, que son patillas configuradas como entradas de datos o salidas de datos, están disponibles como un nuevo tipo de recurso de Windows, recursos de E/S de GPIO. Además, las patillas de interrupción gpIO, que son patillas configuradas como entradas de solicitud de interrupción, están disponibles como recursos de interrupción normales de Windows.
Un recurso de E/S de GPIO representa un conjunto de uno o varios pines GPIO en los que el controlador de un dispositivo periférico puede leer o escribir. Windows oculta los detalles sobre la implementación subyacente de las patillas de E/S de GPIO para que los controladores de dispositivos periféricos se puedan escribir para manipular recursos abstractos de E/S de GPIO. Los controladores de dispositivos periféricos que usan estos recursos abstractos pueden funcionar en distintas plataformas, independientemente del hardware del controlador GPIO que implemente los recursos. Un recurso de E/S de GPIO se representa mediante un identificador WDFIOTARGET que asocia este recurso con el controlador de controlador GPIO específico que posee el pin o patillas GPIO subyacentes.
Normalmente, se puede configurar una patilla de E/S en un controlador GPIO para la entrada o para la salida, en función de las funcionalidades del hardware del controlador y el dispositivo que está conectado físicamente al pin. Por lo tanto, un controlador puede abrir una conexión lógica a este pin para operaciones de escritura o lectura, pero no ambas. Sin embargo, esta restricción se impone por el hardware y no por la extensión del marco gpIO (GpioClx). Si el hardware permite configurar un pin de E/S para entrada y salida, GpioClx permite que un controlador abra una conexión lógica con el pin para las operaciones de lectura y escritura.
En el caso de las patillas GPIO configuradas como entradas de solicitud de interrupción, el sistema operativo abstrae completamente el sistema operativo abstrae completamente el hecho de que el sistema operativo abstrae completamente una solicitud de interrupción para las patillas GPIO configuradas como entradas de solicitud de interrupción. Las interrupciones gpIO se presentan a los controladores de dispositivos periféricos como recursos de interrupción abstractos. La abstracción de estos recursos es compatible con la pila de controladores GPIO y la capa de abstracción de hardware (HAL). Por lo tanto, los controladores de dispositivos periféricos que usan recursos de interrupción pueden omitir en gran medida los detalles sobre la implementación subyacente de estos recursos. Para obtener más información, vea Interrupciones de GPIO.
En el diagrama siguiente se muestra una asignación de ejemplo de recursos basados en GPIO a dos controladores de dispositivos periféricos:
En el diagrama anterior, se asignan los siguientes tres recursos basados en GPIO al controlador de dispositivo periférico A:
- Dos patillas de entrada de datos
- Un pin de salida de datos
- Un pin de entrada de interrupción
Los dos recursos basados en GPIO siguientes se asignan al controlador de dispositivo periférico B:
- Un pin de entrada de datos
- Un pin de entrada de interrupción
Los controladores A y B reciben sus recursos asignados en sus funciones de devolución de llamada EvtDevicePrepareHardware . Si un controlador recibe, como recurso, un conjunto de uno o varios pines de E/S gpIO, el controlador puede abrir una conexión a estos pines para acceder a ellos. El controlador obtiene un identificador WDFIOTARGET para identificar la conexión y envía solicitudes de E/S a este identificador para leer o escribir en estas patillas.
Para obtener ejemplos de código que muestran cómo conectarse a un conjunto de patillas de E/S de GPIO y enviar solicitudes de E/S a estas patillas, consulte los temas siguientes:
Conexión de un controlador KMDF a patillas de E/S de GPIO
En ambos temas, la IoRoutine
función del ejemplo de código abre un recurso pin de E/S de GPIO para lecturas o para escrituras, según el valor del ReadOperation
parámetro. Si el recurso se abre para lecturas (DesiredAccess
= GENERIC_READ), las patillas del recurso se configuran como entradas y una solicitud de IOCTL_GPIO_READ_PINS enviada al recurso pin lee los valores de entrada en estas patillas. GpioClx no permite enviar una solicitud de IOCTL_GPIO_WRITE_PINS un conjunto de patillas de entrada y completa dicha solicitud con un estado de error STATUS_GPIO_OPERATION_DENIED. Del mismo modo, si el recurso de anclaje se abre para escrituras (DesiredAccess
= GENERIC_WRITE), las patillas del recurso se configuran como salidas y una solicitud de IOCTL_GPIO_WRITE_PINS enviada al recurso de anclaje establece los valores de los bloqueos temporales de salida que impulsan estas patillas. Normalmente, el envío de una solicitud de IOCTL_GPIO_READ_PINS a un conjunto de patillas de salida simplemente lee los últimos valores escritos en los bloqueos temporales de salida.
Para usar un recurso de interrupción para recibir interrupciones, un controlador cliente debe conectar una rutina de servicio de interrupción (ISR) a la interrupción. Normalmente, el controlador realiza esta conexión mediante una llamada al método WdfInterruptCreate (o, posiblemente, la rutina IoConnectInterruptEx ). Para obtener más información sobre las interrupciones de KMDF, vea Crear un objeto de interrupción.
A diferencia de los dispositivos Plug and Play que se pueden conectar y desconectar dinámicamente de una plataforma de hardware, se conecta permanentemente un dispositivo de controlador GPIO. Además, se supone que las conexiones entre patillas GPIO y un dispositivo periférico son permanentes. (O bien, si el dispositivo periférico se puede desconectar de una ranura, la ranura se dedica a este dispositivo). Por lo tanto, los recursos GPIO disponibles son fijos y se pueden especificar en el firmware de la plataforma. Del mismo modo, se supone que los controladores de dispositivos periféricos que usan recursos GPIO usan conjuntos dedicados de recursos gpIO. Por lo tanto, los requisitos de recursos para estos controladores de dispositivo se pueden especificar en el firmware de la plataforma.
Cuando el firmware de la plataforma designa un conjunto de patillas GPIO como un recurso de E/S de GPIO, el firmware indica si las patillas de este recurso se pueden abrir para lecturas, para escrituras o para lecturas y escrituras.
Si un controlador de dispositivo periférico usa más de un recurso de E/S de GPIO, este controlador debe tener en cuenta el orden en que el administrador de PnP enumera estos recursos. Por ejemplo, si un controlador usa dos patillas de E/S gpIO, pero se debe tener acceso a estas patillas de forma independiente y en momentos independientes, el firmware de la plataforma debe describir cada patilla como un recurso de E/S de GPIO independiente. El administrador de PnP enumera estos recursos en el orden en que se describen en el firmware de la plataforma, que debe coincidir con el orden esperado por el controlador.
Después de que un controlador de dispositivo periférico abra una conexión a un recurso de E/S de GPIO, un IOCTL_GPIO_READ_PINS o IOCTL_GPIO_WRITE_PINS solicitud de que este controlador envíe a esta conexión acceda a todas las patillas del recurso. Si el controlador a veces solo debe tener acceso a un subconjunto de estas patillas, este subconjunto debe asignarse al controlador como un recurso independiente.
Para obtener más información sobre las solicitudes de IOCTL_GPIO_READ_PINS , incluida la asignación de patillas de entrada de datos a los bits del búfer de salida de la solicitud, consulte IOCTL_GPIO_READ_PINS. Para obtener más información sobre las solicitudes de IOCTL_GPIO_WRITE_PINS , incluida la asignación de los bits del búfer de entrada de solicitud a las patillas de salida de datos, consulte IOCTL_GPIO_WRITE_PINS.