[USB] USB的包结构及包分类

目录

1. 包结构

2. 包分类

2.1 令牌包

2.2 数据包

2.3 握手包

2.4 特殊包


  • USB的传输总是低位在前,高位在后。
  • USB的传输方向:从设备到主机的数据为输入;从主机到设备的数据叫做输出。

1. 包结构

以同步域开始,紧跟着一个包标识符PID(Packet Identifier),最终以包结束符EOP(End of Packet)结束这个包。

  • 同步域
    • 作用:① 通知USB串行接口引擎数据要开始传输;② 同步主机和设备之间的时钟。
    • 格式:① 全速/低速设备的同步域为00000001;② 高速设备的同步域为31个0,后面跟1个1;注意:这是对发送端的要求,接收端在解码时,0的个数可以少于这个数。
  • 包标识符PID
    • 包标识符PID是用来标识一个包的类型。
    • PID共有8位,目前USB协议仅使用4位(PID0~PID3),另外4位(PID4~PID7)是PID0~PID3的取反,用来校验PID。
    • 传输的顺序为PID0,PID1,PID2,PID3,...,PID7。
  • 包结束符EOP
    • 全速/高速模式的EOP是一个约为2个数据宽度的SE0;
    • 高速模式的EOP是通过故意的位填充错误实现的。
    • 单端0(SE0):D+和D-同时保持低电平。
    • 单端0的用处:① 包结束;② 复位信号(USB集线器对USB设备的复位操作,就是将总线设置为SE0约10ms)。
    • Q: 如何一个位填充错误是EOP还是传输错误?A: 通过CRC校验,即如果CRC正确,则说明这个位填充是EOP;否则说明传输错误。

 

2. 包分类

根据包标识符PID的不同,包可以分为四种包:令牌包(token packet, PID1~0为01)、数据包(data packet, PID1~0为11)、握手包(handshake packet, PID1~0为10)、特殊包(special packet, PID1~0为00)。

 

2.1 令牌包

令牌包用来启动一次USB传输。由于USB是主从结构的拓扑结构,所以所有的数据传输都是主机发起的(唯一的例外是支持远程唤醒的设备能够主动改变总线的状态,让集线器感知到设备的唤醒信号,但是这一过程并不发送数据,只是改变总线的状态)。

令牌包分4种:输出(OUT)、输入(IN)、建立(SETUP)、帧起始(SOF)。

  • 输出令牌包:主机将要向设备发送一个数据包。
  • 输入令牌包:主机将要从设备读取一个数据包。
  • 建立令牌包:与输出令牌包几乎相同,不同之处是建立令牌包只使用DATA0,并且发送到设备的控制端点,设备必须接收建立令牌包。
  • 帧起始令牌包:在每帧(或微帧)开始时发送,并且以广播的形式发送,使得总线上的所有USB全速/高速设备都可以接收到SOF令牌包。
同步域8位标识符PID7位地址4位端点号5位CRC5校验EOP

 OUT、IN、SETUP令牌包结构图

同步域8位标识符PID11位帧号5位CRC5校验EOP

 SOF令牌包结构图

2.2 数据包

同步域8位标识符PID字节0字节1字节n16位CRC16校验EOP

数据包的结构图

  • 数据包类型不匹配主要发生在握手包。

2.3 握手包

同步域8位标识符PIDEOP

握手包结构图

  • ACK:正确接收数据,并且有足够的空间容纳数据。主机和设备都可以使用ACK来确认,而NAK、STALL、NYET只有设备才能够返回,主机不能使用这些握手包。
  • NAK:① 没有数据需要返回;② 数据接收正确,但是没有足够的空间容纳数据。
  • STALL:设备无法执行这个请求或者设备已挂起。设备返回STALL,需要主机干预才能解除这种STALL状态。
  • NYET:只在USB2.0高速设备输出设备中使用,表示设备本次数据成功接收,但是没有足够的空间来接收下一次的数据。主机在下一次输出数据前,将使用PING令牌包来探测设备是否有足够的空间接收数据,以免浪费不必要的带宽和时间。

2.4 特殊包

 暂不介绍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: USB ConfigFS是一种用于配置USB设备的内核功能模块。它是Linux内核中的一个USB配置文件系统,用于在运行时动态配置和管理USB设备。通过ConfigFS,用户可以通过系统提供的接口来创建和管理各种USB设备,USB设备描述符、接口、端点等。 使用USB ConfigFS,用户可以通过创建一个configFS实例来定义和配置USB设备。用户可以通过ConfigFS中的文件系统接口创建和修改设备描述符,指定设备的功能和属性。此外,也可以创建和配置USB接口和端点,定义USB设备的数据传输规则和特性。 ConfigFS的优点之一是可以在运行时动态配置USB设备。这意味着在设备运行状态下可以添加、修改和删除设备的接口和端点,而无需重新启动设备或重新加载驱动程序。这为开发人员提供了更大的灵活性和便利性。 另外,ConfigFS还提供了丰富的调试和监控功能,使用户可以通过读取和写入ConfigFS文件来检查和调整设备的配置信息。这对于故障排除和性能优化非常有帮助。 综上所述,USB ConfigFS为用户提供了一种方便的方式来配置和管理USB设备。它不仅提供了灵活性和便利性,还提供了调试和监控功能。通过ConfigFS,用户可以根据自己的需求定义和配置USB设备,以满足各种应用场景的要求。 ### 回答2: USB ConfigFS 是一个针对 Linux 内核的配置文件系统,用于动态创建和管理 USB 设备。它提供了一种可编程的方法,允许用户在运行时构建和配置 USB 设备的功能。 通过 USB ConfigFS,用户可以使用 USB FunctionFS 接口创建 USB 设备。用户通过将函数驱动程序挂载到 ConfigFS 文件系统中的相应目录来定义设备功能。用户可以创建多个配置文件来定义不同的设备配置,每个配置文件可以含多个接口,每个接口又可以含多个接口配制。 使用 USB ConfigFS,用户可以在运行时创建和配置 USB 设备,而不需要重新编译内核或重新启动系统。这种灵活性使得 USB ConfigFS 对于测试和调试 USB 设备非常有用,同时也方便了用户对于 USB 设备进行定制化配置。 USB ConfigFS 还允许用户通过 configfs 文件系统的用户空间接口来动态控制 USB 设备的属性,例如配置设备字符串描述符、设置设备的供应商和产品 ID 等。这种灵活性使得用户可以在运行时根据需要调整设备的属性,方便了设备的定制和适应性。 总而言之,USB ConfigFS 是一个用于动态创建和管理 USB 设备的配置文件系统,在 Linux 内核中起到了重要的作用。它提供了一种可编程的方法,允许用户在运行时构建和配置 USB 设备,为测试、调试和定制化 USB 设备提供了便利。 ### 回答3: USB ConfigFS 是一个用于配置 USB 协议栈的 Linux 内核配置文件系统。ConfigFS 可以在运行时动态地创建和配置 USB 设备和功能。 使用 ConfigFS,用户可以通过在/sys/kernel/config/usb_gadget/目录中创建文件和目录来创建自定义的 USB 设备。 用户可以以树状结构来组织文件和目录,其中顶层目录表示 USB 设备,子目录则表示设备的不同功能。 在每个 USB 设备目录中,可以创建配置文件、字符串描述符和功能文件。 配置文件是指定义了设备的不同配置选项,如 USB 类型、供电模式、最大功率等。 字符串描述符文件含了设备的各种描述信息,如制造商、产品名称、序列号等。 而功能文件则指定了设备所支持的功能,如 Mass Storage、HID、Audio 等。 通过编辑这些文件和目录的属性值,可以自定义 USB 设备的各种特性和行为。 一旦设备被配置好,它就可以在 PC 端被识别为一个 USB 设备,并与 PC 进行数据交互。 ConfigFS 提供了一个灵活和可扩展的方式来创建和配置 USB 设备。 相比传统的 USB 设备管理方式,使用 ConfigFS 不需要修改或重新编译内核,并且可以在运行时动态地添加、修改和删除配置。 同时,ConfigFS 也支持 USB 设备的热插拔,可以在系统运行过程中添加或移除 USB 设备,而不需要重启系统。 总之,USB ConfigFS 提供了一个方便的工具,可以用于自定义和配置 USB 设备,并灵活地管理 USB 设备的各种功能和特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值