Compartir a través de


E/S de uso general (GPIO)

El sistema en circuitos integrados chip (SoC) hace un amplio uso de patillas de E/S de uso general (GPIO). En el caso de las plataformas basadas en SoC, Windows define una abstracción general para el hardware GPIO y esta abstracción requiere compatibilidad con el espacio de nombres Advanced Configuration and Power Interface (ACPI).

La abstracción GPIO es compatible con las definiciones de especificación ACPI 5.0 que se enumeran en este artículo.

Para comprobar que el controlador GPIO cumple todos los requisitos de la plataforma Windows, consulte Lista de comprobación de requisitos del controlador GPIO.

Dispositivos de controlador GPIO

Windows admite controladores GPIO. Los controladores GPIO proporcionan una variedad de funciones para dispositivos periféricos, como interrupciones, señalización de entrada y señalización de salida. Las funcionalidades de GPIO se modelan como un dispositivo de controlador GPIO en el espacio de nombres . La extensión de marco gpIO (GpioClx) modela el dispositivo de controlador GPIO como particionado en algún número de bancos de patillas. Cada banco de patillas tiene 64 o menos patillas configurables. Los bancos de un controlador GPIO se ordenan en relación con la posición de sus patillas dentro del espacio de patillas GPIO relativo al controlador. Por ejemplo, el banco 0 contiene patillas 0-31 en el controlador, el banco 1 contiene patillas 32-63, etc. Todos los bancos tienen el mismo número de patillas, excepto el último banco, que podría tener menos. Los bancos son significativos para el firmware ACPI porque el firmware debe informar de la asignación de recursos de interrupción del sistema a los bancos, como se describe en la sección objetos de espacio de nombres GPIO a continuación.

Cada patilla de un banco tiene un conjunto de parámetros (por ejemplo, salida, interrupción sensible al nivel, entrada desbotada, etc.) que describen cómo se va a configurar la patilla.

Controladores GPIO y interrupciones de ActiveBoth

Una característica de algunos controladores GPIO es la capacidad de generar interrupciones en ambos bordes de una señal (bordes ascendentes o ActiveHigh, y caídas, o bordes ActiveLow). Esto es útil en una variedad de aplicaciones, incluida la interfaz de botón, donde tanto los eventos de pulsación de botones (un borde) como los eventos de liberación de botones (el borde opuesto) son significativos. Esta característica se conoce como "ActiveBoth".

Lógicamente, las señales ActiveBoth tienen un estado asertivo y no asertivo, ya sean aserciones momentáneas (por ejemplo, pulsadores) o aserciones indefinidamente largas (por ejemplo, inserciones de conector de auriculares). La detección perimetral de interrupciones de ActiveBoth puede implementarse en el hardware del controlador GPIO (hardware ActiveBoth) o emularse en el software del controlador GPIO (emulado ActiveBoth). Windows requiere que los controladores GPIO que implementen ActiveBoth deben usar ActiveBoth emulado. Esto es necesario para garantizar un control sólido de interrupciones de doble borde para todos los escenarios. Para admitir la emulación de ActiveBoth, se aplican los siguientes requisitos de hardware:

  1. Los controladores GPIO que admiten interrupciones activeBoth deben admitir interrupciones en modo de nivel y deben admitir la reconfiguración de la polaridad de la interrupción dinámicamente en tiempo de ejecución.

  2. Para minimizar el riesgo de errores de E/S, Windows prefiere el uso de controladores GPIO asignados a memoria en lugar de controladores GPIO conectados a SPB. De hecho, para el dispositivo Windows Button Array (PNP0C40), es necesario que activeBoth GPIO interrumpa para este dispositivo a un controlador GPIO asignado a memoria y no a un SPB conectado. Para determinar qué interrupciones de botón deben ser ActiveBoth, consulte la sección Dispositivos de botón del tema Otros objetos de espacio de nombres ACPI .

  3. Para establecer un estado inicial determinista para las señales de interrupción ActiveBoth, la pila de dispositivos GPIO de Windows garantiza que la primera interrupción generada después de la conexión de la interrupción por el controlador siempre será para el estado asercionado de la señal. En la pila se supone además que el estado aserdo de todas las líneas de interrupción de ActiveBoth es de nivel lógico bajo (el borde ActiveLow) de forma predeterminada. Si este no es el caso en la plataforma, puede invalidar el valor predeterminado incluyendo el controlador GPIO Device-Specific Method (_DSM) en el espacio de nombres del controlador. Para obtener más información sobre este método, vea GpIO Controller Device-Specific Method (_DSM).

El tercer requisito de la lista anterior implica que el controlador de un dispositivo que usa ActiveBoth podría recibir una interrupción inmediatamente después de inicializar (conectarse a) la interrupción, si la señal en el pin GPIO está en el estado asertivo en ese momento. Esto es posible e incluso es probable que algunos dispositivos (por ejemplo, auriculares) y se admita en el controlador.

Para admitir ActiveBoth emulado, el controlador del controlador GPIO debe habilitar ("participar en") emulación activeBoth mediante la implementación de una función de devolución de llamada de CLIENT_ReconfigureInterrupt y estableciendo la marca EmularActiveBoth en la estructura de información básica que la función de devolución de llamada CLIENT_QueryControllerBasicInformation del controlador proporciona a GpioClx. Para obtener más información, vea Controladores de E/S de uso general (GPIO).

Objetos de espacio de nombres GPIO

Los controladores GPIO y los periféricos que se conectan a ellos se enumeran mediante ACPI. La conexión entre ellos se describe mediante descriptores de recursos de conexión gpIO. Para obtener más información, vea la sección 6.4.3.8, "Connection Descriptors", de la especificación ACPI 5.0.

Objetos de identificación y configuración de dispositivos

El espacio de nombres ACPI de un dispositivo de controlador GPIO incluye lo siguiente:

  • Objeto de id. de hardware (_HID) compatible con ACPI asignado por el proveedor.
  • Un conjunto de recursos consumidos (_CRS).
  • Objeto Id. único (_UID), si hay más de una instancia del controlador GPIO en el espacio de nombres (es decir, dos o más nodos de espacio de nombres que tienen los mismos objetos de identificación del dispositivo).

El _CRS del controlador GPIO contiene todos los recursos (espacio de direcciones para registros, interrupciones del sistema, etc.) consumidos por todos los bancos del controlador GPIO. La asignación de recursos a bancos de interrupción se representa en el orden en que los recursos de interrupción se enumeran en el _CRS, es decir, la primera interrupción enumerada se asigna al banco 0, la siguiente lista se asigna al banco 1, etc. Los bancos pueden compartir recursos de interrupción, en cuyo caso la interrupción aparece una vez para cada banco conectado a él, en orden bancario, y se configura como Compartido.

Descriptores de recursos de conexión gpIO

La relación entre periféricos y los pines GPIO a los que están conectados se describe en el sistema operativo mediante descriptores de recursos de conexión gpIO. Estos descriptores de recursos pueden definir dos tipos de conexiones GPIO: conexiones de interrupción de GPIO y conexiones de E/S de GPIO. Los periféricos incluyen descriptores de conexión GPIO en sus _CRS para todas las clavijas de E/S de GPIO e interrupciones conectadas. Si una interrupción conectada es compatible con reactivación (capaz de despertar el sistema desde un estado de inactividad de bajo consumo), debe configurarse como ExclusiveAndWake o SharedAndWake. Para obtener más información, consulte Administración de energía de dispositivos.

Los descriptores se definen en la sección 6.4.3.8.1, "Descriptor de conexión GPIO", de la especificación ACPI 5.0. Las macros de plantilla de recursos de ASL para estos descriptores se describen en la sección 19.5.53, "GpioInt (macro de descriptor de recursos de conexión de interrupción de GPIO)", de la especificación ACPI 5.0.

Eventos ACPI señalados por GPIO

ACPI define un modelo de eventos de plataforma que permite señalar y comunicar eventos de hardware en la plataforma al controlador ACPI. Windows proporciona un servicio de notificación para comunicar eventos de plataforma a controladores de dispositivos. Varios controladores de bandeja de entrada dependen de este servicio para proporcionar compatibilidad con dispositivos definidos por ACPI, como el botón de encendido del método de control, el dispositivo LID, la batería del método de control, la zona térmica, etc. Para obtener más información sobre las notificaciones, vea la sección 5.6.5, "Eventos ACPI señalados por GPIO", de la especificación ACPI.

En el caso de las plataformas SoC, las interrupciones de GPIO se usan para señalar eventos de plataforma. Cualquier dispositivo de espacio de nombres (dispositivo "origen de eventos ACPI") que señale eventos a su controlador mediante el operador de notificación de ASL requiere lo siguiente:

  • El nodo de espacio de nombres del controlador GPIO al que está conectada la señal de evento ACPI debe incluir un recurso GpioInt para ese pin en su objeto de información de eventos ACPI (_AEI) (vea la sección 2.4.2.3.1, "AcpI Event Information (_AEI) Object", a continuación). El recurso GpioInt debe configurarse como no compartido (exclusivo).

  • El nodo del controlador también debe contener un método de control Edge (_Exx), Level (_Lxx) o Event (_EVT) para cada pin enumerado en el objeto _AEI.

El controlador ACPI controla la interrupción GPIO indicada y evalúa el método de control Edge, Level o Event para él. El método de control desactiva el evento de hardware, si es necesario, y ejecuta el operador Notify necesario en el nodo de espacio de nombres del dispositivo de origen del evento. Después, Windows envía la notificación al controlador del dispositivo. Se pueden señalar varios eventos sobre el mismo recurso GpioInt si el método de control de eventos puede consultar el hardware para determinar qué evento se ha producido. A continuación, el método debe notificar al dispositivo correcto con el código de notificación correcto.

Objeto de información de eventos ACPI (_AEI) Como se mencionó anteriormente, el espacio de nombres del controlador GPIO debe contener el objeto _AEI para admitir eventos ACPI. El objeto _AEI (vea la sección 5.6.5.2 en la especificación ACPI 5.0) devuelve un búfer de plantilla de recursos que contiene solo descriptores GpioInt que indican eventos ACPI a través de este controlador GPIO. Cada descriptor corresponde a un dispositivo de origen de eventos ACPI y se dedica a ese dispositivo (no se comparte entre dispositivos).

Regiones de operación GeneralPurposeIO (OpRegions)

Los controladores GPIO a menudo se usan en el firmware de la plataforma para admitir cualquier número de características de hardware de plataforma, como controlar la alimentación y los relojes, o los modos de configuración en los dispositivos. Para admitir el uso de E/S gpIO de métodos de control ASL, ACPI 5.0 define un nuevo tipo OpRegion, "GeneralPurposeIO".

GeneralPurposeIO OpRegions (véase la sección 5.5.2.4.4 de la especificación ACPI 5.0) se declaran dentro del ámbito de espacio de nombres del dispositivo controlador GPIO cuyo controlador controlará la E/S. Las declaraciones de campo GeneralPurposeIO (véase la sección 5.5.2.4.4.1 de la especificación ACPI 5.0) asignan nombres a patillas GPIO a las que se va a tener acceso dentro de una OpRegion generalPurposeIO. Los recursos de conexión gpioIO (véase la sección 19.5.53 de la especificación ACPI 5.0) se usan dentro de la declaración Field para especificar los números de patillas y la configuración de una referencia de campo determinada. El número total de bits de campo con nombre que siguen a un descriptor de conexión debe ser igual al número de patillas enumeradas en el descriptor.

Los campos de una OpRegion se pueden declarar en cualquier lugar del espacio de nombres y se puede acceder a ellos desde cualquier método del espacio de nombres. La dirección de los accesos a un GeneralPurposeIO OpRegion viene determinada por el primer acceso (lectura o escritura) y no se puede cambiar.

Dado que el controlador de dispositivo del controlador GPIO proporciona acceso a OpRegion, los métodos deben tener cuidado de no acceder a opRegion hasta que el controlador esté disponible. El código ASL puede realizar un seguimiento del estado del controlador OpRegion mediante la inclusión de un método Region (_REG) en el dispositivo de controlador GPIO (consulte la sección 6.5.4 de la especificación ACPI 5.0). Además, el objeto OpRegion Dependencies (_DEP) (consulte la sección 6.5.8 de la especificación ACPI 5.0) se puede usar en cualquier dispositivo que tenga un método que tenga acceso a los campos OPRegion de GPIO, si es necesario. Consulte la sección Dependencias del dispositivo en el tema Objetos de espacio de nombres administración de dispositivos para obtener información sobre cuándo usar _DEP. Es importante que los controladores no tengan asignados recursos de E/S gpIO que también estén asignados a GeneralPurposeIO OpRegions. Las regiones de operación son para el uso exclusivo de métodos de control ASL.