linux usbmon获取的U盘数据

 

urb标志                                                ep->id
时间戳                                                 ep->tstamp
事件类型(S-submission, C-Callback, E-submission error) ep->type
端点类型I(中断),C(控制),B(Bulk)和Z(ISOC)               utype
数据方向(i或者o)                                       udir
bus总线号                                               ep->busnum
该bus总线分配到的设备地址                              ep->devnum
端点号,对于in端点,为异或^0x80,即去掉第8位1值的数据,比如0x81,那么这里数据为0x81 ^ 0x80 = 1 ep->epnum

接下来的数据根据不同的端点类型将做不同的格式显示
I(中断) : ep->status和ep->interval 显示端点的状态和端点interval中断间隔值[luther.gliethttp]
C(控制) : 如果事件类型为S,那么显示s bmRequestType bRequest wValue wIndex wLength
          如果事件类型非S,即C,那么只显示ep->status
B(Bulk) : ep->status 只显示状态
Z(ISOC) : 如果事件类型为S,那么显示ep->status, ep->interval, ep->start_frame
          如果事件类型非S,那么显示ep->status, ep->interval, ep->start_frame, ep->error_count
          同时显示ep->numdesc,dp->status, dp->offset, dp->length等信息,是组合最多的一个输出

接下来的数据就是ep->length长度了[luther.gliethttp].

再接下来就是mon_text_read_data填充数据了[luther.gliethttp].
1.如果数据长度ep->length为0,那么直接填入一个'\n'换行.
2.如果确实有数据部分,那么先追入' =',然后在=等号后面追加实际数据内容.
3.如果没有数据部分,比如那么将ep->data_flag作为char类型打印出来[luther.gliethttp]
  ep->data_flag共有5种数值,由mon_text_get_data()函数返回
  3.1 L -- 表示期待数据长度为0
  3.2 < -- 表示有数据要上传,后面有需要接收的数据,后面会有IN动作,
           表示in类型,后面还有In读取操作需要读取数据,
           同时为S-submission或者E-submission error
  3.3 > -- 表示数据部分已经成功下发
           表示out类型,同时为C-Callback
  3.4 Z -- 表示transfer_buffer为NULL
  3.5 0 -- 表示成功获取data.

HUB的中断端点1发生中断,状态成功0,中断interval128ms  数据位02
c393e580 531182834 C Ii:1:001:1 0:128 1 = 02
c393e580 531182947 S Ii:1:001:1 -115:128 2 <
a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4
P427
c3ad3e00 531183571 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
PortStatus为 01010100
分为 0101  和 0100
c3ad3e00 531183633 C Ci:1:001:0 0 4 = 01010100
clear feature
c3ad3e00 531183663 S Co:1:001:0 s 23 01 0010 0001 0000 0
c3ad3e00 531183670 C Co:1:001:0 0 0
c3ad3e00 531183685 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531183691 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531210077 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531210121 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531240074 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531240122 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531270070 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531270113 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531300076 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531300122 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531300234 S Co:1:001:0 s 23 03 0004 0001 0000 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms  数据位02
c393e580 531311050 C Ii:1:001:1 0:128 1 = 02
c393e580 531311086 S Ii:1:001:1 -115:128 2 <
c3ad3e00 531315120 C Co:1:001:0 0 0
c3ad3e00 531370081 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531370130 C Ci:1:001:0 0 4 = 03011000
c3ad3e00 531425071 S Co:1:001:0 s 23 01 0014 0001 0000 0
c3ad3e00 531425116 C Co:1:001:0 0 0

c3ad3e00 531426891 S Ci:1:000:0 s 80 06 0100 0000 0040 64 <

c3ad3e00 531427405 C Ci:1:000:0 -62 0
c3ad3e00 531427744 S Ci:1:000:0 s 80 06 0100 0000 0040 64 <
c3ad3e00 531429392 C Ci:1:000:0 -62 0
c3ad3e00 531429667 S Ci:1:000:0 s 80 06 0100 0000 0040 64 <
c3ad3e00 531431393 C Ci:1:000:0 -62 0
c3ad3e00 531431702 S Co:1:001:0 s 23 03 0004 0001 0000 0
c3ad3e00 531445056 C Co:1:001:0 0 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms  数据位02
c393e580 531500034 C Ii:1:001:1 0:128 1 = 02
c393e580 531500082 S Ii:1:001:1 -115:128 2 <
a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4
c3ad3e00 531500381 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3e00 531500428 C Ci:1:001:0 0 4 = 03011300
c3ad3e00 531500454 S Co:1:001:0 s 23 01 0014 0001 0000 0
c3ad3e00 531500462 C Co:1:001:0 0 0
c3ad3e00 531500480 S Co:1:001:0 s 23 01 0001 0001 0000 0
c3ad3e00 531500487 C Co:1:001:0 0 0
c3ad3e00 531501087 S Co:1:001:0 s 23 01 0001 0001 0000 0
c3ad3e00 531501122 C Co:1:001:0 0 0
c3ad3e00 531501157 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531501165 C Ci:1:001:0 0 4 = 01010300
c3ad3e00 531501178 S Co:1:001:0 s 23 01 0010 0001 0000 0
c3ad3e00 531501185 C Co:1:001:0 0 0
c3ad3e00 531501195 S Co:1:001:0 s 23 01 0011 0001 0000 0
c3ad3e00 531501201 C Co:1:001:0 0 0
c3ad3e00 531501217 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531501223 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531530075 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531530139 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531560081 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531560128 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531590074 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531590121 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531620074 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0101 表示有个设备连接上,port是上电状态
0300 不知道什么意思
c3ad3e00 531620118 C Ci:1:001:0 0 4 = 01010000
c3ad3e00 531620229 S Co:1:001:0 s 23 03 0004 0001 0000 0
c3ad3e00 531635056 C Co:1:001:0 0 0
c3ad3e00 531690076 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0301 表示有个设备连接上,port是上电状态 低速设备连接到这个port
1000 不知道什么意思
c3ad3e00 531690123 C Ci:1:001:0 0 4 = 03011000
c3ad3e00 531745066 S Co:1:001:0 s 23 01 0014 0001 0000 0
c3ad3e00 531745116 C Co:1:001:0 0 0
//获取设备描述符
80=bmRequestType  06=Get_Desriptor 01(00)=Device  0000=windex 0040=wlength
c3ad3e00 531746898 S Ci:1:000:0 s 80 06 0100 0000 0040 64 <
c3ad3e00 531768392 C Ci:1:000:0 0 18 = 12010002 00000040 11008877 04010102 0301
c3ad3e00 531768748 S Co:1:001:0 s 23 03 0004 0001 0000 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms  数据位02
c393e580 531779080 C Ii:1:001:1 0:128 1 = 02
c393e580 531779127 S Ii:1:001:1 -115:128 2 <
c3ad3e00 531780124 C Co:1:001:0 0 0
a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4
c3ad3e00 531835078 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
0301 表示有个设备连接上,port是上电状态 低速设备连接到这个port
1000 不知道什么意思
c3ad3e00 531835126 C Ci:1:001:0 0 4 = 03011000
Clear Feature
This request resets a value reported in the port status.
c3ad3e00 531890074 S Co:1:001:0 s 23 01 0014 0001 0000 0
c3ad3e00 531890118 C Co:1:001:0 0 0
//设置地址
00=bmRequestType  05=Set_Address  0003 =Wvalue
c3ad3e00 531890150 S Co:1:000:0 s 00 05 0003 0000 0000 0
c3ad3e00 531911404 C Co:1:000:0 0 0
//获取设备描述符
80=bmRequestType  06=Get_Desriptor 01(00)=Device  0000=windex 0012=wlength
c3ad3e00 531930073 S Ci:1:003:0 s 80 06 0100 0000 0012 18 <
//设备描述符 12 01 0002 00 00 00 40 11008877 04010102 0301
struct usb_device_descriptor {
 __u8  bLength;            0x12 描述符长度
 __u8  bDescriptorType;    0x01 描述符类型

 __le16 bcdUSB;            0x0002 USB版本号
 __u8  bDeviceClass;       0x00   USB分配的设备类
 __u8  bDeviceSubClass;    0x00   USB分配的子类
 __u8  bDeviceProtocol;    0x00   USB分配的协议
 __u8  bMaxPacketSize0;    0x40   端点0最大包大小
 __le16 idVendor;          0x1100 厂商编号
 __le16 idProduct;         0x8877 产品编号
 __le16 bcdDevice;         0x0401 设备出厂编号
 __u8  iManufacturer;      0x01   描述厂商字符串的索引
 __u8  iProduct;           0x02   描述产品字符串的索引
 __u8  iSerialNumber;      0x03   描述设备系列号字符串的索引
 __u8  bNumConfigurations; 0x01   可能的配置数量
} __attribute__ ((packed));
c3ad3e00 531931415 C Ci:1:003:0 0 18 = 12010002 00000040 11008877 04010102 0301
//获取配置描述符
80=bmRequestType  06=Get_Desriptor 02(00)=configuration  0000=windex 0009=wlength
c3ad3e00 531931773 S Ci:1:003:0 s 80 06 0200 0000 0009 9 <
//配置描述符 09022000 01010080 32
struct usb_config_descriptor {
 __u8  bLength;            0x09  描述符长度
 __u8  bDescriptorType;    0x02  描述符类型编号

 __le16 wTotalLength;      0x2000配置所返回的所有数据的大小
 __u8  bNumInterfaces;     0x01  配置所支持的接口数
 __u8  bConfigurationValue;0x01  set_configuration 命令需要的参数值
 __u8  iConfiguration;     0x00  描述该配置的字符串的索引值
 __u8  bmAttributes;       0x80  供电模式的选择
 __u8  bMaxPower;          0x32  设备从总线提取的最大电流
} __attribute__ ((packed));
c3ad3e00 531933399 C Ci:1:003:0 0 9 = 09022000 01010080 32
//获取配置描述符+接口描述符+2个端点描述符
c3ad3e00 531933694 S Ci:1:003:0 s 80 06 0200 0000 0020 32 <
获取配置描述符  09022000 01010080 32
接口描述符      090400 00020806 5000
端点描述符1     0705 01024000 00
端点描述符2     070582 02400000
struct usb_interface_descriptor {
 __u8  bLength;            0x09 描述符长度
 __u8  bDescriptorType;    0x04 描述符类型
 
 __u8  bInterfaceNumber;   0x00 接口编号
 __u8  bAlternateSetting;  0x00 备用的接口描述符编号
 __u8  bNumEndpoints;      0x02 该接口使用的断点数
 __u8  bInterfaceClass;    0x08 接口类型
 __u8  bInterfaceSubClass; 0x06 接口子类型
 __u8  bInterfaceProtocol; 0x50 接口协议
 __u8  iInterface;         0x00 描述该接口的字符串索引值
} __attribute__ ((packed));
端点1   07 05 01 02 4000 00
struct usb_endpoint_descriptor {
 __u8  bLength;            0x07  描述符长度
 __u8  bDescriptorType;    0x05  描述符类型
 
 __u8  bEndpointAddress;   0x01  端点地址:0~3 为时端点号1,第七位是方向0输出
 __u8  bmAttributes;       0x02  端点属性 bit[0:1]的值00控制,01同步,02批量 ,03中断
 __le16 wMaxPacketSize;    0x4000本端点接受或发送最大信息包的大小
  __u8  bInterval;          0x00  
 
 
 
 __u8  bRefresh;          
 __u8  bSynchAddress;     
} __attribute__ ((packed));
端点2   07 05 82 02 4000 00
struct usb_endpoint_descriptor {
 __u8  bLength;            0x07  描述符长度
 __u8  bDescriptorType;    0x05  描述符类型
 
 __u8  bEndpointAddress;   0x82  端点地址:0~3 为时端点号2,第七位是方向1输入
 __u8  bmAttributes;       0x02  端点属性 bit[0:1]的值00控制,01同步,02批量 ,03中断
 __le16 wMaxPacketSize;    0x4000本端点接受或发送最大信息包的大小
  __u8  bInterval;          0x00  
 
 
 
 __u8  bRefresh;          
 __u8  bSynchAddress;     
} __attribute__ ((packed));
c3ad3e00 531935401 C Ci:1:003:0 0 32 = 09022000 01010080 32090400 00020806 50000705 01024000 00070582 02400000
//获取字符串描述符
c3ad3e00 531935816 S Ci:1:003:0 s 80 06 0300 0000 00ff 255 <
接口字符串索引
04030904 不知道什么意思
c3ad3e00 531937399 C Ci:1:003:0 0 4 = 04030904
c3ad3e00 531937687 S Ci:1:003:0 s 80 06 0302 0409 00ff 255 <
产品字符串
c3ad3e00 531939398 C Ci:1:003:0 0 26 = 1a034400 61007400 61005400 72006100 76006500 6c006500 7200
c3ad3e00 531939727 S Ci:1:003:0 s 80 06 0301 0409 00ff 255 <
厂商字符串 6b k 69 i 6e n 67 g 73 s 74 t 6f o 6e n
合起来就是kingston
c3ad3e00 531941400 C Ci:1:003:0 0 18 = 12036b00 69006e00 67007300 74006f00 6e00
c3ad3e00 531941756 S Ci:1:003:0 s 80 06 0303 0409 00ff 255 <
设备序列号
c3ad3e00 531943399 C Ci:1:003:0 0 18 = 12034300 33004400 46003800 46003900 4600

配置  配置值为0001
c3ad3f80 531964443 S Co:1:003:0 s 00 09 0001 0000 0000 0
配置成功
c3ad3f80 531965419 C Co:1:003:0 0 0
c3ad3d00 531991052 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
c3ad3d00 531991124 C Ci:1:001:0 0 4 = 03010000
这个是什么请求,协议没见过 fe
c3ad3a80 536990080 S Ci:1:003:0 s a1 fe 0000 0000 0001 1 <
c3ad3a80 536990487 C Ci:1:003:0 0 1 = 00


批量传输:
c3ad3a80 536991275 S Bo:1:003:1 -115 31 = 55534243 01000000 24000000 80000612 00000024 00000000 00000000 000000
c3ad3a80 536992469 C Bo:1:003:1 0 31 >
c3ae1b80 536992797 S Bi:1:003:2 -115 36 <
c3ae1b80 536994448 C Bi:1:003:2 0 36 = 00800202 1f000000 6b696e67 73746f6e 44617461 54726176 656c6572 20202020
c3ad3a80 536994753 S Bi:1:003:2 -115 13 <
c3ad3a80 536996450 C Bi:1:003:2 0 13 = 55534253 01000000 00000000 00
c3ad3a80 537030546 S Bo:1:003:1 -115 31 = 55534243 02000000 00000000 00000600 00000000 00000000 00000000 000000
c3ad3a80 537031474 C Bo:1:003:1 0 31 >
c3ad3a80 537031897 S Bi:1:003:2 -115 13 <
c3ad3a80 537033478 C Bi:1:003:2 0 13 = 55534253 02000000 00000000 01
c3ad3a80 537034035 S Bo:1:003:1 -115 31 = 55534243 03000000 12000000 80000603 00000012 00000000 00000000 000000
c3ad3a80 537035479 C Bo:1:003:1 0 31 >
c3ad3800 537036156 S Bi:1:003:2 -115 18 <
c3ad3800 537037474 C Bi:1:003:2 0 18 = f0000600 0000000a 00000000 28000000 0000
c3ad3a80 537038644 S Bi:1:003:2 -115 13 <
c3ad3a80 537039475 C Bi:1:003:2 0 13 = 55534253 03000000 00000000 00
c3ad3a80 537044903 S Bo:1:003:1 -115 31 = 55534243 04000000 00000000 00000600 00000000 00000000 00000000 000000
c3ad3a80 537045467 C Bo:1:003:1 0 31 >
c3ad3a80 537045676 S Bi:1:003:2 -115 13 <
c3ad3a80 537047472 C Bi:1:003:2 0 13 = 55534253 04000000 00000000 00
c3ad3a80 537048142 S Bo:1:003:1 -115 31 = 55534243 05000000 08000000 80000a25 00000000 00000000 00000000 000000
c3ad3a80 537049472 C Bo:1:003:1 0 31 >
c3ad3800 537049678 S Bi:1:003:2 -115 8 <
c3ad3800 537051485 C Bi:1:003:2 0 8 = 00f54fff 00000200
c3ad3a80 537051643 S Bi:1:003:2 -115 13 <
c3ad3a80 537053479 C Bi:1:003:2 0 13 = 55534253 05000000 00000000 00
c3ad3a80 537056379 S Bo:1:003:1 -115 31 = 55534243 06000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
c3ad3a80 537057480 C Bo:1:003:1 0 31 >
c3ad3500 537057660 S Bi:1:003:2 -115 192 <
c3ad3500 537059471 C Bi:1:003:2 -121 4 = 03000000
c3ad3a80 537059621 S Bi:1:003:2 -115 13 <
c3ad3a80 537061479 C Bi:1:003:2 0 13 = 55534253 06000000 00000000 00
c3ad3a80 537081400 S Bo:1:003:1 -115 31 = 55534243 07000000 00000000 00000600 00000000 00000000 00000000 000000
c3ad3a80 537082483 C Bo:1:003:1 0 31 >
c3ad3a80 537082957 S Bi:1:003:2 -115 13 <
c3ad3a80 537084482 C Bi:1:003:2 0 13 = 55534253 07000000 00000000 00
c3ad3a80 537111171 S Bo:1:003:1 -115 31 = 55534243 08000000 00000000 0000061e 00000001 00000000 00000000 000000
c3ad3a80 537111479 C Bo:1:003:1 0 31 >
c3ad3a80 537111838 S Bi:1:003:2 -115 13 <
c3ad3a80 537113478 C Bi:1:003:2 0 13 = 55534253 08000000 00000000 01
c3ad3a80 537115311 S Bo:1:003:1 -115 31 = 55534243 09000000 12000000 80000603 00000012 00000000 00000000 000000
c3ad3a80 537116483 C Bo:1:003:1 0 31 >
c3ad3f00 537116964 S Bi:1:003:2 -115 18 <
c3ad3f00 537118480 C Bi:1:003:2 0 18 = f0000500 0000000a 00000000 24000000 0000
c3ad3a80 537118980 S Bi:1:003:2 -115 13 <
c3ad3a80 537120483 C Bi:1:003:2 0 13 = 55534253 09000000 00000000 00
c3ad3a80 537121371 S Bo:1:003:1 -115 31 = 55534243 0a000000 00000000 00000600 00000000 00000000 00000000 000000
c3ad3a80 537122481 C Bo:1:003:1 0 31 >
c3ad3a80 537122971 S Bi:1:003:2 -115 13 <
c3ad3a80 537124477 C Bi:1:003:2 0 13 = 55534253 0a000000 00000000 00
c3ad3a80 537125691 S Bo:1:003:1 -115 31 = 55534243 0b000000 08000000 80000a25 00000000 00000000 00000000 000000
c3ad3a80 537126477 C Bo:1:003:1 0 31 >
c3ad3080 537126693 S Bi:1:003:2 -115 8 <
c3ad3080 537128478 C Bi:1:003:2 0 8 = 00f54fff 00000200
c3ad3a80 537128641 S Bi:1:003:2 -115 13 <
c3ad3a80 537130483 C Bi:1:003:2 0 13 = 55534253 0b000000 00000000 00
c3ad3a80 537131173 S Bo:1:003:1 -115 31 = 55534243 0c000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
c3ad3a80 537132477 C Bo:1:003:1 0 31 >
c3ad3800 537132654 S Bi:1:003:2 -115 192 <
c3ad3800 537134464 C Bi:1:003:2 -121 4 = 03000000
c3ad3a80 537134589 S Bi:1:003:2 -115 13 <
c3ad3a80 537136478 C Bi:1:003:2 0 13 = 55534253 0c000000 00000000 00
c3ad3a80 537139470 S Bo:1:003:1 -115 31 = 55534243 0d000000 00100000 80000a28 00000000 00000008 00000000 000000
c3ad3a80 537140474 C Bo:1:003:1 0 31 >
c3ad3780 537140680 S Bi:1:003:2 -115 4096 <
c3ad3780 537383472 C Bi:1:003:2 0 4096 = eb58904d 53444f53 352e3000 02082400 02000000 00f80000 3f00ff00 00000000
c3ad3a80 537383960 S Bi:1:003:2 -115 13 <
c3ad3a80 537385457 C Bi:1:003:2 0 13 = 55534253 0d000000 00000000 00
c3ad3a80 537396042 S Bo:1:003:1 -115 31 = 55534243 0e000000 00000000 00000600 00000000 00000000 00000000 000000
c3ad3a80 537396484 C Bo:1:003:1 0 31 >
c3ad3a80 537396772 S Bi:1:003:2 -115 13 <
c3ad3a80 537398487 C Bi:1:003:2 0 13 = 55534253 0e000000 00000000 00
c3ad3a80 537399398 S Bo:1:003:1 -115 31 = 55534243 0f000000 08000000 80000a25 00000000 00000000 00000000 000000
c3ad3a80 537400482 C Bo:1:003:1 0 31 >
c3a37d80 537400933 S Bi:1:003:2 -115 8 <
c3a37d80 537402489 C Bi:1:003:2 0 8 = 00f54fff 00000200
c3ad3a80 537402979 S Bi:1:003:2 -115 13 <
c3ad3a80 537404487 C Bi:1:003:2 0 13 = 55534253 0f000000 00000000 00
c3ad3a80 537405675 S Bo:1:003:1 -115 31 = 55534243 10000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
c3ad3a80 537406480 C Bo:1:003:1 0 31 >
c3a37d80 537406934 S Bi:1:003:2 -115 192 <
c3a37d80 537408484 C Bi:1:003:2 -121 4 = 03000000
c3ad3a80 537408940 S Bi:1:003:2 -115 13 <
c3ad3a80 537410484 C Bi:1:003:2 0 13 = 55534253 10000000 00000000 00

<think>好的,用户现在问的是如何在嵌入式Linux下查看当前USB的带宽占用。首先,我需要回忆一下Linux系统中监控USB带宽的常用方法。通常,在桌面Linux系统中,可以通过`usbview`或者`lsusb`加上一些参数来查看设备信息,但嵌入式系统可能没有这些工具,或者需要自己编译。 用户提到的是嵌入式Linux,可能资源有限,所以需要考虑轻量级的方法。我记得内核文档中提到过,通过sysfs可以获取USB设备的信息。比如,在`/sys/bus/usb/devices/`目录下,每个USB设备都有对应的目录,里面可能有关于带宽的信息。 另外,`/proc/bus/usb/devices`文件也包含USB设备的详细信息,包括带宽使用情况。这个文件可能更直接,但需要解析内容。不过,嵌入式系统是否默认生成这个文件呢?可能需要确认内核配置是否启用了相关选项。 还有一种方法是使用`usbmon`工具,它可以通过内核模块来监控USB流量。不过,这可能需要加载模块,并且对用户来说可能有点复杂。不过对于嵌入式系统,如果支持的话,这可能是最准确的方法。 另外,用户可能需要的是实时监控,而不仅仅是静态信息。这时候,可能需要结合工具如`cat`命令持续读取某个文件,或者使用`dmesg`查看内核日志中的USB事件。不过带宽占用可能需要更动态的数据,比如传输速率。 还有,可能需要考虑USB的版本,比如USB 2.0和3.0的带宽不同,所以需要确认设备支持的标准,才能正确计算占用率。比如,USB 2.0的最大带宽是480Mbps,而USB 3.0是5Gbps。用户之前的问题中提到过设备可能只支持USB 2.0,所以在计算时需要基于这个速率。 接下来,我需要整理出具体的步骤,可能包括检查sysfs中的信息,解析/proc/bus/usb/devices的内容,或者使用usbmon工具。还要考虑嵌入式环境中这些方法是否可行,是否有权限问题,或者是否需要额外的工具安装。 可能用户没有图形界面,所以需要命令行方法。比如,使用`lsusb -v`可以显示详细描述符,包括最大带宽,但实际占用可能需要动态监控。不过lsusb可能在嵌入式系统中不可用,或者需要busybox的配置。 另外,可能需要使用`cat /sys/bus/usb/devices/usbX/带宽相关文件`,但不确定具体文件路径和内容。可能需要查找内核文档或相关驱动信息。 总结下来,可能的步骤包括: 1. 使用`lsusb`确认连接的USB设备及其总线位置。 2. 通过sysfs中的文件查看带宽信息,比如`/sys/bus/usb/devices/usbX/power/active_duration`等。 3. 解析`/proc/bus/usb/devices`中的信息,查找每个设备的带宽分配。 4. 使用usbmon工具进行实时监控,需要加载模块并设置捕获。 5. 计算实际带宽占用率,基于设备的最大速度和当前传输速率。 需要验证这些方法在嵌入式环境中的可行性,并给出具体的命令示例。同时,提醒用户可能需要内核支持或安装额外工具,比如usbutils包中的lsusb。 另外,用户可能需要了解如何安装这些工具,或者如何配置内核以启用必要的调试信息。如果嵌入式系统是定制化的,可能需要交叉编译相关工具并部署到设备上。 最后,需要确保回答清晰,分步骤说明,并提供可能的替代方案,以防某些方法在特定环境下不可用。</think>### **关键结论** 在嵌入式Linux中查看USB带宽占用,主要通过**内核暴露的调试接口**或**专用工具**实现。常用方法包括解析`/proc/bus/usb/devices`、使用`usbmon`工具监控实时流量,或通过sysfs查看设备状态。 --- ### **详细操作指南** #### **1. 查看USB设备基础信息** 通过`lsusb`命令确认设备连接状态和总线位置(若系统支持): ```bash lsusb -tv ``` - **输出示例**: ```plaintext /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 3: Dev 3, If 0, Class=Mass Storage, Driver=usb-storage, 480M ``` - **关键信息**: - `480M`表示USB 2.0总线(最大带宽480Mbps)。 - `Driver=usb-storage`表示设备类型(此处为U盘)。 --- #### **2. 解析`/proc/bus/usb/devices`文件** 此文件记录了USB设备详细参数,包括带宽分配: ```bash cat /proc/bus/usb/devices ``` - **查找关键字段**: ```plaintext T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 4 B: Alloc= 0/800 us (0%), #Int= 0, #Iso= 0 ``` - `Spd=480`:设备速率(480Mbps,即USB 2.0)。 - `Alloc=0/800 us`:带宽占用比例(0%)。 --- #### **3. 使用`usbmon`监控实时流量** 需要加载`usbmon`内核模块并指定监控总线: ```bash modprobe usbmon # 加载模块 ls /sys/kernel/debug/usb/usbmon # 确认监控接口(如1u) cat /sys/kernel/debug/usb/usbmon/1u # 实时捕获总线1的流量 ``` - **输出示例**: ```plaintext ffff8800a4b3c000 8787787 S Ci:1:002:1 0 8 8 ffff8800a4b3c000 8787787 C Ci:1:002:1 0 8 8 ``` - **字段解析**: - `Ci:1:002:1`:总线1、设备2、端点1。 - `8`:传输数据长度(字节)。 - **计算带宽**:统计单位时间内传输的总字节数,换算为Mbps。 --- #### **4. 通过sysfs查看设备状态** 部分设备在sysfs中暴露带宽信息: ```bash # 查看USB控制器最大带宽(示例路径) cat /sys/bus/usb/devices/usb1/speed # 输出"480"(单位:Mbps) # 查看设备当前传输速率(需驱动支持) cat /sys/bus/usb/devices/usb1/1-1/1-1.3/current_bandwidth ``` --- #### **5. 手动计算带宽占用率** - **公式**: $$ \text{占用率} = \frac{\text{实际传输速率}}{\text{总线最大带宽}} \times 100\% $$ - **示例**(USB 2.0 U盘持续写入30MB/s): ```plaintext 实际速率 = 30MB/s × 8 = 240Mbps 占用率 = 240Mbps / 480Mbps × 100% = 50% ``` --- ### **常见问题与限制** | 方法 | 优点 | 缺点 | |---------------------|-------------------------|-----------------------------------| | `/proc/bus/usb/devices` | 无需额外工具 | 信息静态,需手动解析 | | `usbmon` | 支持实时监控 | 需内核支持,数据需二次处理 | | sysfs接口 | 直接读取数值 | 依赖驱动实现,部分设备无此信息 | --- ### **总结表** | 场景 | 推荐方法 | |----------------------|-------------------------| | 快速查看静态带宽分配 | `/proc/bus/usb/devices` | | 实时流量监控 | `usbmon`工具 | | 设备驱动支持良好 | sysfs路径查询 | **注意事项**: - 嵌入式系统可能需**重新编译内核**以启用`usbmon`或调试接口。 - USB 3.0及以上设备的带宽计算需区分**发送(TX)**和**接收(RX)**通道。 - 若工具缺失,可通过交叉编译`usbutils`或`usbmon`后移植到嵌入式设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值