Làm cách nào để sử dụng giao diện liên kết / hủy liên kết trình điều khiển nhân Linux cho các thiết bị USB-HID?


26

Nền đầu tiên. Tôi đang phát triển trình điều khiển cho các thiết bị bảng điều khiển trò chơi Logitech. Đó là một bàn phím có màn hình trên đó. Trình điều khiển đang hoạt động tốt nhưng theo mặc định, thiết bị được xử lý bởi HID. Để ngăn HID tiếp quản thiết bị trước trình điều khiển của tôi, tôi có thể đưa vào danh sách đen trong hid-core.c. Điều này hoạt động nhưng không phải là giải pháp tốt nhất vì tôi đang làm việc với nhiều người và tất cả chúng ta phải tiếp tục vá mô-đun HID đang trở thành một việc vặt, đặc biệt là vì nó thường liên quan đến việc xây dựng lại initramfs và như vậy.

Tôi đã thực hiện một số nghiên cứu về vấn đề này và tôi đã tìm thấy bài đăng danh sách gửi thư này , cuối cùng tôi đã đưa tôi đến bài viết này trên LWN . Điều này mô tả một cơ chế để ràng buộc các thiết bị với trình điều khiển cụ thể trong thời gian chạy. Điều này có vẻ như chính xác những gì tôi cần.

Vì vậy, tôi đã thử nó. Tôi đã có thể hủy liên kết bàn phím từ HID. Điều này làm việc và như mong đợi tôi không thể gõ vào nó nữa. Nhưng khi tôi cố gắng liên kết nó với trình điều khiển của chúng tôi, tôi gặp "lỗi: không có thiết bị nào như vậy" và hoạt động không thành công.

Vì vậy, câu hỏi của tôi là: Làm thế nào để tôi sử dụng các hoạt động liên kết / hủy liên kết kernel để sao chép những gì xảy ra khi bạn đưa vào danh sách đen một thiết bị HID trong hid-core và cung cấp trình điều khiển của riêng bạn? - đó là - để thay thế sự cần thiết phải vá hid-core.c mọi lúc?

Nguồn tài xế của chúng tôi có tại đây: https://github.com/ali1234/lg4l

Câu trả lời:


27

Ok, hóa ra câu trả lời đang nhìn chằm chằm vào mặt tôi.

Thứ nhất, cho dù sử dụng trình điều khiển tùy chỉnh của chúng tôi hay sử dụng trình điều khiển chung thường chiếm thiết bị, tất cả vẫn được điều khiển bởi HID và không phải USB.

Trước đây tôi đã cố gắng hủy liên kết nó từ HID, đó không phải là cách để đi. HID có trình điều khiển phụ, trình điều khiển chiếm các thiết bị không có trình điều khiển chuyên dụng được gọi là generic-usb. Đây là những gì tôi cần để hủy liên kết, trước khi liên kết với hid-g19. Ngoài ra, tôi cần sử dụng địa chỉ HID trông giống như "0003: 046d: c229.0036" chứ không phải địa chỉ USB trông "1-1.1: 1.1".

Vì vậy, trước khi rebinding tôi sẽ thấy điều này trên dmesg:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Sau đó tôi làm:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

Và sau đó tôi thấy trên dmesg:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

Vì vậy, như tôi đã nói, nhìn chằm chằm vào mặt tôi, bởi vì hai thông tin chính là hai điều đầu tiên trên đường dây khi thiết bị liên kết ...


Bạn có phải chỉ định trong trình điều khiển của mình rằng nhà cung cấp / sản phẩm đó tương thích với trình điều khiển của bạn không? Hoặc "ràng buộc" chỉ đơn giản là buộc vấn đề. Tôi đang nhận được "không có thiết bị như vậy" cho một thiết bị đã bị đưa vào danh sách đen nhưng tôi muốn buộc nó bị ràng buộc và tôi đang hình dung danh sách đen không chỉ là "ngăn chặn tự động ràng buộc" mà là "ngăn chặn liên kết "loại điều.
dmansfield

Ràng buộc buộc nó, vì vậy không bắt buộc phải yêu cầu ID trong nguồn trình điều khiển. Đó là nếu bạn muốn nó tự động tải.
ali1234

Hai lý do khiến tôi gặp sự cố: đầu tiên - thiết bị được liệt kê trong hid_ignore_list của kernel và do đó, nó sẽ không nhận được "ẩn danh" ràng buộc gì. Tôi đã phải thêm "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" vào dòng lệnh kernel và khởi động lại. Cờ 0x40000000 là "không bỏ qua". Thứ hai, phần cuối cùng của id "0003: 046D: C229.0036" là '0036'. Điều này thể hiện điều gì? Không chắc. Cách duy nhất để tìm thấy nó (dường như) là để nó bị ràng buộc rồi, sau đó hủy liên kết nó và buộc lại nó.
dmansfield

Bạn đã tìm thấy một cách để rebind tự động?
Vladius

Đã thêm giải pháp tự động đóng lại của riêng tôi: unix.stackexchange.com/a/475277/96686
Vladius
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.