Comment le numéro de bus USB et le numéro de périphérique ont-ils été atsortingbués?

Lorsque j'utilise lsusb je me rends count que le numéro de bus et le numéro de périphérique d'un périphérique USB peuvent changer de time en time. D'après ce que je comprends, le numéro de bus peut être changé à chaque redémarrage. Le numéro de l'appareil changera à chaque reconnection.

Ma question est de savoir quel algorithm le système a utilisé pour get le numéro de bus et le numéro de périphérique? Surtout le numéro de l'appareil, est-ce monotone? Y aura-t-il un cas qui: sans redémarrer le operating system, un périphérique reconnecté utilise l'ancien numéro de bus et le numéro de périphérique d'un autre périphérique reconnecté?

Note: Ceci est une réponse linux , d'autres kernelx auront une façon légèrement différente de faire face à cela.

Le context

Il est difficile de parler des bus USB sans parler des bus PCI. Un CPU ne peut pas communiquer avec un bus USB, ce qui se passe est que le CPU parle à un bus PCI auquel un controller USB est connecté (et un controller / concentrateur USB est ce que lsusb appelle un bus USB). Les bus PCI sont numérotés en fonction de l'éloignement du processeur, par exemple:

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

En regardant dans l' man lspci nous voyons ce qui suit:

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

Par conséquent, nous soaps maintenant comment interpréter les numéros PCI. Ensuite, nous allons regarder les controllers USB connectés aux bus PCI. La machine que je suis actuellement a une configuration USB intéressante donc je vais l'utiliser comme un exemple:

 $ 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 

Attendre attendre attendre, quels sont tous ces avantages. En haut, nous avons le domaine et le bus PCI -[0000:00] (cette machine n'a qu'un seul bus PCI). Et puis nous avons plusieurs appareils connectés à ce bus. Voyons quels sont les périphériques USB:

 $ 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 

Bon, comparons maintenant cela avec lsusb (j'utilise le sort juste pour faciliter la search de la list plus tard):

 $ 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 

Attendez encore. Nous avons 7 appareils USB selon lspci mais 10 appareils selon lsusb ! lspci répertorie uniquement les controllers USB, un controller peut avoir plus d'un périphérique USB attaché à celui-ci. Laissez-nous explorer /sys/bus/ pour voir comment cela se passe.

 $ 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 

Maintenant cela commence à avoir du sens, nous avons 7 controllers USB qui sont branchés sur le bus PCI en tant que périphériques. Par exemple, le bus USB 001 correspond au périphérique 0000:00:12.2 et le bus 007 correspond au périphérique 0000:00:14.5 .

Numérotation de l'appareil

Les directorys commençant par le numéro de bus USB (par ex. 7-1:1.2 ) sont les périphériques réels connectés au controller USB. Tout comme un bus PCI peut avoir plusieurs périphériques connectés, un controller USB (un concentrateur) peut avoir plusieurs périphériques USB connectés.

Les numéros d'appareils sont simplement des counturs: le premier périphérique connecté reçoit un 1, le suivant reçoit un 2, etc. Mais il y a un peu plus: USB a été conçu pour être plug-and-play donc vous pouvez connecter et déconnecter des périphériques. Lorsque vous déconnectez un périphérique USB, le numéro du périphérique ne sera plus utilisé par le kernel pour tout autre périphérique de ce controller USB. Par exemple, si vous connectez et déconnectez une key USB et continuez à lsusb vous verrez le numéro de périphérique de votre key USB.

Numérotation d'autobus

Si vous avez lu ce qui précède avec attention, vous vous requestz peut-être une chose que je n'ai pas touchée. L'ordre de la numérotation PCI ne correspond pas à l'ordre dans lequel les controllers USB ont été numérotés! Voyons encore cela:

 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 

La list est en ordre, mais pas tout à fait. Les deux premiers controllers USB semblent être hors service. Pourtant, il y a une raison pour cela: si vous regardez dans lspci ci-dessus, vous verrez que ce sont EHCI USB (USB 2.0), tandis que tous les autres controllers USB sont OHCI USB (USB 1.x).

Par conséquent, nous pouvons redessiner cette table comme suit:

 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 

Et l'atsortingbution des numéros devient claire.