Saat digunakan, lsusb
saya 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?
Jawaban:
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
lsusb
disebut bus USB). PCI bus diberi nomor berdasarkan seberapa jauh dari CPU mereka, misalnya:Mencari di
man lspci
kita melihat yang berikut: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:
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:Bagus, sekarang mari kita bandingkan dengan
lsusb
(saya gunakansort
hanya untuk memudahkan mencari daftar nanti):Tunggu lagi Kami memiliki 7 perangkat USB sesuai dengan
lspci
tetapi 10 perangkat sesuai denganlsusb
!lspci
hanya 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.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.2
dan USB bus 007 sesuai dengan0000:00:14.5
perangkat.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,
lsusb
Anda 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:
Daftarnya berurutan, tetapi tidak cukup. Dua pengendali USB pertama tampaknya rusak. Namun, ada alasan mengapa: Jika Anda melihat ke
lspci
atas, Anda akan melihat bahwa itu adalahEHCI
USB (USB 2.0), sementara semua pengontrol USB lainnya adalahOHCI
USB (USB 1.x).Karenanya kita dapat menggambar ulang tabel ini sebagai:
Dan tugas nomor menjadi jelas.
sumber
001
, sebaliknya kernel menggunakan kembali beberapa nomor perangkat terbesar. Apakah ada cara mudah untuk mengubah perilaku ini?udev
lebih atau kurang mengerti). Untuk memahami penomoran demi pembelajaran, saya percaya bahwa satu-satunya tempat yang memiliki info adalah kode kernel.