Встроенное USB-устройство Linux определяет порт и адрес - PullRequest
2 голосов
/ 07 ноября 2011

Я разрабатываю приложение 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 и т. Д.)

Я немного погуглил и нашел два системных пути, которые предоставляют эту информацию независимо друг от друга: 1) /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 ]

3 голосов
/ 07 ноября 2011

Как полагают другие, использование udev может быть чистым подходом. Но чтобы ответить на ваш вопрос напрямую, если вы перечислите / sys / block и прочитаете символические ссылки (т.е. readlink) всех блочных устройств, вы увидите что-то вроде:

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

Символическая ссылка завершает поиск информации, которая представляет собой взаимосвязь между блочным устройством и узлом в топологии USB.

Также обратите внимание на «блок:» в последнем цитируемом тексте вашего вопроса.

3 голосов
/ 07 ноября 2011

Полагаю, вам следует больше узнать о udev (или, возможно, hal в старой системе).

0 голосов
/ 24 сентября 2017

Вы можете использовать подсистему udev для отображения устройств во время запуска системы

  1. Использовать команды

    [lsusb] и [lsusb -v] для идентификации VendorID, ProductID и SerialID для каждого устройства, которым вы хотите управлять

  2. Создайте новый файл в [/etc/udev/rules.d/], скажем, файл с именем [77-my.rules] с содержанием на основе следующего шаблона:

    SUBSYSTEMS == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0781", ATTRS {idProduct} == "5567", ATTRS {serial} == "3515430A2EE2729D", SYMLINK + = "mydisk00"

    SUBSYSTEMS == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0781", ATTRS {idProduct} == "5567", ATTRS {serial} == "3515430A2EE2ABA", SYMLINK + = "mydisk11"

  3. Перезапустите подсистему udev [/etc/init.d/udev restart] или перезагрузите linux box.

...