嵌入式Linux USB设备检测端口和地址

嵌入式Linux USB设备检测端口和地址,usb,embedded-linux,libusb,Usb,Embedded Linux,Libusb,我正在为我的主板开发一个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, Seri

我正在为我的主板开发一个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\u disk/x:0:0:0/设备

第一个提供了以下信息:

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 
第二个提供了以下信息:

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等)。但是他们之间没有共同的信息。我如何知道端口1上的特定USB设备安装在sda上?或者端口2上的设备(如果安装在sdc上)?

我认为您应该了解更多信息(或者在旧系统上)。

正如其他人所建议的,使用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拓扑中的节点之间的关系

另外,请注意问题最后引用的文本中的“block:”。

您可以在系统启动期间使用它来映射设备

  • 使用命令

    [lsusb]和[lsusb-v]来标识要控制的每个设备的VendorID、ProductID和SerialID

  • 在[/etc/udev/rules.d/]中创建新文件,假设文件名为[77 my.rules] 内容基于以下模板:

    子系统==“usb”,内核==“ttyUSB*”,属性{idVendor}==“0781”, 属性{idProduct}==“5567”,属性{serial}==“3515430A2EE2729D”, 符号链接+=“mydisk00”

    子系统==“usb”,内核==“ttyUSB*”,属性{idVendor}==“0781”, 属性{idProduct}==“5567”,属性{serial}==“3515430A2EE2ABA”,符号链接+=“mydisk11”

  • 重新启动udev子系统[/etc/init.d/udev Restart]或重新启动linux机箱


  • 好的,我搜索了udev,知道它可以提供关于这个设备的信息。你能给我进一步介绍一下udev吗?
    udev
    可以配置为在插入USB设备时执行操作。但我忘了细节。