Đối với phần đầu tiên của câu hỏi, tôi đã xem và không thể tìm ra cách nào tốt hơn để tách trình điều khiển USB so với những gì bạn đang làm với libusb.
Đối với phần thứ hai của câu hỏi, udev có thể phản ứng với việc tải trình điều khiển, nhưng không buộc một trình điều khiển cụ thể được gán cho một thiết bị.
Mỗi trình điều khiển trong nhân Linux chịu trách nhiệm cho một hoặc nhiều thiết bị. Trình điều khiển tự chọn những thiết bị mà nó hỗ trợ. Nó thực hiện việc này theo chương trình, tức là bằng cách kiểm tra ID nhà cung cấp và sản phẩm của thiết bị, hoặc, nếu những thiết bị đó không có sẵn (ví dụ như một thiết bị cũ), thực hiện một số kiểm tra tự động phát hiện và kiểm tra vệ sinh. Khi người lái tự tin, nó đã tìm thấy một thiết bị mà nó hỗ trợ, nó sẽ tự gắn vào nó. Nói tóm lại, bạn thường không thể buộc một trình điều khiển cụ thể sử dụng một thiết bị cụ thể. Tuy nhiên, đôi khi, trình điều khiển thiết bị rất hào phóng với những gì nó chấp nhận và một thiết bị có thể hoạt động mà nó không biết. Số dặm của bạn sẽ thay đổi! Trước đây, tôi đã phải tự thêm ID thiết bị / nhà cung cấp PCI lạ vào trình điều khiển hỗ trợ chúng, với thành công hỗn hợp và một vài sự cố hạt nhân gây cười.
Bây giờ, trong trường hợp của các mô-đun, có thêm một bước. Trình tải mô-đun được đánh thức bởi kernel khi phát hiện thấy một thiết bị mới. Nó đã thông qua một chuỗi 'modalias', xác định thiết bị và trông giống như thế này cho các thiết bị USB:
usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00
Chuỗi này chứa lớp thiết bị ( usb
) và thông tin cụ thể của lớp (nhà cung cấp / thiết bị / số sê-ri, lớp thiết bị, v.v.). Mỗi trình điều khiển kernel chứa một dòng như:
MODULE_ALIAS("usb:...")
Mà phải phù hợp với usbalias (ký tự đại diện được sử dụng để phù hợp với nhiều thiết bị). Nếu modalias
phù hợp với trình điều khiển mà trình điều khiển hỗ trợ, trình điều khiển này đã được tải (hoặc được thông báo về thiết bị mới, nếu đã có).
Bạn có thể thấy các thiết bị được hỗ trợ (theo phương thức) và các mô-đun được liên kết với
less /lib/modules/`uname -r`/modules.alias
Nếu bạn grep cho trình điều khiển thiết bị lưu trữ usb, bạn sẽ thấy nó có một số thiết bị cụ thể được hỗ trợ bởi ID nhà cung cấp và thiết bị và cũng sẽ cố gắng hỗ trợ bất kỳ thiết bị nào có lớp (lưu trữ) phù hợp, bất kể nhà cung cấp / thiết bị .
Bạn có thể tác động đến điều này bằng cách sử dụng các cơ chế không gian người dùng trên HĐH của bạn ( /etc/modprobe.d/
trên Debian và bạn bè). Bạn có thể liệt kê các mô-đun hoặc bạn có thể chỉ định các mô-đun sẽ được tải bởi các mô-đun, giống như modules.alias
tệp (và sử dụng cùng một cú pháp). depmod -a
sau đó sẽ tạo lại các mẫu của trình tải mô-đun.
Tuy nhiên, mặc dù bạn có thể dẫn con ngựa đặc biệt này xuống nước, nhưng bạn không thể bắt nó uống. Nếu trình điều khiển không có hỗ trợ cho thiết bị của bạn, nó nên bỏ qua nó.
Đây là lý thuyết trong trường hợp chung.
Trong thực tế và trong trường hợp của USB, tôi thấy thiết bị của bạn dường như có hai giao diện , trong đó lưu trữ là một. Nhân sẽ gắn vào giao diện lưu trữ của thiết bị tổng thể. Nếu giao diện khác có lớp đúng, usbnet
trình điều khiển có thể đính kèm. Có, bạn có thể có nhiều trình điều khiển được gắn vào cùng một thiết bị vật lý , vì thiết bị USB xuất nhiều giao diện (ví dụ: bàn phím Logitech G15 của tôi xuất hai vì nó có thiết bị bàn phím và màn hình LCD, mỗi trình điều khiển được điều khiển bởi một trình điều khiển riêng) .
Việc giao diện thứ hai của thiết bị USB của bạn không được phát hiện là dấu hiệu thiếu hỗ trợ trong kernel. Dù thế nào đi nữa, bạn có thể liệt kê các giao diện / điểm cuối của thiết bị một cách chi tiết bằng cách sử dụng lsusb -v | less
, sau đó cuộn xuống thiết bị cụ thể của bạn (bạn có thể giới hạn đầu ra theo thiết bị: ID nhà cung cấp hoặc đường dẫn USB nếu bạn quá nghiêng).
Xin lưu ý: Tôi đang quá đơn giản một chút ở đây đối với cấu trúc logic của các thiết bị USB. Đổ lỗi cho tập đoàn USB. :)