Linux-çekirdekli sürücü bağlanma / çözme arabirimini USB-HID aygıtları için nasıl kullanabilirim?


26

İlk arka plan. Logitech oyun paneli cihazları için bir sürücü geliştiriyorum. Üzerinde ekran bulunan bir klavye. Sürücü iyi çalışıyor ancak varsayılan olarak cihaz HID tarafından yönetiliyor. HID’in aygıtı sürücümden önce devralmasını önlemek için onu hid-core.c’de kara listeye alabilirim. Bu işe yarar, ancak birkaç kişiyle çalıştığım için en iyi çözüm değil ve hepimiz sık sık initramfs ve benzerlerini yeniden inşa etmeyi içerdiği için bir angar olan HID modülümüzü yamalamaya devam etmek zorundayız.

Bu problemin üstünde biraz araştırma yaptım ve buldum bu posta listesi yazı sonunda götürdü LWN bu yazıda . Bu, çalışma zamanında cihazları belirli sürücülere bağlamak için bir mekanizma tanımlar. Bu tam ihtiyacım olan şey gibi görünüyor.

Bu yüzden denedim. Klavyeyi HID'den ayırmayı başardım. Bu işe yaradı ve beklendiği gibi artık yazamadım. Ama onu sürücümüze bağlamaya çalıştığımda "hata: böyle bir cihaz yok" mesajı alıyorum ve işlem başarısız oluyor.

Öyleyse sorum şudur: Bir HID aygıtını sakladığınızda ve kendi sürücünüzü sağladığınızda ne olacağını çoğaltmak için çekirdek bağlama / açma işlemlerini nasıl kullanırım? - bu - her zaman hid-core.c nin yama ihtiyacını değiştirmek için mi?

Şoförümüzün kaynağı burada: https://github.com/ali1234/lg4l

Yanıtlar:


27

Tamam, cevabım yüzüme bakıyordu bana.

Öncelikle, özel sürücümüzü kullanmak veya normal olarak aygıtı devralan jenerik sürücüyü kullanmak olsun, yine de hepsi USB ile değil, HID tarafından kontrol edilir.

Daha önce HID'den ayrılmaya çalıştım, ki bu yol değil. HID'nin alt sürücüleri var, özel sürücüsü olmayan aygıtları devralacak olana jenerik-usb denir. Bu, hid-g19'a bağlanmadan önce bağlantım kesmem gereken şeydi. Ayrıca "0003: 046d: c229.0036" gibi görünen HID adresini ve "1-1.1: 1.1" görünen USB adresini kullanmam gerekiyordu.

Böylece yeniden bağlamadan önce bunu dmesg'de görecektim:

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

O zaman yaparı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

Sonra dmesg'de görüyorum:

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

Dediğim gibi, suratıma bakıyorum, çünkü iki önemli bilgi, cihaz bağlandığında hattaki ilk iki şeydir ...


Sürücünüzde, satıcının / ürünün sürücünüzle uyumlu olduğunu belirtmeniz gerekiyor mu? Yoksa "bağ" basitçe konuyu zorlar. Kara listeye alınmış bir cihaz için "böyle bir cihaz yok" alıyorum ancak sınırlandırılmasını zorlamak istiyorum ve kara listeyi görüntülüyorum sadece "otomatik bağlanmayı önle" düşünmek değil, "ciltleme adayını engelle" ne tür bir şey.
dmansfield

Bağlama zorlar, bu nedenle sürücü kaynağındaki kimlikleri talep etmek gerekmez. Ancak otomatik olarak yüklenmesini istiyorsanız.
ali1234

Sorunumun iki sebebi vardı: ilk - cihaz çekirdeğin hid_ignore_list listesinde listeleniyor ve bu yüzden "saklanmış" bir aday olmayacak. Çekirdek komut satırına "usbhid.quirks = 0x0b0e: 0x0412: 0x40000000" eklemek ve yeniden başlatmak zorunda kaldım. Bayrak 0x40000000 "yoksay" dır. İkincisi, "0003: 046D: C229.0036" kimliğinin son kısmı '0036'dır. Bu neyi temsil ediyor? Emin değil. Onu bulmanın tek yolu (göründüğü gibi) zaten bağlı olması, sonra çözme ve yeniden bağlama.
dmansfield

Otomatik olarak yeniden bağlamanın bir yolunu buldunuz mu?
Vladius

Kendi otomatik yeniden bağlama çözümümü ekledim
Vladius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.