Cách gán trình điều khiển USB cho thiết bị


30

Câu hỏi này có hai phần:

Trước tiên, làm thế nào để bạn tự tách trình điều khiển khỏi thiết bị USB và gắn một trình điều khiển khác? Ví dụ: tôi có một thiết bị khi được kết nối sẽ tự động sử dụng trình điều khiển lưu trữ usb.

đầu ra usbview

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

Tôi không muốn sử dụng trình điều khiển lưu trữ usb, vì vậy trong ứng dụng của mình, tôi sử dụng libusbthư viện để tách trình điều khiển lưu trữ usb và sau đó tôi yêu cầu giao diện. Sau đó tôi có thể gửi dữ liệu đến và từ các ứng dụng chạy trên thiết bị USB và trên hệ thống Linux máy chủ của mình.

Làm thế nào để bạn tách trình điều khiển bằng tay bên ngoài một ứng dụng?


Thứ hai, làm cách nào để tôi tự động gán trình điều khiển để đính kèm trên plugin thiết bị? Tôi hiện có một thiết lập quy tắc udev để tự động đặt quyền cho thiết bị:

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

Tôi có thể sử dụng quy tắc udev để gán trình điều khiển cho các giao diện cụ thể trên thiết bị USB không? Ví dụ: nếu tôi muốn mô-đun usbnet được sử dụng tự động trên giao diện 0 thay vì lưu trữ usb, điều đó có khả thi trong udev không?


1
Nếu một phần của sự cố đang tải đúng mô-đun, hãy xem Webcam trên Angström
Gilles 'SO- ngừng trở nên xấu xa'

1
Bạn có cần tất cả các mô-đun lưu trữ usb? bởi vì nếu không bạn có thể đưa nó vào danh sách đen và nó sẽ không tải gì cả.
Hanan N.

@Gilles, tôi có thể tải thành công LKM. Câu hỏi của tôi là làm thế nào để tự tay và tự động gắn nó vào thiết bị?
linsek

@Hanan, hiện tại tôi không sử dụng mô-đun lưu trữ usb. Cuối cùng tôi có thể cần phải đưa vào danh sách đen để tự động gắn mô-đun chính xác, nhưng trước tiên tôi cần biết cách gắn usbnet.
linsek

1
@njozwiak Module usbnetsẽ không tự động tải, vì nó không có thông tin về phần cứng, có thể sử dụng nó. Cố gắng tìm trình điều khiển thích hợp và sử dụng, ví dụ , modinfo kalmia. Trong các aliasdòng bạn sẽ thấy id nhà cung cấp xxxx và id sản phẩm yyyy là usb:vxxxxpyyyy. Hoặc bạn có thể chỉnh sửa tệp /lib/modules/kernel_version/modules.usbmap và đối với CTNH của bạn, bạn có thể xóa dòng, nơi dành cho bạn lưu trữ usb mô-đun CTNH hoặc thay đổi bộ lưu trữ usb với trình điều khiển mạng thích hợp. Nhưng sau khi depmod -athay đổi này sẽ biến mất ...
Jan Marek

Câu trả lời:


20

Đố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 modaliasphù 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.aliastệp (và sử dụng cùng một cú pháp). depmod -asau đó 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, usbnettrì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. :)


4
Đã có static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);trong mã, nó có thừa với phương thức không?
Thomas

Trong trường hợp của tôi, những dòng đó được tự động tạo ra bởi một số phép thuật Makefile ở bất cứ đâu trong trình điều khiển. Đó là lý do tại sao tôi đã thêm ba lần dòng cho MODULE_ALIAS nhưng nó không bao giờ được liệt kê. Dù sao cũng cảm ơn vì lsusb -v. với điều đó tôi có thể kiểm tra nó và tìm ra lỗ hổng trong ý tưởng của mình. Sau đó, tôi grep nguồn cho một định danh đã biết và tìm thấy mảng với các mục mà tôi phải thao tác.
JackGrinningCat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.