Pull to refresh
35
Karma
0
Rating
Alexey Ivanov @Alexeynew

low level programming

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

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

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

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

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

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

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

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

2) У вас каждое предложение с претензиями:) Конечно я в курсе что имена в sysfs не обязательно будут называться gpioN, но только в том случае если реализован данный функционал. В данной статье отсутсвует поддержка задания имени GPIO. Если в статью добавлять все нюансы которые могут быть в GPIO, то статья может очень сильно растянуться. Чего только стоит поддержать PINCTRL для GPIO.

3) Наверное вы хотите показать, что вы разбираетесь в теме:) Если же у нас достаточно много GPIO, то их разбивают на банки, например: тут. В любом случае, это уже нюансы реализации, а также специфика конкретного чипа, упоминание которых только растянут сатью.

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

В любом случае, спасибо за ваши коментарии:)

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

Данная статья показывает принцип взаимодействия драйвера с sysfs интерфейсом на конкретном примере, а также принцип создание GPIO драйвера с нуля. И так как в драйвере происходит динамическое создание номеров GPIO, это абсолютно предсказуемо, что они будут отличаться. Скорее всего в системе уже существует GPIO драйвер, нужно только узнать правильные номер. Можно изменить диапазон в цикле и тогда вам удасться узнать номера присутсвующих GPIO в системе. Есть еще один вариант: посмотреть на запись gpiochipN, и с большой вероятностью, номера GPIO начинаются с N.

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

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

Пишем модуль ядра Linux: GPIO с поддержкой IRQ

Действительно, спасибо!

Пишем модуль ядра Linux: I2C

Добрый день, с удовольствием отвечу на ваш вопрос. В линуксе очень жесткий code style, без соблюдения которого ваш драйвер не примут в mainline, темболее существует скрипт который проверяет на соответсвие code style. Но, к сожалению, я не соблюдал и не проверял при переносе в статью на соответсвие стандарту. Могу лишь сказать что соблюдение этого стандарта обязательно и вы можете открыть любой драйвер и убедиться в строгом соответсвие. Разработанный драйвер также соответсвует стандарту, но код которого прикрепить по понятным обстоятельствам я не могу.

Процесс портирования драйверов устройств Linux

Как собрать свой собственный драйвер вы можете посомтреть мою предыдущую статью, там довольно все подробно описано, а также есть пример.

Процесс портирования драйверов устройств Linux

Да, полностью согласен, обязательно лучше изучить уже готовые практики в других драйверах, которые входят в основную ветку ядра, а не изобретать велосипед. Решил опустить эту информацию чтобы не отойти от главной цели статьи:) Спасибо за комментарий!)

Как написать свой первый Linux device driver. Часть 2

Добрый вечер!
В начале первой части написано:
Цель данной статьи — показать принцип реализации драйверов устройств в системе Linux, на примере простого символьного драйвера.
Обычно драйвера устройств, как бы это странно не звучало, пишутся для конкретного устройства, но в данной статье показан драйвер для «фейковго устройства». Это сделано для того, чтобы показать принцип реализации драйверов устройств в системе Linux. Как вы можете видеть функции read и write просто осуществляют чтение и запись из/в выделенного потока байтов.

Как написать свой первый Linux device driver

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

Как написать свой первый Linux device driver

Не стоит ужасаться использования goto в данном примере, это обычная практика обработки ошибок в различных драйверах. Посмотрите lxr — очень полезный ресурс.

Как написать свой первый Linux device driver

Да, вы правы, можно использовать обе функции, в статье же используется метод «в лоб», но упомянуть про эти них тоже стоит, добавлю в ближайшее время, спасибо.

Как написать свой первый Linux device driver

Спасибо, в ближайшее время добавлю эту информацию.

Как написать свой первый Linux device driver

А Вы привели определение именно Вашего драйвера с учетом его функционального назначения — это не верно.
Соглашусь, был рассмотрен частный случай. Я пытался, каким то образом обобщить определение (Попытка провалилась:().
Литературу приводят обычно в первой части цикла статей, либо в аннотации к циклу.
Действительно, лучше сразу указать.
Открою Вам секрет, LPT-порт — это символьное устройство, а значит и драйвер к нему тоже символьный)) (опять Вы «по верхам» смотрели)
И еще одно важное замечание, не все драйвера, которые работают с памятью ядра, являются символьными — например, драйвер RAM-диска блочный. Об этом Вы еще прочитаете в других разделах LDD, чего я искренне желаю, если не потеряете интерес к этому после диплома.
Да, я знаю, что LPT порт — это символьное устройство))
Но, спасибо за замечания, попытаюсь учесть.

Как написать свой первый Linux device driver

Добрый день.
Да, вы правы, действительно статьи есть, но та статья, которую вы упомянули требует дополнительного аппаратного обеспечения, символьный же драйвер, не требует, по сути, ничего.
По поводу, литературы, вы также абсолютно правы, я хотел бы привести список, когда написал бы последнюю часть этой статьи.
Названия не менял по этой же причине, я не хотел показать, что я написал драйвер, не используя литературы, наоборот, я хочу чтобы люди, которые хотят попробовать написать драйвер имели больше информации и пояснений.
По поводу второго вашего замечания, как бы вы дали определения символьного драйвера? (Который по сути и работает с памятью, которое выделило ядро, и единственные действия, которые осуществляет, copy_from/to_user space.)

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Registered
Activity