Untuk bagian pertama dari pertanyaan, saya telah mencari dan tidak dapat menemukan cara yang lebih baik untuk melepaskan driver USB daripada apa yang sudah Anda lakukan dengan libusb.
Adapun bagian kedua dari pertanyaan, udev dapat bereaksi terhadap memuat driver, tetapi tidak memaksa driver tertentu untuk ditugaskan ke perangkat.
Setiap driver di kernel Linux bertanggung jawab untuk satu atau lebih perangkat. Pengemudi itu sendiri memilih perangkat apa yang didukungnya. Ini dilakukan secara terprogram, yaitu dengan memeriksa vendor perangkat dan ID produk, atau, jika itu tidak tersedia (misalnya perangkat lama), melakukan beberapa heuristik deteksi otomatis dan pemeriksaan kewarasan. Setelah driver yakin itu menemukan perangkat yang didukungnya, ia menempelkannya ke sana. Singkatnya, Anda seringkali tidak dapat memaksa pengemudi tertentu untuk menggunakan perangkat tertentu. Namun, kadang-kadang, driver perangkat murah hati dengan apa yang diterimanya, dan perangkat dapat bekerja yang tidak diketahuinya. Jarak tempuh Anda akan bervariasi! Di masa lalu, saya harus secara manual menambahkan perangkat PCI / ID vendor aneh ke driver yang seharusnya mendukung mereka, dengan keberhasilan beragam dan beberapa crash kernel yang lucu.
Sekarang, dalam hal modul, ada langkah ekstra. The Modul loader yang dibangunkan oleh kernel ketika sebuah perangkat baru terdeteksi. Telah melewati string 'modalias', yang mengidentifikasi perangkat dan terlihat seperti ini untuk perangkat USB:
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
String ini berisi kelas perangkat ( usb
) dan informasi khusus kelas (vendor / perangkat / nomor seri, kelas perangkat, dll). Setiap driver kernel berisi baris seperti:
MODULE_ALIAS("usb:...")
Yang harus cocok dengan usbalias (wildcard digunakan untuk mencocokkan beberapa perangkat). Jika modalias
cocok dengan yang didukung oleh driver, driver ini dimuat (atau diberitahukan perangkat baru, jika sudah ada di sana).
Anda dapat melihat perangkat yang didukung (dengan modalias) dan modul yang terkait dengannya
less /lib/modules/`uname -r`/modules.alias
Jika Anda menerima driver perangkat penyimpanan-usb, Anda akan melihatnya memiliki beberapa perangkat khusus yang didukung oleh vendor dan ID perangkat, dan juga akan mencoba untuk mendukung perangkat apa pun dengan kelas (penyimpanan) yang tepat, tidak peduli vendor / perangkat .
Anda dapat memengaruhi ini menggunakan mekanisme userspace di OS Anda ( /etc/modprobe.d/
di Debian dan teman-teman). Anda dapat membuat daftar hitam modul, atau Anda dapat menentukan modul yang akan dimuat oleh modalias, seperti halnyamodules.alias
file (dan menggunakan sintaks yang sama). depmod -a
kemudian akan membuat ulang pola pemuat modul.
Namun, meskipun Anda bisa menuntun kuda ini ke air, tetapi Anda tidak bisa membuatnya minum. Jika driver tidak memiliki dukungan untuk perangkat Anda, ia harus mengabaikannya.
Ini adalah teori dalam kasus umum.
Dalam praktiknya, dan dalam kasus USB, saya melihat perangkat Anda tampaknya memiliki dua antarmuka , di mana penyimpanan adalah satu. Kernel akan melampirkan ke antarmuka penyimpanan perangkat secara keseluruhan. Jika antarmuka lain memiliki kelas yang tepat, usbnet
pengemudi dapat melampirkannya. Ya, Anda dapat memiliki beberapa driver yang terpasang pada perangkat fisik yang sama , karena perangkat USB mengekspor banyak antarmuka (mis. Keyboard Logitech G15 saya mengekspor dua karena memiliki perangkat keyboard dan layar LCD, yang masing-masing ditangani oleh driver terpisah) .
Fakta bahwa antarmuka kedua perangkat USB Anda tidak terdeteksi adalah indikasi kurangnya dukungan di kernel. Apa pun masalahnya, Anda dapat membuat daftar antarmuka perangkat / titik akhir dalam detail yang menyiksa menggunakan lsusb -v | less
, lalu gulir ke bawah ke perangkat khusus Anda (Anda dapat membatasi output berdasarkan perangkat: ID vendor atau jalur USB jika Anda cenderung).
Harap dicatat: Saya sedikit menyederhanakan di sini sehubungan dengan struktur logis perangkat USB. Salahkan konsorsium USB. :)