协议基础
一、USB描述符:
描述符什么作用?通过它,设备要告诉主机自己是个什么设备、怎么传数据。
描述符成功返回,USB通信已经成功了一大半。
二、USB设备的枚举过程:
设备回复主机的请求,会返回描述符,也会修改本地设置,这是枚举。
枚举过程:
通过bus hound可以进行数据包监听。
控制传输:建立过程,数据过程,状态过程。建立用来启动数据传输,数据进行数据传输,状态用来确定传输是否成功。
三、USB的包结构和分类:
数据以包为基本单位,包的每个域低位在前,高位在后。
USB的包结构:包是由域组成的。不同的包结构也不同,但是却有三个相同的域,都是以同步域开始,接着一个包标识符,最后以一个包结束符结束。同步域既用来告知USB要发数据了也作为同步时钟,包标识符用来说明包的类型,包结束符用来说明包要结束了。
令牌包:启动传输。分为out,in,setup和帧起始四类。out让设备接收数据;in让设备返回数据;setup让设备必须接收数据,有很多out没有的限制,只能向设备的控制端点发data0的数据包,同时设备必须接收;CRC校验只校验PID之后的数据。
帧起始(sof)需要特殊说明一下,设备会产生帧,而主机会对‘帧’计数,主机把帧号发送给设备。
数据包:1.1版本有两类,data0和data1。版本2.0另加data2和mdata。数据包发数据就可以了,为什么要分为两类呢?分类的目的在于握手包出错时进行纠错,要了解的前提是必须掌握一个定律这个定律就是:数据包一旦发送成功,数据类型就会进行切换。现在开始举例,发送完数据包了,接收方接收完了却因为握手包出错没有告知发送方已接收完毕,发送方就只能通过对比自己数据包的类型和对方接收的数据包的类型是否一致才能判断是否发送成功,当然不一样就成功了,因为之前说过了,数据包发送成功,包类型就发生变化。
握手包:用来告知数据是否被确认,分为ack,nak,stall,nyet,后三个是设备的特权。
特殊包:pre、split、ping令牌包和err握手包,除了pre都是新增的。pre的作用是通知集线器打开低速端口;主机给设备发ping包的目的就是想询问设备是否能传输数据;split令牌包是把高速包分裂成全速或低速包;err包用来说明高速事务分裂失败。
如何处理数据包:给芯片处理,芯片接收到数据,如果有空间存储,那么接收完数据然后返回ack,同时设置一个标志表示已经正常接收到数据,没有空间返回nak。收到输入数据的请求之后,如果有需要发送的数据,将数据发送出去,然后等待ack,接收到ack,设置标志表示数据已经发送。如果没有数据发送,返回一个nak就可以了。
我们需要做的就是:根据芯片给出的标志,发送数据到端点或从端点接收数据,数据是数据包里的数据,setup包的标志也可能使用到,因为它属于控制传输,而控制传输有些特殊。
四、USB的四种传输类型:
虽然数据传输的基本单位是包,但是却不能随意用包来传送,必须组织成事务进行传送。事务由令牌包、数据包、握手包组成。
USB有四种传输类型:批量、中断、等时、控制。前三个每次传输一个事务,控制传输的建立和状态各拥有一个事务,数据可能拥有多个事务。
批量:批量传输没有规定数据包中数据的意义和结构,具体的结构由设备自己来定义。批量事务流程图如下
中断:这种传输要保证查询频率,中断的端点必须在端点描述符里报告查询间隔,主机保证在小于这个时间间隔的范围内进行传输,”中断”就是这个意思!中断传输,也可以用来检测某个状态,条件满足后实行批量传输。
等时:适用于数据量大,实时性高的情况,对于少量的数据错误可以接受,如音频和视频的传输,即使出现一点错误也不重传,想想也合理,一首歌老听一个字也没意思对吧。既然不重传,也就不再需要握手包。
控制:前面已经说过了,分为三个过程:建立、数据、状态。建立过程使用一个事务,发的是setup令牌包,其后只能是data0包,同时握手包只能是ack或者不响应;数据过程可选,如果有,则需要多个事务,使用的事务和批量传输的事务也是一样的,但是传输方向必须是一个方向的,如果方向发生变化则进入状态过程,发送的第一包必须是data1,接下来每次成功发送一包,就从data0包和data1包切换;状态过程使用一个批量事务,方向也是单一的,只使用data1包。
五、端点类型和传输类型的关系:
端点必须有确定的传输类型,什么类型就是什么端点,例如:控制端点、实时端点、中断端点、批量端点。有一个端点比较特殊,那就是端点0,它是USB设备默认的控制端点,插入就存在并可用,设备的描述符和主机传送的命令都是通过端点0。
六、端点的最大包长:
传输类型不同,端点的最大包长也不同。
控制端点:低速8,高速64,全速:8/16/32/64
等时端点:全速上限1023,高速1024,等时端点不支持低速
中断端点:低速上限8,全速上限64,高速上限1024
批量端点:高速512,全速8/16/32/64,不支持低速
对于USB开发这些知识,都是必要的!