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

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

最佳答案

正如其他人所建议的那样,使用 udev 可能是一种干净的方法。但是要直接回答您的问题,如果您枚举/sys/block 并读取所有 block 设备的符号链接(symbolic link)(即 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

符号链接(symbolic link)完成了你寻找的信息,也就是USB拓扑中 block 设备和节点的关系。

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

关于usb - 嵌入式Linux USB设备检测端口和地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8033584/

相关文章:

linux - Buildroot - 系统不启动 -/dev/ttyS0 没有这样的文件

linux - 嵌入式 linux 设备上的 USB 驱动程序测试

c - 批量消息传输 USB Linux

linux - 使用 openssl 构建根工具链

linux - 各种CPU掩码之间的区别 - Linux内核

c++ - 如何将 libusb 与 libevent 一起使用?

python - 在 Raspberry Pi 3 上使用 cron 打开和关闭 USB 端口

Android 外置微型 USB Wifi 天线

Java USB 事件监听器,用于在 USB 插入时收到通知

c++ - 控制Windows CE6的USB访问