用sysfs查看linux下usb设备的描述符

本文深入解析Linux系统中USB设备的命名规则,包括设备、配置和接口描述符的查看方式,以及如何通过路径理解USB控制器和设备的连接关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/sys/bus/usb/devices/下的路径命名规则

 roothub-port[.port]:configuration:interface

一般,1-0是根hub自身信息,当hub上有插入设备时,就会出现1-1、1-2了。
1.查看目录:

ls /sys/bus/usb/devices/
1-0:1.0    1-1.1:1.0  2-1        4-0:1.0    usb1       usb4
1-1        1-1:1.0    2-1:1.0    5-0:1.0    usb2       usb5
1-1.1      2-0:1.0    3-0:1.0    6-0:1.0    usb3       usb6

这是什么鬼东西?

2.别急,再详细看看。

ls /sys/bus/usb/devices/usb1/
1-0:1.0              bcdDevice            manufacturer
1-1                  bmAttributes         maxchild
authorized           busnum               power
authorized_default   configuration        product
avoid_reset_quirk    descriptors          quirks
bConfigurationValue  dev                  removable
bDeviceClass         devnum               remove
bDeviceProtocol      devpath              serial
bDeviceSubClass      driver               speed
bMaxPacketSize0      ep_00                subsystem
bMaxPower            idProduct            uevent
bNumConfigurations   idVendor             urbnum
bNumInterfaces       ltm_capable          version

可以直接看到描述符?

3.子目录呢?

ls /sys/bus/usb/devices/usb1/1-0\:1.0/
bAlternateSetting     bNumEndpoints         power
bInterfaceClass       driver                subsystem
bInterfaceNumber      ep_81                 supports_autosuspend
bInterfaceProtocol    modalias              uevent
bInterfaceSubClass    port1

接口描述符?好家伙!

4.看看是啥设备:

cat /sys/bus/usb/devices/usb1/1-0\:1.0/bInterfaceClass
09

哇哦,是hub!

5.那1-1是啥东西?

cat /sys/bus/usb/devices/usb1/1-1/1-1.1/bDeviceClass
00

是一个设备,我刚刚插进去的安卓手机

于是可以得到:

接口描述符:

cat /sys/bus/usb/devices/usb1/1-1/1-1.1/1-1.1\:1.0/
bAlternateSetting     driver/               subsystem/
bInterfaceClass       ep_02/                supports_autosuspend
bInterfaceNumber      ep_81/                uevent
bInterfaceProtocol    interface             usbmisc/
bInterfaceSubClass    modalias              
bNumEndpoints         power/ 

往上是配置和设备描述符:

cat /sys/bus/usb/devices/usb1/1-1/1-1.1/           
1-1.1:1.0/           busnum               port/
authorized           configuration        power/
avoid_reset_quirk    descriptors          product
bConfigurationValue  dev                  quirks
bDeviceClass         devnum               removable
bDeviceProtocol      devpath              remove
bDeviceSubClass      driver/              serial
bMaxPacketSize0      ep_00/               speed
bMaxPower            idProduct            subsystem/
bNumConfigurations   idVendor             uevent
bNumInterfaces       ltm_capable          urbnum
bcdDevice            manufacturer         version
bmAttributes         maxchild           

再往上:

 cat /sys/bus/usb/devices/usb1/1-1/
1-1.1/               bmAttributes         port/
1-1:1.0/             busnum               power/
authorized           configuration        product
avoid_reset_quirk    descriptors          quirks
bConfigurationValue  dev                  removable
bDeviceClass         devnum               remove
bDeviceProtocol      devpath              speed
bDeviceSubClass      driver/              subsystem/
bMaxPacketSize0      ep_00/               uevent
bMaxPower            idProduct            urbnum
bNumConfigurations   idVendor             version
bNumInterfaces       ltm_capable          
bcdDevice            maxchild   

这个好像没有区别。

6.回到主目录:

ls /sys/bus/usb/devices/
1-0:1.0    1-1.1:1.0  2-1        4-0:1.0    usb1       usb4
1-1        1-1:1.0    2-1:1.0    5-0:1.0    usb2       usb5
1-1.1      2-0:1.0    3-0:1.0    6-0:1.0    usb3       usb6

一共3个接口,为啥有6个usb呢?追溯一下:

 ls -al /sys/bus/usb/devices/
total 0
drwxr-xr-x    2 root     root             0 Jan  1 06:59 .
drwxr-xr-x    4 root     root             0 Jan  1 06:59 ..
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 1-0:1.0 -> ../../../devices/soc/5200000.ehci1-controller/usb1/1-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 1-1 -> ../../../devices/soc/5200000.ehci1-controller/usb1/1-1
lrwxrwxrwx    1 root     root             0 Jan  1 08:46 1-1.1 -> ../../../devices/soc/5200000.ehci1-controller/usb1/1-1/1-1.1
lrwxrwxrwx    1 root     root             0 Jan  1 08:46 1-1.1:1.0 -> ../../../devices/soc/5200000.ehci1-controller/usb1/1-1/1-1.1/1-1.1:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 1-1:1.0 -> ../../../devices/soc/5200000.ehci1-controller/usb1/1-1/1-1:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 2-0:1.0 -> ../../../devices/soc/5310000.ehci2-controller/usb2/2-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 2-1 -> ../../../devices/soc/5310000.ehci2-controller/usb2/2-1
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 2-1:1.0 -> ../../../devices/soc/5310000.ehci2-controller/usb2/2-1/2-1:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 3-0:1.0 -> ../../../devices/soc/5311000.ehci3-controller/usb3/3-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 4-0:1.0 -> ../../../devices/soc/5200000.ohci1-controller/usb4/4-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 5-0:1.0 -> ../../../devices/soc/5310000.ohci2-controller/usb5/5-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 6-0:1.0 -> ../../../devices/soc/5311000.ohci3-controller/usb6/6-0:1.0
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb1 -> ../../../devices/soc/5200000.ehci1-controller/usb1
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb2 -> ../../../devices/soc/5310000.ehci2-controller/usb2
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb3 -> ../../../devices/soc/5311000.ehci3-controller/usb3
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb4 -> ../../../devices/soc/5200000.ohci1-controller/usb4
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb5 -> ../../../devices/soc/5310000.ohci2-controller/usb5
lrwxrwxrwx    1 root     root             0 Jan  1 06:59 usb6 -> ../../../devices/soc/5311000.ohci3-controller/usb6

看到了,ehci和ohci是分开的,所以一共有6个控制器。


void checkUSBDevice()
{
    bool ret = false;

    #define USB1_PATH "/sys/bus/usb/devices/usb1/1-1/1-1.1/product"
    #define USB2_PATH "/sys/bus/usb/devices/usb1/1-1/1-1.2/product"


    int fd = open(USB1_PATH,O_RDONLY);
    if(fd>0)
    {
        printf("usb 1 is exist!\n");
        char product[BUF_LEN] =  {'\0'};
        int seekLen = lseek(fd,0,SEEK_END);
        lseek(fd,0,SEEK_SET);
        int ret = read(fd,product,seekLen);

        close(fd);
    }
    else
    {
        printf("usb 1 is not exist!\n");
    }

    
    fd = open(USB2_PATH,O_RDONLY);
    if(fd>0)
    {
        printf("usb 2 is exist!\n");
        char product[BUF_LEN] =  {'\0'};
        int seekLen = lseek(fd,0,SEEK_END);
        lseek(fd,0,SEEK_SET);
        int ret = read(fd,product,seekLen);
        printf("usb1 name:%s,strlen=%d,seekLen=%d,reedlen=%d\n",product,strlen(product),seekLen,ret);
        close(fd);
    }
    else
    {
        printf("usb 2 is not exist!\n");
    }

}
<think>好的,用户现在问的是在嵌入式Linux中如何查看USB设备USB几,也就是USB的版本。我需要先回顾一下之前和用户的对话历史。之前用户问了一个关于“C”的多重含义的问题,我给出了编程语言、计算机系统、其他领域等多个方向的解释。现在用户具体到嵌入式Linux下的USB设备版本查看,这应该属于计算机系统部分中的USB Type-C相关内容,但用户更关注的是如何识别USB设备的版本。 首先,我需要确认用户的使用场景。用户可能在开发或维护嵌入式Linux系统,需要检查连接的USB设备是否符合预期的USB标准,比如USB 2.03.0等。这可能涉及到硬件兼容性、性能调试或者驱动问题。用户可能遇到了设备连接不稳定、速度不达标的问题,想确认是否是USB版本导致的。 接下来,我需要考虑在嵌入式Linux环境下常用的工具和方法。常见的命令如lsusb、dmesg、查看sysfs文件系统等。不过嵌入式系统可能没有安装所有工具,比如lsusb可能需要usbutils包的支持。如果用户的环境比较精简,可能需要依赖sysfs或者内核日志来获取信息。 用户的问题是如何确定USB设备的版本。USB版本通常指的是设备支持的传输速率,比如USB 1.1、2.03.0等。每个版本有不同的速度标识,如USB 2.0是480 Mbps,USB 3.0是5 Gbps。在Linux系统中,这些信息可以通过多种方式获取。 首先想到的是lsusb命令,它可以列出所有USB设备的信息,包括设备描述符中的bcdUSB字段,这个字段表示设备符合的USB规范版本。例如,bcdUSB 2.00表示USB 2.03.00表示USB 3.0。需要详细解释如何解析这个输出,可能用户对输出的具体字段不太熟悉,需要给出示例和解释。 另外,如果lsusb不可用,查看内核日志dmesg也是一个方法。当USB设备插入时,内核会记录相关信息,包括速度和版本。用户可以通过dmesg | grep -i usb来过滤相关信息,但需要指导用户如何识别其中的版本信息。 还有一种方法是查看sys文件系统下的设备属性,比如/sys/bus/usb/devices/下的各个USB端口和设备的目录,其中的speed文件会直接显示当前连接的速度,比如“480”表示USB 2.0,“5000”表示USB 3.0。但需要注意,这里的数值单位可能不同,需要明确说明。 此外,需要注意USB端口的版本和设备的版本可能不同。比如,设备支持USB 3.0,但插入到USB 2.0端口时,会以降速运行。因此,需要查看端口和设备两方面的信息,可能需要结合多个命令和文件来确认。 用户可能遇到的困难包括嵌入式系统工具缺失,或者对命令行输出不熟悉。因此,需要提供多种方法,并说明它们的适用情况,以及如何安装必要的工具(如usbutils)。同时,可能需要提醒用户权限问题,某些命令需要root权限才能执行。 最后,总结步骤,给出清晰的命令行示例和输出解析,帮助用户一步步确认USB设备的版本。确保回答结构清晰,方法可靠,覆盖不同情况,如工具可用性、权限问题、版本与速度的对应关系等。</think>在嵌入式Linux系统中,可以通过以下方法查看USB设备的版本(如USB 2.0USB 3.0等): --- ### **方法1:`lsusb` 命令(需安装`usbutils`工具包)** #### **步骤** 1. **执行命令**: ```bash lsusb -v | grep -E &#39;bcdUSB|iProduct&#39; ``` - `lsusb -v`:显示所有USB设备详细信息(需root权限)。 - `grep -E`:过滤输出中的关键字段。 2. **解析输出**: ```bash bcdUSB 2.00 # USB 2.0 bcdUSB 3.20 # USB 3.2 iProduct 2 USB 2.0 Hub ``` - **`bcdUSB`字段**:表示设备遵循的USB规范版本: - `2.00` → USB 2.0(480Mbps) - `3.00` → USB 3.0(5Gbps) - `3.10` → USB 3.110Gbps) - `3.20` → USB 3.2(20Gbps) --- ### **方法2:查看`/sys`文件系统** #### **步骤** 1. **定位设备路径**: ```bash ls /sys/bus/usb/devices/ # 列出所有USB设备目录(如1-1、2-1.1等) ``` 2. **查看版本信息**: ```bash cat /sys/bus/usb/devices/<设备目录>/speed # 显示实际传输速度(单位:Mbps) cat /sys/bus/usb/devices/<设备目录>/version # 显示USB协议版本 ``` - **示例**: ```bash cat /sys/bus/usb/devices/1-1/speed 480 # USB 2.0(480Mbps) ``` --- ### **方法3:`dmesg`内核日志** #### **步骤** 1. **插入USB设备**,执行: ```bash dmesg | grep -i usb ``` 2. **查找输出中的版本标识**: ```bash usb 1-1: new high-speed USB device number 2 # high-speed → USB 2.0 usb 2-1: new SuperSpeed USB device number 3 # SuperSpeed → USB 3.0+ ``` --- ### **关键概念对照表** | **USB版本** | **协议名称** | **最大速率** | **内核日志关键词** | |-------------|-----------------|--------------|--------------------------| | USB 1.1 | Full Speed | 12 Mbps | `full-speed` | | USB 2.0 | High Speed | 480 Mbps | `high-speed` | | USB 3.0 | SuperSpeed | 5 Gbps | `SuperSpeed` | | USB 3.1 | SuperSpeed+ | 10 Gbps | `SuperSpeed+` | | USB 3.2 | SuperSpeed 20Gbps| 20 Gbps | `SuperSpeed USB 3.2` | --- ### **注意事项** 1. **嵌入式系统限制**: - 若未安装`usbutils`,需交叉编译后移植到目标板。 - 精简版内核可能未启用`/sys`中部分属性文件。 2. **设备兼容性**: - 实际速度受**USB控制器版本**和**设备版本**共同限制(例如USB 3.0设备插入USB 2.0端口会降速)。 --- 根据你的系统环境选择合适方法,可先用`lsusb`快速判断版本,再通过`/sys`或`dmesg`验证细节。是否需要进一步解释具体操作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值