当前位置:网站首页 > 技术博客 > 正文

linux usb设备



Usb总线上传输的数据是以包为基本单位的,但是不能随意的使用包来传输数据,必须按照一定的关系把这些不同的包组织或事务(transaction)传输。

总体上可以分为四类:令牌包、数据包、握手包、特殊包

(1)令牌包

令牌包类型作用OUT输出令牌包用来通知设备将要输出一个数据包IN输入令牌包用来通知设备返回一个数据包SETUP建立令牌包和输出令牌包功能相同,但它只用在控制传输中,且两者有所差异SOF通知设备这是一个帧起始包

(2)数据包

数据包就是用来传输数据的,可以从主机到设备,也可以从设备到主机,方向由令牌包来指定。

(3)握手包

握手包的发送者一般是数据接收者,用来表示一个传输是否被对方确认。在传输正常情况下,主机/设备会发送一个表示传输正常的ACK握手包。

(4)特殊包

特殊包用在特殊的场合。
在这里插入图片描述

由于不能随意的使用USB包来传输数据,必须按照一定的关系把这些不同的包组织成事务才能传输数据。
事务通常由三个包组成:令牌包、数据包和握手包。
在这里插入图片描述
Usbmon只能抓取事务中的数据包,不会抓取令牌包和握手包。
Usb协议规定了 4 种传输类型:批量传输、等时传输、中断传输和控制传输。其中,批量传输、等时传输、中断传输每传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程可能包含多个事务。

批量传输

在这里插入图片描述

等时传输

在这里插入图片描述

中断传输

在这里插入图片描述

控制传输

在这里插入图片描述

Usbmon即usb monitor,是linux内置的usb抓包工具,usbmon本质上是一个内核模块。

(1)首先检测内核是否支持debugfs文件系统

在这里插入图片描述
上图为支持,如果不知道,就没有输出。

(2)挂载debugfs文件系统

在ubuntu上默认已经挂载了debugfs文件系统,如果没有挂载debugfs,可以使用以下命令手动挂载:

 

(3)按照usbmon内核模块

执行modprobe usbmon后,可以在/sys/kernel/debug/usb/目录下找到usbmon,如下:
在这里插入图片描述
在usbmon目录下,有0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u的文件,其中1代表bus1,2代表bus2,以此类推,0代表所有usb总线。

(4)监控usb总线上的数据

首先需要获取想要监测的设备所在的总线以及设备号。linux 中查看USB设备列表以及USB设备详细信息的两种方法。
第一是lsusb命令,
在这里插入图片描述
第二是 cat /sys/kernel/debug/usb/devices
在这里插入图片描述
然后可以使用:

 

在这里插入图片描述
其中:
第一列为URB Tag(URB标签),该字段表示驱动中定义的struct urb 结构体变量在内核空间的地址,可以使用该字段区分不同的 URB 数据包。
第二列为时间戳,单位为微秒,该字段定义在内核代码driver/usb/mon/mon_text.c中:

在这里插入图片描述第三列为Event Type(事件类型),其中,S - submission,向 usb controller 提交 URB;C - callback,URB 提交完成后的回调;E - submission error,向 usb controller 提交 URB 发生错误。
第四列为Address word(地址字段),这个字段由四部分组成,分别为:URB类型及方向、usb总线号、usb设备地址、端点号。

 

第五列为URB的状态,有两种表示形式:
(1)s + 一串数字
(2)一串以分号间隔的数字(或单个数字)构成的,这串数字包含下面几个部分:URB status、interval、start frame 和 error count。特别注意一点,该字段不同于 “Address word” 字段,对于不同的传输方式这几部分是可选的,并非所有部分都是必须的,下图是不同的传输方式包含的信息。

在这里插入图片描述
在这里插入图片描述
不同传输方式所包含的信息:

 

对于控制传输,s表示建立阶段,后面跟的为建立阶段主机发送给设备的数据包。
在这里插入图片描述

再后一列,表示数据包的长度:
在这里插入图片描述

对于 S(Submission),Data Length 字段是主机请求发送/读取的数据长度,但是设备并不一定能够接收/发送主机请求的数据长度。实际接收/发送的数据长度在 C(Callback)中的 Data Length 字段。
在这里插入图片描述
再后一列,数据标签,”=” 后面紧跟数据流;“>” 表示这是一次 Output 数据传输;“<” 表示这是一次 Input 数据传输。
“=”后跟着的一列为数据流:这个字段就是一个事务(transaction)中的数据包,我们平时分析 usbmon 的 log 定位问题,也主要是看这个字段。注意一点,这个字段实际显示的数据 <= Data Length 的值。

版权声明


相关文章:

  • 测试cpu性能的工具2024-11-06 22:01:03
  • 非连通图的深度优先遍历算法2024-11-06 22:01:03
  • tftp协议禁用2024-11-06 22:01:03
  • spring-security-oauth22024-11-06 22:01:03
  • xdisplay(‎App Store 上的“Splashtop Wired XDisplay HD– 显示器扩展与镜像”)2024-11-06 22:01:03
  • 计算机发展历程简介2024-11-06 22:01:03
  • 代码设计思路 示例2024-11-06 22:01:03
  • mq消息中间件有哪些2024-11-06 22:01:03
  • sql游标的使用方法代码2024-11-06 22:01:03
  • crc16校验算法ccitt2024-11-06 22:01:03