LINUX.ORG.RU

Поясните по написанию драйверов

 , , , ,


1

7

Давно уже решил заняться таким неблагодарным делом, как написание драйверов под родное линуксячье ядро. Сейчас вот руки дошли. Прочитал пару глав Linux device drivers и вроде даже что-то понял. Только дело в том, что ldd не рассматривает написание дров под конкретное железо, вместо этого драйвер scull просто торчит в памяти.
Я и призадумался. Есть у меня железяка от TI на процессоре ARM Cortex M4, подключается через usb (но я так понял, там на самом деле еще и дебагер сначала стоит), так вот вопрос: можно ли для этой железяки написать драйвер ядра?
Допустим, цель — ткнуть кнопку в юзерспейсе на qt и тем самым зажечь/потушить диод на мк. И как это будет выглядеть? Ведь драйвер usb в ядре уже есть. Нужен ли для этой цели вообще драйвер или можно все в юзерспейсе запилить? На мк никаких осей нет, голое железо.

★★★★

Тоже интересуюсь драйверами, подпишусь.

CYB3R ★★★★★ ()

Для этих целей драйвер не нужен, можно обойтись стандартным юзерспейс API для USB (libusb).

Драйвер нужен если например твоя железяка былабы USB веб камерой с не стантартным интерфейсом (отличным от USB video) тогда можно былобы написать драйвер который бы позволял работать с этой камерой любому приложению через стандартный v4l интерфейс.

zaz ★★★★ ()
Ответ на: комментарий от zaz

А если не использовать libusb? Можно же придумать задачу, про которой нужно писать именно ядерный драйвер.
Например, подключим к этому микроконтроллеру матрицу (например, популярную OV7725) и придумаем свой протокол передачи изображения.

CYB3R ★★★★★ ()
Ответ на: комментарий от CYB3R

Драйвер экспортирует файл в /proc, туда и пиши 1 или 0, чтобы соответственно зажечь или потушить лампочку.

urxvt ★★★★★ ()

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

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от CYB3R

Если ты не хочешь в итоге выводить все через v4l2, тебе нахрен не нужно заморачиваться с модулями ведра!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я для обучения и практики. К тому же видел вакансии в intel, samsung, nokia где нужен ядерщик именно усбшник. Они там все полные извращенцы?

unt1tled ★★★★ ()
Ответ на: комментарий от unt1tled

Они там все полные извращенцы?

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

Если бы все придерживались стандартов, ведро было бы значительно худее.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от mix_mix

Один раз на миллион строк кода.

Это если не считать велосипедов.

A1 ()

Пользуясь случаем спрошу: хочу сделать более полноценную поддержку usb клавиатуры (не все клавиши определяются даже xev-ом), умею писать прикладной софт, с написанием дров под linux раньше дел не имел. Си знаю, с ассемблером скорее на Вы. С чего начать читать/гуглить в правильном направлении представляю смутно. Может кто что-то подобное делал и пнет меня в нужном направлении?

anonymous ()

Писать драйвер для ненужно ради того, чтобы занять себя драйверами - тупиковая затея. Лучше начать с прочёсывания bugzilla.kernel.org и попыток помочь конкретным людям с конкретными багами.

Andrey_Utkin ★★ ()
Ответ на: комментарий от anonymous

ты хочешь пописать драйвер для usbhid.

тебе сюда: http://code.woboq.org/linux/linux/drivers/hid/

читать код, делающий примерно то, ято надо тебе — самое полезное.

вот, скажем, для thinkpad usb keyboard: http://code.woboq.org/linux/linux/drivers/hid/hid-lenovo.c.html

тут написано почти всё, что можно захотеть для своей клавиатуры (и много того, чего лучше не хотеть). почитай, потом напиши аналогичный файлик свой, и готово.

anonymous ()
Ответ на: комментарий от A1

Это прекрасно. Я теперь буду коллегам на каждый чих говорить «алгоритм интересный, но...»

hateyoufeel ★★★★★ ()
Ответ на: комментарий от anonymous

Вот только ему придется долго сидеть в обнимку с wireshark, разбираясь с протоколом, т.к. наверняка никакой документации на эту клаву не найти!

Eddy_Em ☆☆☆☆☆ ()

Тоесть, я правильно понял, что для usb устройств дрова писать ненужно? Как тогда практиковаться?

unt1tled ★★★★ ()
Ответ на: комментарий от unt1tled

Ну, почему же? Ты можешь и корову оседлать: напиши модуль ведра, который будет с МК общаться через интерфейс в /sys. Скажем, пишешь ты

echo "blink 100 times period 1s LED 2" > /sys/stm32/LEDs
И условный светодиод №2 начинает мыргать с периодом 1 секунду 100 раз.

Только нафиг так извращаться?

Eddy_Em ☆☆☆☆☆ ()

Драйвер написать можно, сначала надо решить что ты хочешь.

Например посмотри на стандартные CDC склассы оборудования, там и сетевые карты и tty и прочее есть и драйвера уже написаны.

А по своему опыту могу сказать, что лучше для начала всё пилить в userspace на основе libusb, а только потом, по необходимости, вынести в ядро, если нужна будет именно ядерная инфраструктура.

Dark_SavanT ★★★★★ ()

подключается через usb

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

Лучше писать драйвера под всякую неокученную в mainline kernel периферию популярных SoC - это даже проще чем USB, и в общем-то даже может оказаться нужным.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

неокученную в mainline kernel периферию популярных SoC

Это что, например? Блупуп уже вроде есть, tcp/ip стеки тоже. Что-то типа отпечатков пальцев или распознавания речуги? Так это уже другая сфера совсем...

unt1tled ★★★★ ()

На самом деле на libusb очень интересно писать тоже, крайне полезный скилл. В ядро такое выносить стоит, если это более эффективно, например задействуются другие подсистемы ядра, чтобы не гонятсь данные туда-сюда. Также драйвер ядра позволяет снизить нагрузку на процеессор при сложных протоколах и интерактивности. Просто мигание светодиодом - задача притянутая за уши а вот оперативное отображение быстрого ADC уже ближе. Также можешь открыть для себя дивный мир linux-arm и пописать драйверы для allwinner'ов и вообще помочь проекту

slapin ★★★★★ ()
Ответ на: комментарий от unt1tled

Нет, банальный CANbus, например, или там всякие PWM c SPI.

Stanson ★★★★★ ()
Ответ на: комментарий от alexku

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

Если готов нырнуть в это всё, то флаг тебе в руки.

alexku ()
Ответ на: комментарий от alexku

Да, и ещё. Для написания «драйвера» для usb устройства тебе это всё не нужно. Достаточно уметь открывать/закрывать последовательное устройство (файл) и знать протокол обмена с этим устройством. Это всё делается в user space.

alexku ()
Ответ на: комментарий от Eddy_Em

Ну это вообще довольно приятное занятие. Хорошо успокаивает. Особенно если под рукой есть виртуалка с виндой (иначе очень неудобно).

anonymous ()
Ответ на: комментарий от alexku

Остапа несло. В общем, продолжаем.

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

Как-то так.

alexku ()

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

splinter ★★★★★ ()
Ответ на: комментарий от Eddy_Em

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

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

anonymous ()
Ответ на: комментарий от splinter

Ага, уже объяснили. С usb пролетаем мимо кернел модулей. Вопрос встал по-другому: с чем практиковаться в написании дров?

unt1tled ★★★★ ()
Ответ на: комментарий от CYB3R

А где взять железяки, для которых я в состоянии написать драйвер? Т.е. открытость, спеки итп. А главное нужность этого всего.

unt1tled ★★★★ ()
Последнее исправление: unt1tled (всего исправлений: 2)
Ответ на: комментарий от unt1tled

Разъём сам довольно простой, его можно сделать, просто взяв кусок текстолита и нож.
Другое дело — зачем там кортекс? Обычно берут какой-нибудь FPGA.

CYB3R ★★★★★ ()
Ответ на: комментарий от Iron_Bug

Я сам никогда этим не занимался, но судя по обилию туториалов даже от индусов, ничего особо сложного там нет.

CYB3R ★★★★★ ()
Ответ на: комментарий от anonymous

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

peregrine ★★★★★ ()
Ответ на: комментарий от unt1tled

Skystar DVB 2 USB железка, для неё до сих пор драйвер не написали

Harald ★★★★★ ()
Ответ на: комментарий от CYB3R

Нафиг ПЛИСину? Это ж хардкорище! А вот на арме запилить обычную писиайку — как два пальца об асфальт. И плату спокойно отЛУТить можно...

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.