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


Интерфейсы ввода-вывода и прерывания GpioClx

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

Контакты GPIO — это управляемые системой аппаратные ресурсы. Перед запуском драйвера периферийного устройства диспетчер Plug and Play (PnP) назначает этому драйверу список аппаратных ресурсов. Этот список аппаратных ресурсов может включать в себя следующее:

  • Ресурс ввода-вывода GPIO. Этот ресурс представляет собой набор из одного или нескольких контактов GPIO, настроенных в качестве входных или выходных данных. Ресурсы ввода-вывода GPIO — это новый тип ресурсов Windows, начиная с Windows 8.
  • Прерывание. Этот ресурс прерывания может быть реализован в виде контакта GPIO, настроенного как входные данные прерывания, но вместо этого он может быть реализован программируемым контроллером прерываний или в качестве выделенного контакта прерывания в пакете процессора. Абстракция прерывания аппаратного абстракции (HAL) скрывает эти сведения о реализации, которые клиентские драйверы могут безопасно игнорировать.

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

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

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

Расширение платформы GPIO (GpioClx) управляет подключениями ввода-вывода и прерывает подключения для драйверов периферийных устройств, которые являются его клиентами. Диспетчер PnP может назначать разные группы контактов GPIO на устройстве контроллера GPIO разным клиентским драйверам. Некоторые из этих контактов настроены как входные или выходные данные, а некоторые — как входные данные запроса прерывания.

Когда клиентские драйверы получают запросы прерываний или отправляют запросы ввода-вывода контактам GPIO, GpioClx вызывает функции обратного вызова событий, реализованные драйвером контроллера GPIO. Эти обратные вызовы обращаются к аппаратным регистрам на устройстве контроллера GPIO. С помощью этих вызовов функций GpioClx считывает входные данные, записывает данные в выходные данные и управляет запросами прерываний (путем запроса, включения, маскирования, очистки и т. д., контактов GPIO, настроенных как входные данные прерывания).

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