Обзор поддержки драйверов 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 и GpioClx взаимодействуют друг с другом через интерфейс драйвера устройства (DDI) GpioClx. Драйвер контроллера 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 к прерыванию.