Изучение разработки драйверов для 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. Можете ли вы рассказать о некоторых ресурсах, которые помогут мне научиться кодировать простой драйвер для устройства, например, один или несколько светодиодов, подключенных непосредственно к выводам GPIO?
— Сагар

0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.