วิธีการใช้ไดรเวอร์เคอร์เนล Linux อินเตอร์เฟส bind / unbind สำหรับอุปกรณ์ USB-HID


26

พื้นหลังแรก ฉันกำลังพัฒนาไดรเวอร์สำหรับอุปกรณ์แผงเกม Logitech มันเป็นคีย์บอร์ดที่มีหน้าจออยู่ ไดรเวอร์ทำงานได้เป็นอย่างดี แต่โดยค่าเริ่มต้นอุปกรณ์จะถูกจัดการโดย HID เพื่อป้องกันไม่ให้ HID ทำการยึดอุปกรณ์ก่อนไดร์เวอร์ฉันสามารถขึ้นบัญชีดำใน hid-core.c ใช้งานได้ แต่ไม่ใช่ทางออกที่ดีที่สุดเนื่องจากฉันทำงานกับคนหลายคนและเราทุกคนต้องทำการปะโมดูล HID ของเราซึ่งกำลังเป็นที่น่าเบื่อโดยเฉพาะอย่างยิ่งมันมักเกี่ยวข้องกับการสร้าง initramfs ขึ้นมาใหม่

ฉันได้วิจัยบางอย่างเกี่ยวกับปัญหานี้และผมพบว่าโพสต์รายชื่อผู้รับจดหมายซึ่งท้ายที่สุดก็พาฉันไปที่บทความนี้ใน LWN สิ่งนี้อธิบายกลไกสำหรับการผูกอุปกรณ์กับไดรเวอร์เฉพาะตอนรันไทม์ ดูเหมือนว่าสิ่งที่ฉันต้องการ

ดังนั้นฉันจึงพยายาม ฉันสามารถปลดคีย์บอร์ดจาก HID ได้ สิ่งนี้ได้ผลและเป็นไปตามที่คาดไว้ฉันไม่สามารถพิมพ์ได้อีกต่อไป แต่เมื่อฉันพยายามที่จะผูกไว้กับไดรเวอร์ของเราฉันได้รับ "ข้อผิดพลาด: ไม่มีอุปกรณ์ดังกล่าว" และการดำเนินการล้มเหลว

ดังนั้นคำถามของฉันคือฉันจะใช้การดำเนินการเคอร์เนลผูก / unbind เพื่อทำซ้ำสิ่งที่เกิดขึ้นเมื่อคุณขึ้นบัญชีดำอุปกรณ์ HID ใน hid-core และจัดหาไดรเวอร์ของคุณเอง? - นั่นคือ - เพื่อแทนที่ความต้องการในการแก้ไข hid-core.c ตลอดเวลาหรือไม่

แหล่งที่มาของไดรเวอร์ของเราอยู่ที่นี่: https://github.com/ali1234/lg4l

คำตอบ:


27

ตกลงปรากฎว่าคำตอบคือการจ้องมองฉันในหน้า

ประการแรกไม่ว่าจะใช้ไดรเวอร์ที่กำหนดเองของเราหรือใช้ไดรเวอร์ทั่วไปที่ใช้แทนอุปกรณ์พวกเขายังคงถูกควบคุมโดย HID ในท้ายที่สุดไม่ใช่ USB

ก่อนหน้านี้ฉันพยายามที่จะผูกมันออกจาก HID ซึ่งไม่ใช่วิธีที่จะไป HID มีไดร์เวอร์ย่อยอุปกรณ์ที่ใช้แทนอุปกรณ์ที่ไม่มีไดร์เวอร์เฉพาะเรียกว่า generic-usb นี่คือสิ่งที่ฉันต้องการที่จะปลดจากก่อนที่จะผูกพันกับ hid-g19 นอกจากนี้ฉันต้องใช้ที่อยู่ HID ซึ่งดูเหมือน "0003: 046d: c229.0036" และไม่ใช่ที่อยู่ USB ซึ่งมีลักษณะ "1-1.1: 1.1"

ดังนั้นก่อนที่จะปฏิเสธฉันจะเห็นสิ่งนี้ใน 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

จากนั้นฉันก็:

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

แล้วฉันเห็น 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

อย่างที่ฉันพูดจ้องหน้าฉันเพราะข้อมูลสำคัญสองชิ้นเป็นสองสิ่งแรกที่อยู่ในสายเมื่ออุปกรณ์ผูก ...


คุณต้องระบุในไดรเวอร์ของคุณว่าผู้ขาย / ผลิตภัณฑ์นั้นเข้ากันได้กับไดรเวอร์ของคุณหรือไม่? หรือ "ผูก" หรือไม่เพียงแค่บังคับปัญหา ฉันได้รับ "ไม่มีอุปกรณ์ดังกล่าว" สำหรับอุปกรณ์ที่ถูกขึ้นบัญชีดำ แต่ฉันต้องการบังคับให้มันถูกผูกไว้และฉันกำลังถ่ายภาพการขึ้นบัญชีดำไม่ได้เป็นเพียงแค่ "ป้องกันการเชื่อมอัตโนมัติ" แต่คิดว่า "ป้องกันการเชื่อมโยงชื่อ สิ่งที่ "ประเภทของสิ่ง
dmansfield

ผูกบังคับมันจึงไม่จำเป็นต้องเรียกร้อง ID ในแหล่งไดรเวอร์ คือถ้าคุณต้องการให้โหลดโดยอัตโนมัติ
ali1234

สองสาเหตุที่ฉันมีปัญหา: แรก - อุปกรณ์แสดงอยู่ในเคอร์เนลของ hid_ignore_list และดังนั้นมันจะไม่ได้รับ "hid" ที่ผูกไว้กับชื่ออะไร ฉันต้องเพิ่ม "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" ลงในบรรทัดคำสั่งเคอร์เนลและรีบูต การตั้งค่าสถานะ 0x40000000 คือ "อย่าเพิกเฉย" ประการที่สองส่วนสุดท้ายของรหัส "0003: 046D: C229.0036" คือ '0036' สิ่งนี้แสดงถึงอะไร? ไม่แน่ใจ. วิธีเดียวที่จะค้นพบมัน (ดูเหมือน) คือการผูกมันไว้แล้วจากนั้นก็ผูกมันแล้วผูกใหม่
dmansfield

คุณหาวิธีที่จะรีบูทอัตโนมัติหรือไม่?
Vladius

เพิ่มโซลูชันการตอบกลับอัตโนมัติของฉันเอง: unix.stackexchange.com/a/475277/96686
Vladius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.