Как стать автором
Поиск
Написать публикацию
Обновить

Пишем простой драйвер Linux для устройства, ничего не зная о драйверах и о USB

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров15K
Всего голосов 75: ↑74 и ↓1+99
Комментарии8

Комментарии 8

поэтому наше устройство — это старый добрый стандартный HID с подклассом интерфейса 0. Это значит, что ядро распознаёт его и правильно подаёт питание, но не знает, что с ним делать.

На самом деле, там вполне мог бы стоять и "нулевой" класс (он же vendor-specific, он же 0xff), и тогда коммуникация с прибором через libusb была бы еще проще. Однако, тогда под одной не в меру популярной ОС пришлось бы либо писать драйвера уровня ядра либо ставить не очень уж там прижившийся драйвер от WinUSB. А вот перекидываться произвольными данными с устройствами классами HID там - без проблем. Что и объясняет популярность такого подхода даже среди прошивалок чипов с Ali.

А можно ли считать то что описано в статье драйвером? Разве это не обычная userspace программа взаимодействующая с USB устройством?

ну тут кому и водитель - драйвер :) так то да, драйвером kernel уровня здесь и не пахнет, можно ли это считать драйвером верхнего уровня вопрос диалектический. статью действительно логичнее назвать "учимся hid и libsusb из rust"

Тегов раста не хватает у статьи, это да.

когда я первый раз поднимал (легендартный) софтовый usb от igor plug я гораздо меньше понимал как все это работает, но вот там действительно было свой драйвер под win, хотя по сути можно было бы через hid и в результате почти к hid и пришло

Хорошая статья. Но libusb != драйвер в истинном понимании. Потому что драйвер работает на уровне ядра, а тут на уровне userspace.

КМК, тут вопрос терминологии.

Если взяли, например, i2c или spi устройство, и драйвер его переписали из ядра для запуска в userspace'е.
Перестал ли он быть драйвером?

Ну и люди с kernel.org юзерспейсные драйверы тоже, внезапно, драйверами называют.

Implementing I2C device drivers in userspace: www.kernel.org/doc/html/latest/i2c/dev-interface.html

Просто различают kernel driver и userspace driver.

Добавлю одну деталь на тему того, как в lsusb появилось имя устройства. Ядро не знает, что это за вендор такой и девайс, lsusb от ядра (скорее всего, через /proc или /sys) получает числовой vendor id и product id (благодаря тому самому обработчику нулевого подкласса hid), а у самого lsusb есть файл с базой всех имён вендоров/устройств/етц, так что ядро не в курсе, это у lsusb актуальная инфа из общественно доступной инфы. Из мана lsusb:
/usr/share/hwdata/usb.ids A list of all known USB ID's (vendors, products, classes, subclasses and protocols).

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий