Cihaza USB sürücüsü nasıl atanır


30

Bu soru iki katlıdır:

Öncelikle, bir sürücüyü bir USB cihazından elle nasıl ayırır ve farklı bir sürücü eklersiniz? Örneğin, bağlandığımda otomatik olarak usb depolama sürücüsünü kullanan bir cihaza sahibim.

usbview çıkışı

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
        ...

Ben usb depolama sürücüsünü kullanmak istemiyorum, bu yüzden uygulamamda libusbusb depolama sürücüsünü ayırmak için kütüphaneyi kullanıyorum ve ardından arayüzü talep ediyorum. Daha sonra, USB cihazımda ve ana bilgisayar Linux sistemimde çalışan uygulamalara veri gönderebilirim.

Bir sürücüyü bir uygulamanın dışında manuel olarak nasıl ayırırsınız?


İkincisi, aygıt eklentisine sürücüyü otomatik olarak nasıl atayabilirim? Cihaz izinlerini otomatik olarak ayarlamak için şu anda bir udev kural kurulumum var:

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

USB aygıtındaki belirli arabirimlere sürücü atamak için udev kurallarını kullanabilir miyim? Örneğin, usbnet modülünün usb depolama yerine 0 arabiriminde otomatik olarak kullanılmasını istersem, udev'de bu mümkün mü?


1
Sorunun bir parçası sağ modülü yükleniyorsa bkz Angstrom üzerinde Webcam
Gilles 'SO durdurma varlık kötülüğü'

1
Tüm usb-depolama modüllerine ihtiyacınız var mı? Çünkü eğer bir kara listeye koyamazsanız ve hiç yüklemeyebilir.
Hanan N.

@Gilles, LKM'yi başarıyla yükleyebiliyorum. Sorum şu: bunu manuel olarak ve otomatik olarak cihaza nasıl eklerim?
linsek

@Hanan, şu anda usb-depolama modülünü kullanmam gerekmiyor. Doğru modülü otomatik olarak eklemek için kara listeye girmem gerekebilir, ancak önce usbnet'i nasıl takacağımı bilmem gerekiyor.
linsek

1
@njozwiak Modül usbnetotomatik olarak yüklenmeyecektir, çünkü onu kullanabilecek donanım hakkında hiçbir bilgiye sahip değildir. Uygun sürücüyü bulmaya ve örneğin kullanmaya çalışın modinfo kalmia. Gelen aliashatları Eğer satıcı kimliği xxxx ve ürün kimliği yyyy olarak göreceksiniz usb:vxxxxpyyyy. Veya /lib/modules/kernel_version/modules.usbmap dosyasını düzenleyebilir ve HW'niz için satırı silebilirsiniz, nerede sizin için HW modülü usb deposunu kullanabilir veya uygun ağ sürücüsü ile usbtorage değiştirebilirsiniz. Ama depmod -abu değişiklikten sonra gidecek ...
Jan Marek

Yanıtlar:


20

Sorunun ilk bölümünde, bir USB sürücüsünü ayırmanın libusb ile yaptığınızdan daha iyi bir yol aradım ve bulamadım.

Söz konusu ikinci bölümü olarak, Udev olabilir reaksiyona sürücü yükleme, ancak zorla bir cihaz tahsis edilecek özel bir sürücü.

Linux çekirdeğindeki her sürücü bir veya daha fazla cihazdan sorumludur. Sürücünün kendisi hangi cihazları desteklediğini seçer. Bunu program aracılığıyla yapar, yani cihazın satıcısını ve ürün kimliğini kontrol ederek veya eğer mevcut değilse (örneğin eski bir cihaz), bazı otomatik algılama sezgisel taramalarını ve akıl sağlığı kontrollerini yaparak. Sürücü kendinden emin olduktan sonra, desteklediği bir cihaz bulduğunda, kendisine takılır. Kısacası, belirli bir sürücüyü belirli bir aygıtı kullanmaya zorlayamazsınız. Bununla birlikte, bazen bir aygıt sürücüsü kabul ettiği şeylerle cömert davranır ve bir aygıt bilmediği bir şekilde çalışabilir. Kilometreniz değişecek! Geçmişte, garip bir PCI aygıt / satıcı kimliklerini, bunları desteklemesi gereken sürücülere, karışık bir başarı ve birkaç eğlenceli çekirdek çökmesiyle manuel olarak eklemek zorunda kaldım.

Şimdi, modüller söz konusu olduğunda, fazladan bir adım var. Modül yükleme yeni bir aygıt algılandığında çekirdek tarafından uyandırılır. Aygıtı tanımlayan ve USB aygıtları için buna benzeyen bir 'modalias' dizgisi geçti:

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

Bu dize, cihaz sınıfını ( usb) ve sınıfa özgü bilgileri (satıcı / cihaz / seri numarası, cihaz sınıfı, vb.) İçerir. Her bir çekirdek sürücüsü aşağıdaki gibi bir satır içerir:

MODULE_ALIAS("usb:...")

Usbalyalarla uyuşması gereken (joker karakterler birden fazla cihazı eşleştirmek için kullanılır). Eğer modaliassürücü desteklerin olduğunu uyuşuyorsa bu sürücü yüklenir (veya zaten varsa, yeni cihaz haberdar).

Desteklenen cihazları (modalias tarafından) ve bunlarla ilişkili modülleri görebilirsiniz.

less /lib/modules/`uname -r`/modules.alias

USB depolama aygıtı sürücüsünü seçerseniz, satıcı ve aygıt kimliği tarafından desteklediği bazı belirli aygıtlara sahip olduğunu görür ve satıcı / aygıt ne olursa olsun, doğru (depolama) sınıfı olan aygıtları desteklemeye çalışır. .

Bunu işletim sisteminizdeki ( /etc/modprobe.d/Debian ve arkadaşlarınızdaki) kullanıcı alanı mekanizmalarını kullanarak etkileyebilirsiniz . Modülleri kara listeye alabilir veya modalias tarafından yüklenecek modülleri modules.alias( tıpkı dosya gibi) (ve aynı sözdizimini kullanarak) belirleyebilirsiniz. depmod -asonra modül yükleyicinin düzenlerini yeniden oluşturacaktır.

Bununla birlikte, bu atı suya götürebilseniz de, onu içmesini sağlayamazsınız. Sürücünün cihazınız için desteği yoksa, görmezden gelmesi gerekir.

Genel durumdaki teori budur.

Uygulamada ve USB durumunda, cihazınızın depolama alanı iki olan iki arayüze sahip gibi görünüyor . Çekirdek , genel cihazın depolama arayüzüne bağlanacaktır . Diğer arayüz doğru sınıf varsa, usbnetsürücü olabilir ona bağlanması. Evet, aynı fiziksel aygıta bağlı birden fazla sürücünüz olabilir , çünkü bir USB aygıtı birden fazla arabirim dışa aktarır (örneğin, Logitech G15 klavyem her ikisi de ayrı bir sürücü tarafından yönetilen bir klavye aygıtına ve LCD ekranına sahip olduğu için iki tane verir) .

USB cihazınızın ikinci arayüzünün tespit edilmemesi, çekirdekte destek bulunmadığını gösterir. Durum ne olursa olsun, cihaz arayüzlerini / uç noktalarını kullanarak ayrıntılı ve ayrıntılı bir şekilde listeleyebilir lsusb -v | less, ardından kendi cihazınıza doğru aşağıya doğru gidebilirsiniz (çıktıyı cihaza göre sınırlandırabilirsiniz: satıcı kimliğine veya USB eğimine sahipseniz).

Lütfen dikkat: Burada USB cihazlarının mantıksal yapısına göre biraz fazla sadeleştiriyorum. USB konsorsiyumunu suçla. :)


4
static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);Kodda zaten var, modalias ile gereksiz mi?
Thomas

Benim durumumda, bu çizgiler sürücünün herhangi bir yerinde bulunan bazı Makefile büyüleri tarafından otomatik olarak üretiliyor. Bu yüzden MODULE_ALIAS için üç kere satır ekledim ama listelenmedi. Herneyse, lsusb -v için teşekkürler. Bununla kontrol edip fikrimdeki kusuru bulabilirdim. Daha sonra bilinen bir tanımlayıcı için kaynağı okudum ve üzerinde işlem yapmak zorunda olduğum girişleri içeren diziyi buldum.
JackGrinningCat
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.