USB veri yolu numarası ve cihaz numarası nasıl atanır?


19

Kullanım lsusbsırasında bir USB cihazının veri yolu numarasının ve cihaz numarasının zaman zaman değişebileceğini fark ediyorum. Anladığım kadarıyla, her yeniden başlatmada otobüs numarası değişebilir. Her yeniden bağlanmada cihaz numarası değişecektir.

Benim sorum, sistemin veri yolu numarasını ve cihaz numarasını almak için hangi algoritmayı kullandığı? Özellikle cihaz numarası monotonik mi? Şunlar söz konusu olabilir mi: işletim sistemini yeniden başlatmadan, yeniden bağlanan bir cihaz başka bir yeniden bağlanan cihazın eski veri yolu numarasını ve cihaz numarasını kullanıyor mu?


6
Bir şey bana sorunuzu meraklandırdı, yeniden başlattıktan sonra BUS numaralarının gerçekten değiştiğini gördünüz mü? Donanımı değiştirmezseniz veya BIOS'u güncellemezseniz, BUS numaralarının değişmeyeceğinden her zaman emindim. USB veri yolları PCI veri yollarına bağlı hub'lar / denetleyicilerdir (her durumda en azından gördüm) ve PCI veri yolu bilgileri BIOS'tan gelir. Ama yanılıyor olabilirim, cevap vermek ve boktan konuşmak istemiyorum.
grochmal

doğru, sadece donanım değişikliği olduğunda.
Conan

Yanıtlar:


23

Not: Bu bir Linux yanıtıdır; diğer çekirdeklerin bununla başa çıkmak için biraz farklı bir yolu olacaktır.

bağlam

PCI veriyollarından bahsetmeden USB veriyolları hakkında konuşmak zordur. CPU bir USB veriyoluyla konuşamaz, olan şey, CPU'nun kendisine bağlı bir USB denetleyicisi olan bir PCI veriyoluyla (ve lsusbUSB veri yolu olarak adlandırılan USB denetleyici / hub ) konuşmasıdır. PCI veriyolları, CPU'dan ne kadar uzakta olduklarına göre numaralandırılır, örneğin:

    +-----+
    | CPU |
    +-----+
       |              PCI Bus 0
 ---+--+-----------------------------+
    |                                |
+---+----+                      +----+---+
| Bridge |                      | Bridge |
+---+----+                      +----+---+
    |  PCI bus 1                     |  PCI bus 2
  --+--------+               +-------+-------------+
             |               |                     |
       Disk Controller    USB Controller      Network Card
         (Device 00)       (Device 00)         (Device 01)

Baktığımızda man lspciaşağıdakileri görüyoruz:

   Slot   The  name of the slot where the device resides
          ([domain:]bus:device.function).  This tag is
          always the first in a record.

Bu nedenle artık PCI numaralarını nasıl yorumlayacağımızı biliyoruz. Sonra PCI veriyollarına bağlı USB denetleyicilerine bakacağız. Şu anda bulunduğum makinenin ilginç bir USB yapılandırması var, bu yüzden örnek olarak kullanacağım:

$ lspci -tv
-[0000:00]-+-00.0  Advanced Micro Devices, Inc. [AMD] RS780 Host Bridge
           +-01.0-[01]----05.0  Advanced Micro Devices, Inc. [AMD/ATI] RS780M [Mobility Radeon HD 3200]
           +-04.0-[02]----00.0  Qualcomm Atheros AR928X Wireless Network Adapter (PCI-Express)
           +-05.0-[03]----00.0  Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
           +-06.0-[04-06]--
           +-11.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode]
           +-12.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
           +-12.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
           +-12.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
           +-13.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
           +-13.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
           +-13.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
           +-14.0  Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller
           +-14.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 IDE Controller
           +-14.2  Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA)
           +-14.3  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller
           +-14.4-[07]--
           +-14.5  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller
           +-18.0  Advanced Micro Devices, Inc. [AMD] Family 11h Processor HyperTransport Configuration
           +-18.1  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Address Map
           +-18.2  Advanced Micro Devices, Inc. [AMD] Family 11h Processor DRAM Controller
           +-18.3  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Miscellaneous Control
           \-18.4  Advanced Micro Devices, Inc. [AMD] Family 11h Processor Link Control

Bekle bekle bekle, tüm bu artılar neler? Üstte etki alanı ve PCI veri yolu var -[0000:00](bu makinede yalnızca bir PCI veri yolu var). Ve sonra o veri yoluna bağlı birkaç cihazımız var. Hangisinin USB cihazı olduğunu görelim:

$ lspci -tv | grep -i usb
       +-12.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
       +-12.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
       +-12.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
       +-13.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller
       +-13.1  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller
       +-13.2  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller
       +-14.5  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller

Güzel, şimdi karşı karşılaştırın bize lsusb( sortsadece daha sonra listede daha kolay arama yapmak için kullanın ):

$ lsusb | sort
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 174f:5a31 Syntek Sonix USB 2.0 Camera
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 046d:c019 Logitech, Inc. Optical Tilt Wheel Mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 002: ID 0b05:1751 ASUSTek Computer, Inc. BT-253 Bluetooth Adapter

Tekrar bekle. Biz göre 7 USB cihazlar, lspciama göre 10 cihazlar var lsusb! lspciyalnızca USB denetleyicilerini listeler; bir denetleyiciye bağlı birden fazla USB aygıtı olabilir. Bunun /sys/bus/nasıl olduğunu görmek için inceleyelim .

$ ls -l /sys/bus/usb/devices/
... 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.2/usb1/1-0:1.0
... 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-0:1.0
... 2-1 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1
... 2-1:1.0 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1/2-1:1.0
... 2-1:1.1 -> ../../../devices/pci0000:00/0000:00:13.2/usb2/2-1/2-1:1.1
... 3-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-0:1.0
... 3-1 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-1
... 3-1:1.0 -> ../../../devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0
... 4-0:1.0 -> ../../../devices/pci0000:00/0000:00:12.1/usb4/4-0:1.0
... 5-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.0/usb5/5-0:1.0
... 6-0:1.0 -> ../../../devices/pci0000:00/0000:00:13.1/usb6/6-0:1.0
... 7-0:1.0 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-0:1.0
... 7-1 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1
... 7-1:1.0 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.0
... 7-1:1.1 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.1
... 7-1:1.2 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.2
... 7-1:1.3 -> ../../../devices/pci0000:00/0000:00:14.5/usb7/7-1/7-1:1.3
... usb1 -> ../../../devices/pci0000:00/0000:00:12.2/usb1
... usb2 -> ../../../devices/pci0000:00/0000:00:13.2/usb2
... usb3 -> ../../../devices/pci0000:00/0000:00:12.0/usb3
... usb4 -> ../../../devices/pci0000:00/0000:00:12.1/usb4
... usb5 -> ../../../devices/pci0000:00/0000:00:13.0/usb5
... usb6 -> ../../../devices/pci0000:00/0000:00:13.1/usb6
... usb7 -> ../../../devices/pci0000:00/0000:00:14.5/usb7

Şimdi bu mantıklı olmaya başladı, PCI veriyoluna aygıtlar olarak takılan 7 USB denetleyicimiz var. Örneğin, USB veriyolu 001 PCI cihazına 0000:00:12.2ve USB veriyolu 007 0000:00:14.5cihaza karşılık gelir .

Cihaz numaralandırma

USB veri yolu numarasıyla (ör. 7-1:1.2) Başlayan dizinler , USB denetleyicisine bağlı gerçek cihazlardır. Bir PCI veri yolunun birden fazla cihaza bağlı olması gibi, bir USB denetleyicisine (bir hub) bağlı birden fazla USB cihazı olabilir.

Cihaz numaraları basitçe sayaçlardır: ilk bağlanan cihaz 1 alır, diğeri 2 alır vb. Ama biraz daha fazlası var: USB çalışırken takılabilir olacak şekilde tasarlandı; böylece cihazları bağlayabilir ve bağlantısını kesebilirsiniz. Bir USB aygıtının bağlantısını kestiğinizde, aygıt numarası çekirdek tarafından söz konusu USB denetleyicisindeki başka herhangi bir aygıt için bir daha kullanılmaz. Örneğin, bir kalem sürücü bağlayıp çıkarırsanız ve yapmaya devam lsusbederseniz, kalem sürücünüzün cihaz numarasının yükseldiğini görürsünüz.

Otobüs numaralandırma

Yukarıdakileri dikkatle okuduysanız, dokunmadığım bir şeyi merak ediyor olabilirsiniz. PCI numaralandırmasının sırası, USB denetleyicilerinin numaralandırılma sırasına karşılık gelmez! Tekrar görelim:

USB  | PCI
-----+----
usb1 | 0000:00/0000:00:12.2
usb2 | 0000:00/0000:00:13.2
usb3 | 0000:00/0000:00:12.0
usb4 | 0000:00/0000:00:12.1
usb5 | 0000:00/0000:00:13.0
usb6 | 0000:00/0000:00:13.1
usb7 | 0000:00/0000:00:14.5

Liste sıralı ama tam olarak değil. İlk iki USB denetleyicisi bozuk görünüyor. Yine de, bunun bir nedeni var: lspciYukarıya bakarsanız , bunların EHCIUSB (USB 2.0) olduğunu, diğer tüm USB denetleyicilerinin ise OHCIUSB (USB 1.x) olduğunu göreceksiniz .

Bu nedenle bu tabloyu şu şekilde yeniden çizebiliriz:

USB  | PCI
-----+----
usb1 | 0000:00/0000:00:12.2
usb2 | 0000:00/0000:00:13.2     USB 2.0
-----+---------------------------------
usb3 | 0000:00/0000:00:12.0     USB 1.x
usb4 | 0000:00/0000:00:12.1
usb5 | 0000:00/0000:00:13.0
usb6 | 0000:00/0000:00:13.1
usb7 | 0000:00/0000:00:14.5

Ve sayı ataması netleşir.


maksimum cihaz numarası kullanıldığında ne olur. diyelim ki cihazımı yeniden bağlamaya devam ediyorum. Cihaz numarası yakında maks. Aslında bir test yaptım, basit bir sayaç değil gibi görünüyor. Geri dönmüyor 001, bunun yerine çekirdek en büyük birkaç cihaz numarasını yeniden kullanıyor. Bu davranışı değiştirmenin kolay bir yolu var mı?
Conan

@Conan - Hmm ... iyi, nasıl söyleyebilirim: Bilmiyorum. Asla yaptığınız gibi cihaz sayacını taşmaya çalışmadım. Sonra tekrar, önceden bir cihaz numarası bilmek zor. Örneğin, bağlandığında bir USB sürücü bulmaya çalışıyorsanız, bunu dosya sistemi etiketi veya UUID (daha udevfazla veya daha az anlar) ile yapmalısınız . Öğrenme uğruna numaralandırmayı anlamak için, bilgiye sahip tek yerin çekirdek kodu olduğuna inanıyorum.
grochmal

@Grochmal, test taşması sırasında hata yaptım sanırım. Daha sonraki testler taşma sırasında bana gösterdi, sayaç gerçekten daha düşük sayıdan arıyor.
Conan
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.