Встроенный Linux USB-устройство обнаружения порта и адреса
Я разрабатываю USB-приложение для своей платы. Он имеет два порта USB. Когда я подключаю USB-накопитель в каждом из них, я получаю следующие сообщения на консоли:
На Порту 1:
usb 1-1: new high speed USB device using atmel-ehci and address 4
usb 1-1: New USB device found, idVendor=0781, idProduct=5567
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: Cruzer Blade
usb 1-1: Manufacturer: SanDisk
usb 1-1: SerialNumber: 3515430A2EE2729D
scsi2 : usb-storage 1-1:1.0
scsi 2:0:0:0: Direct-Access SanDisk Cruzer Blade 8.02 PQ: 0 ANSI: 0 CCS
sd 2:0:0:0: [sdb] 7856127 512-byte logical blocks: (4.02 GB/3.74 GiB)
sd 2:0:0:0: [sdb] Write Protect is off
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sdb:
sdb1
sd 2:0:0:0: [sdb] Assuming drive cache: write through
sd 2:0:0:0: [sdb] Attached SCSI removable disk
На Порту 2:
usb 1-2: USB disconnect, address 3
usb 1-2: new high speed USB device using atmel-ehci and address 5
usb 1-2: New USB device found, idVendor=0781, idProduct=5567
usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-2: Product: Cruzer Blade
usb 1-2: Manufacturer: SanDisk
usb 1-2: SerialNumber: 3515430A2EE2729D
scsi3 : usb-storage 1-2:1.0
scsi 3:0:0:0: Direct-Access SanDisk Cruzer Blade 8.02 PQ: 0 ANSI: 0 CCS
sd 3:0:0:0: [sda] 7856127 512-byte logical blocks: (4.02 GB/3.74 GiB)
sd 3:0:0:0: [sda] Write Protect is off
sd 3:0:0:0: [sda] Assuming drive cache: write through
sd 3:0:0:0: [sda] Assuming drive cache: write through
sda:
sda1
sd 3:0:0:0: [sda] Assuming drive cache: write through
sd 3:0:0:0: [sda] Attached SCSI removable disk
Но эти сообщения находятся на консоли.
Я хочу определить, какое устройство было подключено к какому порту с адресом (например, sda, sdb и т. д.)
Я немного погуглил по этому поводу и нашел два системных пути, которые дают эту информацию независимо друг от друга :
Один) /sys/bus/usb/devices/1-x
2) /sys/class/scsi_disk/x:0:0:0/device
Первый дает такую информацию:
1-2:1.0 bus maxchild
authorized busnum product
bConfigurationValue configuration quirks
bDeviceClass descriptors remove
bDeviceProtocol dev serial
bDeviceSubClass devnum speed
bMaxPacketSize0 devpath subsystem
bMaxPower driver uevent
bNumConfigurations ep_00 urbnum
bNumInterfaces idProduct usb_device:usbdev1.4
bcdDevice idVendor version
bmAttributes manufacturer
Второй дает такую информацию:
block:sdb iorequest_cnt scsi_disk:2:0:0:0
bus max_sectors scsi_level
delete modalias state
device_blocked model subsystem
driver queue_depth timeout
evt_media_change queue_type type
iocounterbits rescan uevent
iodone_cnt rev vendor
ioerr_cnt scsi_device:2:0:0:0
Таким образом, между этими двумя структурами данных нет общей информации. Я могу достать портвейн нет. и серийный номер нет. USB-устройства с первого пути. И я могу получить адрес (sda, sdb и т. д.) со второго пути. Но между ними нет никакой общей информации. Как я могу знать, что определенное USB-устройство на Порту 1 установлено на sda ? Или устройство на Порту 2, если оно установлено на sdc ??
3 ответов:
Как предполагают другие люди, использование udev может быть чистым подходом. Но чтобы ответить на ваш вопрос напрямую, если вы перечислите /sys / block и прочитаете символьные ссылки (т. е.
readlink) всех блочных устройств, вы увидите что-то вроде:Символьная ссылка завершает информацию, которую вы ищете, которая является отношением между блочным устройством и узлом в топологии USB. Кроме того, обратите внимание на "блок:" в последнем процитированном тексте вашего вопроса.sde -> ../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2.4/1-1.2.4.4/1-1.2.4.4:1.0/host12/target12:0:0/12:0:0:1/block/sde
Вы можете использовать подсистема udev для отображения устройств во время запуска системы
Использовать команды
[lsusb] и [lsusb-v] для идентификации VendorID, ProductID и SerialID для каждого устройства, которым вы хотите управлять
Создайте новый файл в [/etc/udev / rules.d/], Пусть говорят файл с именем [77-my.правила] с содержанием, основанным на следующем шаблоне:
Подсистемы= = "usb", ядро== " ttyUSB*", ATTRS{idVendor}== " 0781", ATTRS{idProduct}== " 5567", ATTRS{serial}== " 3515430A2EE2729D", Символьная ссылка+= "mydisk00"
Подсистемы= = "usb", ядро== " ttyUSB*", ATTRS{idVendor}== " 0781", ATTRS{idProduct}== "5567", ATTRS{serial}== "3515430A2EE2ABA", SYMLINK+= "mydisk11"
Перезапустить подсистему udev [/etc/init.D / udev restart ] или reboot linux box.
Comments