Bagaimana nomor bus USB dan nomor perangkat diberikan?


19

Saat digunakan, lsusbsaya menyadari bahwa nomor bus dan nomor perangkat perangkat USB dapat berubah dari waktu ke waktu. Dari apa yang saya mengerti, nomor bus dapat diubah pada setiap reboot. Nomor perangkat akan berubah pada setiap koneksi ulang.

Pertanyaan saya adalah algoritma apa yang digunakan sistem untuk mendapatkan nomor bus dan nomor perangkat? Terutama nomor perangkat, apakah itu monoton? Akankah ada kasus bahwa: tanpa me-reboot OS, satu perangkat yang terhubung kembali menggunakan nomor bus dan nomor perangkat yang terhubung kembali?


6
Satu hal yang membuat saya penasaran dengan pertanyaan Anda, apakah Anda benar-benar melihat nomor BUS berubah setelah reboot? Saya selalu yakin bahwa kecuali Anda mengubah perangkat keras atau memperbarui BIOS, nomor BUS tidak akan berubah. Bus USB hanyalah hub / pengontrol yang terhubung ke bus PCI (dalam semua kasus saya melihat setidaknya), dan info bus PCI berasal dari BIOS. Tapi saya mungkin salah, tidak ingin membuat jawaban dan berbicara omong kosong di dalamnya.
grochmal

benar, hanya ketika saya memiliki perubahan perangkat keras seperti.
Conan

Jawaban:


23

Catatan: Ini adalah jawaban Linux ; kernel lain akan memiliki cara yang sedikit berbeda untuk menangani ini.

Konteks

Sulit untuk berbicara tentang bus USB tanpa berbicara tentang bus PCI. CPU tidak dapat berbicara dengan bus USB, yang terjadi adalah CPU berbicara dengan bus PCI yang memiliki pengontrol USB yang terhubung (dan pengontrol / hub USB adalah apa yang lsusbdisebut bus USB). PCI bus diberi nomor berdasarkan seberapa jauh dari CPU mereka, misalnya:

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

Mencari di man lspcikita melihat yang berikut:

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

Karena itu kita sekarang tahu bagaimana menafsirkan nomor PCI. Selanjutnya kita akan melihat pengontrol USB yang terhubung ke bus PCI. Mesin yang saya gunakan saat ini memiliki konfigurasi USB yang menarik jadi saya akan menggunakannya sebagai contoh:

$ 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

Tunggu, tunggu, tunggu, apa saja plusnya? Di bagian atas kami memiliki domain dan bus PCI -[0000:00](mesin ini hanya memiliki satu bus PCI). Dan kemudian kami memiliki beberapa perangkat yang terhubung ke bus itu. Mari kita lihat mana yang merupakan perangkat 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

Bagus, sekarang mari kita bandingkan dengan lsusb(saya gunakan sorthanya untuk memudahkan mencari daftar nanti):

$ 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

Tunggu lagi Kami memiliki 7 perangkat USB sesuai dengan lspcitetapi 10 perangkat sesuai dengan lsusb! lspcihanya mencantumkan pengontrol USB; sebuah pengontrol dapat memiliki lebih dari satu perangkat USB yang terpasang padanya. Mari kita jelajahi /sys/bus/untuk melihat bagaimana ini terjadi.

$ 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

Sekarang ini mulai masuk akal, kami memiliki 7 pengontrol USB yang dicolokkan dalam PCI bus sebagai perangkat. Misalnya, bus USB 001 sesuai dengan perangkat PCI 0000:00:12.2dan USB bus 007 sesuai dengan 0000:00:14.5perangkat.

Penomoran perangkat

Direktori yang dimulai dengan nomor bus USB (mis. 7-1:1.2) Adalah perangkat aktual yang terhubung ke pengontrol USB. Sama seperti bus PCI dapat memiliki beberapa perangkat yang terhubung dengan pengontrol USB (hub) dapat memiliki beberapa perangkat USB yang terhubung dengannya.

Nomor perangkat hanyalah penghitung: perangkat pertama yang terhubung mendapat 1, selanjutnya mendapat 2, dan seterusnya. Tetapi ada sedikit lagi: USB dirancang untuk menjadi hot-plugabble; karena itu Anda dapat menghubungkan dan memutuskan perangkat. Ketika Anda melepaskan perangkat USB, nomor perangkat tidak akan digunakan oleh kernel lagi untuk perangkat lain pada pengontrol USB tersebut. Misalnya, jika Anda menghubungkan dan melepaskan drive pen dan terus melakukan, lsusbAnda akan melihat nomor perangkat untuk drive pen Anda naik.

Penomoran bus

Jika Anda telah membaca hal di atas dengan perhatian, Anda mungkin bertanya-tanya tentang satu hal yang tidak saya sentuh. Urutan penomoran PCI tidak sesuai dengan urutan pengontrol USB diberi nomor! Mari kita lihat lagi:

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

Daftarnya berurutan, tetapi tidak cukup. Dua pengendali USB pertama tampaknya rusak. Namun, ada alasan mengapa: Jika Anda melihat ke lspciatas, Anda akan melihat bahwa itu adalah EHCIUSB (USB 2.0), sementara semua pengontrol USB lainnya adalah OHCIUSB (USB 1.x).

Karenanya kita dapat menggambar ulang tabel ini sebagai:

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

Dan tugas nomor menjadi jelas.


jadi apa yang akan terjadi ketika jumlah maksimal nomor perangkat digunakan. katakanlah saya terus menghubungkan kembali perangkat saya. Nomor perangkat akan segera mencapai maks. Saya benar-benar melakukan tes, sepertinya itu bukan penghitung sederhana. Itu tidak kembali ke 001, sebaliknya kernel menggunakan kembali beberapa nomor perangkat terbesar. Apakah ada cara mudah untuk mengubah perilaku ini?
Conan

@ Conan - Hmm ... well, bagaimana saya bisa mengatakannya: Saya tidak tahu. Saya tidak pernah mencoba meluap penghitung perangkat seperti yang Anda lakukan. Namun sekali lagi, sulit untuk mengetahui nomor perangkat sebelumnya. Misalnya, jika Anda mencoba menemukan drive USB saat terhubung, Anda harus melakukannya dengan label sistem file atau UUID (yang bahkan udevlebih atau kurang mengerti). Untuk memahami penomoran demi pembelajaran, saya percaya bahwa satu-satunya tempat yang memiliki info adalah kode kernel.
grochmal

Terima kasih @ grochmal, saya pikir saya membuat kesalahan saat tes meluap. Tes kemudian menunjukkan kepada saya ketika meluap, penghitung memang mencari dari angka yang lebih rendah.
Conan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.