Ввод-вывод общего назначения (GPIO)

Интегральные схемы системы на кристалле (SoC) широко используют выводы общего назначения (GPIO). Для платформ на основе SoC Windows определяет общую абстракцию для оборудования GPIO, и эта абстракция требует поддержки из пространства имен Advanced Configuration and Power Interface (ACPI).

Абстракция GPIO поддерживается определениями спецификации ACPI 5.0 , перечисленными в этой статье.

Чтобы убедиться, что контроллер GPIO соответствует всем требованиям платформы Windows, ознакомьтесь с контрольным списком требований контроллера GPIO.

Устройства контроллера GPIO

Windows поддерживает контроллеры GPIO. Контроллеры GPIO предоставляют различные функции для периферийных устройств, включая прерывания, входной сигнал и выходное сигналирование. Возможности GPIO моделироваются как устройство контроллера GPIO в пространстве имен. Расширение фреймворка GPIO (GpioClx) моделирует устройство контроллера GPIO как разбитое на некоторое количество банков выводов. Каждый банк выводов имеет 64 или меньше настраиваемых пинов. Банки в контроллере GPIO упорядочиваются относительно их положения в пространстве GPIO пинов контроллера. Например, банк 0 содержит пин-коды 0-31 на контроллере, банк 1 содержит пин-коды 32-63 и т. д. Все банки имеют одинаковое количество пин-кодов, за исключением последнего банка, который может иметь меньше. Банки имеют значительное значение для встроенного ПО ACPI, так как встроенное ПО должно сообщать о сопоставлении ресурсов системного прерывания с банками, как описано в разделе объектов пространства имен GPIO ниже.

Каждый пин-код банка имеет набор параметров (например, выходные данные, прерывание с учетом уровня, отскоки входных данных и т. д.), описывающие настройку пин-кода.

Контроллеры GPIO и прерывания типа ActiveBoth

Особенностью некоторых контроллеров GPIO является возможность генерировать прерывания по обоим фронтам сигнала (по фронту восходящему или ActiveHigh, и по спаду нисходящему или ActiveLow). Это полезно в различных приложениях, включая интерфейс кнопки, где события нажатия кнопки (один фронт) и события отпускания кнопки (противоположный фронт) имеют значение. Эта функция называется "ActiveBoth".

Логически, сигналы ActiveBoth имеют как активное, так и неактивное состояние, независимо от того, являются ли они мгновенными утверждениями (например, кнопки), или длительными утверждениями (например, вставки наушников). Обнаружение фронта для прерываний типа ActiveBoth может быть реализовано на оборудовании контроллера GPIO (аппаратная реализация ActiveBoth) или эмулироваться в драйвере GPIO (эмулированный ActiveBoth). Для Windows требуется, чтобы контроллеры GPIO, реализующие ActiveBoth, должны использовать эмулированный ActiveBoth. Это необходимо для обеспечения надежной обработки двойных прерываний во всех сценариях. В поддержке эмуляции ActiveBoth применяются следующие требования к оборудованию:

  1. Контроллеры GPIO, поддерживающие прерывания ActiveBoth, должны поддерживать прерывания в режиме уровня и поддерживать повторное программирование полярности прерывания динамически во время выполнения.

  2. Чтобы свести к минимуму риск возникновения ошибок ввода-вывода, в Windows предпочитают использовать контроллеры GPIO с отображением в память, а не подключённые через SPB контроллеры GPIO. На самом деле, для устройства массив кнопок Windows (PNP0C40) необходимо, чтобы прерывания ActiveBoth GPIO для этого устройства подключались к контроллеру GPIO, сопоставленному с памятью, а не к контроллеру, подключенному к SPB. Чтобы определить, какие прерывания кнопки должны быть ActiveBoth, см. раздел "Устройства Button " в разделе "Другие объекты пространства имен ACPI ".

  3. Чтобы установить детерминированное начальное состояние для сигналов прерывания ActiveBoth, стек устройств Windows GPIO гарантирует, что первое прерывание, сгенерированное после подключения прерывания драйвером, всегда будет соответствовать состоянию, когда сигнал находится в активном состоянии. Далее в стеке предполагается, что состояние всех линий прерываний ActiveBoth по умолчанию имеет логический уровень низкий (спад до уровня ActiveLow). Если на вашей платформе это не так, можно переопределить настройку по умолчанию, включив в пространство имен контроллера контроллер GPIO с методом Device-Specific (_DSM). Дополнительные сведения об этом методе см. в разделе Device-Specific Метод контроллера GPIO (_DSM).

Третье требование в приведенном выше списке подразумевает, что драйвер для устройства, использующего ActiveBoth, может получить прерывание сразу после инициализации (подключения к прерыванию), если сигнал на выводе GPIO находится в активном состоянии в это время. Это возможно, и даже вероятно для некоторых устройств (например, наушников) и должно поддерживаться в драйвере.

Чтобы поддерживать эмулированную функцию ActiveBoth, драйвер контроллера GPIO должен включить ("согласие на") ActiveBoth, реализуя функцию обратного вызова CLIENT_ReconfigureInterrupt и установив флаг emulateActiveBoth в базовой информационной структуре, которую функция обратного вызова драйвера CLIENT_QueryControllerBasicInformation предоставляет GpioClx. Дополнительные сведения см. в General-Purpose драйверах ввода-вывода (GPIO).

Объекты пространства имен GPIO

Контроллеры GPIO и периферийные устройства, которые подключаются к ним, перечисляются ACPI. Соединение между ними описано с помощью дескрипторов ресурсов подключения GPIO. Дополнительные сведения см. в разделе 6.4.3.8, "Дескрипторы подключения" спецификации ACPI 5.0.

Объекты идентификации и конфигурации устройств

Пространство имен ACPI устройства контроллера GPIO включает следующее:

  • Объект идентификатора оборудования (_HID), совместимый с ACPI, назначенный поставщиком.
  • Набор объектов, потребляющих ресурсы (_CRS).
  • Объект Unique ID (_UID), если в пространстве имен имеется несколько экземпляров контроллера GPIO (то есть два или более узлов пространства имен с одинаковыми объектами идентификации устройства).

_CRS контроллера GPIO содержит все ресурсы (адресное пространство для регистров, системных прерываний и т. д.), потребляемые всеми банками в контроллере GPIO. Сопоставление ресурсов прерывания к банкам представлено в том порядке, в котором ресурсы прерывания перечислены в _CRS, то есть первое прерывание назначено банку 0, следующее прерывание назначено банку 1 и т. д. Банки могут совместно использовать ресурсы прерывания, в этом случае прерывание указывается один раз для каждого подключенного банка, в порядке банков и настроено как совместно используемое.

Дескрипторы ресурсов подключения GPIO

Связь между периферийными устройствами и контактами GPIO, к которым они подключены, описывается дескрипторами ресурсов подключения GPIO. Эти дескрипторы ресурсов могут описывать два типа соединений GPIO: соединения прерывания GPIO и соединения ввода-вывода GPIO. Периферийные устройства включают дескрипторы подключения GPIO в их _CRS для всех пинов ввода-вывода GPIO и подключенных пинов прерывания. Если подключенное прерывание может пробуждать систему (способно выводить систему из состояния низкого энергопотребления), его необходимо настроить как ExclusiveAndWake или SharedAndWake. Дополнительные сведения см. в разделе "Управление питанием устройств".

Дескрипторы определены в разделе 6.4.3.8.1, "Дескриптор подключения GPIO" спецификации ACPI 5.0. Макросы шаблона ресурсов ASL для этих дескрипторов описаны в разделе 19.5.53, "GpioInt (макрос дескриптора подключения GPIO) спецификации ACPI 5.0.

События ACPI с сигналом GPIO

ACPI определяет модель событий платформы, которая позволяет сигнализировать аппаратные события в платформе и передавать их драйверу ACPI. Windows предоставляет службу уведомлений для обмена событиями платформы с драйверами устройств. Ряд драйверов папки "Входящие" полагаются на эту службу для обеспечения поддержки определенных ACPI устройств, таких как кнопка управления методом управления, устройство LID, батарея метода управления, тепловая зона и т. д. Дополнительные сведения об уведомлениях см. в разделе 5.6.5, "GPIO-Signaled ACPI Events" в спецификации ACPI.

Для платформ SoC прерывания GPIO используются для сигнализации событий платформы. Любое устройство пространства имен ("Источник событий ACPI"), которое сигнализирует о событиях драйверу с помощью оператора уведомления ASL, требует следующего:

  • Узел пространства имен контроллера GPIO, к которому подключен сигнал прерывания ACPI, должен включать ресурс GpioInt для этого контакта в объекте Информация о событиях ACPI (_AEI) (см. раздел 2.4.2.3.1, "Информация о событиях ACPI (_AEI) объект" ниже). Ресурс GpioInt должен быть настроен как не общий (эксклюзивный).

  • Узел контроллера также должен содержать метод управления Edge (_Exx), Level (_Lxx) или Event (_EVT) для каждого контакта, указанного в объекте _AEI.

Драйвер ACPI обрабатывает указанные прерывания GPIO и оценивает метод управления Edge, Level или Event для них. Метод управления при необходимости переводит аппаратное событие в пассивное состояние и выполняет необходимый оператор Notify на узле пространства имен устройства-источника события. Затем Windows отправляет уведомление драйверу устройства. Несколько событий могут сигнализировать по одному и тому же ресурсу GpioInt, если метод контроля событий может опрашивать оборудование с целью определения, какое событие произошло. Затем метод должен уведомить правильное устройство с правильным кодом уведомления.

Объект ACPI Event Information (_AEI) Как упоминалось ранее, пространство имен контроллера GPIO должно содержать объект _AEI для поддержки событий ACPI. Объект _AEI (см. раздел 5.6.5.2 в спецификации ACPI 5.0) возвращает буфер шаблона ресурсов, содержащий только дескрипторы GpioInt, которые сигнализируют события ACPI через этот контроллер GPIO. Каждый дескриптор соответствует одному исходному устройству события ACPI и предназначен для этого устройства (не совместного использования между устройствами).

Области операций GeneralPurposeIO (OpRegions)

Контроллеры GPIO часто используются встроенного ПО платформы для поддержки любого количества аппаратных функций платформы, таких как управление питанием и часами, или настройка режимов на устройствах. Для поддержки использования операций ввода-вывода GPIO из методов управления ASL ACPI 5.0 определяет новый тип OpRegion "GeneralPurposeIO".

GeneralPurposeIO OpRegions (см. раздел 5.5.2.4.4 спецификации ACPI 5.0) объявлены в области пространства имен устройства контроллера GPIO, драйвер которого будет обрабатывать ввод-вывод. Объявления полей GeneralPurposeIO (см. раздел 5.5.2.4.4.1 спецификации ACPI 5.0) присваивают имена пин-кодам GPIO, которые должны быть доступны в OpRegion GeneralPurposeIO. Ресурсы подключения GpioIO (см. раздел 19.5.53 спецификации ACPI 5.0) используются в объявлении Field для указания номеров пин-кодов и конфигурации для конкретной ссылки на поле. Общее число битов именованных полей после дескриптора подключения должно равняться числу пинов, перечисленных в дескрипторе.

Поля в OpRegion можно объявить в любом месте пространства имен и получить к ней доступ из любого метода в пространстве имен. Направление доступа к GeneralPurposeIO OpRegion определяется первым доступом (чтение или запись) и не может быть изменено.

Так как доступ к OpRegion предоставляется драйвером устройства контроллера GPIO (обработчик OpRegion), методы должны не обращаться к OpRegion, пока драйвер не будет доступен. Код ASL может отслеживать состояние обработчика OpRegion, включив метод Region (_REG) на устройстве контроллера GPIO (см. раздел 6.5.4 спецификации ACPI 5.0). Кроме того, объект зависимостей OpRegion (_DEP) (см. раздел 6.5.8 спецификации ACPI 5.0) можно использовать на любом устройстве с методом доступа к полям OpRegion GPIO при необходимости. Сведения об использовании _DEP см. в разделе " Зависимости устройств " в разделе объектов пространства имен управления устройствами . Важно, чтобы драйверам не назначали ресурсы ввода-вывода GPIO, которые также выделены для регионов GeneralPurposeIO OpRegions. Opregions предназначены для эксклюзивного использования методов управления ASL.