Прочитать на английском

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


Общие сведения о поддержке драйверов GPIO

Начиная с Windows 8 расширение платформы GPIO (GpioClx) упрощает задачу написания драйвера для устройства контроллера GPIO. Кроме того, GpioClx обеспечивает поддержку драйверов для периферийных устройств, которые подключаются к пин-кодам GPIO. GpioClx, который является системным расширением платформы драйверов в режиме ядра (KMDF), выполняет задачи обработки, общие для членов класса устройств GPIO.

В этом обзоре рассматриваются следующие статьи:

Драйверы контроллера GPIO

Поставщики оборудования предоставляют драйверы для управления контроллерами GPIO. Драйвер контроллера GPIO — это драйвер KMDF, который управляет всеми аппаратными операциями для контроллера GPIO. Драйвер контроллера GPIO взаимодействует с GpioClx для обработки запросов ввода-вывода для групп контактов GPIO, настроенных как входные данные и выходные данные. Кроме того, этот драйвер взаимодействует с GpioClx для обработки запросов прерываний от контактов GPIO, настроенных как входы для прерываний.

У контроллера GPIO есть некоторое количество контактов GPIO. Эти контакты могут быть физически подключены к периферийным устройствам. Пин-коды GPIO можно настроить как входные данные, выходные данные или входные данные прерывания. Как правило, пин-код GPIO предназначен для периферийных устройств и не предоставляет общий доступ к двум или нескольким устройствам. Подключения между пин-узлами GPIO и периферийными устройствами не могут быть изменены пользователем (например, путем удаления периферийного устройства и замены его другим устройством). Таким образом, назначение пин-адресов GPIO периферийным устройствам можно описать в встроенном ПО платформы.

На следующей схеме показан драйвер контроллера GPIO и GpioClx.

блок-схема компонентов gpio.

Драйвер контроллера GPIO и GpioClx взаимодействуют друг с другом через интерфейс драйвера устройств GpioClx (DDI). Драйвер контроллера GPIO вызывает методы поддержки драйвера, реализованные GpioClx. Вызовы GpioClx функции обратного вызова событий, реализованные драйвером контроллера GPIO.

Драйвер контроллера GPIO напрямую обращается к аппаратным регистрам устройства контроллера GPIO.

GpioClx обрабатывает запросы ввода-вывода от драйверов для периферийных устройств, физически подключающихся к пин-кодам GPIO. GpioClx преобразует эти запросы ввода-вывода в простые аппаратные операции, которые он выполняет путем вызова функций обратного вызова событий, реализованных драйвером контроллера GPIO. Например, чтобы считывать данные из или записывать данные в набор пин-кодов GPIO, GpioClx вызывает функции обратного вызова событий, такие как CLIENT_ReadGpioPins и CLIENT_WriteGpioPins. GpioClx управляет очередями ввода-вывода для контроллера GPIO и тем самым освобождает драйвер контроллера GPIO этой задачи.

Кроме того, GpioClx обрабатывает первичные прерывания с устройства контроллера GPIO и сопоставляет эти прерывания с дополнительными прерываниями, которые обрабатываются драйверами периферийных устройств. Основными прерываниями являются прерывания, создаваемые аппаратными устройствами. Вторичные прерывания создаются операционной системой в ответ на определенные первичные прерывания. Первичные и вторичные прерывания определяются глобальными системными прерываниями (GSIS). Встроенное ПО ACPI для аппаратной платформы назначает GSIs основным прерываниям, а операционная система назначает GSIs дополнительным прерываниям.

Например, прошивка назначает GSI аппаратному прерыванию от контроллера GPIO, а операционная система назначает GSI контакту GPIO, который настроен как вход прерывания.

GpioClx реализует ISR, который обрабатывает аппаратно сгенерированные первичные прерывания с устройства контроллера GPIO. Когда периферийное устройство генерирует прерывание на выводе GPIO и прерывания на этом выводе включены и не замаскированы, контроллер GPIO прерывает процессор. В ответ обработчик ловушки ядра планирует выполнение ISR для GpioClx. Чтобы определить пин-код GPIO, который вызвал прерывание, ISR GpioClx вызывает функцию обратного вызова событий CLIENT_QueryActiveInterrupts, которая реализуется драйвером контроллера GPIO. Затем isR GpioClx ищет GSI, назначенный этому пин-коду, и передает этот GSI на аппаратный уровень абстракции (HAL). HAL генерирует вторичное прерывание, вызывая ISR, зарегистрированную для этого GSI. Этот ISR принадлежит драйверу для периферийного устройства, которое изначально инициировало прерывание.

Дополнительные сведения об основных и второстепенных прерываниях см. в разделе Прерывания GPIO.

Драйверы для периферийных устройств, использующих пин-коды GPIO

При запуске диспетчер Plug and Play (PnP) перечисляет устройства PnP и устройства, отличные от PnP. Для устройств не PnP с фиксированными подключениями к выводам GPIO диспетчер PnP запрашивает встроенное ПО платформы, чтобы определить, какие выводы GPIO назначаются для этих устройств как аппаратные ресурсы, управляемые системой.

Драйвер KMDF для периферийного устройства получает назначенные аппаратные ресурсы во время обратного вызова EvtDevicePrepareHardware. Эти ресурсы могут включать пин-коды GPIO, настроенные как выходные данные, входные данные или входные данные прерывания запросов.

Ресурс ввода-вывода GPIO — это новый тип ресурса Windows в Windows 8. Этот ресурс состоит из набора одного или нескольких контактов GPIO, которые можно использовать как входы, так и выходы. Если драйвер периферийных устройств открывает ресурс GPIO для операций чтения, драйвер использует все контакты в ресурсе в качестве входов данных. Если драйвер открывает ресурс ввода-вывода GPIO для записи, драйвер использует все выводы в ресурсе как выходные. Примеры кода, показывающие, как драйвер периферийных устройств открывает логическое подключение к набору контактов GPIO, см. следующие разделы:

Подключение драйвера KMDF к контактам ввода-вывода GPIO

Вывод GPIO, настроенный как вход прерывания, назначается драйверу как обычный ресурс прерывания Windows. Абстракция ресурсов прерывания скрывает тот факт, что прерывание может быть реализовано пин-кодом GPIO, а не программным контроллером прерываний. Таким образом, драйвер может обрабатывать ресурс прерывания на основе GPIO так же, как и любой другой ресурс прерывания.

Чтобы получить доступ к контактам GPIO в ресурсе ввода-вывода GPIO, драйвер периферийных устройств должен открыть логическое подключение к контактам. Драйвер KMDF вызывает метод WdfIoTargetOpen для открытия подключения. Через это подключение драйвер может отправлять запросы ввода-вывода в пин-коды GPIO. Драйвер отправляет IOCTL_GPIO_READ_PINS запросы на чтение данных из этих пин-кодов (если они входные пин-коды) или IOCTL_GPIO_WRITE_PINS запросы на запись данных в них (если они выходные пин-коды).

Чтобы получить прерывания от пин-кода GPIO в ресурсе прерывания, драйвер периферийных устройств должен зарегистрировать свою подпрограмму службы прерываний (ISR), чтобы получать прерывания от ресурса прерывания, реализуемого этим пин-кодом. Драйвер KMDF вызывает метод WdfInterruptCreate для подключения ISR к прерыванию.