GPIO-Based аппаратные ресурсы
Начиная с Windows 8, контакты ввода-вывода общего назначения (GPIO), управляемые драйвером контроллера GPIO, доступны другим драйверам в качестве аппаратных ресурсов, управляемых системой. Контакты ввода-вывода GPIO, которые являются контактами, настроенными как входные или выходные данные, доступны в качестве нового типа ресурсов Windows — ресурсов ввода-вывода GPIO. Кроме того, контакты прерываний GPIO, которые являются контактами, настроенными в качестве входных данных запроса прерывания, доступны как обычные ресурсы прерывания Windows.
Ресурс ввода-вывода GPIO представляет собой набор из одного или нескольких контактов GPIO, которые драйвер для периферийного устройства может считывать или записывать в них. Windows скрывает сведения о базовой реализации контактов ввода-вывода GPIO, чтобы драйверы периферийных устройств могли быть записаны для управления абстрактными ресурсами ввода-вывода GPIO. Драйверы периферийных устройств, использующие эти абстрактные ресурсы, могут работать на разных платформах независимо от оборудования контроллера GPIO, реализующего ресурсы. Ресурс ввода-вывода GPIO представлен дескриптором WDFIOTARGET, который связывает этот ресурс с конкретным драйвером контроллера GPIO, которому принадлежит базовый контакт или контакты GPIO.
Как правило, контакт ввода-вывода на контроллере GPIO можно настроить для ввода или вывода в зависимости от возможностей оборудования контроллера и устройства, физически подключенного к контакту. Таким образом, драйвер может открыть логическое подключение к этому закреплению для операций записи или чтения, но не для обеих операций. Однако это ограничение накладывается оборудованием, а не расширением платформы GPIO (GpioClx). Если оборудование позволяет настроить контакт ввода-вывода как для ввода, так и для вывода, GpioClx позволяет драйверу открывать логическое подключение к закреплению для операций чтения и записи.
Для контактов GPIO, настроенных в качестве входных данных запроса прерывания, тот факт, что запрос прерывания реализуется с помощью пин-кода GPIO вместо контроллера прерывания или выделенной строки запроса прерывания полностью абстрагируется операционной системой. Прерывания GPIO представляются драйверам периферийных устройств как абстрактные ресурсы прерываний. Абстракция этих ресурсов поддерживается стеком драйверов GPIO и уровнем аппаратной абстракции (HAL). Таким образом, драйверы периферийных устройств, использующие ресурсы прерывания, могут в значительной степени игнорировать сведения о базовой реализации этих ресурсов. Дополнительные сведения см. в разделе Прерывания GPIO.
На следующей схеме показан пример назначения ресурсов на основе GPIO двум драйверам периферийных устройств:
На предыдущей схеме следующие три ресурса на основе GPIO назначаются драйверу периферийных устройств A:
- Два контакта ввода данных
- Вывод данных
- Входной контакт прерывания
Следующие два ресурса на основе GPIO назначаются драйверу B периферийных устройств:
- Контакт ввода данных
- Входной контакт прерывания
Драйверы A и B получают назначенные им ресурсы в функциях обратного вызова EvtDevicePrepareHardware . Если драйвер получает в качестве ресурса набор из одного или нескольких контактов ввода-вывода GPIO, драйвер может открыть подключение к этим контактам для доступа к ним. Драйвер получает дескриптор WDFIOTARGET для идентификации подключения и отправляет этому дескриптору запросы ввода-вывода для чтения или записи в эти контакты.
Примеры кода, демонстрирующие подключение к набору контактов ввода-вывода GPIO и отправку запросов ввода-вывода этим контактам, см. в следующих разделах:
Подключение драйвера KMDF к контактам ввода-вывода GPIO
В обоих разделах IoRoutine
функция в примере кода открывает ресурс закрепления ввода-вывода GPIO для операций чтения или записи в зависимости ReadOperation
от значения параметра. Если ресурс открыт для операций чтения (DesiredAccess
= GENERIC_READ), контакты в ресурсе настраиваются как входные данные, а запрос IOCTL_GPIO_READ_PINS , отправленный ресурсу pin, считывает входные значения в этих контактах. GpioClx не разрешает отправку запроса IOCTL_GPIO_WRITE_PINS набора входных контактов и завершает такой запрос с состоянием ошибки STATUS_GPIO_OPERATION_DENIED. Аналогичным образом, если ресурс закрепления открыт для операций записи (DesiredAccess
= GENERIC_WRITE), контакты в ресурсе настраиваются как выходные данные, а запрос IOCTL_GPIO_WRITE_PINS , отправляемый ресурсу контактов, задает значения в блокировках вывода, которые управляют этими контактами. Как правило, при отправке запроса IOCTL_GPIO_READ_PINS набору выходных контактов просто считываются последние значения, записанные в блоки.
Чтобы использовать ресурс прерывания для получения прерываний, драйвер клиента должен подключить подпрограмму службы прерываний (ISR) к прерыванию. Как правило, драйвер устанавливает это подключение, вызывая метод WdfInterruptCreate (или, возможно, процедуру IoConnectInterruptEx ). Дополнительные сведения о прерываниях KMDF см. в разделе Создание объекта прерывания.
В отличие от Plug and Play устройств, которые могут динамически подключаться к аппаратной платформе и отключаться от нее, устройство контроллера GPIO подключено постоянно. Кроме того, предполагается, что подключения между контактами GPIO и периферийным устройством являются постоянными. (Или, если периферийное устройство можно отключить из слота, слот выделяется для этого устройства.) Таким образом, доступные ресурсы GPIO являются фиксированными и могут быть указаны в встроенном ПО платформы. Аналогичным образом предполагается, что драйверы периферийных устройств, использующие ресурсы GPIO, используют выделенные наборы ресурсов GPIO. Таким образом, требования к ресурсам для этих драйверов устройств можно указать в встроенном ПО платформы.
Когда встроенное ПО платформы назначает набор контактов GPIO в качестве ресурса ввода-вывода GPIO, встроенное ПО указывает, можно ли открывать контакты в этом ресурсе для операций чтения, записи или для операций чтения и записи.
Если драйвер периферийных устройств использует более одного ресурса ввода-вывода GPIO, этот драйвер должен учитывать порядок перечисления этих ресурсов диспетчером PnP. Например, если драйвер использует два контакта ввода-вывода GPIO, но доступ к этим контактам должен осуществляться независимо и в отдельное время, встроенное ПО платформы должно описывать каждый контакт как отдельный ресурс ввода-вывода GPIO. Диспетчер PnP перечисляет эти ресурсы в порядке, в котором они описаны в встроенном ПО платформы, который должен соответствовать порядку, ожидаемому драйвером.
Когда драйвер периферийного устройства открывает подключение к ресурсу ввода-вывода GPIO, запрос IOCTL_GPIO_READ_PINS или IOCTL_GPIO_WRITE_PINS , который этот драйвер отправляет этому подключению, обращается ко всем контактам в ресурсе. Если драйверу иногда требуется доступ только к подмножествам этих контактов, это подмножество должно быть назначено драйверу как отдельный ресурс.
Дополнительные сведения о запросах IOCTL_GPIO_READ_PINS , включая сопоставление контактов ввода данных с битами в буфере вывода запросов, см. в разделе IOCTL_GPIO_READ_PINS. Дополнительные сведения о запросах IOCTL_GPIO_WRITE_PINS , включая сопоставление битов во входном буфере запросов с выводом данных, см. в разделе IOCTL_GPIO_WRITE_PINS.