Поделиться через


интерфейс ввода-вывода общего назначения (GPIO);

Интегральные схемы системы на микросхеме (SoC) широко используют контакты ввода-вывода общего назначения (GPIO). Для платформ на основе SoC Windows определяет общую абстракцию для оборудования GPIO, и для этой абстракции требуется поддержка пространства имен Расширенной конфигурации и интерфейса питания (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 является возможность генерировать прерывания на обоих краях сигнала (восходящие, активные и падающие, или края ActiveLow). Это полезно в различных приложениях, включая интерфейс кнопки, где значимы как события нажатия кнопки (один край), так и события нажатия кнопки (противоположный край). Эта функция называется "ActiveBoth".

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

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

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

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

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

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

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

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

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

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

  • Назначаемый поставщиком объект ACPI-совместимого идентификатора оборудования (_HID).
  • Набор потребленных ресурсов (_CRS) объекта.
  • Объект Уникального идентификатора (_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, таких как кнопка питания метода управления, устройство с индикатором, батарея метода управления, тепловая зона и т. д. Дополнительные сведения об уведомлениях см. в разделе 5.6.5 "События ACPI с сигналом GPIO" спецификации ACPI.

Для платформ SoC прерывания GPIO используются для сигнализации событий платформы. Для любого устройства пространства имен ("acPI Event Source" device), которое передает события драйверу с помощью оператора ASL Notify, требуется следующее:

  • Узел пространства имен контроллера 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 можно объявить в любом месте пространства имен и получить доступ из любого метода в пространстве имен. Направление доступа к Объекту OpRegion GeneralPurposeIO определяется первым доступом (чтение или запись) и не может быть изменено.

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