LINUX.ORG.RU

Что правильнее для работы с USB-устройством: модуль ядра или «чистый» userspace?


0

1

И снова я со своими CCD. На сей раз для изучения характеристик нам с коллегой был выдан светоприемник Apogee U16M-HC. На диске к нему был только вантузячий софт, который, к тому же, требовал установки проприетарной софтины. Однако, в интернете нашлись и линуксовые «драйверы», правда, под старенькое ядро 2.6.

За пол дня модуль ядра был приведен к нормальному виду и запустился. Однако, изучая файлы для работы в пространстве пользователя, мы обнаружили 2 варианта: один - с использованием модуля ядра, а второй - без оного (перебирает все USB-устройства на предмет обнаружения idVendor и idProduct, затем вызывает usb_claim_interface и работает через usb_control_msg и usb_bulk_read).

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

Вопрос: какие подводные камни могут возникнуть, если работать со светоприемником без модуля ядра? Стоит ли продолжать ковырять «драйвер», работающий без модуля ядра, или же лучше «причесать» тот, который работает с модулем (через ioctl'ы)?

☆☆☆☆☆

Хм, обнаружил в «их» makefile'е:

#  Legacy version for use with kernel modules, deprecated in favor
#  of libusb based access.

Т.е. все-таки модуль ядра нафиг не нужен?

Eddy_Em ☆☆☆☆☆
() автор топика

По идее, все изменения в kernel API для тебя маскирует библиотека. К тому же, она существует для mac os x и вроде есть и win32 порт.

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

В общем, можно забыть о модуле ядра и направить все свои силы на исправление говнокода в «драйвере», использующем libusb?

// а говнокод там жуткий: мешанина из плюсов и С, отсутствие проверки успеха функций (что постоянно приводит к сегфолтам) и т.д., и т.п.

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

В общем, можно забыть о модуле ядра и направить все свои силы на исправление говнокода в «драйвере», использующем libusb?

Думаю, что это разумно, в userspace все же попроще должно быть. Я в свое время так и поступил, пока еще не пожалел :-) У меня было устройство попроще, оно маскировалось под HID(там вроде несколько раз API перекраивали) - да и проще показалалось API у libusb.

ef37 ★★
()

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

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

Ладно, пока занимаюсь работой с libusb. Такого количества говнокода, как у этих самых Apogee, я еще не встречал...

Интересно, в мастдае у них такой же ужас? Странно, как еще народ с этими светоприемниками работает.

Eddy_Em ☆☆☆☆☆
() автор топика

Когда я возился с libusb (это правда ещё 0.1 была) то там нельзя было отследить когда устройство отсоединяют или присоединят. Может в новой версии исправили правда, я не знаю. Но тогда для меня это было существенный недостаток.

nanoolinux ★★★★
()

Чудеса в решете!

Без insmod'а usb_claim_interface отказывается «подхватывать» интерфейс.

Хрен знает что!

Eddy_Em ☆☆☆☆☆
() автор топика

ящитаю, всё, что можно вынести из ядра, и, при этом, не привнеся тормозов, должно быть в userspace

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

Я вот не пойму, зачем при работе с libusb все равно модуль ядра нужен?

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

Без insmod'а usb_claim_interface отказывается «подхватывать» интерфейс.

Чего говорит-то ? М.б. не хватает разрешений, попробуй от root-а.

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

usb_claim

а не занимается ли этот драйвер хитрым дёрганьем +D и -D для хитрого же общения? хотя может просто usb reset вызывает.

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

Говорит «Broken pipe». А после insmod'а работает.

это устройство не отвечает или не посылается запрос туда?

может usbmon поможет?

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

Без понятия. Я - вообще не программист, а уж с «железом» занимался только на уровне адаптации старых модулей, да написания всяких CLI- и веб-морд для работы с периферией.

это устройство не отвечает или не посылается запрос туда?

может usbmon поможет?

Черт его знает: если модуль не загружен, получаю фигвам. Если делаю insmod, тут же все начинает работать (правда, пока что рано говорить «работать», т.к. мне еще тысяч 40 строк индусокода перелопатить надо).

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