一,前言
10多年前买过一本圈圈教你usb,然后自己移植了代码到自己焊接的单片机最小系统,当时连原理图都是我自己画的,现在原理图软件已经不知道怎么用了,所以usb协议基本也忘记了。居然配置了usb host那么简单,这样感觉都没有学习过什么,我还是希望要雁过留痕。所以下载了wireshark usb抓包玩了下,百度也看了别人的usb D+和D-的抓包。但是还是需要以了解协议为主。
二,学习笔记
现在都是typec或usb3.0,但是我依然选择学习usb2.0协议,因为我今天的目的只是要大概了解而已,所以学习最简单的,最重要的内容即可,这也就是当初我学习Linux0.11源码的目的是一样的。
1.usb采用轮询广播传输机制,具体组成的包括令牌包,数据包,握手包及特殊包。主要通过PID字段
2.管道是数据传输模型,有2种,包括无格式的流管道和带格式的信息管道。任何usb设备一旦上电就存在默认的一条信息管道,usb host通过该管道来进行枚举,获取设备的描述,配置,状态,并对设备进行配置。枚举就是一系列的请求。
3.传输类型分4种,包括控制(仅控制传输是有格式的),中断,批量和同步。 数据在 USB 总线上的传输以包为单位,包只能在帧内传输。高速 USB 总线的帧周期为125uS,全速以及低速 USB 总线的帧周期为 1mS。帧的起始由一个特定的包( SOF 包)表示,帧尾为 EOF。 EOF 不是一个包,而是一种电平状态, EOF 期间不允许有数据传输不同的传输类型主机安排传输任务、可占用 USB 带宽的限制以及最大包长度有一定的差异。
3.1 控制传输分3个阶段(Setup阶段定义了此次传输的请求类型,数据阶段,状态阶段) 控制传输对于最大包长度有固定的要求。对于高速设备该值为64字节,低速设备该值为8字节,全速设备可以是8或16或32或64。 控制传输中如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。
3.2 中断传输 中断传输是单项传输,若有数据传输或可以接收数据则返回数据或发送数据,否则返回 NAK,表示尚未准备好。 中断端点的轮询间隔由在端点描述符中定义。所谓单向传输,并不是说该传输只支持一个方向的传输,而是指在某个端点上该传输,仅支持一个方向,或输出,或输入,这是对应端点来说的方向,不是说的host对象,因为一个host的管道传输可以有多个端点组成。如果需要在两个方向上进行某种单向传输,需要占用两个端点,分别配置成不同的方向,可以拥有相同的端点编号。
3.3 批量传输 低速USB设备不支持批量传输,高速批量端点的最大包长度为 512,全速批量端点的最大包长度可以为8、16、32、64。关于传输方式的优先级由host来控制,此传输方式是优先级最低的。高速批量端点必须包括PING操作,用来汇报当前端点状态是否已准备好。
3.4 同步传输 同步传输最大1024字节,是一种实时的、不可靠的传输,不支持错误重发机制。因为它没有握手机制,但是它优先级最高,所以实时性好(但是这个的有什么应用场景,网上搜索了下是实时性较高的比如视频和音频数据传输,想想也有道理)
3.5 usb host和hub间有一种分离传输 主要用来解决不同速度的usb的传输问题,拆分包数据。这样就可以在中间插入其他高速传输,从而提高总线的利用率。
4.usb设备支持接收到主机请求包括3种,11种标准请求,类请求,厂商请求。
5.usb hub主要功能为重发,转发和HUB控制器。重发是上行和下行间的协议控制器开关,负责重生及转发。hub控制器主要是和host沟通,进行hub和下行port的管理。
6.USB HOST在USB体系中负责设备连接/移除的检测、 HOST 和设备之间控制流和数据流的管理、传输状态的收集、总线电源的供给。
7.端点可以理解为buffer,buffer通过管道来传输数据,usb通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。
8.一个usb设备可以有多个端点,端点和管道相连,也就是和管道有一样的属性。
9.事务传输的流程 包是 USB 总线是数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。 9.1 批量传输事务流程 USB 允许连续 3 次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST认为该端点功能错误(STALL),放弃该端点的传输任务。对于批量传输,传输过程中数据包的PID按照DATA0-DATA1-DATA0交替的方式翻转,若不翻转,会视作重传。
9.2 控制传输事务流程 最后是状态阶段,通过一次方向与前一次相反的控制事务传输来表明传输的成功与否。也就是之前都是IN,最后变成out就是状态阶段如果成功会返回一个长度为0的数据包,否则返回NAK或STALL。
9.3 中断传输事务流程 也是用PID翻转来得知重传。
9.4 同步传输事务流程 没有ACK的阶段。
三,抓包
四,小结
这么看下,主要内容又想起来了,抓包内容也能看懂了,但是后面还有Hub相关我就先忽略了。
标签:Apple,--,host,传输,管道,端点,USB,usb2.0,usb From: https://blog.51cto.com/AppleCai/8042886