Драйвер Gpio, что это такое

Обновлено: 08.07.2024

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

Возможности

Драйвер GPIO включает следующие функции:

  • поддержка цифрового ввода и вывода
  • поддержка нежелательных входных данных
  • триггерное событие можно настроить непосредственно в драйвере

Установка

Как и другие драйверы, поддерживаемые Eclipse Kura, он распространяется в виде пакета развертывания на Eclipse Marketplace для Kura 3.x и 4.x. Его можно установить, следуя приведенным здесь инструкциям.

Создание экземпляра

Новый экземпляр драйвера GPIO можно создать, нажав кнопку «Новый драйвер» в специальном разделе веб-интерфейса «Драйверы и активы» или нажав кнопку «+» в разделе «Службы». В обоих случаях необходимо выбрать фабрику org.eclipse.kura.driver.gpio и указать уникальное имя для нового экземпляра. После создания драйвер GPIO готов к использованию, и его настройка не требуется.

Конфигурация канала

Канал драйвера GPIO можно настроить со следующими параметрами:

  • NONE : ни одно событие не активирует прослушиватель.
  • RISING_EDGE , FALLING_EDGE , BOTH_EDGES : прослушиватели будут запускаться соответственно при переходе от низкого к высокому, переходу от высокого к низкому или к обоим.
  • HIGH_LEVEL , LOW_LEVEL , BOTH_LEVELS : прослушиватели будут активироваться соответственно при обнаружении высокого, низкого или обоих уровней. Обратите внимание, что эти параметры поддерживаются не всеми устройствами.

Управление светодиодом с помощью драйвера GPIO

В этом разделе будет представлен простой пример драйвера GPIO с использованием RaspberryPi. Перед настройкой драйвера выполните настройку, как показано на следующем рисунке, используя макетную плату, светодиод, резистор на 120 Ом и несколько проводов. Подсоедините желтый провод к контакту заземления на разъеме RasperryPi (т. е. к контакту 6), а красный — к контакту 40 (также известному как gpio21).

gpio_rpi

На вкладке "Драйверы и активы" создайте новый драйвер GPIO, назовите его GPIODriver и добавьте актив, как показано на следующем рисунке.

gpio_driver

Ресурс настроен на управление gpio, называемым светодиодом, в качестве выходных данных и управляет записью логического значения. Светодиодный канал подключен к gpio21 на RaspberryPi. На вкладке «Данные» заполните форму «Значение» значением «истина» и нажмите «Применить»: загорится зеленый светодиод. Запись false выключит светодиод.

Этот документ служит руководством для разработчиков драйверов микросхем GPIO.

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

Внутреннее представление GPIO¶

Чип GPIO обрабатывает одну или несколько линий GPIO. Чтобы считаться чипом GPIO, линии должны соответствовать определению: ввод/вывод общего назначения. Если линия не общего назначения, это не GPIO и не должна обрабатываться микросхемой GPIO. Вариант использования является показательным: определенные линии в системе могут называться GPIO, но служить очень конкретной цели, поэтому не соответствуют критериям ввода-вывода общего назначения. С другой стороны, линия драйвера светодиодов может использоваться как GPIO и, следовательно, должна обрабатываться драйвером чипа GPIO.

Внутри драйвера GPIO отдельные линии GPIO идентифицируются по их аппаратному номеру, иногда также называемому смещением, которое представляет собой уникальное число от 0 до n-1, где n – это количество GPIO, управляемых микросхемой.

Номер аппаратного GPIO должен быть чем-то интуитивно понятным для аппаратного обеспечения, например, если в системе используется набор регистров ввода-вывода с отображением памяти, где 32 линии GPIO обрабатываются одним битом на строку в 32-битном регистре, имеет смысл использовать для них аппаратные смещения 0..31, соответствующие битам 0..31 в регистре.

Этот номер является чисто внутренним: аппаратный номер конкретной линии GPIO никогда не отображается вне драйвера.

Помимо этого внутреннего номера, каждая линия GPIO также должна иметь глобальный номер в целочисленном пространстве имен GPIO, чтобы ее можно было использовать с устаревшим интерфейсом GPIO. Таким образом, каждый чип должен иметь «базовый» номер (который может быть назначен автоматически), а для каждой линии GPIO глобальный номер будет (базовый + аппаратный номер). Хотя целочисленное представление считается устаревшим, оно по-прежнему используется многими пользователями, и поэтому его необходимо поддерживать.

Например, одна платформа может использовать глобальные номера 32–159 для GPIO, а контроллер определяет 128 GPIO в «базе» 32 ; в то время как другая платформа использует глобальные числа 0..63 с одним набором контроллеров GPIO, 64-79 с другим типом контроллера GPIO и на одной конкретной плате 80-95 с FPGA. Унаследованные номера не обязательно должны быть смежными; любая из этих платформ также может использовать номера 2000–2063 для идентификации линий GPIO в банке расширителей I2C GPIO.

Драйверы контроллера: gpio_chip¶

  • методы установки направления линии GPIO

  • методы, используемые для доступа к значениям линии GPIO

  • метод установки электрической конфигурации для данной линии GPIO

  • метод возврата номера IRQ, связанного с данной линией GPIO

  • флаг, указывающий, могут ли вызовы его методов засыпать

  • необязательный массив имен строк для идентификации строк

  • дополнительный метод дампа debugfs (показ дополнительной информации о состоянии)

  • необязательный базовый номер (будет присвоен автоматически, если его не указать)

  • дополнительная метка для диагностики и сопоставления микросхем GPIO с использованием данных платформы

Код, реализующий gpio_chip, должен поддерживать несколько экземпляров контроллера, желательно с использованием модели драйвера. Этот код настроит каждый gpio_chip и вызовет gpiochip_add(), gpiochip_add_data() или devm_gpiochip_add_data(). Удаление контроллера GPIO должно быть редким; используйте gpiochip_remove(), когда это неизбежно.

Часто gpio_chip является частью специфичной для экземпляра структуры с состояниями, не раскрываемыми интерфейсами GPIO, такими как адресация, управление питанием и т. д. Чипы, такие как аудиокодеки, будут иметь сложные состояния, отличные от GPIO.

Любой метод дампа debugfs обычно должен игнорировать строки, которые не были запрошены. Они могут использовать gpiochip_is_requested() , которая возвращает либо NULL, либо метку, связанную с этой линией GPIO, когда она была запрошена.

Соображения, касающиеся реального времени: драйвер GPIO не должен использовать spinlock_t или какие-либо спящие API-интерфейсы (например, среду выполнения PM) в своей реализации gpio_chip (.get/.set и обратные вызовы управления направлением), если ожидается, что он будет вызывать API-интерфейсы GPIO из атомарного контекста в реальном времени. ядра (внутри обработчиков жестких IRQ и подобных контекстов). Обычно этого не требуется.

Электрическая конфигурация GPIO¶

Линии GPIO можно настроить для нескольких электрических режимов работы с помощью обратного вызова .set_config(). В настоящее время этот API поддерживает настройку:

Односторонние режимы (открытый сток/открытый источник)

Включение резистора Pull Up и Pull Down

Эти настройки описаны ниже.

Обратный вызов .set_config() использует те же перечислители и семантику конфигурации, что и универсальные драйверы управления контактами. Это не совпадение: можно присвоить .set_config() функции gpiochip_generic_config(), что приведет к вызову pinctrl_gpio_set_config() и, в конечном итоге, к серверной части управления контактами «позади» контроллера GPIO, обычно ближе к настоящим штифтам. Таким образом, контроллер выводов может управлять перечисленными ниже конфигурациями GPIO.

Если используется серверная часть контроллера контактов, в описании контроллера GPIO или аппаратного обеспечения должны быть указаны «диапазоны GPIO», сопоставляющие смещения линий GPIO с номерами контактов на контроллере контактов, чтобы они могли правильно ссылаться друг на друга.

Линии GPIO с поддержкой устранения дребезга¶

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

На практике устранение дребезга включает в себя настройку таймера, когда что-то происходит на линии, некоторое время ожидания, а затем повторную выборку линии, поэтому проверьте, имеет ли она то же значение (низкое или высокое). Это также может повторить умный конечный автомат, ожидающий, пока линия станет стабильной. В любом случае он устанавливает определенное количество миллисекунд для устранения дребезга или просто «вкл/выкл», если это время нельзя настроить.

Линии GPIO с поддержкой открытого стока/источника¶

Открытый сток (CMOS) или открытый коллектор (TTL) означает, что линия не имеет активного высокого уровня: вместо этого вы предоставляете сток/коллектор в качестве выхода, поэтому, когда транзистор не открыт, он представляет собой высокоимпедансный (тристатный ) к внешней направляющей:

Эта конфигурация обычно используется для достижения одной из двух целей:

Сдвиг уровня: для достижения логического уровня выше, чем уровень кремния, на котором находится вывод.

Инверсное проводное ИЛИ на линии ввода-вывода, например на линии GPIO, что позволяет любому управляющему каскаду на линии подавать на нее низкий уровень, даже если любой другой выход той же линии одновременно подает на нее высокий уровень. Особым случаем этого является управление линиями SCL и SDA шины I2C, которая по определению является шиной проводного ИЛИ.

В обоих случаях требуется, чтобы линия была оснащена подтягивающим резистором.Этот резистор заставит линию стремиться к высокому уровню, если только один из транзисторов на шине не потянет его вниз.

Уровень на линии будет достигать уровня VDD на подтягивающем резисторе, который может быть выше, чем уровень, поддерживаемый транзистором, что приводит к смещению уровня в сторону более высокого значения VDD.

Встроенная электроника часто имеет выходной драйверный каскад в виде КМОП «тотемного столба» с одним транзистором N-MOS и одним транзистором P-MOS, где один из них управляет линией высокого уровня, а другой — низким. Это называется двухтактным выходом. «Тотемный столб» выглядит так:

Желаемый выходной сигнал (например, поступающий непосредственно из какого-либо выходного регистра GPIO) поступает на вход IN. Переключатели с именами «OD» и «OS» нормально замкнуты, создавая двухтактную цепь.

Рассмотрите маленькие «переключатели» с именами «OD» и «OS», которые включают/отключают транзистор P-MOS или N-MOS сразу после разделения входа. Как видите, любой из транзисторов полностью отключится, если этот переключатель разомкнут. Затем тотемный столб делится пополам и дает высокий импеданс вместо того, чтобы активно управлять линией вверх или вниз соответственно. Обычно так работает программно-управляемый открытый сток/источник.

Некоторое оборудование GPIO поставляется в конфигурации с открытым стоком/открытым исходным кодом. Некоторые из них представляют собой жестко смонтированные линии, которые будут поддерживать только открытый сток или открытый источник, независимо от того, что: там только один транзистор. Некоторые из них настраиваются программно: путем переключения бита в регистре выход можно настроить как с открытым стоком или с открытым исходным кодом, на практике размыканием переключателей, помеченных «OD» и «OS» на рисунке выше.

При отключении транзистора P-MOS выходной сигнал может быть подключен между GND и высоким импедансом (открытый сток), а путем отключения транзистора N-MOS выход может управляться между VDD и высоким импедансом (открытый источник). В первом случае необходим подтягивающий резистор на отходящей шине для замыкания цепи, а во втором случае на шине необходим подтягивающий резистор.

Оборудование, поддерживающее открытый сток или открытый исходный код, или и то, и другое, может реализовать специальный обратный вызов в gpio_chip: .set_config(), который принимает стандартное упакованное значение pinconf, указывающее, следует ли настроить линию как открытую сток, открытый исходный код или двухтактную. . Это произойдет в ответ на установку флага GPIO_OPEN_DRAIN или GPIO_OPEN_SOURCE в машинном файле или в других описаниях оборудования.

Если это состояние не может быть настроено аппаратно, т. е. если аппаратное обеспечение GPIO не поддерживает аппаратное обеспечение с открытым стоком/открытым исходным кодом, библиотека GPIO вместо этого использует прием: когда линия задана как выход, если линия помечен как открытый сток, а выходное значение IN низкое, оно, как обычно, будет установлено на низком уровне. Но если для выходного значения IN установлено высокое значение, вместо этого НЕ оно будет переведено на высокий уровень, вместо этого оно будет переключено на вход, так как входной режим имеет высокий импеданс, таким образом достигается «эмуляция открытого стока» сорта: электрически поведение будет идентичным, за исключением возможных аппаратных глюков при переключении режима линии.

Для конфигурации с открытым исходным кодом используется тот же принцип, только вместо того, чтобы активно снижать уровень линии, она устанавливается на вход.

Линии GPIO с поддержкой резистора pull up/down¶

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

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

Обратный вызов .set_config() может только включать и выключать подтягивание вверх или вниз и не будет иметь никаких семантических сведений об используемом сопротивлении. Он будет говорить только о переключении бита в регистре, включающем или отключающем подтягивание или опускание.

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

Драйверы GPIO, предоставляющие IRQ¶

Обычно драйверы GPIO (микросхемы GPIO) также обеспечивают прерывания, чаще всего каскадно от родительского контроллера прерываний, а в некоторых особых случаях логика GPIO объединяется с основным контроллером прерываний SoC.

Любой потребитель IRQ имеет право запрашивать IRQ у любого irqchip, даже если это комбинированный драйвер GPIO+IRQ. Основная предпосылка заключается в том, что gpio_chip и irq_chip ортогональны и предлагают свои услуги независимо друг от друга.

gpiod_to_irq() — это просто удобная функция для определения IRQ для определенной линии GPIO, и не следует полагаться на то, что она была вызвана до использования IRQ.

Всегда подготавливайте оборудование и делайте его готовым к действию в соответствующих обратных вызовах от API GPIO и irq_chip. Не полагайтесь на то, что gpiod_to_irq() была вызвана первой.

Можно разделить микросхемы irqchips GPIO на две большие категории:

ЧИПЫ КАСКАДНЫХ ПРЕРЫВАНИЙ: это означает, что чип GPIO имеет одну общую линию вывода прерывания, которая запускается любой включенной линией GPIO на этом чипе. Линия вывода прерывания затем направляется к родительскому контроллеру прерываний на один уровень выше, в самом простом случае к первичному контроллеру прерываний системы. Это моделируется irqchip, который будет проверять биты внутри контроллера GPIO, чтобы выяснить, какая линия его запустила. Часть драйвера irqchip должна проверить регистры, чтобы понять это, и, вероятно, также потребуется подтвердить, что она обрабатывает прерывание, очистив какой-то бит (иногда неявно, просто прочитав регистр состояния), и часто потребуется установить настроить такую ​​конфигурацию, как чувствительность к фронту (например, восходящий или спадающий фронт или прерывание по высокому/низкому уровню).

ИЕРАРХИЧЕСКИЕ ЧИПЫ ПРЕРЫВАНИЯ: это означает, что каждая линия GPIO имеет выделенную линию прерывания для родительского контроллера прерываний на один уровень выше. Нет необходимости запрашивать аппаратное обеспечение GPIO, чтобы выяснить, какая линия сработала, но все же может потребоваться подтвердить прерывание и настроить конфигурацию, например чувствительность к фронту.

Соображения, касающиеся реального времени: драйвер GPIO, совместимый с реальным временем, не должен использовать spinlock_t или какие-либо спящие API (например, среду выполнения PM) как часть своей реализации irqchip.

spinlock_t следует заменить на raw_spinlock_t.[1]

Если необходимо использовать спящие API, это можно сделать с помощью обратных вызовов .irq_bus_lock() и .irq_bus_unlock(), так как это единственные обратные вызовы медленного пути на irqchip. При необходимости создайте обратные вызовы.[2]

Каскадные микросхемы GPIO¶

Каскадные микросхемы GPIO irqchips обычно относятся к одной из трех категорий:

ЦЕПОЧНЫЕ КАСКАДНЫЕ GPIO IRQCHIPS: обычно это тип, встроенный в SoC. Это означает, что существует быстрый обработчик потока IRQ для GPIO, который вызывается в цепочке из родительского обработчика IRQ, чаще всего системного контроллера прерываний. Это означает, что обработчик GPIO irqchip будет вызываться немедленно из родительского irqchip, при этом IRQ будут отключены. Затем GPIO irqchip вызовет что-то вроде этой последовательности в своем обработчике прерываний:

Связанные в цепочку GPIO irqchip обычно НЕ могут устанавливать флаг .can_sleep в структуре gpio_chip , поскольку все происходит непосредственно в обратных вызовах: нельзя использовать медленный трафик шины, такой как I2C.

Замечания по работе в реальном времени. Обратите внимание, что обработчики IRQ, объединенные в цепочку, не будут принудительно перенаправлены на -RT. В результате, spinlock_t или любые спящие API (например, среда выполнения PM) не могут использоваться в цепочке обработчиков IRQ.

При необходимости (и если его нельзя преобразовать во вложенный потоковый GPIO-чип irqchip, см. ниже) связанный обработчик IRQ можно преобразовать в общий обработчик IRQ, и таким образом он станет потоковым обработчиком IRQ на -RT и аппаратный обработчик IRQ на не-RT (например, см. [3]).

Ожидается, что generic_handle_irq() будет вызываться с отключенным IRQ, поэтому ядро ​​IRQ будет жаловаться, если оно будет вызвано из обработчика IRQ, который принудительно привязан к потоку. Подделка? Чтобы обойти эту проблему, можно использовать необработанную блокировку:

GENERIC CHAINED GPIO IRQCHIPS: это то же самое, что и «CHAINED GPIO irqchips», но связанные в цепочку обработчики IRQ не используются. Вместо этого диспетчеризация IRQ GPIO выполняется универсальным обработчиком IRQ, который настраивается с помощью request_irq() . Затем GPIO irqchip вызовет что-то вроде этой последовательности в своем обработчике прерываний:

Соображения, касающиеся реального времени: этот вид обработчиков будет принудительно привязан к -RT, и в результате ядро ​​IRQ будет жаловаться, что generic_handle_irq() вызывается с включенным IRQ, и может быть использован тот же обходной путь, что и для «CHAINED GPIO irqchips». применяется.

ВЛОЖЕННЫЕ РЕЗЬБОВЫЕ GPIO IRQCHIPS: это внечиповые расширители GPIO и любые другие GPIO irqchips, находящиеся на другой стороне спящей шины, такой как I2C или SPI.

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

Отличительной чертой многопоточных GPIO irqchip является то, что они устанавливают флаг .can_sleep в структуре gpio_chip в значение true, указывая, что этот чип может спать при доступе к GPIO.

Эти типы irqchips по своей природе устойчивы к работе в реальном времени, поскольку они уже настроены для обработки спящих контекстов.

Инфраструктурные помощники для GPIO irqchips¶

Чтобы помочь в настройке и управлении irqchips GPIO, а также связанных обратных вызовах irqdomain и распределения ресурсов. Они активируются выбором символа Kconfig GPIOLIB_IRQCHIP. Если также выбран символ IRQ_DOMAIN_HIERARCHY, также будут предоставлены иерархические помощники. Большая часть служебного кода будет управляться gpiolib, при условии, что ваши прерывания сопоставляются 1-к-1 с индексом линии 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 и сопоставляет эти прерывания со вторичными прерываниями, которые обрабатываются драйверами периферийных устройств. Первичные прерывания — это прерывания, генерируемые аппаратными устройствами. Вторичные прерывания генерируются операционной системой в ответ на определенные первичные прерывания. Как первичные, так и вторичные прерывания идентифицируются глобальными системными прерываниями (GSI). Микропрограмма ACPI для аппаратной платформы назначает GSI первичным прерываниям, а во время выполнения операционная система назначает GSI вторичным прерываниям.

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

GpioClx реализует ISR, который обрабатывает первичные аппаратные прерывания от контроллера GPIO. Когда периферийное устройство устанавливает прерывание на контакте GPIO, а прерывания на этом контакте разрешены и не маскируются, контроллер GPIO прерывает работу процессора. В ответ обработчик ловушки ядра планирует запуск GpioClx ISR. Чтобы определить вывод GPIO, вызвавший прерывание, GpioClx ISR вызывает функцию обратного вызова события CLIENT_QueryActiveInterrupts, которая реализуется драйвером контроллера GPIO. Затем GpioClx ISR ищет 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, см. в следующих разделах:

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

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

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

AMD — американская компания, производящая мощные продукты для компьютеров. Вы должны знать его знаменитую серию графических процессоров и процессоров. Вы можете установить их на свой компьютер. Если у вас возникли проблемы с продуктами AMD, вы можете просто обновить драйверы AMD, чтобы решить эту проблему.

Что такое драйвер GPIO?

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

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

Обновить драйвер AMD GPIO

Драйверы AMD GPIO можно обновить двумя способами:

Вариант 1. Используйте инструмент автоматического обнаружения драйверов AMD

Инструмент автоматического обнаружения драйверов AMD предназначен только для компьютеров под управлением Windows 10/7, оснащенных дискретной графикой AMD Radeon для настольных ПК, мобильной графикой или процессорами AMD с графикой Radeon. Этот инструмент может автоматически определять модель AMD и версию системы Windows, а затем загружать и устанавливать последнюю версию драйвера AMD для вашего компьютера. Таким образом, вы можете загрузить этот инструмент и использовать его для обновления/загрузки драйверов AMD.

Вариант 2. Автоматическое обновление драйвера AMD GPIO

Если вы не можете выполнить требования инструмента автоматического обнаружения драйверов AMD и хотите сэкономить время, попробуйте Driver Easy. Driver Easy автоматически распознает вашу систему и найдет для нее правильные драйверы. Это также удобный инструмент для автоматического обновления драйверов AMD.

Разница между Driver easy и средством автоматического обнаружения драйверов AMD заключается в том, что Driver Easy не имеет ограничений, в отличие от средства автоматического обнаружения драйверов AMD. Не только для продуктов AMD, но и для других продуктов. Driver Easy может помочь вам обновить все драйверы на вашем компьютере. Вам не нужно точно знать, какая система работает на вашем компьютере, вам не нужно беспокоиться о том, что вы загружаете не тот драйвер, и вам не нужно беспокоиться об ошибке при установке.

Вы можете автоматически обновлять драйверы с помощью БЕСПЛАТНОЙ или профессиональной версии Driver Easy. Но с версией Pro это займет всего 2 клика (и вы получите полную поддержку и 30-дневную гарантию возврата денег).

    и установите драйвер Easy.
  1. Запустите Driver Easy и нажмите кнопку "Сканировать сейчас". Затем Driver Easy просканирует ваш компьютер и обнаружит проблемные драйверы.
  2. Нажмите кнопку «Обновить» рядом с помеченной графической картой, чтобы автоматически загрузить правильную версию драйвера (это можно сделать в БЕСПЛАТНОЙ версии). Затем установите драйвер на свой компьютер. Или нажмите «Обновить все», чтобы автоматически загрузить и установить правильную версию всех драйверов, которые отсутствуют или устарели в вашей системе (для этого требуется версия Pro — вам будет предложено выполнить обновление, когда вы нажмете «Обновить все»).
  3. Мы надеемся, что этот пост удовлетворит ваши потребности. Если у вас есть какие-либо вопросы или предложения, не стесняйтесь оставлять комментарии ниже. Было бы очень мило с вашей стороны, если бы вы согласились нажать кнопку большого пальца ниже.

    Читайте также: