Что такое amd gpio controller

990x.top

Простой компьютерный блог для души)

AMD GPIO Driver — что это за драйвер? (AMD GPIO Controller)

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controllerДрайвер интерфейса ввода/вывода (чипсет).

Простыми словами — нужен для корректной работы чипсета (набор логики) на материнской плате.

Без драйвера скорее всего тоже все будет работать, но функции будут только базовые, дополнительные — работать не будут. Всякие технологии, заложенные в чипсет, в том числе которые теоретически могут ускорить работу Windows — будут работать только после установки этого драйвера. Например регулировка частоты в Windows (в настройках Электропитания), автоматическое ее снижение в простое — не будет работать без этого драйвера. Также могут не работать порты USB 3.0/3.1 (точнее работать будут, но как версия 2.0) или некоторые технологии ускорения передачи данных по USB.

Также вы можете встретить драйвер с названием AMD GPIO Driver Promontory — это просто версия для чипсетов серии 300, 400 и X570.

Сам драйвер входит в состав пакета AMD Chipset Drivers. Поэтому можно сделать вывод, что он точно нужен для чипсета. Также в пакет входят и другие — AMD PCI driver, PSP driver, AMD SMbus, Promonotory GPIO Driver. И еще — после установки пакета можно перейти в эту папку (в нее распаковываются дрова):

И установить оттуда схему электропитания Ryzen balanced PowerPlan, которая тоже оптимизирует работу ПК.

После корректной установки драйверов у вас в диспетчере появится устройство AMD GPIO Controller:

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controllerКстати, выше еще видим AMD PSP Device — это специальное устройство, которое участвует в защите софта AMD, а также используется в работе антивирусов, защищает некоторые компоненты Windows от вирусов. Аналог Intel Management Engine. PS: быстрый способ открыть диспетчер устройств: зажмите Win + R > введите команду devmgmt.msc > нажмите ОК.

Надеюсь информация оказалась полезной. Удачи и добра, до новых встреч друзья!

Источник

Что такое GPIO (General Purpose Input/Output).

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

Что такое GPIO (General Purpose Input/Output).

Порт GPIO (универсальный ввод/вывод) размещают внутри кристаллов прцессоров, чипсетов, вспомогательных чипов управления. Порт GPIO обрабатывает как входящие, так и исходящие цифровые сигналы. В качестве входного порта его можно использовать, например, для связи ЦП или PCH с сигналами полученными от переключателей, или цифровыми показаниями, полученными от датчиков. В качестве выходного порта его можно использовать для формирования сигналов управления внешними операциями на основе программ исполняемых процессором, например, для управления включением/ выключением светодиодной подсветки дисплея, или вывода сигналов управления двигателем и т. п..

GPIO называют «порт общего назначения», поскольку каждый его разряд может быть свободно настроен для работы по приему как входных сигналов, так и для формирования выходных сигналов (программным путем). В ранних вариантах каждый порт был либо исключительно входным, либо исключительно выходным. Однако сейчас GPIO является «гибким» по использованию своих контактов. Вы можете установить их назначение наилучшим образом в соответствии с вашими потребностями ( на вход, на выход или вход/выход в любой количественной комбинации.

Во время чтения, записи и работы с цифровыми значениями (0 и 1) внешние устройства часто используют уровни сигнала: «низкое» напряжение и «высокое» напряжение. GPIO выполняет необходимые преобразования в обоих направлениях.

Регистр входных данных порта (PIDR). Показывает состояние входных контактов. Для каждого вывода вход LOW-сигнала устанавливает соответствующее значение разряда регистра в 0; вход сигнала HIGH устанавливает соответствующее значение разряда регистра в 1. CPU программно считывает этот регистр, чтобы узнать самые последние уровни сигнала его разрядов. Значения сохраняются до перезаписывания; каждый раз, когда CPU считывает регистр, он будет отображать текущие состояния входных сигналов.

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

Рис. 1. Базовая структура GPIO (концептуальная).

Регистр выходных данных порта (PODR). Чтобы выводить данные через выходные выводы, ЦП программно записывает выходные значения в этот регистр. Значение 0 преобразуется в LOW-выход; 1 преобразуется в HIGH выход. Как и в обычной памяти, значения, записанные здесь, сохраняются до перезаписывания. Это означает, что уровень выходного контакта будет поддерживаться до тех пор, пока значение не будет изменено.

Модуль GPIO является гибким для различных приложений. Каждый вывод GPIO может быть настроен в качестве альтернативного режима ввода или альтернативного выхода. Альтернативная функция может быть выбрана регистром установки.

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

На рис. 3 видим, например, что разряд GPIO77 – используется для приема входного сигнала DGPU_PWRGD; разряд GPIO7 8 – используется для формирования выходного сигнала PXS_PWREN.

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

Рис. 3. Фрагмент схемы (однокристальный вариант Intel Haswell ULT/Broadwell U)

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

Рис. 4. Использование порта GPIO в ЕС контроллере (EC-KB9012).

Источник

Драйвер виртуальных GPIO с контроллером прерываний на базе QEMU ivshmem для Linux

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

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

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

Даже в примере приведенном в LDD3 (драйвер snull) прерывания эмитируются явным вызовом функции парного устройства. Так же имеются примеры в курсах USFCA (http://cs.usfca.edu/

cruse/cs686s08/), но они используют чужое прерывание, тесно связаны с архитектурой x86 и сильно устарели.

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

ivshmem — разделяемая память Inter-VM

Разработано для совместного использования разделяемой памяти (выделенной на хост-платформе через механизм POSIX shared memory API) множественными процессами QEMU с различными гостевыми платформами. Для того чтобы все гостевые платформы имели доступ к области разделяемой памяти, ivshmem моделирует PCI устройство предоставляя доступ к памяти как PCI BAR.

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

и проанализировал быстродействие в целом.

В настоящей момент, официально, сопровождение ivshmem никто не осуществляет, тем не менее большой вклад в развитие ivshmem вносят сотрудники Red Hat.

ivshmem может послужить основой для симуляции и отладки многих классов устройств.
В данной статье мы рассматриваем виртуальную pci плату ввода/вывода общего назначения (general-purpose input/output, GPIO), которая так же является источником прерываний, и соответствующий драйвер с предоставлением доступа и управления посредством механизма sysfs.

Для разработки и тестирования использовалась виртуальная плата qemu versatilepb (system ARM).

g>> — команды или вывод выполняемые на гостевой системе.
h>> — на основной.

Пример и оригинальный код

Для начала продемонстрируем оригинальный код, основанный на оригинальном коде ( https://github.com/henning-schild/ivshmem-guest-code ), и модифицированном, в последствии, Siro Mugabi.

В принципе этого вполне достаточно для эмуляции GPIO уже в таком виде. И во многих случаях так и поступали, когда достаточно простого состояния входа или записи в выход, использование sysfs и прерываний предполагают небольшую надстройку на I/O mem.

Реализация

Заметим, что /dev/ivshmem0 и ne_ivshmem_shm_guest_usr.c нам более не нужны, вся работа с устройством со стороны гостевой машины из пространства пользователя (user-space) будет осуществляться средствами интерфейса sysfs.

Прежде чем разметить наше устройство в памяти, хотелось бы отметить, что мы просто дублируем схему применяемую в большинстве gpio драйверов.

Во-первых все входа/выхода gpio разделены на порты, как правило по 8, 16, 32 входа. Каждый порт имеет, как минимум, регистр состояния входов (GPIO_DATA), регистр направления, если переключение in/out поддерживается (GPIO_OUTPUT). Далее (если есть поддержка в самом устройстве), регистр состояния прерываний, регистры прерывания по переднему фронту (rising) и заднему фронту (falling) и по уровню (high и low). Аппаратное прерывание, поставляемое главным контроллером прерываний, как правило, одно на весь порт и делится между всеми входами порта.

Примеры существующих реализаций с комментариями

Sitara am335x

более известна в составе платы beaglebone

Разработчик: Texas Instruments
Документация: AM335x Sitara Processors Technical Reference Manual (page 4865)
Соответствующий ему драйвер gpio: linux/drivers/gpio/gpio-omap.c
Соответствующий заголовок: linux/include/linux/platform_data/gpio-omap.h
Количество входов/выходов: 128 (4 gpio порта — по 32 контакта каждый)

Имя регистраСмещениеИмя в драйвереКомментарий
GPIO_IRQSTATUS_00x02СOMAP4_GPIO_IRQSTATUS_0Состояние прерывания для заданного входа
GPIO_IRQSTATUS_10x030OMAP4_GPIO_IRQSTATUS_1Состояние прерывания для заданного входа
GPIO_IRQSTATUS_SET_00x034OMAP4_GPIO_IRQSTATUS_SET_0Включает прерывания по заданному входу
GPIO_IRQSTATUS_SET_10x038OMAP4_GPIO_IRQSTATUS_SET_1Включает прерывания по заданному входу
GPIO_IRQSTATUS_CLR_00x03СOMAP4_GPIO_IRQSTATUS_CLR_0Выключает прерывания по заданному входу
GPIO_IRQSTATUS_CLR_10x040OMAP4_GPIO_IRQSTATUS_CLR_1Выключает прерывания по заданному входу
GPIO_OE0x134OMAP4_GPIO_OEКонтролирует состояние вход/выход (in/out)
GPIO_DATAIN0x138OMAP4_GPIO_DATAINСостояние входа/выхода
GPIO_DATAOUT0x13COMAP4_GPIO_DATAOUTЗадание состояния для выходов (low/high)
GPIO_LEVELDETECT00x140OMAP4_GPIO_LEVELDETECT0Включение/выключения прерывания для входа по низкому уровню сигнала
GPIO_LEVELDETECT10x144OMAP4_GPIO_LEVELDETECT1Включение/выключения прерывания для входа по высокому уровню сигнала
GPIO_RISINGDETECT0x148OMAP4_GPIO_RISINGDETECTВключение/выключения прерывания для входа по переднему фронту
GPIO_FALLINGDETECT0x14СOMAP4_GPIO_FALLINGDETECTВключение/выключения прерывания для входа по заднему фронту
GPIO_CLEARDATAOUT0x190OMAP4_GPIO_CLEARDATAOUTПереключает соответствующий вход в состояние low
GPIO_SETDATAOUT0x194OMAP4_GPIO_SETDATAOUTПереключает соответствующий вход в состояние high

Примечание: GPIO_IRQSTATUS_N также используется для IRQ ACK. Управление дребезгом, а так же питанием выходит за рамки данной статьи.

ep9301

Разработчик: Cirrus Logic
Документация: EP9301 User’s Guide (page 523)
Соответствующий ему драйвер gpio: linux/drivers/gpio/gpio-ep93xx.c
Соответствующий заголовок: linux/arch/arm/mach-ep93xx/include/mach/gpio-ep93xx.h
Количество входов/выходов: 56 (7 портов gpio — по 8 контактов каждый)

Имя регистраСмещениеИмя в драйвереОписание
PADR0x00EP93XX_GPIO_REG(0x0)Регистр состояние входов/выходов доступен для чтения записи
PADDR0x10EP93XX_GPIO_REG(0x10)Контролирует состояние вход/выход (in/out)
GPIOAIntEn0x9Cint_en_register_offset[0]Включает прерывания по заданному входу
GPIOAIntType10x90int_type1_register_offset[0]Задает тип прерывания level/edge
GPIOAIntType20x94int_type2_register_offset[0]Задает high/rising или low/fallingв зависимости от выбранного типа прерываний
GPIOAEOI0x98eoi_register_offset[0]Регистр для оповещения об обработанном прерывании
IntStsA0xA0EP93XX_GPIO_A_INT_STATUSРегистр состояние прерывания

Примечание:
Из них для доступны 7 портов по 8, 8, 1, 2, 3, 2, 4 входов/выходов причем регистрами прерываний обладают только первый, второй и пятый порты.
В таблице рассмотрен только порт A.
Одной из особенностей ep9301, является то что тип прерываний both на аппаратном уровне не поддерживается, в драйвере происходит переключение в момент срабатывания прерывания. Другая интересная особенность — на порту F каждый контакт имеет свое собственное прерывание.

Bt848

Последний пример: pci плата Bt848, с gpio.

Разработчик: Intel
Документация: Bt848/848A/849A (page 68)
Соответствующий драйвер gpio: linux/drivers/gpio/gpio-bt8xx.c
Соответствующий заголовок: linux/drivers/media/pci/bt8xx/bt848.h
Количество входов/выходов: 24

Bt848 является платой видеозахвата.

Имя регистраСмещениеИмя в драйвереОписание
BT848_GPIO_OUT_EN0x118BT848_GPIO_OUT_ENРегистр состояние входов/выходов доступен для чтения и записи
BT848_GPIO_DATA0x200BT848_GPIO_DATAКонтролирует состояние вход/выход (in/out)

Поддержки прерываний нет. Всего два регистра — состояние и настройка in/out.

Размечаем в памяти наше устройство

Для начала выделим место под данные и управление состоянием.

Пусть устройство обладает 8 входами/выходами общего назначения, тогда:

Имя регистраСмещениеИмя в драйвереОписание
DATA0x00VIRTUAL_GPIO_DATAРегистр состояние входов/выходов доступен для чтения и записи
OUTPUTEN0x01VIRTUAL_GPIO_OUT_ENКонтролирует состояние вход/выход (in/out)

Краткая справка по интерфейсу gpio

Состояние выхода при переключении

Необходимо отметить параметр int value в функции direction_output, которая обслуживает файл /sys/class/gpio/gpioN/direction, принимающий значение не только “in”/”out”, но так же и “high”/“low”, значения которых передаются как параметр value (этот простой факт, по какой-то причине, редко упоминается в руководствах для начинающих).

Динамическое присвоение int base и наследие ARCH_NR_GPIOS

Исторически, количество GPIO в ядре было ограничено параметром ARCH_NR_GPIOS, по умолчанию равном 256 и, впоследствии увеличенном до 512 (версия 3.18).

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

Причиной такого поведения было определение таблицы описаний GPIO как статической и максимальная величина смещения для каждого порта была ограничена:

Порты GPIO и их смещения были жестко определены в файлах описывающих аппаратную часть конкретного SOC, например:

Начиная с версии 3.19 статический массив был заменен на динамические для каждого порта GPIO, выделяемого в фукнции gpiochip_add().

Тем не менее ARCH_NR_GPIOS все еще здесь (на момент версии 4.7) и используется для поиска смещения при динамическом присваивании base.

Определим следующие функции нашего драйвера

Задать соответствующий контакт как вход:

Чтение текущего состояния контакта:

Задать соответствующий контакт как выход:

Задать состояние выхода:

Функция регистрации нашего драйвера как устройства gpio_chip:

vgread и vgwrite это просто обертки для функций iowrite8 и ioread8:

Передача значения gpiobase в качестве параметра при динамической загрузки модуля

Загрузка и тестирования модуля

DATA выставлен, OUTPUTEN выставлен.

Добавляем прерывания

Разметка регистров прерываний и базовая обработка прерывания

Примечание: В виртуальном драйвере рассматриваются только EDGEDETECT_RISE и EDGEDETECT_FALL.

Добавляем следующие регистры:

Имя регистраСмещениеИмя в драйвереОписание
INTERRUPT_EN0x01VIRTUAL_GPIO_INT_ENВключает прерывания по заданному входу
INTERRUPT_ST0x02VIRTUAL_GPIO_INT_STРегистр состояния прерывания
INTERRUPT_EOI0x03VIRTUAL_GPIO_INT_EOIРегистр для оповещения об обработанном прерывании
EDGEDETECT_RISE0x04VIRTUAL_GPIO_RISINGВключение/выключения прерывания для входа по переднему фронту
EDGEDETECT_FALL0x05VIRTUAL_GPIO_FALLINGВключение/выключения прерывания для входа по заднему фронту
LEVELDETECT_HIGHNCNOT CONNECTED
LEVELDETECT_LOWNCNOT CONNECTED

За обработку прерывания от pci шины отвечает следующая функция, на данный момент её роль заключается всего лишь в уведомлении об обработанном прерывании:

irq_chip и концепция chained_interrupt

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

Вот почему часть драйвера GPIO отвечающего за прерывания использует irq_chip. Другими словами такой драйвер использует две подсистемы одновременно: gpio_chip и irq_chip.

Беглый взгляд на подсистему irq дает нам следующую картину:

Что такое amd gpio controller. Смотреть фото Что такое amd gpio controller. Смотреть картинку Что такое amd gpio controller. Картинка про Что такое amd gpio controller. Фото Что такое amd gpio controller

High-Level Interrupt Service Routines (ISRs) — Выполняет всю необходимую работу по обслуживанию прерывания на драйвере устройства. Например, если прерывание используется для индикации доступных для чтения новых данных, работа ISR будет заключаться в копировании данных в соответствующее место.

Interrupt Flow Handling — Данная подсистема отвечает за особенности в реализации обработок прерываний, таких как срабатывание по уровню сигнала (level) или по фронту (edge).

Срабатывание по фронту (Edge-triggering) происходит при определении, что на линии произошло изменение потенциала. Срабатывание по уровню (Level-triggering), определяется как определенное значение потенциала, при этом изменение потенциала не играет роли.

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

Chip-Level Hardware Encapsulation — Используется для инкапсуляции особенностей реализации работы с аппаратной частью. Данную подсистему можно рассматривать как разновидность “драйвера устройства” для контроллеров прерываний.

Как мы видим ядро берет на себя управление обработкой цепочки прерывания и разницу в реализации типов (по фронту и по уровню), если предоставить соответствующую инфраструктуру.

IRQ Domains

Подсистема IRQ Domain появившееся в патче irq: add irq_domain translation infrastructure позволила отделить локальные для контроллера номера прерываний от номеров прерываний в ядре, предоставив общий массив номеров прерываний. Цитируя официальную документацию: «Сегодня номер IRQ, это просто номер».

До данного обновления аппаратные номера отображались на номерами ядра как 1:1, а каскадирование не поддерживалось. Под аппаратными номерами, понимается локальные для контроллера номера прерывания, которые в нашем случае совпадают с локальными номерами GPIO.

Поскольку наш вектор прерываний достаточно мал, и у нас точно нет интереса в «No map» отображении, наше отображение линейно, фактически номера сопоставляются 1:1 со смещением, разница со старым подходом состоит в том что за присвоение номеров irq и за вычисление смещения отвечает ядро, при этом гарантируется непрерывность выделяемого диапазона.

В каждую функцию интерфейса irq_chip передается указатель на структуру struct irq_data, где irq_data->irq это номер прерывания в ядре linux, a irq_data->hwirq это наш локальный номер прерывания в рамках драйвера. Так же в struct irq_data передается указатель на нашу структуру struct virtual_gpio, что неудивительно.

Связывание irq_chip и gpio_chip

Если бы мы ориентировались на более младшие версии ядра, нам пришлось бы воспользоваться функцией irq_domain_add_simple для отображения наших номер, но с версии 3.15 в патче gpio: add IRQ chip helpers in gpiolib patch нет необходимости напрямую использовать интерфейс IRQ Domain.

Поэтому вместо прямого использования интерфейса IRQ Domain и предоставления инфраструктуры для отображения локальных номеров на глобальные (.map() ops), мы воспользуемся функциями gpiochip_irqchip_add и gpiochip_set_chained_irqchip (зависят от параметра GPIOLIB_IRQCHIP Kconfig).

Прекрасным примером использования и простоты в применении, является драйвер gpio-pl061.

Привязываем наш irq_chip к уже существующему gpio_chip:

handle_edge_irq — это один из встроенных обработчиков потока, который берет на себя управление цепочкой прерывания по фронтам.

Примечание: прерывания по фронтам является наиболее распространенным. Главное отличие от прерываний по уровню заключается как раз в управлении цепочкой, прерывание по уровню маскируется в ядре сразу после получения.

Вызовом функции gpiochip_set_chained_irqchip мы сообщаем ядру, что наш irq_chip использует прерывание от PCI шины и наши прерывания каскадируются от pdev->irq.

Доработаем наш обработчик, чтобы он генерировал прерывания в зависимости от состояния VIRTUAL_GPIO_INT_ST:

irq_find_mapping — вспомогательная функция для трансляции локального номера входа в глобальный номер прерывания.

Собираем все вместе

Прежде всего, отметим, что интерфейс irq_chip нашего драйвера, выглядит следующим образом:

Функция ack() всегда тесна связана с аппаратной спецификой контроллера. Некоторым устройствам, например требуется подтверждение обработки запроса прерывания, прежде чем могут быть обслужены последующие запросы.

В нашем случае в программе vg_get_set – используется достаточно грубая эмуляция регистра eoi. После выставления флага статуса прерывания, в цикле постоянно опрашивается eoi регистр. Когда бит входа уведомления о прерывании выставляется драйвером, происходит обнуление регистра eoi и снятие бита статуса прерывания на входе.

Маскирование и демаскирование производится записью соответствующего значения в регистр INTERRUPT_EN.

irq_type позволяет задать тип триггера — на текущий момент в ядре определены следующие типы:
IRQ_TYPE_NONE — тип не задан
IRQ_TYPE_EDGE_RISING — по переднему фронту
IRQ_TYPE_EDGE_FALLING — по заднему фронту
IRQ_TYPE_EDGE_BOTH — по переднему и заднему фронту
IRQ_TYPE_LEVEL_HIGH — по высокому уровню
IRQ_TYPE_LEVEL_LOW — по низкому уровню

Тестирование и результаты

Для тестирования передачи информации о прерываниях в user space, воспользуемся специально написанной утилитой vg_guest_client. Согласно документации по gpio_sysfs, “Если вы используете select для отслеживания событий, задайте файловый дескриптор (входа) в exceptfds”.

Подготавливаем входы к работе при помощи sysfs:

Примечание: gpio на подавляющем большинстве устройств по умолчанию инициализируются как входы.

Цепочка вызовов от нашего обработчика прерывания к уведомлению pselect:

Заключение

Данная статья подразумевалась мной, как базовая для материала, который сложно, или даже невозможно, представить без какого-либо общего вступления. Qemu в паре с ivshmem послужили отличным и понятным базисом для этой цели. Причиной выбора этой конкретной связки является наличие вменяемой документации и прозрачности использования.

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

Сам драйвер, несмотря на безусловную образовательную ценность, далек от идеала в контексте современного ядра. Для подобного простого драйвера стоит использовать generic-gpio драйвер, созданный, чтобы избежать похожего, повторяющегося кода для mmio gpio драйверов, использование которого, правда, не так очевидно. Обработку прерываний можно было бы сделать более элегантной, а значения смещений регистров лучше хранить в структуре драйвера.

Так же нельзя упускать из виду последние изменения в gpiolibsysfs gpio теперь является устаревшей. Новый основанный на ioctl интерфейс для gpiolib на пути становления как новый стандарт для общения с GPIO. Но младшие версии еще долго будут использоваться, к тому же никто не собирается на данный момент убирать из ядра старый интерфейс. У меня например до сих пор есть устройства успешно работающие на версии ядра 2.6.34.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *