Изучение разработки драйверов для Linux с помощью Raspberry Pi

13

Я хотел бы написать драйвер устройства Linux для какого-то реального аппаратного устройства. Какие периферийные устройства Raspberry Pi хорошо подходят? В основном мне нужно следующее:

  1. Он должен быть достаточно маленьким для начинающего (максимум несколько месяцев, лучше несколько недель).

  2. Лист данных должен быть доступен. Сначала я думал об адаптере USB-Ethernet, но похоже, что он имеет очень ограниченную таблицу данных.

Есть идеи? Может быть что-то вроде того, чтобы заставить последовательную консоль работать над GPIO?

иван
источник
2
Драйверы Linux являются модулями ядра, и технически они вообще не имеют никакого отношения к аппаратному обеспечению, поэтому первое, что вы хотите попробовать, это, вероятно, интерфейс char-устройства - то есть то, что предоставляет файл char-устройства, который может быть прочитанным и / или записанным (очень похоже на материал в proc) для какой-то тривиальной цели.
Златовласка
Я сделал все это, закончил учебники и написал модули ядра для псевдоустройств, а также читал книги по разработке ядра / драйвера. Это все хорошо, но теперь я хочу работать с реальным оборудованием ..
ivan
Грег К.Х. написал это некоторое время назад (в некоторых отношениях оно может быть немного устаревшим): linuxjournal.com/article/7353 Итак, есть устройства USB с открытыми таблицами данных. У него есть несколько советов по обратному проектированию (я бы не хотел делать это с чем-то слишком сложным, хотя) Вещи для выводов GPIO. Я думаю, что обычно они работают с использованием существующих драйверов I2C и т. Д., Но вы можете просто проигнорировать это и сделать что-то самостоятельно.
Златовласка

Ответы:

4

Может быть трудно научиться писать драйверы при взаимодействии со сложными устройствами и / или сложными автобусами. По этой причине я бы рекомендовал использовать несколько простых и хорошо известных устройств (игнорируя существующую реализацию их драйверов в ядре), таких как устройства I²C / SPI, которые обычно используются с микроконтроллерами. Например, вы можете найти любое устройство, которое «поддерживается» сообществом Arduino (имеется в виду библиотека / документация для него) и попробовать использовать его с RaspberryPi.

Если этого недостаточно или вы не хотите покупать слишком много оборудования, вы можете создать его самостоятельно. Просто возьмите какой-нибудь микроконтроллер (например, atmega или что-то в этом роде), создайте программу, чтобы он стал каким-то устройством, а затем попробуйте подключиться к нему с помощью драйверов Linux. Таким образом, вы можете легко создавать программы, которые будут эмулировать устройства разных классов. А поскольку вы сами напишите свою «прошивку», это поможет вам решить проблемы.

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

Кшиштоф Адамски
источник
Как насчет реализации последовательной связи в программном обеспечении через контакты GPIO? Например, подключите последовательный порт к ПК и попытайтесь хотя бы вывести что-то на консоль Это жизнеспособно?
Иван
@ivan: Я не уверен, правильно ли я понял. Если под последовательным интерфейсом вы имеете в виду UART / rs232, а под программным обеспечением - битбэнг, то это невозможно из-за временных ограничений. Если, с другой стороны, вы имеете в виду (пере) реализацию последовательного устройства Linux с использованием оборудования RaspberryPi UART, то это, конечно, выполнимо. Я считаю, что всю информацию, необходимую об этом оборудовании, можно найти в BCM2835 ARM Peripheralsдокументе. Но помните, что для того, чтобы использовать его, сначала нужно отключить существующий драйвер в ядре.
Кшиштоф Адамски,
Спасибо, но уверены ли вы в невозможности использования UART? Я нашел эту ссылку: ganssle.com/articles/auart.htm, так что она выглядит потенциально выполнимой для низкой скорости передачи и, по крайней мере, только для реализации отправляющей части (что проще).
Иван
@ivan: Эта статья не касается систем с операционными системами общего назначения, таких как Linux. В UART у вас действительно строгие временные ограничения, с которыми очень трудно справиться без операционной системы реального времени. Это, как говорится, может быть возможно сделать это при низкой скорости передачи данных, но это может быть не очень надежным.
Кшиштоф Адамски
Похоже, вы правы: raspberrypi.stackexchange.com/questions/1987/… (однако там есть интересное решение). Еще раз спасибо за помощь.
Иван
3

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

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

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

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

PiBorg
источник
Привет, @PiBorg. Можете ли вы рассказать о некоторых ресурсах, которые помогут мне научиться кодировать простой драйвер для устройства, например, один или несколько светодиодов, подключенных непосредственно к выводам GPIO?
Сагар
0

Простейшее «устройство», для которого вы можете написать аппаратный драйвер (если разработка аппаратного драйвера - ваша вещь) также может быть простым, как светодиод (я добавил кавычки, потому что технически светодиод не является устройством, но он все еще является частью оборудование), как предложил @PiBorg.

Другими вариантами выбора могут быть некоторые простые в интерфейсе устройства / компоненты, такие как фоторезисторы, пассивные инфракрасные датчики (сокращенно: PIR), датчики температуры, вентиляторы ПК (предпочтительно 4-проводный вентилятор, который позволяет не только контролировать, но и контролировать Об / мин), светодиодные точечные матрицы и тд. По сути, такие простые устройства позволят вам иметь минимум оборудования (чтобы вы могли увидеть и потрогать то, что вы на самом деле достигли), и в то же время вы можете узнать о многих темах, которые используются для гораздо более сложных устройств, где сложность проистекает главным образом из протокола, который они используют.

Помните также, что вам не нужно делать лишнюю милю, копаясь в модулях ядра. Конечно, если ты хочешь это сделать, тебя никто не остановит. :)

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

rbaleksandar
источник