В первой части вопроса я посмотрел и не смог найти лучшего способа отсоединить драйвер USB, чем то, что вы уже делаете с libusb.
Что касается второй части вопроса, udev может реагировать на загрузку драйвера, но не может принудительно назначать конкретный драйвер устройству.
Каждый драйвер в ядре Linux отвечает за одно или несколько устройств. Драйвер сам выбирает, какие устройства он поддерживает. Это делается программно, т. Е. Путем проверки производителя устройства и идентификатора продукта или, если они недоступны (например, старое устройство), выполнения некоторых эвристических процедур автоматического обнаружения и проверки работоспособности. Как только водитель уверен, что нашел устройство, которое он поддерживает, он присоединяется к нему. Короче говоря, вы часто не можете заставить определенный драйвер использовать определенное устройство. Иногда, однако, драйвер устройства щедр в отношении того, что он принимает, и устройство может работать, о чем оно не знает. Ваш пробег будет меняться! В прошлом мне приходилось вручную добавлять странные идентификаторы устройств / поставщиков PCI в драйверы, которые должны их поддерживать, с неоднозначным успехом и несколькими забавными сбоями ядра.
Теперь, в случае модулей, есть дополнительный шаг. Модуль загрузчик пробуждается ядром , когда новое устройство обнаружено. Передается строка 'modalias', которая идентифицирует устройство и выглядит примерно так для USB-устройств:
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
Эта строка содержит класс устройства ( usb
) и информацию о классе (производитель / устройство / серийный номер, класс устройства и т. Д.). Каждый драйвер ядра содержит строку, такую как:
MODULE_ALIAS("usb:...")
Который должен соответствовать usbalias (подстановочные знаки используются для соответствия нескольким устройствам). Если 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 консорциум. :)