У першій частині питання я шукав і не міг знайти кращого способу від'єднати USB-драйвер, ніж те, що ви вже робите з libusb.
Що стосується другої частини питання, udev може реагувати на завантаження драйверів, але не примушувати конкретного драйвера призначати пристрою.
Кожен драйвер ядра Linux відповідає за один або кілька пристроїв. Драйвер сам вибирає, які пристрої він підтримує. Це робиться програмно, тобто перевіряючи постачальника пристрою та ідентифікатор продукту, або, якщо вони недоступні (наприклад, старий пристрій), виконуючи деякі евристики автоматичного виявлення та перевірки стану безпеки. Як тільки водій впевнений, що знайшов пристрій, який він підтримує, він приєднається до нього. Коротше кажучи, ви часто не можете змусити конкретного драйвера використовувати певний пристрій. Однак іноді драйвер пристрою щедрий на те, що він приймає, і пристрій може працювати, про що він не знає. Ваш пробіг буде змінюватися! Раніше мені довелося вручну додавати дивні ідентифікатори пристрою / постачальника PCI до драйверів, які повинні їх підтримувати, зі змішаним успіхом та кількома забавними збоями ядра.
Тепер, що стосується модулів, є додатковий крок. Модуль завантажувач пробуджується ядром , коли новий пристрій виявлено. Це передано рядок "modalias", який ідентифікує пристрій і виглядає приблизно так для USB-пристроїв:
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
Цей рядок містить клас пристрою ( usb
) та інформацію, що стосується класу (постачальник / пристрій / серійний номер, клас пристрою тощо). Кожен драйвер ядра містить рядок, такий як:
MODULE_ALIAS("usb:...")
Які повинні відповідати usbalias (макіяж використовуються для підбору декількох пристроїв). Якщо modalias
збігається з підтримкою драйвера, цей драйвер завантажується (або повідомляється про новий пристрій, якщо він вже є).
Ви можете бачити підтримувані пристрої (від modalias) та пов'язані з ними модулі за допомогою
less /lib/modules/`uname -r`/modules.alias
Якщо ви візьметеся за драйвер пристрою зберігання usb, ви побачите, що у нього є деякі конкретні пристрої, які він підтримує за допомогою ідентифікатора постачальника та пристрою, а також намагатиметься підтримувати будь-який пристрій з правильним класом (сховище), незалежно від постачальника / пристрою .
Ви можете впливати на це, використовуючи механізми простору користувача на вашій ОС ( /etc/modprobe.d/
на Debian та друзів). Ви можете переглядати модулі чорного списку, або ви можете вказати модулі для завантаження modalias, як і modules.alias
файл (і використовуючи той самий синтаксис). depmod -a
потім відновить схеми завантажувача модулів.
Однак, навіть якщо ви можете вести цього конкретного коня до води, але ви не можете змусити його пити. Якщо у драйвера немає підтримки для вашого пристрою, він повинен ігнорувати його.
Це теорія в загальному випадку.
На практиці, і що стосується USB, я бачу, що ваш пристрій має два інтерфейси , один із яких - це сховище. Ядро буде приєднано до інтерфейсу зберігання загального пристрою. Якщо інший інтерфейс має правильний клас, usbnet
драйвер може приєднатися до нього. Так, ви можете мати декілька драйверів, підключених до одного фізичного пристрою, тому що USB-пристрій експортує кілька інтерфейсів (наприклад, моя клавіатура Logitech G15 експортує два, оскільки має клавіатурний пристрій та РК-екран, кожен з яких обробляється окремим драйвером) .
Те, що другий інтерфейс вашого USB-пристрою не виявлено, свідчить про відсутність підтримки в ядрі. Незалежно від цього, ви можете перелічити інтерфейси / кінцеві точки пристрою з неприємними деталями, використовуючи lsusb -v | less
потім, прокрутіть униз до конкретного пристрою (ви можете обмежити вихід за допомогою пристрою: ідентифікатор постачальника або шлях USB, якщо ви так схильні).
Зверніть увагу: я тут трохи спрощую логічну структуру USB-пристроїв. Звинувачуйте консорціум USB. :)